Automatska prijava na Lync konferencije na Linuxu

Hej Habr!

Za mene je ova fraza slična pozdravu svijete, budući da sam konačno došao do svoje prve objave. Dugo sam odgađala ovaj prekrasan trenutak, jer se nije imalo o čemu pisati, a isto tako nisam željela sisati nešto što je već hrpu puta sisano. Općenito, za svoju prvu publikaciju želio sam nešto originalno, korisno drugima i sadržavati neku vrstu izazova i rješavanja problema. I sada mogu ovo podijeliti. Sada razgovarajmo o svemu redom.

Ulazak

Sve je počelo kada sam prije nekog vremena skinuo Linux Mint na svoje radno računalo. Mnogima je vjerojatno poznato da je Pidgin sa dodatkom Sipe potpuno prikladna zamjena za Microsoft Lync (sada se zove Skype za posao) za Linux sustave. Zbog specifičnosti posla često moram sudjelovati na SIP konferencijama, a kad sam bio Windows radnik, ulazak na konferenciju je bio elementaran: dobijemo pozivnicu poštom, kliknemo na link za prijavu i spremni smo za polazak .

Prelaskom na mračnu stranu Linuxa sve se malo zakompliciralo: naravno, na konferencije se možete prijaviti i u Pidginu, ali za to morate odabrati opciju pridruživanja konferenciji u izborniku u svojstvima vašeg SIP računa i u prozor koji se otvori umetnite poveznicu na konferenciju ili unesite ime organizatora i konf. I nakon nekog vremena počeo sam razmišljati: "je li moguće ovo nekako pojednostaviti?" Da, mogli biste reći, zašto ti, dovraga, ovo treba? Radije bih sjedio na Windowsima i ne bi se razbijao.

1. korak: istraživanje

"Ako imate neki hir u glavi, ne možete ga izbiti kolcem", rekao je Nekrasov u svom djelu "Tko dobro živi u Rusiji".

Dakle, kad mi je ta misao sinula u glavi, nakon nekog vremena javila se prva ideja za realizaciju. Sve se činilo jednostavno - trebate presresti pristup poveznicama meet.company.com/user/confid — instalirajte proces lokalne web aplikacije na svoj automobil na 127.0.0.1 i u /etc/hosts dodajte statički unos za domenu tvrtke preko koje ulazite na konferenciju, pokazujući na localhost. Dalje, ovaj web poslužitelj mora obraditi vezu koja mu je došla i nekako je prenijeti unutar Pidgina (odmah ću reći da u ovoj fazi još nisam imao pojma kako mu je uopće dati). Rješenje, naravno, miriše na štake, ali mi smo programeri, štake nas ne plaše (sranje).

Onda sam slučajno nekako otvorio link pozivnice u Google Chromeu (a inače uvijek koristim Mozilla Firefox). I na moje iznenađenje, stranica je izgledala potpuno drugačije - nije bilo forme za unos korisničkih podataka, a odmah po ulasku na stranicu pojavio se zahtjev za otvaranjem nečega preko xdg otvorenom. Samo radi zabave, kliknem “da” i pojavi se poruka o pogrešci - poveznica lync15:confjoin?url=https://meet.company.com/user/confid ne može se otvoriti. Hmm. Kakav je ovo xdg-open i što mu treba da bi se takvi linkovi otvarali? Post mortem čitanje dokumentacije otkrilo je da se radi o GUI rukovatelju koji pomaže u pokretanju povezanih aplikacija bilo s protokolima za uri shemu ili s određenim vrstama datoteka. Asocijacije se konfiguriraju putem preslikavanja mime tipa. Dakle, vidimo da pokrećemo pretragu za podudarnom aplikacijom za uri shemu pod nazivom lync15 a link se prosljeđuje xdg-open-u, koji bi ga onda, u teoriji, trebao proslijediti nekoj aplikaciji koja je odgovorna za ovu vrstu linka. Što, naravno, nemamo u našem sustavu. Ako ne, što onda rade u svijetu otvorenog koda? Tako je, sami ćemo napisati.

Daljnje uranjanje u svijet Linuxa, a posebno u proučavanje kako radi grafička ljuska (stolno okruženje, DE), usput, imam Xfce u Linux Mintu, pokazalo je da su aplikacije i mime-tipovi povezani s njima obično napisani izravno u datoteke prečaca s nastavkom .desktop. Pa, zašto ne, kreiram jednostavan prečac aplikacije, koji bi trebao jednostavno pokrenuti bash skriptu i ispisati argument koji joj je proslijeđen na konzolu, dajem samo samu datoteku prečaca:

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

