« Introduction au protocole Jabber » : différence entre les versions

De Wiki JabberFR
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
m (a déplacé Introduction au protocole XMPP vers Introduction au protocole Jabber en écrasant sa redirection: Annulation des modifications 11272 de Neustradamus (discussion))
 
(18 versions intermédiaires par 8 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
{| style="border:1px #000000 dashed; width:100%; padding:1px; text-align:center; background:#feffd5;"
==Introduction==
| Cet article est une copie du wikibook : [http://fr.wikibooks.org/wiki/Communiquer_avec_un_Serveur_Jabber Communiquer avec un Serveur Jabber].
|}
=Introduction=


Ce livre a pour but de vous expliquer comment communiquer avec un serveur Jabber pour la création d'un client. Il n'a pas pour but de montrer des lignes de programmations mais seulement de vous expliquer les échanges entre le client et le serveur.
Ce livre a pour but de vous expliquer comment communiquer avec un serveur Jabber pour la création d'un client. Il n'a pas pour but de montrer des lignes de programmations mais seulement de vous expliquer les échanges entre le client et le serveur.
Ligne 11 : Ligne 8 :
Nous considérons également que vous connaissez déjà Jabber, en cas de doute, vous pouvez consulter [http://fr.wikipedia.com/wiki/Jabber Wikipedia:Jabber].
Nous considérons également que vous connaissez déjà Jabber, en cas de doute, vous pouvez consulter [http://fr.wikipedia.com/wiki/Jabber Wikipedia:Jabber].


Les indentations ne sont ici que pour faciliter la lisibilité des exemples, elles ne sont pas obligatoires. Vous pourrez facilement tester ces exemples grace à une session telnet sur un serveur Jabber : telnet jabber.org 5222
Les indentations ne sont ici que pour faciliter la lisibilité des exemples, elles ne sont pas obligatoires. Vous pourrez facilement tester ces exemples grâce à une session telnet sur un serveur Jabber : telnet jabber.org 5222


=Les bases=
==Les bases==


Ce chapitre regroupe les actions élementaires permettant de se connecter à un serveur jabber et de discuter avec ses contacts en connaissant leur status.
Ce chapitre regroupe les actions élementaires permettant de se connecter à un serveur jabber et de discuter avec ses contacts en connaissant leur status.


==Initialisation de la connexion==
===Initialisation de la connexion===


Notre client va envoyer ceci :
Notre client va envoyer ceci :


  <?xml version='1.0' encoding='UTF-8'?>
  <?xml version='1.0' encoding='UTF-8'?>
Les échanges entre le client et le serveur se font en XML. On peut également préciser l'encodage des caractères.
Les échanges entre le client et le serveur se font en XML. L'encodage des caractères doit être UTF-8<ref>http://xmpp.org/rfcs/rfc3920.html#xml-encoding</ref>.


  <stream:stream xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xmlns='jabber:client' to='jabber.org' >
  <stream:stream xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xmlns='jabber:client' to='jabber.org' >
On ouvre un "stream" qui sera ouvert tout au long de la connexion au serveur.
On ouvre un "stream" qui sera ouvert tout au long de la connexion au serveur.


Le client devra renseigner certains paramètres obligatoirement :
Le client devra renseigner certains paramètres obligatoirement<ref>Liste de tous les paramêtres de l'élément stream : http://xmpp.org/rfcs/rfc3920.html#streams-attr</ref> :


* xmlns='jabber:client' : indique au serveur que notre client est effectivement un client et non un serveur.
* xmlns='jabber:client' : indique au serveur que notre client est effectivement un client et non un serveur.
Ligne 35 : Ligne 32 :
et il est aussi conseillé de renseigner d'autres paramètres :
et il est aussi conseillé de renseigner d'autres paramètres :


* version : indique la version du protocol utilisé
* version : indique la version du protocole utilisé
* xml:lang : indique la langue utilisée par défaut
* xml:lang : indique la langue utilisée par défaut


Ligne 42 : Ligne 39 :
  <stream:stream xmlns='jabber:client' xml:lang='en' xmlns:stream='http://etherx.jabber.org/streams' from='jabber.org' id='166C34A3F3E91' >
  <stream:stream xmlns='jabber:client' xml:lang='en' xmlns:stream='http://etherx.jabber.org/streams' from='jabber.org' id='166C34A3F3E91' >


Mais s'il y a un problème, celui-ci peut aussi vous envoyer un message tel que : <stream:error>
Mais s'il y a un problème, celui-ci peut aussi vous envoyer un message tel que : <stream:error><ref>Liste des erreurs de flux possible : http://xmpp.org/rfcs/rfc3920.html#streams-error-conditions</ref>


==Identification==
===Identification===


Maintenant que nous sommes connectés au serveur, nous devons lui dire qui on est pour pouvoir discuter avec nos contacts.
Maintenant que nous sommes connectés au serveur, nous devons lui dire qui nous sommes pour pouvoir discuter avec nos contacts. Il existe pour cela deux méthodes. Celle que nous allons voir est là plus courante<ref>XEP 0078</ref>, cepandant elle est maintenant obsolète et est remplacé par une nouvelle, utilisant [[wikipedia:SASL|SASL]], qui est plus compliquée.


  <iq type="get" id="auth_1" to="jabber.org" >
  <iq type="get" id="auth_1" to="jabber.org" >
Ligne 68 : Ligne 65 :
  </iq>
  </iq>


Tous ces élements ne sont pas obligatoires, il est inutil de préciser à la fois password et digest.
Tous ces élements ne sont pas obligatoires, il est inutile de préciser à la fois password et digest.


On peut alors lui envoyer les informations pour s'identifier :
On peut alors lui envoyer les informations pour s'identifier :
Ligne 100 : Ligne 97 :




==Changer son Statut==
===Changer son Statut===


Pour le moment, on est certes identifié au serveur mais personne ne sait que vous êtes en ligne. Pour cela, vous devez simplement indiquer votre statut.
Pour le moment, on est certes identifié au serveur mais personne ne sait que vous êtes en ligne. Pour cela, vous devez simplement indiquer votre statut.
Ligne 111 : Ligne 108 :
  </presence>
  </presence>


Lorsqu'il n'y a pas les balises show et status cela veut dire qu'on se dit simplement en ligne. D'ailleurs en général, la première chose faite après l'identification est du type :
Lorsqu'il n'y a pas les balises show et status<ref>http://xmpp.org/rfcs/rfc3921.html#stanzas-presence-children</ref> cela veut dire qu'on se dit simplement en ligne. D'ailleurs en général, la première chose faite après l'identification est du type :


  <presence>
  <presence>
Ligne 146 : Ligne 143 :
* presence possède également la propriété type qui permet :
* presence possède également la propriété type qui permet :


- de se rendre invisible :  
- de se rendre invisible (cette fonctionnalité n'est pas standard mais est supportée par la plupart des serveurs) :  


  <presence type="invisible" />
  <presence type="invisible" />
Ligne 155 : Ligne 152 :




==Statut de ses contacts==
===Statut de ses contacts===


Il n'y a pas besoin de les demander au serveur, du moment où vous êtes en ligne, vous recevrez des messages de présence similaire à ceux que vous pourriez envoyer à la différence près que ceux-là contiennent une proprieté "from" (et "to" mais qui ne vous servira pas) :
Il n'y a pas besoin de les demander au serveur, du moment où vous êtes en ligne, vous recevrez des messages de présence similaire à ceux que vous pourriez envoyer à la différence près que ceux-là contiennent une proprieté "from" (et "to" mais qui ne vous servira pas) :
Ligne 166 : Ligne 163 :




==Récupérer la liste des contacts==
===Récupérer la liste des contacts===


Pour demander la liste de ses contacts, il faut envoyer :
Pour demander la liste de ses contacts, il faut envoyer<ref>http://xmpp.org/rfcs/rfc3921.html#roster-login</ref> :


  <iq type="get" id="aaab" >
  <iq type="get" id="aaab" >
Ligne 187 : Ligne 184 :
  </iq>
  </iq>


Attention, un contact peut appartenir à differents groupes ou aucun. Dans ces cas, vous aurez respectivement plusieurs balises <group> contenant les differents groupes auquel il appartient ou aucune balise <group>.


==Envoyer des messages==
===Envoyer des messages===


Il existe différents types de messages :
Il existe différents types de [[Message messages]]<ref>http://xmpp.org/rfcs/rfc3921.html#stanzas-message-type</ref> :


* chat : Le plus courrament employé, c'est celui de la messagerie instantanée, il est fait pour une conversation 2 à 2.
* chat : Le plus courrament employé, c'est celui de la messagerie instantanée, il est fait pour une conversation 1 à 1.
* error : Permet au serveur de vous envoyer un message d'erreur.
* error : Permet au serveur de vous envoyer un message d'erreur.
* groupchat : Utile pour une conversation à plusieurs.
* groupchat : Utilisé pour les conversations à plusieurs.
* headline : Permet au serveur d'envoyer des informations.
* headline : Permet au serveur d'envoyer des informations.
* normal : Envoit un message similaire à un email (sujet et message)
* normal : Envoit un message similaire à un email (sujet et message)
Ligne 210 : Ligne 208 :
  </message>
  </message>


====Envoyer une notification de frappe ([http://www.jabber.org/jeps/jep-0022.html JEP-0022])====
====Envoyer une notification de frappe (XEP 22)====


Pour cela c'est très simple, il suffit d'envoyer un message qui ne contient pas <body> mais :
Pour cela c'est très simple, il suffit d'envoyer un message qui ne contient pas <body> mais :
Ligne 237 : Ligne 235 :
Ceci a pour effet d'annuler la première information indiquant que Roméo est en train d'écrire.
Ceci a pour effet d'annuler la première information indiquant que Roméo est en train d'écrire.


=Gestion des contacts=
 
 
==== Envoyer du texte en XHTML (XEP 71) ====
 
Pour le moment, vous ne savez qu'envoyer des messages texte... Donc vous ne pouviez pas changer de police, de couleur d'écriture etc. Et bien c'est ce que nous allons voir maintenant grace à la possibilité d'envoyer des messages en XHTML.
 
Exemple simple :
 
<message to="toto@jabber.org" type="chat">
  <body>Salut !</body>
  &lt;html xmlns='http://jabber.org/protocol/xhtml-im'>
    &lt;body xmlns='http://www.w3.org/1999/xhtml'>
      &lt;p style='font-weight:bold'>Salut !&lt;/p>
    &lt;/body>
  &lt;/html>
</message>
 
Vous retrouvez des éléments identiques à l'envoi d'un message en texte simple : <body>Salut !</body> . En effet, cela permet aux clients qui ne gèrent pas cette fonctionnalité d'afficher le message quand même.
Le message est ensuite répété en XHTML.
 
Vous pouvez aller consulter les attributs de chaque balise directement dans la XEP. Regardez bien ceux qui sont obligatoires, recommandés et déconseillés.
 
À noter la possibilité d'insérer des images mais attention, des clients peuvent préférer afficher le contenu de l'attribut ''alt'' à la place de l'image.
 
Pour savoir si le client de votre contact supporte le XHTML, il suffit de lui demander ce qu'il supporte :
 
<iq type='get' from='toto@jabber.org/ecole' to='tintin@jabber.fr/lune' id='disco1'>
  <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>
 
Si le client le supporte, il vous le dira :
 
<iq type='result' from='toto@jabber.org/ecole' to='tintin@jabber.fr/lune' id='disco1'>
  <query xmlns='http://jabber.org/protocol/disco#info'>
      ...
      <feature var='http://jabber.org/protocol/xhtml-im'/>
      ...
  </query>
</iq>
 
===Enregistrement d'un nouveau compte (XEP 77)===
 
La connexion au serveur doit juste être initialisée mais vous n'avez pas à vous identifier (ce qui est logique).
 
Exemple d'enregistrement :
 
<iq type="set" to="server.org" id="aab0a" >
  <query xmlns="jabber:iq:register">
      <username>Login</username>
      <password>MotDePasse</password>
  </query>
</iq>
 
Ceci va créer un nouveau compte sur le serveur jabber "server.org" avec le pseudo "Login". Ainsi le JID de ce nouveau compte sera login@server.org.
L'attribut id permet de connaître la réponse du serveur, ce qui est très important ici mais il est facultatif. Tout le reste est obligatoire.
 
Exemple d'erreur :
 
<iq type='error' id='aab0a'>
  <query xmlns='jabber:iq:register'>
      <username>Login</username>
      <password>MotDePasse</password>
  </query>
  <error code='409'>Username Not Available</error>
</iq>
 
Exemple en cas de succès :
 
<iq type='result' id='aab0a'/>
 
 
===Fermeture d'un compte===
 
Si vous n'utilisez plus un compte jabber, vous pouvez décider de le supprimer.
 
Pour cela, il vous fait déjà être connecté et identifié avec votre mot de passe. Ensuite il suffit d'envoyer :
 
<iq type="set" to="server.org" id="aab0a" >
  <query xmlns="jabber:iq:register">
      <remove/>
  </query>
</iq>
 
 
==Gestion des contacts==


Jabber permet de gérer les contacts par une liste de contact stockée sur le serveur mais à cela se rajoute un système d'autorisation permettant d'accepter que tel ou tel contact puisse voir votre status.
Jabber permet de gérer les contacts par une liste de contact stockée sur le serveur mais à cela se rajoute un système d'autorisation permettant d'accepter que tel ou tel contact puisse voir votre status.


==Autorisations==
===Autorisations===


====Les différents niveaux d'autorisation====
====Les différents niveaux d'autorisation====
Ligne 289 : Ligne 371 :




==Gestion de la contact-liste==
===Gestion de la contact-list===


====Ajouter un contact====
====Ajouter un contact====
Ligne 310 : Ligne 392 :
  </iq>
  </iq>


En cas de succés, le serveur doit vous répondre quelque chose comme ceci :
En cas de succès, le serveur doit vous répondre quelque chose comme ceci :


  <iq to='toto@im.apinc.org/ecole' from='toto@im.apinc.org/ecole' type='result' id='ac90a'/>
  <iq to='toto@im.apinc.org/ecole' from='toto@im.apinc.org/ecole' type='result' id='ac90a'/>
Ligne 329 : Ligne 411 :




==Procédure complète pour une autorisation mutuelle==
===Procédure complète pour une autorisation mutuelle===


====Vous demandez en premier====
====Vous demandez en premier====


Ajout du contact dans la contact-liste :
Ajout du contact dans la contact-list :


  <iq type="set" id="ac90a" >
  <iq type="set" id="ac90a" >
Ligne 354 : Ligne 436 :


====Vous recevez une demande d'autorisation====
====Vous recevez une demande d'autorisation====
Ajout du contact dans la contact-liste :
<iq type="set" id="ac90a" >
  <query xmlns="jabber:iq:roster">
      <item jid="tintin@jabber.org" />
  </query>
</iq>


Vous demandez à votre tour une autorisation :
Vous demandez à votre tour une autorisation :
Ligne 364 : Ligne 454 :


[reception d'une autorisation]
[reception d'une autorisation]
== Fonctionnalités Avancés ==
=== Informations sur le Client (XEP 92) ===
La XEP 92 permet de demander des informations supplémentaires sur les logiciels utilisés par vos contacts. On peut récuperer 3 informations qui sont le nom, la version et le système d'exploitation sur lequel celui ci tourne.
Pour demander, c'est très simple. Mais vous devrez spécifier la ressource.
<iq type="get" to="toto@jabber.org/ecole" id="version_1" >
  <query xmlns="jabber:iq:version" />
</iq>
Si le client peut lui répondre, alors vous recevrez une réponse, par exemple :
<iq from="toto@jabber.org/ecole" type="result" to="tintin@im.apinc.org/lune" id="version_1" >
  <query xmlns="jabber:iq:version">
      <name>Psi</name>
      <version>0.10-CVS (Jul 27 2005)</version>
      <os>Debian GNU/Linux (testing/unstable)</os>
  </query>
</iq>
Reperez bien ici les 3 balises name, version et os qui correspondent respectivement au nom du client, de sa version et du système d'exploitation. L'XEP 92 n'en prévoit pas d'autres.
== Notes ==
<references/>

Dernière version du 3 juin 2010 à 22:36

Introduction

Ce livre a pour but de vous expliquer comment communiquer avec un serveur Jabber pour la création d'un client. Il n'a pas pour but de montrer des lignes de programmations mais seulement de vous expliquer les échanges entre le client et le serveur.

Les échanges entre le client et le serveur se font en XML et ont donc l'avantage d'être facile à parser.

La documentation sur le sujet la plus précise est sans doute : rfc3920 et rfc3921. Nous considérons également que vous connaissez déjà Jabber, en cas de doute, vous pouvez consulter Wikipedia:Jabber.

Les indentations ne sont ici que pour faciliter la lisibilité des exemples, elles ne sont pas obligatoires. Vous pourrez facilement tester ces exemples grâce à une session telnet sur un serveur Jabber : telnet jabber.org 5222

Les bases

Ce chapitre regroupe les actions élementaires permettant de se connecter à un serveur jabber et de discuter avec ses contacts en connaissant leur status.

Initialisation de la connexion

Notre client va envoyer ceci :

<?xml version='1.0' encoding='UTF-8'?>

Les échanges entre le client et le serveur se font en XML. L'encodage des caractères doit être UTF-8<ref>http://xmpp.org/rfcs/rfc3920.html#xml-encoding</ref>.

<stream:stream xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xmlns='jabber:client' to='jabber.org' >

On ouvre un "stream" qui sera ouvert tout au long de la connexion au serveur.

Le client devra renseigner certains paramètres obligatoirement<ref>Liste de tous les paramêtres de l'élément stream : http://xmpp.org/rfcs/rfc3920.html#streams-attr</ref> :

  • xmlns='jabber:client' : indique au serveur que notre client est effectivement un client et non un serveur.
  • xmlns:stream='http://etherx.jabber.org/streams'
  • to : indique l'adresse du serveur auquel on s'adresse

et il est aussi conseillé de renseigner d'autres paramètres :

  • version : indique la version du protocole utilisé
  • xml:lang : indique la langue utilisée par défaut


Le serveur doit nous répondre quelque chose comme ceci :

<stream:stream xmlns='jabber:client' xml:lang='en' xmlns:stream='http://etherx.jabber.org/streams' from='jabber.org' id='166C34A3F3E91' >

Mais s'il y a un problème, celui-ci peut aussi vous envoyer un message tel que : <stream:error><ref>Liste des erreurs de flux possible : http://xmpp.org/rfcs/rfc3920.html#streams-error-conditions</ref>

Identification

Maintenant que nous sommes connectés au serveur, nous devons lui dire qui nous sommes pour pouvoir discuter avec nos contacts. Il existe pour cela deux méthodes. Celle que nous allons voir est là plus courante<ref>XEP 0078</ref>, cepandant elle est maintenant obsolète et est remplacé par une nouvelle, utilisant SASL, qui est plus compliquée.

<iq type="get" id="auth_1" to="jabber.org" >
  <query xmlns="jabber:iq:auth">
     <username>toto</username>
  </query>
</iq>

La valeur de id n'est pas obligatoirement "auth_1" mais le serveur va nous répondre en réutilisant cet id pour nous indiquer à quoi il répond et donc il faut le conserver. Le type "get" nous indique que nous demandons une information au serveur. Et en même temps, nous indiquons notre identité (balise query).

Le serveur va alors nous indiquer les informations nécessaire à la connexion.

<iq id='auth_1' type='result'>
  <query xmlns='jabber:iq:auth'>
     <username>toto</username>
     <password/>
     <digest/>
     <resource/>
  </query>
</iq>

Tous ces élements ne sont pas obligatoires, il est inutile de préciser à la fois password et digest.

On peut alors lui envoyer les informations pour s'identifier :

<iq type="set" id="auth_2" to="jabber.org" >
  <query xmlns="jabber:iq:auth">
     <username>toto</username>
     <password>mot2passe</password>
     <resource>maison</resource>
  </query>
</iq>

Encore une fois, la valeur de id n'est pas obligatoirement "auth_2".

Le serveur doit vous répondre en cas de réussite:

<iq id='auth_2' type='result'/>

Sinon vous pourriez avoir quelque chose comme ceci :

<iq type='error' id='auth_2'>
  <query xmlns='jabber:iq:auth'>
     <username>toto</username>
     <password>mot2passe</password>
     <resource>maison</resource>
  </query>
  <error type='auth' code='401'><not-authorized xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
     <text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Unauthorized</text>
  </error>
</iq>


Changer son Statut

Pour le moment, on est certes identifié au serveur mais personne ne sait que vous êtes en ligne. Pour cela, vous devez simplement indiquer votre statut. C'est la balise <presence> qui permet cela.

<presence>
  <show>dnd</show>
  <status>Occupé</status>
  <priority>1</priority>
</presence>

Lorsqu'il n'y a pas les balises show et status<ref>http://xmpp.org/rfcs/rfc3921.html#stanzas-presence-children</ref> cela veut dire qu'on se dit simplement en ligne. D'ailleurs en général, la première chose faite après l'identification est du type :

<presence>
  <priority>1</priority>
</presence>

La balise priority n'est pas obligatoire, cependant, en cas d'omission, cela revient à lui donner la valeur 0 :

<presence>
  <show>dnd</show>
  <status>Occupé</status>
</presence>

équivaut à :

<presence>
  <show>dnd</show>
  <status>Occupé</status>
  <priority>0</priority>
</presence>


  • show possède 4 états possibles :

- away : Absent

- chat : Veut discuter

- dnd : Ne pas déranger (occupé)

- xa : Non disponible


  • presence possède également la propriété type qui permet :

- de se rendre invisible (cette fonctionnalité n'est pas standard mais est supportée par la plupart des serveurs) :

<presence type="invisible" />

- de se déconnecter :

<presence type="unavailable" />


Statut de ses contacts

Il n'y a pas besoin de les demander au serveur, du moment où vous êtes en ligne, vous recevrez des messages de présence similaire à ceux que vous pourriez envoyer à la différence près que ceux-là contiennent une proprieté "from" (et "to" mais qui ne vous servira pas) :

<presence to='dupont@im.apinc.org' from='toto@jabber.org/ecole'>
  <show>away</show>
  <status>Je suis de retour dans 1 minute !</status>
  <priority>5</priority>
</presence>


Récupérer la liste des contacts

Pour demander la liste de ses contacts, il faut envoyer<ref>http://xmpp.org/rfcs/rfc3921.html#roster-login</ref> :

<iq type="get" id="aaab" >
  <query xmlns="jabber:iq:roster"/>
</iq>

Encore une fois, vous pouvez mettre ce que vous voulez comme id mais celui-ci doit être unique.

Le serveur peut répondre quelque chose comme ceci :

<iq from='toto@jabber.org/ecole' type='result' id='aaab'>
  <query xmlns='jabber:iq:roster'>
     <item jid='tintin@jabber.org' subscription='both' name='Tintin'/>
     <item subscription='both' name='Dupont' jid='dupont@im.apinc.org'>
        <group>Amis</group>
     </item>
  </query>
</iq>

Attention, un contact peut appartenir à differents groupes ou aucun. Dans ces cas, vous aurez respectivement plusieurs balises <group> contenant les differents groupes auquel il appartient ou aucune balise <group>.

Envoyer des messages

Il existe différents types de Message messages<ref>http://xmpp.org/rfcs/rfc3921.html#stanzas-message-type</ref> :

  • chat : Le plus courrament employé, c'est celui de la messagerie instantanée, il est fait pour une conversation 1 à 1.
  • error : Permet au serveur de vous envoyer un message d'erreur.
  • groupchat : Utilisé pour les conversations à plusieurs.
  • headline : Permet au serveur d'envoyer des informations.
  • normal : Envoit un message similaire à un email (sujet et message)

Exemple d'envois de message de type chat :

<message to="toto@jabber.org" type="chat">
	<body>Salut !</body>
</message>

Exemple de réception d'un message de type chat :

<message from="tintin@jabber.org/chateau" type="chat">
	<body>Salut !</body>
</message>

Envoyer une notification de frappe (XEP 22)

Pour cela c'est très simple, il suffit d'envoyer un message qui ne contient pas <body> mais :

<x xmlns='jabber:x:event'>
   <composing/>
</x>

Il peut être souhaitable de préciser un id :

<message from='romeo@montague.net' to='juliette@capulet.com/balcon'>
 <x xmlns='jabber:x:event'>
   <composing/>
   <id>message22</id>
 </x>
</message>

Si Roméo fait une pause, alors il suffit de renvoyer :

<message from='romeo@montague.net' to='juliette@capulet.com/balcon'>
 <x xmlns='jabber:x:event'>
   <id>message22</id>
 </x>
</message>

Ceci a pour effet d'annuler la première information indiquant que Roméo est en train d'écrire.


Envoyer du texte en XHTML (XEP 71)

Pour le moment, vous ne savez qu'envoyer des messages texte... Donc vous ne pouviez pas changer de police, de couleur d'écriture etc. Et bien c'est ce que nous allons voir maintenant grace à la possibilité d'envoyer des messages en XHTML.

Exemple simple :

<message to="toto@jabber.org" type="chat">
  <body>Salut !</body>
  <html xmlns='http://jabber.org/protocol/xhtml-im'>
    <body xmlns='http://www.w3.org/1999/xhtml'>
      <p style='font-weight:bold'>Salut !</p>
    </body>
  </html>
</message>

Vous retrouvez des éléments identiques à l'envoi d'un message en texte simple : <body>Salut !</body> . En effet, cela permet aux clients qui ne gèrent pas cette fonctionnalité d'afficher le message quand même. Le message est ensuite répété en XHTML.

Vous pouvez aller consulter les attributs de chaque balise directement dans la XEP. Regardez bien ceux qui sont obligatoires, recommandés et déconseillés.

À noter la possibilité d'insérer des images mais attention, des clients peuvent préférer afficher le contenu de l'attribut alt à la place de l'image.

Pour savoir si le client de votre contact supporte le XHTML, il suffit de lui demander ce qu'il supporte :

<iq type='get' from='toto@jabber.org/ecole' to='tintin@jabber.fr/lune' id='disco1'>
  <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>

Si le client le supporte, il vous le dira :

<iq type='result' from='toto@jabber.org/ecole' to='tintin@jabber.fr/lune' id='disco1'>
  <query xmlns='http://jabber.org/protocol/disco#info'>
     ...
     <feature var='http://jabber.org/protocol/xhtml-im'/>
     ...
  </query>
</iq>

Enregistrement d'un nouveau compte (XEP 77)

La connexion au serveur doit juste être initialisée mais vous n'avez pas à vous identifier (ce qui est logique).

Exemple d'enregistrement :

<iq type="set" to="server.org" id="aab0a" >
  <query xmlns="jabber:iq:register">
     <username>Login</username>
     <password>MotDePasse</password>
  </query>
</iq>

Ceci va créer un nouveau compte sur le serveur jabber "server.org" avec le pseudo "Login". Ainsi le JID de ce nouveau compte sera login@server.org. L'attribut id permet de connaître la réponse du serveur, ce qui est très important ici mais il est facultatif. Tout le reste est obligatoire.

Exemple d'erreur :

<iq type='error' id='aab0a'>
  <query xmlns='jabber:iq:register'>
     <username>Login</username>
     <password>MotDePasse</password>
  </query>
  <error code='409'>Username Not Available</error>
</iq>

Exemple en cas de succès :

<iq type='result' id='aab0a'/>


Fermeture d'un compte

Si vous n'utilisez plus un compte jabber, vous pouvez décider de le supprimer.

Pour cela, il vous fait déjà être connecté et identifié avec votre mot de passe. Ensuite il suffit d'envoyer :

<iq type="set" to="server.org" id="aab0a" >
  <query xmlns="jabber:iq:register">
     <remove/>
  </query>
</iq>


Gestion des contacts

Jabber permet de gérer les contacts par une liste de contact stockée sur le serveur mais à cela se rajoute un système d'autorisation permettant d'accepter que tel ou tel contact puisse voir votre status.

Autorisations

Les différents niveaux d'autorisation

  • "none" -- Ni l'utilisateur ni le contact n'ont d'autorisation pour se voir.
  • "to" -- L'utilisateur a l'autorisation de voir la présence du contact mais le contact lui ne l'a pas.
  • "from" -- Le contact a l'autorisation de voir l'utilisateur mais l'utilisateur lui ne l'a pas.
  • "both" -- L'utilisateur et le contact ont tous deux l'autorisation de connaître l'état de présence de l'autre.

Types pour <presence />

L'attribut type est optionnel. Une balise de presence sans attribut est utilisé pour signaliser au serveur le statut de l'expéditeur. La balise presence permet aussi de gérer les autorisations. L'attribut type peut avoir en plus ces valeurs :

  • subscribe : L'expéditeur veut avoir l'autorisation de voir l'état du contact.
  • subscribed : L'expéditeur a accepté de recevoir le statut de présence du contact.
  • unsubscribe : L'expéditeur supprime l'autorisation de l'autre.
  • unsubscribed : La demande d'autorisation a été refusé ou une précedente autorisation a été annulée.

Demander une autorisation

<presence type='subscribe' to='toto@im.apinc.org'>
  <status>Je voudrais t'ajouter à ma liste de contacts.</status>
</presence>

La balise status n'est pas obligatoire mais permet d'envoyer un message en même temps que la demande.

Toto va recevoir ceci :

<presence type='subscribe' to='toto@im.apinc.org' from='tintin@jabber.org'>
  <status>Je voudrais t'ajouter à ma liste de contacts.</status>
</presence>

Accepter une autorisation

<presence type="subscribed" to="tintin@jabber.org" />

Refuser une autorisation

<presence type="unsubscribed" to="tintin@jabber.org" />


Gestion de la contact-list

Ajouter un contact

<iq type="set" id="ac90a" >
  <query xmlns="jabber:iq:roster">
     <item jid="tintin@jabber.org" />
  </query>
</iq>

L'attribut id est facultatif mais en cas d'erreur, il est bon de toujours spécifier un id pour savoir d'où vient l'erreur. D'autres informations peuvent être ajoutées :

<iq type="set" id="ac90a" >
  <query xmlns="jabber:iq:roster">
     <item name='tintin' jid='tintin@jabber.org'>
        <group>Amis</group>
     </item>
  </query>
</iq>

En cas de succès, le serveur doit vous répondre quelque chose comme ceci :

<iq to='toto@im.apinc.org/ecole' from='toto@im.apinc.org/ecole' type='result' id='ac90a'/>

Supprimer un contact

<iq type="set" id="ad8fa" >
  <query xmlns="jabber:iq:roster">
     <item subscription="remove" jid="tintin@jabber.org" />
  </query>
</iq>

Notez à la différence de l'ajout d'un contact, l'attribut subscription avec la valeur "remove" qui indique la suppression du jid spécifié.

Modifier un contact

Pour modifier un contact, il suffit d'ajouter à nouveau ce contact mais avec les nouvelles options (groupe et nom).


Procédure complète pour une autorisation mutuelle

Vous demandez en premier

Ajout du contact dans la contact-list :

<iq type="set" id="ac90a" >
  <query xmlns="jabber:iq:roster">
     <item jid="tintin@jabber.org" />
  </query>
</iq>

Demande d'inscription :

<presence type='subscribe' to='tintin@jabber.org'>
  <status>Je voudrais t'ajouter à ma liste de contacts.</status>
</presence>

[Réception d'une autorisation et d'une demande d'autorisation]

Envoi d'une autorisation :

<presence type='subscribed' to='tintin@jabber.org' />

Vous recevez une demande d'autorisation

Ajout du contact dans la contact-liste :

<iq type="set" id="ac90a" >
  <query xmlns="jabber:iq:roster">
     <item jid="tintin@jabber.org" />
  </query>
</iq>

Vous demandez à votre tour une autorisation :

<presence type='subscribe' to='toto@im.apinc.org' />

Vous acceptez la sienne :

<presence type='subscribed' to='toto@im.apinc.org' />

[reception d'une autorisation]


Fonctionnalités Avancés

Informations sur le Client (XEP 92)

La XEP 92 permet de demander des informations supplémentaires sur les logiciels utilisés par vos contacts. On peut récuperer 3 informations qui sont le nom, la version et le système d'exploitation sur lequel celui ci tourne.

Pour demander, c'est très simple. Mais vous devrez spécifier la ressource.

<iq type="get" to="toto@jabber.org/ecole" id="version_1" >
  <query xmlns="jabber:iq:version" />
</iq>

Si le client peut lui répondre, alors vous recevrez une réponse, par exemple :

<iq from="toto@jabber.org/ecole" type="result" to="tintin@im.apinc.org/lune" id="version_1" >
  <query xmlns="jabber:iq:version">
     <name>Psi</name>
     <version>0.10-CVS (Jul 27 2005)</version>
     <os>Debian GNU/Linux (testing/unstable)</os>
  </query>
</iq>

Reperez bien ici les 3 balises name, version et os qui correspondent respectivement au nom du client, de sa version et du système d'exploitation. L'XEP 92 n'en prévoit pas d'autres.

Notes

<references/>