Automatska prijava na Lync konferencije na Linuxu

Hej Habr!

Za mene je ova fraza slična hello world, pošto sam konačno stigao do svoje prve publikacije. Dugo sam odgađala ovaj divan trenutak, jer se nije imalo o čemu pisati, a nisam ni htela da sisam nešto što je već hrpu puta usisano. Općenito, za svoju prvu publikaciju želio sam nešto originalno, korisno za druge i koje sadrži neku vrstu izazova i rješavanja problema. I sada mogu podijeliti ovo. Hajde sada o svemu po redu.

ulazak

Sve je počelo kada sam prije nekog vremena skinuo Linux Mint na svoj radni računar. Mnogi ljudi vjerovatno znaju da je Pidgin sa dodatkom Sipe potpuno prikladna zamjena za Microsoft Lync (sada se zove Skype for business) za Linux sisteme. Zbog specifičnosti mog posla često moram da učestvujem na SIP konferencijama, a kada sam bio Windows radnik, ulazak u konferencije je bio elementaran: primimo pozivnicu poštom, kliknemo na link za prijavu i spremni smo za rad. .

Prelaskom na tamnu stranu Linuxa, sve je postalo nešto složenije: naravno, možete se prijaviti i na konferencije u Pidgin-u, ali da biste to učinili potrebno je u izborniku u svojstvima vašeg SIP računa odabrati opciju pridruži se konferenciji i u prozoru koji se otvori ubacite link do konferencije ili unesite naziv organizatora i conf id. I nakon nekog vremena počeo sam razmišljati: "da li je moguće to nekako pojednostaviti?" Da, mogli biste reći, zašto vam je dođavola ovo potrebno? Radije bih sjedio na Windows-u i ne bih se razbijao.

Korak 1: Istraživanje

„Ako ti padne neki hir u glavu, ne možeš ga izbiti kolcem“, rekao je Nekrasov u svom delu „Ko dobro živi u Rusiji“.