Pokrenem xdg-open s konzole, proslijeđujem isti link koji dolazi iz preglednika i... šteta. Opet piše da ne može obraditi vezu.

Ispostavilo se da nisam ažurirao direktorij povezanih mime tipova sa svojom aplikacijom. To se radi jednostavnom naredbom:

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

koji jednostavno uređuje datoteku ~/.config/mimeapps.list.

Pokušaj broj 2 s pozivom xdg-open - i opet neuspjeh. Ništa, poteškoće nas ne plaše, već samo potpiruju naš interes. I naoružani svom snagom bash-a (tj. praćenja), uranjamo s glavom u otklanjanje pogrešaka. Ovdje je važno napomenuti da je xdg-open samo shell skripta.

bash -x xdg-open $url

Analizom izlaza nakon praćenja postaje pomalo jasno na što se tada prenosi kontrola egzo-otvoren. A ovo je već binarna datoteka i teže je razumjeti zašto vraća neuspješan povratni kod kada prosljeđuje vezu na nju u argumentu.

Nakon što sam pregledao unutrašnjost xdg-open-a, otkrio sam da analizira različite parametre okoline i prosljeđuje kontrolu dalje bilo nekim alatima za otvaranje veza datoteka specifičnih za određeni DE, ili ima rezervnu funkciju 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
}

Ovdje ću brzo ugraditi mali hack s analizom proslijeđenog argumenta i nalazi li se tamo naš specifični podstring lync15:, tada odmah prenosimo kontrolu na funkciju open_generic.

Pokušaj broj 3 i mislite li da je uspio? Da, sada, naravno. Ali poruka o pogrešci se već promijenila, ovo je već napredak - sada mi je govorio da datoteka nije pronađena i u obliku datoteke napisao mi je istu poveznicu koja je prošla kao argument.

Ovaj put se pokazalo da je to funkcija je_url_datoteke_ili_staza, koji analizira vezu datoteke proslijeđenu na ulaz: file:// ili put do datoteke ili nešto drugo. A provjera nije radila ispravno zbog činjenice da naš prefiks (url shema) ima brojeve, a regularni izraz provjerava samo skup znakova koji se sastoji od :alpha: točkica i crtica. Nakon savjetovanja sa standardom rfc3986 za jedinstveni identifikator izvora Postalo je jasno da ovaj put Microsoft ne krši ništa (iako sam imao takvu verziju). Samo klasa znakova :alpha: sadrži samo slova latinične abecede. Brzo mijenjam redovnu provjeru u alfanumeričku. Gotovo, fantastični ste, sve konačno počinje, kontrolu nakon svih provjera daje naša skript aplikacija, naš link se prikazuje na konzoli, sve je kako treba. Nakon ovoga počinjem sumnjati da su svi problemi s exo-openom također uzrokovani validacijom formata veze zbog brojeva u shemi. Kako bih testirao hipotezu, mijenjam registraciju mime tipa aplikacije u samo shemu Lync i voila - sve radi bez nadjačavanja funkcije open_xfce. Ali to nam nikako neće pomoći jer web stranica za ulazak na konferenciju stvara poveznicu s lync15.

Dakle, prvi dio putovanja je završen. Znamo kako presresti poziv veze i onda ga treba nekako obraditi i proslijediti unutar Pidgina. Kako bih razumio kako interno funkcionira prilikom unosa podataka putem poveznice u izborniku "pridruži se konferenciji", klonirao sam Git repozitorij Sipe projekta i pripremio se ponovno zaroniti u kod. No tada su me, srećom, privukli scenariji iz kataloga doprinos/dbus/:

  • sipe-join-conference-with-uri.pl
  • sipe-pridružiti se-konferenciji-s-organizatorom-i-id.pl
  • sipe-poziv-telefonski-broj.pl
  • SipeHelper.pm

Ispostavilo se da je Sipe plugin dostupan za interakciju putem dbus-a (desktop bus) i unutar skripti postoje primjeri pridruživanja konferenciji putem linka, bilo preko imena organizatora i conf-id-a, ili možete inicirati poziv putem sip-a . To je upravo ono što nam je nedostajalo.

