Login otomatis ke konferensi Lync di Linux

Hei Habr!

Bagi saya, ungkapan ini mirip dengan hello world, karena saya akhirnya sampai pada publikasi pertama saya. Aku sudah lama menunda momen indah ini, karena tidak ada yang perlu ditulis, dan aku juga tidak ingin menyedot sesuatu yang sudah berkali-kali tersedot. Secara umum, untuk publikasi pertama saya, saya menginginkan sesuatu yang orisinal, bermanfaat bagi orang lain dan mengandung semacam tantangan dan pemecahan masalah. Dan sekarang saya dapat membagikannya. Sekarang mari kita bicara semuanya secara berurutan.

Masuk

Semuanya bermula ketika beberapa waktu lalu saya mendownload Linux Mint di komputer kerja saya. Banyak orang mungkin tahu bahwa Pidgin dengan plugin Sipe adalah pengganti yang cocok untuk Microsoft Lync (sekarang disebut Skype for Business) untuk sistem Linux. Karena spesifiknya pekerjaan saya, saya sering harus berpartisipasi dalam konferensi SIP, dan ketika saya masih menjadi pekerja Windows, mengikuti konferensi adalah hal yang mendasar: kami menerima undangan melalui surat, klik tautan login, dan kami siap berangkat .

Saat beralih ke sisi gelap Linux, segalanya menjadi lebih rumit: tentu saja, Anda juga dapat masuk ke konferensi di Pidgin, tetapi untuk melakukan ini, Anda perlu memilih opsi bergabung konferensi di menu di properti akun SIP Anda dan di jendela yang terbuka, masukkan tautan ke konferensi atau masukkan nama penyelenggara dan conf id. Dan setelah beberapa waktu saya mulai berpikir: β€œmungkinkah hal ini disederhanakan?” Ya, Anda mungkin berkata, mengapa Anda membutuhkan ini? Saya lebih suka duduk di Windows dan tidak berpikir berlebihan.

Langkah 1: Penelitian

β€œJika Anda punya keinginan tertentu, Anda tidak bisa menghancurkannya dengan pasak,” kata Nekrasov dalam karyanya β€œWho Lives Well in Rus'.”

Jadi, begitu pemikiran itu muncul di kepala saya, lama kelamaan ide implementasi pertama pun muncul. Segalanya tampak sederhana - Anda perlu mencegat akses ke tautan temui.company.com/user/confid β€” instal proses aplikasi web lokal di mobil Anda di 127.0.0.1 dan di /etc/hosts tambahkan entri statis untuk domain perusahaan tempat Anda memasuki konferensi, dengan menunjuk ke localhost. Selanjutnya, server web ini harus memproses tautan yang datang ke sana dan mentransfernya ke dalam Pidgin (saya akan langsung mengatakan bahwa pada tahap ini saya masih tidak tahu bagaimana cara memberikannya sama sekali). Solusinya tentu saja baunya seperti kruk, tapi kami adalah programmer, kruk tidak membuat kami takut (sial).

Lalu kebetulan saya membuka link undangan tersebut di Google Chrome (dan biasanya saya selalu menggunakan Mozilla Firefox). Dan yang mengejutkan saya, halaman webnya terlihat sangat berbeda - tidak ada formulir untuk memasukkan data pengguna dan segera setelah memasuki halaman ada permintaan untuk membuka sesuatu melalui xdg-terbuka. Sekadar iseng, saya klik β€œyes” dan muncul pesan error - link lync15:confjoin?url=https://meet.company.com/user/confid tidak bisa dibuka. Hmm. Xdg-open macam apa ini dan apa yang diperlukan agar tautan tersebut dapat dibuka? Pembacaan dokumentasi post-mortem mengungkapkan bahwa itu adalah pengendali GUI yang membantu menjalankan aplikasi terkait baik dengan protokol untuk skema uri atau dengan tipe file tertentu. Asosiasi dikonfigurasikan melalui pemetaan tipe mime. Jadi kita melihat bahwa kita sedang menjalankan pencarian aplikasi yang cocok untuk skema uri bernama lync15 dan tautan tersebut diteruskan ke xdg-open, yang kemudian, secara teori, harus meneruskannya ke beberapa aplikasi yang bertanggung jawab atas jenis tautan ini. Yang tentu saja tidak kami miliki di sistem kami. Jika tidak, lalu apa yang mereka lakukan di dunia open source? Benar, kami akan menulisnya sendiri.

