Parlons XMPP - épisode 4 - les discussions de groupes

goffi 9 years ago technique planet-libre parlons_xmpp jabber-xmpp Libre

(pour lire les épisodes précédents, suivez l'étiquette correspondante)

Dans le milieu du développement logiciel, et surtout dans le logiciel libre, les discussions de groupes sont très populaires, le plus souvent via IRC (Internet Relay Chat).
Ce vénérable protocole fait ce qu'on lui demande, et XMPP s'en est fortement inspiré. Voyons ça de plus près.

Les discussions de groupes utilisées actuellement sont appelées MUC pour « Multi-User Chat » et sont définies par la XEP-0045. Cette dernière standardise et étend la solution utilisée à l'origine, appelée « groupchat ». Comme tout ceci est calqué sur IRC, je vais expliquer au fur et à mesure les différences majeures avec lui.

Il est possible d'accéder à un salon situé sur n'importe quel serveur depuis n'importe quel serveur (encore une fois, tant que ça n'est pas explicitement interdit dans la configuration). Les salons ont un jid, comme les utilisateurs, qui est de la forme nom_salon@service. Par exemple celui de Salut à Toi est sat@chat.jabberfr.org : « sat » est le nom du salon, « chat.jabberfr.org » le service.

La ressource est utilisée pour les occupants du salon: sat@chat.jabberfr.org/goffi correspond à l'occupant appelé « goffi » sur le salon sat@chat.jabberfr.org. Ah, petit détail que j'ai oublié de vous préciser dans les précédents articles: tout est unicode en XMPP, y compris le jid. Vous pouvez donc utiliser un pseudo arabe ou russe. Mais attention : certains caractères unicodes se ressemblent fortement, aussi il peut y avoir un risque de confusion visuelle entre 2 mots qui se ressemblent graphiquement, qu'on appelle « homoglyphes » : par exemple « gοffⅰ » ressemble à « goffi » mais il utilise des caractères différents. Ce problème est mentionné dans un rapport technique unicode: http://www.unicode.org/reports/tr36/. Aussi, ne vous basez pas uniquement sur un pseudonyme pour identifier quelqu'un (surtout qu'il est possible qu'il soit réutilisé par quelqu'un d'autre entre 2 sessions).

Le pseudonyme (« nickname » ou « nick » en plus court) est lié au salon et non au service : vous pouvez vous appeler « toto » sur un salon et « titi » sur un autre, et il peut y avoir quelqu'un d'autre qui s'appelle « titi » également sur un troisième salon. Ceci est une autre grosse différence avec IRC où on a un seul pseudonyme par serveur, qui sera utilisé pour tous les salons (canaux ou « channels » chez IRC) de celui-ci.

Pour entrer ou sortir d'un salon, ou changer de pseudonyme, on envoie une présence disponible (ou pas) directement à salon@example.net/pseudo_désiré, mais ceci est normalement géré par votre client.

Il est possible d'écrire directement à tous les occupants du salon (en dessous c'est un message de type « groupchat » qui est envoyé au bare jid du salon), ou d'avoir une discussion privée avec un membre (on écrit normalement au jid complet – ou full jid – du destinataire).

