Log masuk automatik ke persidangan Lync di Linux

Hai Habr!

Bagi saya, frasa ini serupa dengan hello world, kerana saya akhirnya mendapat penerbitan pertama saya. Saya menangguhkan detik indah ini untuk masa yang lama, kerana tidak ada apa-apa untuk ditulis, dan saya juga tidak mahu menghisap sesuatu yang telah disedut berkali-kali. Secara umum, untuk penerbitan pertama saya, saya mahukan sesuatu yang asli, berguna kepada orang lain dan mengandungi beberapa jenis cabaran dan penyelesaian masalah. Dan sekarang saya boleh berkongsi ini. Sekarang mari kita bercakap tentang segala-galanya mengikut urutan.

Entry

Semuanya bermula apabila beberapa waktu lalu saya memuat turun Linux Mint pada komputer kerja saya. Ramai orang mungkin tahu bahawa Pidgin dengan pemalam Sipe adalah pengganti yang sesuai sepenuhnya untuk Microsoft Lync (kini dipanggil Skype untuk perniagaan) untuk sistem Linux. Disebabkan oleh kekhususan kerja saya, saya sering perlu mengambil bahagian dalam persidangan SIP, dan semasa saya menjadi pekerja Windows, memasuki persidangan adalah asas: kami menerima jemputan melalui mel, klik pada pautan log masuk dan kami bersedia untuk pergi .

Apabila beralih ke sisi gelap Linux, semuanya menjadi lebih rumit: sudah tentu, anda juga boleh log masuk ke persidangan di Pidgin, tetapi untuk melakukan ini, anda perlu memilih pilihan menyertai persidangan dalam menu dalam sifat akaun SIP anda dan dalam tetingkap yang terbuka, masukkan pautan ke persidangan atau masukkan nama penganjur dan conf id. Dan selepas beberapa lama saya mula berfikir: "adakah mungkin untuk memudahkan ini?" Ya, anda mungkin berkata, mengapa anda memerlukan ini? Saya lebih suka duduk di Windows dan tidak membingungkan saya.

Langkah 1: Penyelidikan

"Jika anda mempunyai sedikit keinginan di kepala anda, anda tidak boleh menyingkirkannya dengan taruhan," kata Nekrasov dalam karyanya "Who Lives Well in Rus'."

Jadi, apabila pemikiran itu masuk ke dalam kepala saya, selepas beberapa lama idea pertama untuk pelaksanaan timbul. Semuanya kelihatan mudah - anda perlu memintas akses kepada pautan meet.company.com/user/confid β€” pasang proses aplikasi web tempatan pada kereta anda di 127.0.0.1 dan dalam /etc/hosts tambahkan entri statik untuk domain syarikat yang anda gunakan untuk memasuki persidangan, menunjuk ke localhost. Seterusnya, pelayan web ini mesti memproses pautan yang datang kepadanya dan entah bagaimana memindahkannya ke dalam Pidgin (saya akan katakan dengan segera bahawa pada peringkat ini saya masih tidak tahu cara memberikannya sama sekali). Penyelesaiannya, tentu saja, berbau seperti tongkat, tetapi kami adalah pengaturcara, tongkat tidak menakutkan kami (sial).

Kemudian, secara kebetulan, saya entah bagaimana membuka pautan jemputan dalam Google Chrome (dan biasanya saya selalu menggunakan Mozilla Firefox). Dan yang mengejutkan saya, halaman web kelihatan berbeza sama sekali - tidak ada borang untuk memasukkan data pengguna dan serta-merta selepas memasuki halaman terdapat permintaan untuk membuka sesuatu melalui xdg-terbuka. Hanya untuk keseronokan, saya klik "ya" dan mesej ralat muncul - pautan lync15:confjoin?url=https://meet.company.com/user/confid tidak boleh dibuka. Hmm. Apakah jenis xdg-open ini dan apakah yang diperlukan untuk pautan tersebut dibuka? Bacaan bedah siasat dokumentasi mendedahkan bahawa ia adalah pengendali GUI yang membantu menjalankan aplikasi berkaitan sama ada dengan protokol untuk skema uri atau dengan jenis fail tertentu. Persatuan dikonfigurasikan melalui pemetaan jenis mime. Oleh itu, kami melihat bahawa kami sedang menjalankan carian untuk aplikasi yang dipadankan untuk skim uri bernama lync15 dan pautan diserahkan kepada xdg-open, yang kemudiannya, secara teori, harus menyerahkannya kepada beberapa aplikasi yang bertanggungjawab untuk jenis pautan ini. Yang, sudah tentu, kami tidak ada dalam sistem kami. Jika tidak, maka apa yang mereka lakukan dalam dunia sumber terbuka? Betul, kami akan menulisnya sendiri.