Perendaman lebih lanjut dalam dunia Linux dan khususnya mempelajari cara kerja shell grafis (lingkungan desktop, DE), omong-omong, saya memiliki Xfce di Linux Mint, menunjukkan bahwa aplikasi dan tipe mime yang terkait dengannya biasanya ditulis langsung di file pintasan dengan ekstensi .desktop. Mengapa tidak, saya membuat pintasan aplikasi sederhana, yang seharusnya meluncurkan skrip bash dan menampilkan argumen yang diteruskan ke konsol, saya hanya menyediakan file 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 meluncurkan xdg-open dari konsol, meneruskan tautan yang sama yang berasal dari browser dan... mengecewakan. Sekali lagi dikatakan bahwa ia tidak dapat memproses tautan tersebut.

Ternyata, saya tidak memperbarui direktori tipe mime yang terkait dengan aplikasi saya. Ini dilakukan dengan perintah sederhana:

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

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

Coba nomor 2 dengan panggilan xdg-open - dan lagi-lagi gagal. Tidak ada, kesulitan tidak membuat kita takut, tetapi hanya menambah minat kita. Dan berbekal seluruh kekuatan bash (yaitu penelusuran), kami terjun lebih dulu ke dalam proses debug. Penting untuk dicatat di sini bahwa xdg-open hanyalah skrip shell.

bash -x xdg-open $url

Menganalisis keluaran setelah menelusuri menjadi sedikit jelas bahwa kendali kemudian ditransfer ke exo-terbuka. Dan ini sudah menjadi file biner dan lebih sulit untuk memahami mengapa ia mengembalikan kode pengembalian yang gagal ketika meneruskan tautan ke sana dalam sebuah argumen.

Setelah memeriksa internal xdg-open, saya menemukan bahwa ia menganalisis berbagai parameter lingkungan dan meneruskan kontrol lebih jauh ke beberapa alat untuk membuka tautan file khusus untuk DE tertentu, atau ia memiliki fungsi cadangan open_generik

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 segera menyematkan di sini peretasan kecil dengan analisis argumen yang disampaikan dan apakah substring spesifik kita terletak di sana lync15:, lalu kita segera mentransfer kontrol ke fungsi tersebut open_generik.

Coba nomor 3 dan menurut Anda berhasil? Ya, sekarang, tentu saja. Tetapi pesan kesalahan telah berubah, ini sudah kemajuan - sekarang dia memberi tahu saya bahwa file tersebut tidak ditemukan dan dalam bentuk file dia menulis kepada saya tautan yang sama diteruskan sebagai argumen.

Kali ini ternyata sebuah fungsi is_file_url_or_path, yang menganalisis tautan file yang diteruskan ke input: file:// atau jalur ke file atau yang lainnya. Dan pemeriksaan tidak berfungsi dengan benar karena awalan kami (skema url) memiliki angka, dan ekspresi reguler hanya memeriksa kumpulan karakter yang terdiri dari :alpha: titik dan garis. Setelah berkonsultasi dengan standar rfc3986 untuk pengidentifikasi sumber daya yang seragam Menjadi jelas bahwa kali ini Microsoft tidak melanggar apa pun (walaupun saya punya versi seperti itu). Hanya kelas karakter :alpha: hanya berisi huruf alfabet Latin. Saya segera mengubah cek biasa menjadi alfanumerik. Selesai, Anda luar biasa, semuanya akhirnya dimulai, kontrol setelah semua pemeriksaan diberikan kepada aplikasi skrip kami, tautan kami ditampilkan di konsol, semuanya sebagaimana mestinya. Setelah ini, saya mulai curiga bahwa semua masalah dengan exo-open juga disebabkan oleh validasi format tautan karena angka-angka dalam skema. Untuk menguji hipotesis, saya mengubah pendaftaran aplikasi tipe mime menjadi skema saja lynx dan voila - semuanya berfungsi tanpa mengesampingkan fungsi open_xfce. Tapi ini tidak akan membantu kami dengan cara apa pun, karena halaman web untuk mengikuti konferensi membuat tautan dengan lync15.

Jadi, bagian pertama perjalanan telah selesai. Kami tahu cara mencegat panggilan tautan dan kemudian panggilan itu perlu diproses dan diteruskan ke dalam Pidgin. Untuk memahami cara kerjanya secara internal saat memasukkan data melalui tautan di menu "bergabung dalam konferensi", saya mengkloning repositori Git proyek Sipe dan bersiap untuk mendalami kodenya lagi. Tapi untungnya, saya tertarik dengan skrip di katalog kontribusi/dbus/:

  • sipe-gabung-konferensi-dengan-uri.pl
  • sipe-gabung-konferensi-dengan-penyelenggara-dan-id.pl
  • sipe-panggilan-nomor-telepon.pl
  • SipeHelper.pm

Ternyata plugin Sipe tersedia untuk interaksi melalui dbus (desktop bus) dan di dalam script terdapat contoh mengikuti konferensi melalui link, baik melalui nama penyelenggara dan conf-id, atau Anda dapat memulai panggilan melalui sip . Inilah tepatnya yang kami lewatkan.

Langkah 2. Menerapkan pengendali autojoin