Un salon peut être public ou caché (il n’apparaîtra alors pas dans la liste des salons), non anonyme ou semi-anonyme (dans le premier cas tout le monde peut voir le jid réel d'un occupant, dans le second seuls les modérateurs et administrateurs le peuvent), persistant ou temporaire, ouvert ou accessible uniquement à une liste blanche d'utilisateur ou encore protégé par un mot de passe, modéré ou pas.

Ces paramètres se règlent normalement à la création du salon, ou se modifient après coup via l'option idoine de votre client (sur Gajim : clique droit sur un onglet de salon => Gérer le salon => Configurer le salon). Selon le service utilisé, vous pouvez configurer plus ou moins de choses, par exemple limiter le nombre maximal d'occupants.

Une fonctionnalité souvent implémentée est l'historique, ou « back log » : quand vous arrivez dans un salon, le service vous envoie les X derniers messages, vous permettant ainsi de comprendre le contexte de la conversation en cours.

Aussi, si une archive publique du salon est conservée (on parle de salon « loggué »), le service doit vous avertir (c'est obligatoire dans la XEP), ce qui est un autre bon point par rapport à IRC. Il faut bien sûr garder à l'esprit que n'importe qui dans le salon peut garder une archive au risque de la publier sans votre consentement.

Bon tout ça c'est bien joli, mais une grande force d'IRC c'est sa simplicité : pas de compte à créer, il faut juste choisir un pseudo (unique), un serveur et roulez jeunesse ! Eh bien vous ne serez pas déçus, XMPP propose exactement la même chose avec les connexions dites « anonymes ». Pas d'anonymat au sens de Tor ici, mais plutôt la possibilité d'avoir un compte temporaire, avec un jid plus ou moins aléatoire, le temps de vous connecter. Ceci est disponible de base mais doit souvent être explicitement autorisé dans la configuration du serveur, et la plupart du temps les connexions anonymes sont limitées au serveur local, pas de communication avec les autres (pour éviter les pourriels).

Si vous voulez faire des conversations à la IRC de manière simple et intuitive, et si vous aimez la console, je vous recommande fortement Poezio qui est un excellent client XMPP, et qui joue la simplicité : de base, sans rien changer à la configuration, vous serez connecté anonymement sur le service MUC de Poezio. Il s'inspire de Irssi/Weechat, et reprend les commandes de ces derniers (ou plus généralement d'IRC). Ci-dessous le message au premier lancement, sans avoir touché à la configuration, on voit le jid anonyme attribué le temps de la session.

capture Poezio

Bon cet épisode est déjà suffisamment long, mais je n'ai pas fini avec les MUCs, aussi on en reparlera la prochaine fois, probablement avec les transports.

Hedy 9 years ago

Merci pour cette série de billets des plus intéressante :)
J'ai autrefois utilisé XMPP pour monitorer certaines infos de mes serveurs depuis mon roaster : load average, espace disque restant...
Malheureusement depuis Wheezy, mon bout de script a cessé de fonctionner pour une raison obscure et je n'ai pas réussi à remettre le nez dedans.
C'était à la fois léger et efficace :)

Goffi 9 years ago

Hedy: quelle bibliothèque utilisais-tu ? Quel langage ? Tu devrais demander conseil soit chez Debian, soit sur jdev (salon anglophone des développeurs XMPP, il y a aussi une liste de diffusion, tu as tous les liens sur https://xmpp.org/participate/discus...). Il y a probablement des salons francophones qui peuvent t'aider aussi, selon le langage utilisé.


author website

Hedy 9 years ago

Oui je me doute...
C'était un script en python que j'avais récupéré sur un blog.
Je l'ai utilisé des années, et j'ai tjrs été surpris que XMPP ne soit pas plus démocratisé à ce niveau (monitoring).

Un jour, je m'y repencherai sans doute :)

Goffi 9 years ago

En Python il y SleekXMPP et Twisted/Wokkel (qu'on utilise avec SàT) qui sont actifs, ça peut valoir le coup de réécrire.

Mais sinon le monitoring, il peut être plus simple/rapide d'utiliser un client en ligne de commande, ou un bot déjà existant. Nous avons un client en ligne de commande pour ça par exemple (jp), et on l'utilise sur notre salon pour voir les commits mercurial en temps réél. Pour envoyer un message il suffit de faire « echo ton_message | jp message ton_jid@domaine.tld ».


author website

Hedy 9 years ago

Merci pour les pistes :)
De mon côté cet après midi je suis tombé sur Jimbo : http://www.darkcoding.net/software/...

La mise en place est facile mais reste à configurer les infos remontées, et surtout éviter d'envoyer un nouveau msg toutes les 5min et privilégier à la place une mise jour du status (plus discret à mon goût)

Goffi 9 years ago

Ah je ne connaissais pas, bien.

Note que tu peux utiliser un « contenu étendu » dans ton message, c'est à dire un message qui transporte autre chose qu'un texte à afficher (cf https://tools.ietf.org/html/rfc6120... pour les détails). Comme ça tu peux en envoyer plus souvent, et les autres clients ignoreront le namespace qu'ils ne connaissent pas.

Une autre option est d'utiliser PEP: ton serveur est un client XMPP avec PEP, et il transmet les infos sur son état de cette façon.

Tu n'es pas le premier à me parler de monitoring serveur, je me demande si ça ne vaudrait pas le coup d'ajouter des commandes spécialisées pour ça dans SàT et jp...


author website