Dakle, kada mi je ta misao pala u glavu, nakon nekog vremena pojavila se prva ideja za implementaciju. Sve je izgledalo jednostavno - morate presresti pristup vezama 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 domen kompanije preko kojeg ulazite u konferenciju, pokazujući na localhost. Zatim, ovaj web server mora obraditi link koji je došao do njega i nekako ga prenijeti unutar Pidgin-a (odmah ću reći da u ovoj fazi još uvijek nisam imao pojma kako mu ga 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 za pozivnicu u Google Chrome-u (a obično uvijek koristim Mozilla Firefox). I na moje iznenađenje, web stranica je izgledala potpuno drugačije - nije postojao obrazac za unos korisničkih podataka i odmah po ulasku na stranicu je bio zahtjev da se nešto otvori preko xdg-otvoren. Čisto iz zabave, kliknem “da” i pojavi se poruka o grešci - link lync15:confjoin?url=https://meet.company.com/user/confid ne može se otvoriti. Hmm. Kakav je ovo xdg-open i šta mu je potrebno da bi se takvi linkovi otvarali? Čitanje dokumentacije nakon smrti otkrilo je da je to GUI rukovalac koji pomaže u pokretanju povezanih aplikacija bilo s protokolima za uri shemu ili sa određenim tipovima datoteka. Asocijacije se konfigurišu putem mapiranja tipa mime. Dakle, vidimo da pokrećemo pretragu za odgovarajućom aplikacijom za uri šemu pod nazivom lync15 a veza se prosljeđuje na xdg-open, koji bi je onda, u teoriji, trebao proslijediti nekoj aplikaciji koja je odgovorna za ovu vrstu veze. Koje, naravno, nemamo u našem sistemu. Ako ne, šta onda rade u svijetu otvorenog koda? Tako je, sami ćemo napisati.

Dalje uranjanje u svijet Linuxa i posebno u proučavanje načina rada grafičke ljuske (desktop okruženje, DE), inače, imam Xfce u Linux Mint-u, pokazalo je da se aplikacije i mime-tip koji je povezan s njim obično pišu direktno u datoteke prečica sa ekstenzijom .desktop. Pa, zašto ne, ja kreiram jednostavnu prečicu aplikacije, koja bi jednostavno trebala pokrenuti bash skriptu i izbaciti argument koji mu je proslijeđen na konzolu, pružam samo samu datoteku prečice:

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

Pokrećem xdg-open sa konzole, prosleđujući isti link koji dolazi iz pretraživača i... sranje. Opet kaže da ne može obraditi vezu.

Kako se ispostavilo, nisam ažurirao direktorij povezanih mime tipova sa svojom aplikacijom. Ovo se radi jednostavnom komandom:

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

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

Pokušaj broj 2 sa xdg-open pozivom - i opet neuspjeh. Ništa, teškoće nas ne plaše, već samo podstiču naše interesovanje. I naoružani svom snagom bash-a (tj. praćenja), zaronimo glavom u otklanjanje grešaka. Ovdje je važno napomenuti da je xdg-open samo shell skripta.

bash -x xdg-open $url

Analizirajući izlaz nakon praćenja postaje malo jasno na šta se onda prenosi kontrola exo-open. 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.

Pregledavši unutrašnjost xdg-open-a, otkrio sam da on analizira različite parametre okruženja i dalje prosljeđuje kontrolu bilo nekim alatima za otvaranje veza datoteka specifičnih za određeni DE, ili ima zamjensku 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 hak s analizom proslijeđenog argumenta i ako se tu nalazi naš specifični podniz 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 grešci se već promijenila, ovo je već napredak - sada mi je govorio da datoteka nije pronađena i u obliku datoteke mi je napisao isti link koji je prošao kao argument.

Ovaj put se pokazalo da je to bila funkcija is_file_url_or_path, koji analizira vezu datoteke proslijeđenu na ulaz: file:// ili putanju do datoteke ili nešto drugo. I provjera nije radila ispravno zbog činjenice da naš prefiks (url shema) ima brojeve, a regularni izraz samo provjerava skup znakova koji se sastoji od :alpha: tačaka i crtica. Nakon konsultacije sa standardom rfc3986 za uniformni identifikator resursa Postalo je jasno da ovaj put Microsoft ništa ne krši (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, konačno sve počinje, kontrola nakon svih provjera je data našoj skript aplikaciji, naš link je prikazan na konzoli, sve je kako treba. Nakon ovoga počinjem da sumnjam da su svi problemi sa exo-open-om takođe posledica validacije formata veze zbog brojeva u šemi. Da bih testirao hipotezu, mijenjam registraciju aplikacije mime u samo šemu ris i voila - sve radi bez poništavanja funkcije open_xfce. Ali to nam nikako neće pomoći, jer web stranica za ulazak u konferenciju kreira vezu sa lync15.

Dakle, prvi dio putovanja je završen. Znamo kako presresti link poziv i onda ga treba nekako obraditi i proslijediti unutar Pidgin-a. Da bih razumio kako interno funkcionira kada unosite podatke putem linka u meniju „pridruži se konferenciji“, klonirao sam Git repozitorij projekta Sipe i spremio se da ponovo zaronim u kod. Ali onda su me, srećom, privukli scenariji u katalogu doprinos/dbus/:

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

Ispostavilo se da je dodatak Sipe 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 pokrenuti poziv putem sip-a . To je upravo ono što nam je nedostajalo.

Korak 2. Implementacija rukovatelja automatskog spajanja

Pošto u Pearlu postoje gotovi primjeri, odlučio sam samo koristiti sipe-join-conference-with-uri.pl i modifikujte ga malo kako vam odgovara. Mogu pisati na Pearl-u, tako da to nije izazvalo neke posebne poteškoće.

Nakon zasebnog testiranja skripte, upisao sam njen poziv u datoteku lync.desktop. I to je bila pobjeda! Kada uđete na stranicu konferencije za pridruživanje i dozvolite da se pokrene xdg-open, iskačući prozor konferencije iz Pidgin-a će se automatski otvoriti. Kako sam se radovao.
Ohrabren uspjehom, odlučio sam da uradim isto za svoj glavni pretraživač, Mozilla Firefox. Kada se prijavite preko foxa, otvara se stranica za autorizaciju i na samom dnu nalazi se dugme pridružite se koristeći uredski komunikator. Ona je bila ta koja je privukla moju pažnju. Kada kliknete na njega u pretraživaču, 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 ne zna kako da ga otvori i, možda, nemam pridruženu aplikaciju za takav protokol. Pa, već smo prošli kroz ovo.

Brzo registrujem svoju skript aplikaciju i za uri šemu conf i... ništa se ne dešava. Pregledač se stalno žali da ne postoji aplikacija koja obrađuje moje veze. U ovom slučaju, pozivanje xdg-open sa konzole sa parametrima radi savršeno.

“Podesi prilagođeni rukovalac protokola u firefox-u” - otišao sam na internet s ovim pitanjem. Nakon što smo prošli kroz nekoliko diskusija o stackoverflow-u (i gdje bismo bili bez njega), čini se da je odgovor pronađen. Morate kreirati poseban parametar u o: konfiguraciji (naravno zamjena foo sa conf):

network.protocol-handler.expose.foo = false

Kreiramo ga, otvaramo link i... nema sreće. Pretraživač, kao da se ništa nije dogodilo, kaže da ne poznaje našu aplikaciju.

Čitam zvaničnu dokumentaciju o registraciji protokola od Mozille, postoji opcija registracije asocijacija u samom desktopu gnome (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

Registrujem se, otvaram pretraživač... i opet brada.

Ovdje mi upada u oči red iz dokumentacije:

Sljedeći put kada kliknete na link foo tipa protokola, bit ćete upitani s kojom aplikacijom da ga otvorite.

— Semjon Semenjič
- Ahh

Ne kliknemo na link, već web stranica jednostavno mijenja window.location putem javascripta. Napišem jednostavnu html datoteku sa vezom na conf protokol, otvorim je u pretraživaču, kliknem na link - Yos! Otvara se prozor sa pitanjem u kojoj aplikaciji treba da otvorimo naš link i tu već imamo našu Lync aplikaciju na listi - pošteno smo je registrovali na sve moguće načine. Tamo u prozoru postoji potvrdni okvir „zapamti izbor i uvijek otvaraj linkove u našoj aplikaciji“, označite ga, kliknite na ok. I ovo je druga pobjeda - otvara se prozor konferencije. U isto vrijeme, otvaranje konferencija funkcionira ne samo kada kliknete na link, već i kada pređete sa stranice za pridruživanje koja nam je potrebna na konferenciju.

Onda sam provjerio, brišući parametre network.protocol-handler.expose.conf ni na koji način nije uticalo na rad protokola u Foxu. Veze su nastavile da rade.

zaključak

Učitao sam sav svoj rad u GitHub spremište; veze do svih resursa biće na kraju članka.
Biću zainteresovan da dobijem povratne informacije od onih koji žele da koriste moj rad. Odmah moram napomenuti da sam sav razvoj radio samo za svoj Linux Mint sistem, tako da neke druge distribucije ili desktop računari možda neće raditi u toj verziji. Ili bolje rečeno, čak sam skoro siguran u ovo, jer sam zakrpio samo 1 funkciju u xdg-open koja se odnosi samo na moj DE. Ako želite da dodate podršku za druge sisteme ili desktope, napišite mi zahtjeve za povlačenjem na Github.

Za završetak cijelog projekta trebalo je jedno veče.

Reference:

izvor: www.habr.com

Dodajte komentar