Karena ada contoh yang sudah jadi di Pearl, saya memutuskan untuk menggunakan saja sipe-gabung-konferensi-dengan-uri.pl dan modifikasi sedikit sesuai keinginan Anda. Saya bisa menulis dalam bahasa Pearl, jadi tidak menimbulkan kesulitan khusus.

Setelah menguji skrip secara terpisah, saya menulis panggilannya ke dalam file lync.desktop. Dan itu adalah sebuah kemenangan! Saat memasuki halaman bergabung konferensi dan mengizinkan xdg-open dijalankan, jendela popup konferensi dari Pidgin akan terbuka secara otomatis. Betapa saya bersukacita.
Didorong oleh kesuksesan tersebut, saya memutuskan untuk melakukan hal yang sama untuk browser utama saya, Mozilla Firefox. Saat Anda masuk melalui rubah, halaman otorisasi terbuka dan di bagian paling bawah ada tombol bergabung menggunakan komunikator kantor. Dialah yang menarik perhatianku. Ketika Anda mengkliknya di browser, ia menuju ke alamat:

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

dan dia dengan baik hati memberi tahu saya bahwa dia tidak tahu cara membukanya dan, mungkin, saya tidak memiliki aplikasi terkait untuk protokol semacam itu. Ya, kita sudah melalui ini.

Saya segera mendaftarkan aplikasi skrip saya juga untuk skema uri conf dan... tidak terjadi apa-apa. Browser terus mengeluh karena tidak ada aplikasi yang menangani link saya. Dalam hal ini, memanggil xdg-open dari konsol dengan parameter berfungsi dengan baik.

β€œSetel pengendali protokol khusus di firefox” - Saya online dengan pertanyaan ini. Setelah melalui beberapa diskusi tentang stackoverflow (dan bagaimana jadinya kita tanpanya), sepertinya jawabannya telah ditemukan. Anda perlu membuat parameter khusus di dalamnya about: config (tentu saja mengganti foo dengan conf):

network.protocol-handler.expose.foo = false

Kami membuatnya, membuka tautannya dan... tidak beruntung. Browser, seolah-olah tidak terjadi apa-apa, mengatakan bahwa ia tidak mengetahui aplikasi kita.

Saya membaca dokumentasi resmi tentang mendaftarkan protokol dari Mozilla, ada opsi untuk mendaftarkan asosiasi di desktop gnome itu sendiri (tentu saja mengganti foo dengan 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

Saya mendaftar, membuka browser... dan lagi janggut.

Di sini satu baris dari dokumentasi menarik perhatian saya:

Lain kali Anda mengeklik tautan foo tipe protokol, Anda akan ditanya aplikasi mana yang akan digunakan untuk membukanya.

β€” Semyon Semenych
- Ahhh

Kami tidak mengklik link tersebut, tetapi halaman web hanya mengubah lokasi jendela melalui javascript. Saya menulis file html sederhana dengan tautan ke protokol conf, buka di browser, klik tautannya - Yos! Sebuah jendela terbuka menanyakan aplikasi mana yang kita perlukan untuk membuka tautan kita, dan di sana kita sudah memiliki aplikasi Lync kita dalam daftar - kita dengan jujur ​​​​mendaftarkannya dengan semua cara yang memungkinkan. Di jendela tersebut terdapat kotak centang β€œingat pilihan dan selalu buka tautan di aplikasi kami”, tandai, klik ok. Dan ini adalah kemenangan kedua - jendela konferensi terbuka. Pada saat yang sama, pembukaan konferensi berfungsi tidak hanya saat Anda mengeklik tautan, tetapi juga saat berpindah dari halaman bergabung yang kita perlukan ke konferensi.

Lalu saya periksa, menghapus parameter jaringan.protokol-handler.expose.conf sama sekali tidak mempengaruhi pengoperasian protokol di Fox. Tautannya terus berfungsi.

Kesimpulan

Saya telah mengunggah semua pekerjaan saya ke repositori GitHub; tautan ke semua sumber ada di akhir artikel.
Saya akan tertarik menerima masukan dari mereka yang ingin menggunakan karya saya. Saya harus segera mencatat bahwa saya melakukan semua pengembangan hanya untuk sistem Linux Mint saya, sehingga beberapa distribusi atau desktop lain mungkin tidak berfungsi di versi tersebut. Atau lebih tepatnya, saya bahkan hampir yakin akan hal ini, karena saya hanya menambal 1 fungsi di xdg-open yang hanya berhubungan dengan DE saya. Jika Anda ingin menambahkan dukungan untuk sistem atau desktop lain, tuliskan saya permintaan tarik di Github.

Seluruh proyek membutuhkan waktu 1 malam untuk diselesaikan.

Бсылки:

Sumber: www.habr.com

Tambah komentar