Tự động đăng nhập vào hội nghị Lync trên Linux

Này Habr!

Đối với tôi, cụm từ này giống như xin chào thế giới, vì cuối cùng tôi cũng có được ấn phẩm đầu tiên của mình. Tôi đã trì hoãn khoảnh khắc tuyệt vời này trong một thời gian dài, vì chẳng có gì để viết cả, và tôi cũng không muốn ngậm ngùi một thứ đã nhiều lần bị hút vào. Nói chung, trong lần xuất bản đầu tiên của mình, tôi muốn một cái gì đó độc đáo, hữu ích cho người khác và chứa đựng một số loại thách thức và giải quyết vấn đề. Và bây giờ tôi có thể chia sẻ điều này. Bây giờ hãy nói về mọi thứ theo thứ tự.

Nhập

Mọi chuyện bắt đầu khi cách đây một thời gian tôi đã tải xuống Linux Mint trên máy tính làm việc của mình. Chắc hẳn nhiều người cũng biết rằng Pidgin với plugin Sipe là sự thay thế hoàn toàn phù hợp cho Microsoft Lync (nay gọi là Skype for business) cho hệ thống Linux. Do đặc thù công việc của tôi, tôi thường phải tham gia các hội nghị SIP và khi tôi còn là nhân viên Windows, việc tham gia hội nghị là điều cơ bản: chúng tôi nhận được lời mời qua thư, nhấp vào liên kết đăng nhập và chúng tôi đã sẵn sàng. .

Khi chuyển sang mặt tối của Linux, mọi thứ trở nên phức tạp hơn một chút: tất nhiên, bạn cũng có thể đăng nhập vào các hội nghị trong Pidgin, nhưng để thực hiện việc này, bạn cần chọn tùy chọn tham gia hội nghị trong menu trong thuộc tính của tài khoản SIP của mình và trong cửa sổ mở ra, chèn liên kết đến hội nghị hoặc nhập tên của người tổ chức và id tâm sự. Và sau một thời gian, tôi bắt đầu nghĩ: "Có thể đơn giản hóa việc này bằng cách nào đó không?" Vâng, bạn có thể nói, tại sao bạn lại cần cái này? Tôi thà ngồi trên Windows và không phải suy nghĩ nhiều.

Bước 1: Nghiên cứu

“Nếu bạn nảy ra ý tưởng bất chợt trong đầu, bạn không thể đánh bại nó bằng tiền cọc,” Nekrasov nói trong tác phẩm “Ai sống tốt ở Rus'.”

Vì vậy, ngay khi ý nghĩ đó lóe lên trong đầu tôi, sau một thời gian, ý tưởng thực hiện đầu tiên đã nảy sinh. Mọi thứ có vẻ đơn giản - bạn cần chặn quyền truy cập vào các liên kết Meet.company.com/user/confid — cài đặt quy trình ứng dụng web cục bộ trên ô tô của bạn tại 127.0.0.1 và trong /etc/hosts thêm một mục nhập tĩnh cho miền công ty mà qua đó bạn tham gia hội nghị, trỏ tới localhost. Tiếp theo, máy chủ web này phải xử lý liên kết đến nó và bằng cách nào đó chuyển nó vào bên trong Pidgin (Tôi sẽ nói ngay rằng ở giai đoạn này tôi vẫn chưa biết làm cách nào để đưa nó vào nó). Tất nhiên, giải pháp có mùi giống như những chiếc nạng, nhưng chúng tôi là những lập trình viên, những chiếc nạng không làm chúng tôi sợ hãi (chết tiệt).