Korak 2. Implementacija rukovatelja automatskim spajanjem

Budući da u Pearlu postoje gotovi primjeri, odlučio sam samo koristiti sipe-join-conference-with-uri.pl i malo ga modificirajte kako vama odgovara. Mogu pisati u Pearlu, tako da nije izazvalo nikakve posebne poteškoće.

Nakon zasebnog testiranja skripte, zapisao sam njen poziv u datoteku lync.desktop. I to je bila pobjeda! Prilikom ulaska na stranicu za pridruživanje konferenciji i dopuštanja pokretanja xdg-open-a automatski bi se otvorio skočni prozor konferencije iz Pidgin-a. Kako sam se radovao.
Ohrabren uspjehom, odlučio sam učiniti isto za svoj glavni preglednik, Mozilla Firefox. Kada se ulogirate preko lisice otvara vam se stranica za autorizaciju i na samom dnu je tipka pridružite se pomoću uredskog komunikatora. Ona je bila ta koja je privukla moju pozornost. Kada kliknete na nju u pregledniku, ona ide na adresu:

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

na što mi on ljubazno kaže da ga ne zna otvoriti, a možda i nemam pridruženu aplikaciju za takav protokol. Pa ovo smo već prošli.

Brzo registriram svoju skriptnu aplikaciju i za uri shemu conf i... ništa se ne događa. Preglednik se stalno žali da ne postoji aplikacija koja obrađuje moje veze. U ovom slučaju, pozivanje xdg-open s konzole s parametrima radi savršeno.

"Postavi prilagođeni rukovatelj protokolom u firefoxu" - otišao sam na internet s ovim pitanjem. Nakon nekoliko rasprava o stackoverflowu (a gdje bismo bez njega), čini se da je odgovor pronađen. Morate stvoriti poseban parametar u about: config (naravno zamjenom foo sa conf):

network.protocol-handler.expose.foo = false

Kreiramo ga, otvorimo link i... nema te sreće. Preglednik, kao da se ništa nije dogodilo, kaže da ne poznaje našu aplikaciju.

Čitam službenu dokumentaciju o registraciji protokola od Mozille, postoji opcija registracije asocijacija u samom gnome desktopu (zamjena foo sa conf, naravno):

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

Registriram se, otvorim browser... i opet brada.

Ovdje mi upada u oči redak iz dokumentacije:

Sljedeći put kada kliknete na poveznicu tipa protokola foo bit ćete upitani s kojom aplikacijom je želite otvoriti.

— Semjon Semenih
- Ahh

Ne kliknemo na poveznicu, već web stranica jednostavno promijeni window.location putem javascripta. Napišem jednostavnu html datoteku s vezom na conf protokol, otvorim je u pregledniku, kliknem na vezu - Yos! Otvara nam se prozor s pitanjem u kojoj aplikaciji trebamo otvoriti naš link, a tu već imamo našu Lync aplikaciju na listi – pošteno smo je registrirali na sve moguće načine. Također postoji potvrdni okvir u prozoru "zapamti izbor i uvijek otvori poveznice u našoj aplikaciji", označite ga i kliknite OK. I ovo je druga pobjeda - otvara se konferencijski prozor. Istodobno, otvaranje konferencija funkcionira ne samo kada kliknete na poveznicu, već i kada prijeđete sa stranice za pridruživanje koja nam je potrebna na konferenciju.

Zatim sam provjerio, izbrisao parametre network.protocol-handler.expose.conf nije ni na koji način utjecao na rad protokola u Foxu. Veze su nastavile raditi.

Zaključak

Učitao sam sav svoj rad u repozitorij GitHub; poveznice na sve resurse bit će na kraju članka.
Zanimat će me povratne informacije od onih koji žele koristiti moj rad. Moram odmah napomenuti da sam sav razvoj radio samo za svoj Linux Mint sustav, tako da neke druge distribucije ili stolna računala možda neće raditi u toj verziji. Ili bolje rečeno, čak sam gotovo siguran u ovo, jer sam zakrpao samo 1 funkciju u xdg-open koja se odnosi samo na moj DE. Ako želite dodati podršku za druge sustave ili stolna računala, pišite mi zahtjeve za povlačenjem na Githubu.

Cijeli je projekt trajao 1 večer.

reference:

Izvor: www.habr.com

Dodajte komentar