Jabber

<message type="chat" id="4711" to="upplysning@lysator.liu.se/Visionen" ><body>
Jabber - en öppen standard för instant messaging
</body></message>

27/9 2005

Karl-Johan Karlsson

creideiki@lysator.liu.se

$Id: presentation.xhtml 16 2005-09-27 14:53:03Z creideiki $

$HeadURL: https://www.ferretporn.se/subversion/upplysning/trunk/presentation.xhtml $

Presentation

Jabber på 30 sekunder

Jabber är ett instant messaging-nätverk.

Protokollet

XMPP (Extensible Messaging and Presence Protocol)
Flera RFC:er, för olika delar av protokollet.
  • XMPP Core - XML, autentisering, routing
  • XMPP IM - meddelanden, status
  • XMPP CPIM - översättning till Common Presence and Instant Messaging
  • XMPP E2E - end-to-end signing and encryption
JEP - Jabber Enhancement Proposals
End-to-end-kryptering (2 st), filöverföring (5 st), RSS-workalike (pubsub), typing notification, fleranvändarsamtal, ...

XMPP Core

RFC 3920
Strömmande XML
Inte XML "på riktigt", eftersom hela dokumentet inte är tillgängligt. Parsing sker en "stanza" åt gången.
Routing
Autentisering
Klartextlösenord eller SASL
Transportkryptering
TLS, antingen på egen port eller med STARTTLS

Identifiering

Identifierare: Jabber-ID, JID
<nod>@<domän>/<resurs>
Resurser identifierar (oftast) klienter
Avsändaren väljer resurs
creideiki@lysator.liu.se/~
Se upp - det finns klienter som inte väljer på samma sätt som servern
Mottagande server väljer resurs
creideiki@lysator.liu.se
Mottagaren specificerar en prioritet för varje resurs, servern väljer den bästa
Servern är mottagare
lysator.liu.se
Inloggning, hantering av kontaktlistor
Nod och resurs tolkas av servern
Oftast identifierar noden en användare och resursen en klient, men t.ex. MUC använder <rum>@<server>/<deltagare>

Routing

Ganska likt e-post
Plocka ut domänen ur mottagarens JID, slå upp SRV-post, skicka, mottagarens server bryr sig om detaljerna
SRV-poster
_xmpp-client._tcp
Klient-till-server. För TLS utan STARTTLS, addera 1 till portnumret. Mycket dåligt klientstöd.
_xmpp-server._tcp
Server-till-server
_jabber._tcp
Server-till-server (gammalt protokoll), samma innehåll som _xmpp-server
A-post på zonapex
Sista utvägen för klienter som inte kan SRV och inte kan specificera servernamn. Rekommenderas inte
Max en uppkoppling per serverpar
Persistens rekommenderas
Hopp-till-hopp-säkerhet: TLS, SASL
... men ingen server stöder det

Inloggning

<?xml version="1.0"?>
<stream:stream xmlns:stream="http://etherx.jabber.org/streams"
               xmlns="jabber:client" to="ferretporn.se">
<?xml version='1.0'?>
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'
               id='2344544537' from='ferretporn.se' xml:lang='en'>
<iq type="get" id="auth_1" to="ferretporn.se" >
   <query xmlns="jabber:iq:auth">
   <username>upplysning2</username>
   </query>
</iq>
<iq from="ferretporn.se" type="result" id="auth_1" >
   <query xmlns="jabber:iq:auth">
      <username>upplysning2</username>
      <password/>
      <digest/>
      <resource/>
   </query>
</iq>
<iq type="set" id="auth_2" to="ferretporn.se" >
   <query xmlns="jabber:iq:auth">
      <username>upplysning2</username>
      <digest>90bbb3b267e579574cc94a1f97c32d22c0dab76f</digest>
      <resource>~</resource>
   </query>
</iq>
<iq from="ferretporn.se" type="result" id="auth_2" />

Ett litet exempel - Nätverkslayout

Ett litet exempel - Inloggning

Ett litet exempel - Meddelande

Ett litet exempel - Inloggning (igen)

Ett litet exempel - Meddelande genom transport

XMPP IM

Status och meddelande

<presence from="upplysning1@ferretporn.se/~" to="upplysning2@ferretporn.se/~">
   <priority>7</priority>
   <c xmlns="http://jabber.org/protocol/caps" node="http://psi.affinix.com/caps"
      version="0.9.3-gentoo-r3" />