Sau đó, tình cờ, bằng cách nào đó tôi đã mở được liên kết lời mời trong Google Chrome (và thường thì tôi luôn sử dụng Mozilla Firefox). Và thật ngạc nhiên, trang web trông hoàn toàn khác - không có biểu mẫu nào để nhập dữ liệu người dùng và ngay sau khi vào trang đã có yêu cầu mở nội dung nào đó thông qua xdg-open. Để giải trí, tôi nhấp vào “có” và một thông báo lỗi xuất hiện - không thể mở được liên kết lync15:confjoin?url=https://meet.company.com/user/confid. Ừm. Đây là loại xdg-open gì và nó cần những gì để mở các liên kết như vậy? Việc đọc tài liệu sau khi khám nghiệm cho thấy rằng đó là một trình xử lý GUI giúp chạy các ứng dụng liên quan với các giao thức cho sơ đồ uri hoặc với các loại tệp cụ thể. Các liên kết được cấu hình thông qua ánh xạ kiểu mime. Vì vậy, chúng tôi thấy rằng chúng tôi đang tiến hành tìm kiếm một ứng dụng phù hợp cho sơ đồ uri có tên lync15 và liên kết được chuyển đến xdg-open, sau đó, về mặt lý thuyết, sẽ chuyển nó đến một số ứng dụng chịu trách nhiệm về loại liên kết này. Tất nhiên, điều này chúng tôi không có trong hệ thống của mình. Nếu không thì họ sẽ làm gì trong thế giới nguồn mở? Đúng vậy, chúng tôi sẽ tự viết nó.

Đắm chìm sâu hơn vào thế giới Linux và đặc biệt là nghiên cứu cách hoạt động của shell đồ họa (môi trường máy tính để bàn, DE), nhân tiện, tôi có Xfce trong Linux Mint, đã cho thấy rằng các ứng dụng và loại mime liên quan đến nó thường được viết trực tiếp bằng các tập tin lối tắt có phần mở rộng .desktop. Chà, tại sao không, tôi tạo một lối tắt ứng dụng đơn giản, chỉ cần khởi chạy một tập lệnh bash và xuất đối số được truyền cho nó ra bảng điều khiển, tôi chỉ cung cấp chính tệp lối tắt:

[Desktop Entry]
Name=Lync
Exec=/usr/local/bin/lync.sh %u
Type=Application
Terminal=false
Categories=Network;InstantMessaging;
MimeType=x-scheme-handler/lync15;

Tôi khởi chạy xdg-open từ bảng điều khiển, chuyển cùng một liên kết đến từ trình duyệt và... tiếc quá. Một lần nữa nó nói rằng nó không thể xử lý liên kết.

Hóa ra, tôi đã không cập nhật thư mục các loại mime liên quan với ứng dụng của mình. Điều này được thực hiện bằng một lệnh đơn giản:

xdg-mime default lync.desktop x-scheme-handler/lync15

chỉ đơn giản là chỉnh sửa tập tin ~/.config/mimeapps.list.

Hãy thử số 2 với lệnh gọi xdg-open - và lại thất bại. Không có gì, khó khăn không làm chúng ta sợ hãi mà chỉ khơi dậy niềm đam mê của chúng ta. Và được trang bị tất cả sức mạnh của bash (tức là truy tìm), chúng tôi đi sâu vào việc gỡ lỗi. Điều quan trọng cần lưu ý ở đây là xdg-open chỉ là một tập lệnh shell.

bash -x xdg-open $url

Phân tích đầu ra sau khi theo dõi, có thể thấy rõ rằng điều khiển sau đó được chuyển đến mở ra. Và đây đã là một tệp nhị phân và càng khó hiểu hơn tại sao nó trả về mã trả về không thành công khi chuyển một liên kết đến nó trong một đối số.

Sau khi xem xét phần bên trong của xdg-open, tôi phát hiện ra rằng nó phân tích các thông số môi trường khác nhau và chuyển quyền kiểm soát sâu hơn cho một số công cụ để mở các liên kết tệp cụ thể cho một DE cụ thể hoặc nó có chức năng dự phòng open_generic

open_xfce()
{
if exo-open --help 2>/dev/null 1>&2; then
exo-open "$1"
elif gio help open 2>/dev/null 1>&2; then
gio open "$1"
elif gvfs-open --help 2>/dev/null 1>&2; then
gvfs-open "$1"
else
open_generic "$1"
fi

if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
}

Tôi sẽ nhanh chóng nhúng vào đây một bản hack nhỏ với việc phân tích đối số được truyền và liệu chuỗi con cụ thể của chúng ta có nằm ở đó không lync15:, khi đó ta chuyển ngay quyền điều khiển sang hàm open_generic.

Hãy thử số 3 và bạn có nghĩ nó hiệu quả không? Vâng, bây giờ, tất nhiên. Nhưng thông báo lỗi đã thay đổi, đây đã là tiến trình - bây giờ anh ấy nói với tôi rằng không tìm thấy tệp và ở dạng tệp, anh ấy đã viết cho tôi liên kết tương tự được chuyển làm đối số.