Penyerapan lebih lanjut dalam dunia Linux dan terutamanya dalam mengkaji bagaimana cangkerang grafik (persekitaran desktop, DE) berfungsi, dengan cara itu, saya mempunyai Xfce dalam Linux Mint, menunjukkan bahawa aplikasi dan jenis mime yang dikaitkan dengannya biasanya ditulis secara langsung dalam fail pintasan dengan sambungan .desktop. Nah, mengapa tidak, saya mencipta pintasan aplikasi mudah, yang sepatutnya melancarkan skrip bash dan mengeluarkan hujah yang dihantar kepadanya ke konsol, saya hanya menyediakan fail pintasan itu sendiri:

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

Saya melancarkan xdg-open dari konsol, menghantar pautan yang sama yang datang dari penyemak imbas dan... bummer. Sekali lagi ia mengatakan bahawa ia tidak boleh memproses pautan.

Ternyata, saya tidak mengemas kini direktori jenis mime yang berkaitan dengan aplikasi saya. Ini dilakukan dengan arahan mudah:

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

yang hanya mengedit fail ~/.config/mimeapps.list.

Percubaan nombor 2 dengan panggilan xdg-buka - dan sekali lagi gagal. Tiada apa-apa, kesukaran tidak menakutkan kita, tetapi hanya menyemarakkan minat kita. Dan berbekalkan semua kuasa bash (iaitu mengesan), kami menyelam terlebih dahulu ke dalam penyahpepijatan. Adalah penting untuk ambil perhatian di sini bahawa xdg-open hanyalah skrip shell.

bash -x xdg-open $url

Menganalisis output selepas mengesannya menjadi sedikit jelas bahawa kawalan kemudian dipindahkan ke exo-terbuka. Dan ini sudah menjadi fail binari dan lebih sukar untuk memahami mengapa ia mengembalikan kod pulangan yang tidak berjaya apabila menghantar pautan kepadanya dalam hujah.

Setelah melihat melalui dalaman xdg-open, saya mendapati bahawa ia menganalisis pelbagai parameter persekitaran dan meneruskan kawalan lagi sama ada kepada beberapa alat untuk membuka pautan fail khusus untuk DE tertentu, atau ia mempunyai fungsi sandaran 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
}

Saya akan membenamkan di sini dengan pantas hack kecil dengan analisis hujah yang diluluskan dan jika subrentetan khusus kami terdapat di sana lync15:, maka kami segera memindahkan kawalan ke fungsi tersebut open_generic.

Percubaan nombor 3 dan adakah anda fikir ia berjaya? Ya, sekarang, sudah tentu. Tetapi mesej ralat telah berubah, ini sudah pun kemajuan - kini dia memberitahu saya bahawa fail itu tidak dijumpai dan dalam bentuk fail dia menulis saya pautan yang sama diluluskan sebagai hujah.

Kali ini ia ternyata menjadi satu fungsi is_file_url_or_path, yang menganalisis pautan fail yang dihantar ke input: file:// atau laluan ke fail atau sesuatu yang lain. Dan semakan itu tidak berfungsi dengan betul disebabkan oleh fakta bahawa awalan (skema url) kami mempunyai nombor, dan ungkapan biasa hanya menyemak set aksara yang terdiri daripada :alpha: titik dan sempang. Selepas berunding dengan standard rfc3986 untuk pengecam sumber seragam Ia menjadi jelas bahawa kali ini Microsoft tidak melanggar apa-apa (walaupun saya mempunyai versi sedemikian). Hanya kelas aksara :alpha: mengandungi hanya huruf abjad Latin. Saya cepat menukar cek biasa kepada alfanumerik. Selesai, anda hebat, semuanya akhirnya bermula, kawalan selepas semua semakan diberikan kepada aplikasi skrip kami, pautan kami dipaparkan pada konsol, semuanya adalah seperti yang sepatutnya. Selepas ini, saya mula mengesyaki bahawa semua masalah dengan exo-open juga disebabkan oleh pengesahan format pautan kerana nombor dalam skema. Untuk menguji hipotesis, saya menukar pendaftaran jenis mime aplikasi kepada hanya skim Lync dan voila - semuanya berfungsi tanpa mengatasi fungsi open_xfce. Tetapi ini tidak akan membantu kami dalam apa cara sekalipun, kerana halaman web untuk memasuki persidangan mencipta pautan dengan lync15.

Jadi, bahagian pertama perjalanan telah selesai. Kami tahu cara memintas panggilan pautan dan kemudian ia perlu diproses dan dihantar ke dalam Pidgin. Untuk memahami cara ia berfungsi secara dalaman apabila memasukkan data melalui pautan dalam menu "sertai persidangan", saya mengklon repositori Git projek Sipe dan bersedia untuk menyelami kod itu semula. Tetapi kemudian, mujurlah, saya tertarik dengan skrip dalam katalog sumbangan/dbus/:

  • sipe-join-conference-with-uri.pl
  • sipe-join-conference-with-organizer-and-id.pl
  • sipe-call-phone-number.pl
  • SipeHelper.pm

Ternyata pemalam Sipe tersedia untuk interaksi melalui dbus (bas desktop) dan di dalam skrip terdapat contoh menyertai persidangan melalui pautan, sama ada melalui nama penganjur dan conf-id, atau anda boleh memulakan panggilan melalui sip . Inilah yang kami hilang.