</presence>
<message type="chat" id="aabba" to="upplysning1@ferretporn.se" >
   <body>Foobar.</body>
</message>
<presence from="upplysning1@ferretporn.se/Peepoe" to="upplysning2@ferretporn.se/~">
   <show>xa</show>
   <status>Håller UppLYSning.</status>
   <priority>5</priority>
   <c xmlns="http://jabber.org/protocol/caps" node="http://psi.affinix.com/caps"
      version="0.9.3-gentoo-r4" />
</presence>

Filter

Subscription
Bestämmer vart sändande server skall skicka status, och varifrån mottagande server skall ta emot status
Privacy lists
Filter
  • Avsändare: resurs, användare, domän
  • Tidigare status: finns i mottagarens kontaktlista, finns i en viss grupp, har subscription
  • Meddelandetyp: inkommande status, utgående status, protokollinformation, meddelande
  • Skönsvärde
Listhantering
  • Sparas på servern
  • Standardlista
  • Välj lista per session
Inget klientstöd för privacy lists
Har du en klient som kan hantera rå XML kan du läsa RFC 3921, kapitel 10, och skriva själv

Transporter

Service discovery

Fråga servern vad den känner till för andra specialservrar
Transporter, vCard-sökningar, ...
Kan missbrukas till att bli ett admingränssnitt
Demo

Filöverföring

In-band (JEP 47)
Skickar Base64-kodad data i XML-strömmen
SOCKS5 (JEP 65)
Den som vill skicka säger "Koppla upp dig hit och prata SOCKS5"
Out-of-band (JEP 66)
Skickar en URL till datat
Stream initiation (JEP 95)
Protokoll för att förhandla fram vilket sätt som skall användas
File transfer (JEP 96)
Profil av SI

Klienter

Kan vara relativt dumma och överlämna det mesta till servern
Men de flesta JEP:ar kräver extra intelligens i klienten
Det mesta tillståndet sparas på servern mellan sessioner
Kontaktlistor, privacy lists, prenumerationsstatus. Dock inte historia (fast det finns en JEP)
Finns för de flesta miljöer
Psi (Qt), Kopete (KDE), Gaim (GTK+), Miranda (Win32), jabber.el (elisp), CenterICQ (ncurses), JWChat (webbläsare), Mac OS X, J2ME, Symbian, Amiga, ...
Mycket stora skillnader i protokollstöd
Psi verkar ha bäst stöd just nu, men inte ens den stöder hela XMPP Core

Servrar

Finns ett flertal, både fria och proprietära
Fria huvudalternativ: ejabberd och jabberd
Lysator kör ejabberd, främst för att när servern sattes upp hade jabberd 1 bitröta och jabberd 2 var vapourware
Proprietära servrar har features som företag sägs behöva
Lagring och spårning av alla meddelanden, automatisk tilläggning av kontakter på användares kontaktlistor, broadcastmeddelanden

Att driva en server

Nätverk: ungefär som en mailserver
Servern behöver veta vilken domän den har hand om, en SRV-post skall in i DNS
Lagring av konfiguration, kontaktlistor och offlinemeddelande
Som standard använder ejabberd Mnesia (distribuerad databas, standard i Erlang) och jabberd platta XML-filer. Båda kan använda SQL-databaser istället
Autentisering
Har varit ett problemområde förr, men blir bättre. jabberd 2 kan PAM, ejabberd har ett eget protokoll för att prata med externa autentiseringsmoduler (Lysator har en för att autentisera mot IMAP)
Extramoduler
Fleranvändarsamtal, användarsökning, transporter, ...

Jabber på Lysator

Mer information

http://www.xmpp.org/
Protokollstandarder: RFC:er, internet-drafts, XML schemas.
http://www.jabber.org/
Jabber Software Foundation: Information om Jabber-nätverket, listor över klienter och servrar, kod.
http://www.jabber.org/jeps/jeplist.shtml
Jabber Enhancement Proposals
LysKOM
möte 13164: Jabber (-) erfarenhetsutbyte (både servrar och klienter)
http://ejabberd.jabber.ru/
ejabberd, servern som Lysator kör
http://psi.affinix.com/
Psi, Qt-klient