Lần này hóa ra là một chức năng is_file_url_or_path, phân tích liên kết tệp được chuyển đến đầu vào: file:// hoặc đường dẫn đến tệp hoặc nội dung nào khác. Và quá trình kiểm tra không hoạt động chính xác do tiền tố (lược đồ url) của chúng tôi có số và biểu thức chính quy chỉ kiểm tra bộ ký tự bao gồm :alpha: dấu chấm và dấu gạch ngang. Sau khi tham khảo tiêu chuẩn rfc3986 cho định danh tài nguyên thống nhất Rõ ràng là lần này Microsoft không vi phạm bất cứ điều gì (mặc dù tôi đã có phiên bản như vậy). Chỉ lớp ký tự :alpha: chỉ chứa các chữ cái trong bảng chữ cái Latinh. Tôi nhanh chóng thay đổi kiểm tra thông thường thành chữ và số. Xong, bạn thật tuyệt vời, mọi thứ cuối cùng cũng bắt đầu, kiểm soát sau khi tất cả các bước kiểm tra được đưa vào ứng dụng tập lệnh của chúng tôi, liên kết của chúng tôi được hiển thị trên bảng điều khiển, mọi thứ vẫn như bình thường. Sau đó, tôi bắt đầu nghi ngờ rằng tất cả các vấn đề với exo-open cũng là do việc xác thực định dạng liên kết do các con số trong sơ đồ. Để kiểm tra giả thuyết, tôi thay đổi đăng ký kiểu mime của ứng dụng thành một sơ đồ Lync và thì đấy - mọi thứ đều hoạt động mà không ghi đè hàm open_xfce. Nhưng điều này sẽ không giúp ích gì cho chúng tôi vì trang web tham gia hội nghị sẽ tạo liên kết với lync15.

Vậy là chặng đầu tiên của cuộc hành trình đã hoàn thành. Chúng tôi biết cách chặn lệnh gọi liên kết và sau đó nó cần được xử lý bằng cách nào đó và chuyển vào bên trong Pidgin. Để hiểu cách hoạt động nội bộ khi nhập dữ liệu qua liên kết trong menu “tham gia hội nghị”, tôi đã sao chép kho lưu trữ Git của dự án Sipe và sẵn sàng đi sâu vào mã một lần nữa. Nhưng rồi may mắn thay, tôi đã bị cuốn hút bởi những kịch bản trong danh mục đóng góp/dbus/:

  • SIPe-join-conference-with-uri.pl
  • nhâm nhi-tham gia-hội nghị-với-người tổ chức-và-id.pl
  • Sipe-call-phone-number.pl
  • SipeHelper.pm

Hóa ra plugin Sipe có sẵn để tương tác thông qua dbus (bus máy tính để bàn) và bên trong tập lệnh có các ví dụ về việc tham gia hội nghị qua liên kết, thông qua tên và conf-id của người tổ chức hoặc bạn có thể bắt đầu cuộc gọi qua SIP . Đây chính xác là những gì chúng tôi đã thiếu.

Bước 2. Triển khai trình xử lý autojoin

Vì có những ví dụ được tạo sẵn trong Pearl nên tôi quyết định chỉ sử dụng SIPe-join-conference-with-uri.pl và sửa đổi nó một chút cho phù hợp với chính mình. Tôi có thể viết bằng Pearl nên không gây khó khăn gì đặc biệt.

Sau khi kiểm tra tập lệnh riêng biệt, tôi đã viết lệnh gọi của nó vào tệp lync.desktop. Và đó là một chiến thắng! Khi vào trang tham gia hội nghị và cho phép chạy xdg-open, cửa sổ bật lên hội nghị từ Pidgin sẽ tự động mở. Tôi đã vui mừng biết bao.
Được khích lệ bởi thành công, tôi quyết định làm điều tương tự với trình duyệt chính của mình, Mozilla Firefox. Khi bạn đăng nhập thông qua con cáo, một trang ủy quyền sẽ mở ra và ở dưới cùng có một nút tham gia bằng cách sử dụng Office Communicator. Cô ấy là người đã thu hút sự chú ý của tôi. Khi bạn nhấp vào nó trong trình duyệt, nó sẽ chuyển đến địa chỉ:

conf:sip:{user};gruu;opaque=app:conf:focus:id:{conf-id}%3Frequired-media=audio