Langkah 2. Melaksanakan pengendali autojoin

Oleh kerana terdapat contoh siap pakai dalam Pearl, saya memutuskan untuk menggunakan sahaja sipe-join-conference-with-uri.pl dan ubah suai sedikit mengikut kesesuaian diri anda. Saya boleh menulis dalam Pearl, jadi ia tidak menyebabkan sebarang kesulitan tertentu.

Selepas menguji skrip secara berasingan, saya menulis panggilannya ke dalam fail lync.desktop. Dan ia adalah kemenangan! Apabila memasuki halaman sertai persidangan dan membenarkan xdg-open dijalankan, tetingkap pop timbul persidangan daripada Pidgin akan dibuka secara automatik. Betapa saya bergembira.
Didorong oleh kejayaan itu, saya memutuskan untuk melakukan perkara yang sama untuk pelayar utama saya, Mozilla Firefox. Apabila anda log masuk melalui musang, halaman untuk kebenaran terbuka dan di bahagian paling bawah terdapat butang sertai menggunakan komunikator pejabat. Dialah yang menarik perhatian saya. Apabila anda mengklik padanya dalam penyemak imbas, ia pergi ke alamat:

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

yang dia dengan baik hati memberitahu saya bahawa dia tidak tahu cara membukanya dan, mungkin, saya tidak mempunyai aplikasi berkaitan untuk protokol sedemikian. Nah, kita telah pun melalui ini.

Saya segera mendaftarkan permohonan skrip saya juga untuk skim uri conf dan... tiada apa yang berlaku. Pelayar terus mengadu bahawa tiada aplikasi yang mengendalikan pautan saya. Dalam kes ini, memanggil xdg-open dari konsol dengan parameter berfungsi dengan sempurna.

"Tetapkan pengendali protokol tersuai dalam firefox" - Saya pergi ke dalam talian dengan soalan ini. Selepas melalui beberapa perbincangan mengenai stackoverflow (dan di manakah kita akan berada tanpanya), nampaknya jawapannya ditemui. Anda perlu mencipta parameter khas dalam about: config (sudah tentu menggantikan foo dengan conf):

network.protocol-handler.expose.foo = false

Kami menciptanya, membuka pautan dan... tiada nasib seperti itu. Pelayar, seolah-olah tiada apa yang berlaku, mengatakan bahawa ia tidak mengetahui aplikasi kami.

Saya sedang membaca dokumentasi rasmi untuk mendaftarkan protokol daripada Mozilla, terdapat pilihan untuk mendaftar persatuan dalam desktop gnome itu sendiri (menggantikan foo dengan conf, sudah tentu):

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

Saya mendaftar, buka pelayar... dan sekali lagi janggut.

Berikut baris dari dokumentasi menarik perhatian saya:

Kali seterusnya anda mengklik pautan jenis protokol foo anda akan ditanya aplikasi mana untuk membukanya.

β€” Semyon Semenych
- Ahh

Kami tidak mengklik pada pautan, tetapi halaman web hanya menukar window.location melalui javascript. Saya menulis fail html mudah dengan pautan ke protokol conf, buka dalam penyemak imbas, klik pada pautan - Yos! Tetingkap terbuka bertanya dalam aplikasi yang mana kami perlu membuka pautan kami, dan di sana kami sudah mempunyai aplikasi Lync kami dalam senarai - kami dengan jujur ​​mendaftarkannya dalam semua cara yang mungkin. Di tetingkap terdapat kotak semak "ingat pilihan dan sentiasa buka pautan dalam aplikasi kami", tandainya, klik ok. Dan ini adalah kemenangan kedua - tetingkap persidangan dibuka. Pada masa yang sama, pembukaan persidangan berfungsi bukan sahaja apabila anda mengklik pada pautan, tetapi juga apabila berpindah dari halaman penyertaan yang kami perlukan ke persidangan.

Kemudian saya menyemak, memadam parameter network.protocol-handler.expose.conf tidak menjejaskan operasi protokol dalam Fox. Pautan terus berfungsi.

Kesimpulan

Saya telah memuat naik semua kerja saya ke repositori GitHub; pautan ke semua sumber akan berada di penghujung artikel.
Saya akan berminat untuk menerima maklum balas daripada mereka yang ingin menggunakan kerja saya. Saya harus segera ambil perhatian bahawa saya melakukan semua pembangunan hanya untuk sistem Linux Mint saya, jadi beberapa pengedaran atau desktop lain mungkin tidak berfungsi dalam versi itu. Atau sebaliknya, saya hampir pasti akan perkara ini, kerana saya menambal hanya 1 fungsi dalam xdg-open yang hanya berkaitan dengan DE saya. Jika anda ingin menambah sokongan untuk sistem atau desktop lain, tulis saya tarik permintaan pada Github.

Keseluruhan projek mengambil masa 1 petang untuk disiapkan.

Rujukan:

Sumber: www.habr.com

Tambah komen