Hlavní navigace

Jabber - komunikačný protokol (5)

25. 8. 2004
Doba čtení: 4 minuty

Sdílet

Dnešná časť seriálu sa bude venovať manažmentu používateľských účtov. Začneme tiež s opisom InfoQuery paketov, ktoré používajú model request/response a umožňujú prenos akýchkoľvek štruktúrovaných dát.

V protokole XMPP nie je stanovené žiadne minimum funkcii, ktoré musí klient implementovať. Jabber klient môže byť veľmi jednoduchý – stačí, aby dokázal odpovedať na niektorú z prijatých správ. Môže byť tiež zložitý – ako klienti s grafickým UI. Otvorenosť protokolu umožňuje implementovať presne takú jeho časť, ktorú vyžaduje konkrétna aplikácia, a ignorovať zvyšok. Napr. klient s JID jabrss@jabber.at umožňuje zasielanie notifikácii o nových článkoch (získaných pomocou RSS) ako XMPP správy. Nie je potrebné, aby implementoval prácu s rosterom alebo blokovanie komunikácie.

Jabber je množina protokolov. Hlavnú časť tvoria XMPP Core a XMPP IM. Tieto sa v súčasnosti nachádzajú v schvaľovacom procese IETF. Okrem nich existujú tzv. JEP (Jabber Enhancement Proposals). Sú to dokumenty, ktoré rozširujú základný protokol. Líšia sa však stupňom akceptácie. Vývoj niektorých je ukončený, iné existujú ako koncepty a ďalšie sú nahradzované inými. Podobný spôsob rozširovania existuje aj v Jave.

Ak by ste hľadali referenčnú implementáciu týchto protokolov – niečo ako Amaya vo w3c – tak vedzte, že nič také zatiaľ neexistuje. Potrebu takejto implementácie si začínajú uvedomovať aj ľudia z jabber.org – ako vidieť z ich weblogov. Zatiaľ sa hovorí o pythone ako vhodnom jazyku na implementáciu.

Manažment používateľských účtov

Dnes si ukážeme, ako vytvoriť konto na Jabber serveri so zadaným JID. Protokol umožňuje klientom vytváranie vlastných kónt. Tu je príklad demonštrujúci vytvorenie aj zrušenie konta:

// pripojenie k XMPP serveru
XMPPConnection con = new XMPPConnection("jabber.sk");
// získanie manažéra používateľských účtov
AccountManager accMan = con.getAccountManager();
// je povolené vytvárať nové kontá?
if (accMan.supportsAccountCreation()) {
  // administrátor servera môže poskytovať informáciu pre nových používateľov
  System.out.println(accMan.getAccountInstructions());
  // vytvorenie používateľského účtu
  accMan.createAccount("geek", "heslo");
  // prihlásenie sa
  con.login("geek", "heslo");
  // zrušenie účtu, na ktorý sme prihlásení
  accMan.deleteAccount();
} 

Ak potrebujete mať manažment používateľov pod kontrolou, môžete túto vlastnosť na serveri zakázať a pridávať nových používateľov cez používateľské rozhranie servera – často editovaním databázy na serveri.

Element IQ podrobnejšie

Ďalej budeme pokračovať elementom IQ. Element IQ (infoquery) umožňuje poslať požiadavku inej entite a prijať od nej odpoveď. Môže obsahovať akýkoľvek iný element. Ten však musí mať riadne uvedený menný priestor (namespace). Menný priestor pomáha určiť význam prenášaných dát. Napr. vložením elementu query a určením menného priestoru na jabber:iq:roster žiadame server o zaslanie obsahu rosteru.

<iq from='psivak@jabber.sk' type='get' id='1'>
  <query xmlns='jabber:iq:roster'/>
</iq>

Jediným prípadom, keď vnútorný element nemusí mať uvedený menný priestor, je, ak ním je element <error>. Na druhej strane si môžeme vytvoriť aj vlastný menný priestor a prenášať tak údaje, ktoré si sami určíme.

ict ve školství 24

IQ môže obsahovať tieto atribúty:

  • to – určuje zamýšlaného príjemcu požiadavky (teda jeho JID). Ak IQ neobsahuje tento atribút, tak sa berie implicitne najbližšia entita. IQ paket sa napr. používa, keď server informuje klienta o spôsoboch autentizácie, ktoré podporuje. Vtedy sa atribút „to“ neuvádza, lebo server ešte nevie JID klienta.
  • from – určuje odosielateľa IQ paketu. Podobne ako pri atribúte „to“ aj pri tomto atribúte sú situácie, keď jeho uvedenie nemá zmysel. Možno niekoho napadne vydávať sa za iného používateľa napísaním cudzieho JIDu do atribútu „from“. Kým v protokole SMTP to je možné, XMPP server musí skontrolovať, či obsah atribútu zodpovedá prihlásenej entite. A ak nezodpovedá, tak ho musí prepísať.
  • id – umožňuje spojiť odpoveď s požiadavkou. Pri odpovedaní musí entita použiť rovnaký id, ako bol uvedený v požiadavke. Obsahom atribútu môže byť akýkoľvek reťazec (samozrejme taký, ktorý povoluje XML v atribúte). Na zaistenie jedinečnosti je vhodné použiť náhodný generátor.
  • type – pomocou tohto atribútu entita rozlišuje požiadavku od odpovede. Možné hodnoty sú:

    • get – označuje paket so žiadosťou o dáta. Napr. klient zisťuje spôsoby autentizácie, ktoré server podporuje:

      <iq type='get' id='auth1'>
        <query xmlns='jabber:iq:auth'/>
      </iq>
    • set – označuje paket odosielajúci dáta na spracovanie. Napr. prihlásenie sa klienta (JEP-0078):

      <iq type='set' id='auth2'>
        <query xmlns='jabber:iq:auth'>
      
          <username>meno</username>
          <password>heslo</password>
          <resource>zdroj</resource>
        </query>
      
      </iq>
    • result – označuje paket, ktorý je odpoveďou na úspešné spracovanie požiadavky get alebo set.
    • error – označuje paket, ktorý je odpoveďou na neúspešné spracovanie alebo doručenie požiadavky get alebo set. Napr. ak sa pokúsime prihlásiť druhý krát, tak sa vráti chyba:

      <iq type="error" to="xy@jabber.sk " id="2" >
        <query xmlns="jabber:iq:auth"/>
        <error code="503" >Service Unavailable</error>
      
      </iq>

      Chybové kódy sú ako v protokole HTTP:

      302 Redirect
      400 Bad Request
      401 Unauthorized
      402 Payment Required
      403 Forbidden
      404 Not Found
      405 Not Allowed
      406 Not Acceptable
      407 Registration Required
      408 Request Timeout
      409 Conflict
      500 Internal Server Error
      501 Not Implemented
      502 Remote Server Error
      503 Service Unavailable
      504 Remote Server Timeout
      510 Disconnected

Záver

Cieľom dnešnej časti bolo predviesť pridávanie a odoberanie používateľských účtov pomocou Smacku a opísať teóriu okolo IQ paketov. Nabudúce budeme prenášať vlastné informácie prostredníctvom IQ paketov a povieme si niečo o Provider Architektúre v Smacku.