và anh ấy vui lòng nói với tôi rằng anh ấy không biết cách mở nó và có lẽ tôi không có ứng dụng liên quan cho giao thức như vậy. Vâng, chúng tôi đã trải qua điều này.

Tôi cũng nhanh chóng đăng ký ứng dụng tập lệnh của mình cho lược đồ uri conf và... không có gì xảy ra. Trình duyệt liên tục phàn nàn rằng không có ứng dụng nào xử lý các liên kết của tôi. Trong trường hợp này, việc gọi xdg-open từ bảng điều khiển với các tham số hoạt động hoàn hảo.

“Đặt trình xử lý giao thức tùy chỉnh trong firefox” - Tôi đã lên mạng với câu hỏi này. Sau khi trải qua một số cuộc thảo luận về stackoverflow (và chúng ta sẽ ở đâu nếu không có nó), có vẻ như câu trả lời đã được tìm thấy. Bạn cần tạo một tham số đặc biệt trong about: config (tất nhiên thay thế foo bằng conf):

network.protocol-handler.expose.foo = false

Chúng tôi tạo ra nó, mở liên kết và... không có may mắn như vậy. Trình duyệt, như thể không có chuyện gì xảy ra, nói rằng nó không biết ứng dụng của chúng tôi.

Tôi đang đọc tài liệu chính thức về việc đăng ký giao thức từ Mozilla, có một tùy chọn để đăng ký liên kết trong chính màn hình gnome (tất nhiên thay thế foo bằng conf):

gconftool-2 -s /desktop/gnome/url-handlers/foo/command '/path/to/app %s' --type String
gconftool-2 -s /desktop/gnome/url-handlers/foo/enabled --type Boolean true

Tôi đăng ký, mở trình duyệt... và lại có bộ râu.

Ở đây một dòng từ tài liệu thu hút sự chú ý của tôi:

Lần tới khi bạn nhấp vào liên kết của loại giao thức foo, bạn sẽ được hỏi nên mở nó bằng ứng dụng nào.

— Semyon Semenych
- Ahhh

Chúng tôi không nhấp vào liên kết mà trang web chỉ thay đổi window.location thông qua javascript. Tôi viết một tệp html đơn giản có liên kết đến giao thức conf, mở nó trong trình duyệt, nhấp vào liên kết - Yos! Một cửa sổ mở ra hỏi chúng tôi cần mở liên kết của mình trong ứng dụng nào và ở đó chúng tôi đã có ứng dụng Lync của mình trong danh sách - chúng tôi đã đăng ký nó một cách trung thực bằng mọi cách có thể. Trong cửa sổ có một hộp kiểm “hãy nhớ lựa chọn và luôn mở các liên kết trong ứng dụng của chúng tôi”, đánh dấu vào đó, nhấp vào ok. Và đây là chiến thắng thứ hai - cửa sổ hội nghị mở ra. Đồng thời, việc mở hội nghị không chỉ hoạt động khi bạn nhấp vào liên kết mà còn khi chuyển từ trang tham gia chúng ta cần đến hội nghị.

Sau đó tôi kiểm tra, xóa thông số network.protocol-handler.expose.conf không hề ảnh hưởng đến hoạt động của giao thức trong Fox. Các liên kết tiếp tục hoạt động.

Kết luận

Tôi đã tải tất cả công việc của mình lên kho GitHub; liên kết đến tất cả các tài nguyên sẽ ở cuối bài viết.
Tôi sẽ quan tâm đến việc nhận được phản hồi từ những người muốn sử dụng tác phẩm của tôi. Tôi cần lưu ý ngay rằng tôi chỉ thực hiện tất cả quá trình phát triển cho hệ thống Linux Mint của mình, vì vậy một số bản phân phối hoặc máy tính để bàn khác có thể không hoạt động trong phiên bản đó. Hay đúng hơn, tôi thậm chí còn gần như chắc chắn về điều này, vì tôi chỉ vá 1 chức năng trong xdg-open chỉ liên quan đến DE của tôi. Nếu bạn muốn thêm hỗ trợ cho các hệ thống hoặc máy tính để bàn khác, hãy viết cho tôi các yêu cầu kéo trên Github.

Toàn bộ dự án mất 1 buổi tối để hoàn thành.

Links:

Nguồn: www.habr.com

Thêm một lời nhận xét