J'utilise Gajim pour discuter de manière instantanée à l'aide du protocole libre et acentré XMPP. Le logiciel qui anime mon serveur XMPP se nomme ejabberd.
Un truc m'agace : je me connecte depuis une machine (ça pourrait être au travail, par exemple), je commence une discussion, je quitte cet ordinateur pour un autre (ça pourrait être un ordinateur de poche, par exemple), la discussion s'enchaîne, mais j'ai perdu l'historique de la conversation (il est disponible sur le premier ordinateur…). Cette conversation aboutie des jours après et je voudrais écrire un compte-rendu ou un mail ou un shaarli ou tout simplement relire l'ensemble des arguments, le tout depuis mon ordinateur à la maison. Pas de bol, la majorité des arguments se trouvent dans deux historiques auxquels je n'ai pas accès pour l'instant. Frustrant.
Bref, comment partager automatiquement l'historique des conversations entre tous mes bidules qui causent XMPP ?
Il existe un module pour ejabberd nommé mod_mam (module Message Archive Management). Comme d'autres fonctionnalités, celle-ci est documentée dans un standard public (que l'on nomme une XEP dans la terminologie XMPP), la XEP-0313.
Ce module implémente précisément la fonctionnalité que je désire : il stocke les messages échangés sur le serveur (à la demande d'un logiciel client ou en permanence) et il les distribue aux autres logiciels clients qui en feront la demande. Évidemment, un⋅e utilisateur⋅rice donné⋅e a uniquement accès à ses conversations (mais l'administrateur⋅rice du serveur peut tout lire, du simple fait qu'il⋅elle est admin, comme d'habitude). Évidemment, les messages chiffrés de bout en bout (E2E, OTR, OMEMO, etc.) ne sont pas stockés par le serveur.
Depuis Debian Stretch, le mod_mam est packagé avec le serveur ejabberd dans le package ejabberd. \o/
Pour l'activer, on ajoute ce qui suit au fichier /etc/ejabberd/ejabberd.yml
puis on redémarre ejabberd :
modules:
[…]
mod_mam:
default: always
request_activates_archiving: false
Ici, les messages seront stockés dans la base de données traditionnelle d'ejabberd, mnesia (c'est déjà elle qui stocke les utilisateur⋅rice⋅s, les rosters, les messages envoyés quand un contact est hors ligne, etc.). Tous les messages directs (one-to-one) seront archivés, indépendamment des commandes envoyées par le logiciel client.
Évidemment, il faut que le logiciel client installé sur chaque ordinateur utilisé implémente MAM (les autres ne recevront pas et n'émettront pas l'historique). C'est le cas de Gajim depuis sa version 0.16.1. Debian Jessie package la version 0.16 (qui n'a donc pas cette fonctionnalité). Debian Stretch package la version 0.16.6 qui a cette fonctionnalité. \o/
En cas de poblème, pour vérifier qui se mélange les pinceaux, on peut regarder dans l'interface web d'admin d'ejabberd (http(s)://server:5280, JID, avec le nom de domaine donc + mdp pour se connecter), dans « Noeuds », « Base de données » : le compteur de la ligne « archive_msg » doit s'incrémenter à chaque message reçu ou envoyé. Si c'est bien le cas, c'est probablement le logiciel client qui dysfonctionne.