28th mar 2008

Jabber est plus qu’un réseau de messagerie instantanée: publication et notification

Dans mes précédents articles sur Jabber, je l’ai comparé aux divers réseaux fermés de messagerie instantanée. Que l’on parle de l’ancêtre ICQ, des dominants Yahoo!, Live Messenger ou AIM, de l’incongru (ou plutôt local) Gadu-Gadu ou simplement de notre étoile montante Jabber (sous toutes ses formes, comme celle qu’elle prend avec GoogleTalk), on pense immédiatement et uniquement à des systèmes de discussion en temps réel. Pourtant ce n’est qu’une des multiples facettes de Jabber, celle qui a montré son visage en premier certes, car elle s’est engouffrée dans une mode. Mais Jabber (ou XMPP, nom standardisé par l’IETF) est en fait un protocole bien plus généraliste avec énormément de possibilités (on pourrait presque dire une infinité), lesquelles sont en permanence travaillées par la Fondation Jabber. C’est un protocole jeune et mouvant, ce qui est à la foi son point faible actuel, car il bouge un peu trop vite et rend obsolète certaines implémentations en peu de temps, et son point fort car son évolution rapide donne de plus en plus de possibilités.

Ce billet ne traitera que d’une des fonctionnalités de XMPP — le Publish-Subscribe — que j’ai “traduit” par un programme adapté à ce site. J’ai appelé ce programme: Jabber Feed.

Publish-Subscribe” (”Publier-Souscrire” en français, aussi connu sous l’abbréviation “pubsub”) est un système conceptualisant des nœuds de publication , service permettant de publier des données d’un côté; et de l’autre côté, des “utilisateurs” peuvent s’abonner à ces même nœuds et configurer les détails de leur inscription, par exemple en demandant à être notifiés quand quelque chose de nouveau survient. Ce principe a de multiples débouchés. Je pense que vous pourrez tous penser à au moins une utilisation que l’on peut en faire.
Image de publication des Marmottages
J’ai décidé d’appliquer ce concept à une utilisation précise la semaine dernière en développant un plugin pour Wordpress (le système de publication utilisé pour ce journal) afin de publier l’ensemble des articles que j’y fais en temps réel sur un nœud Jabber. Un lecteur régulier pourra par conséquent s’y inscrire et recevra les nouveaux articles par Jabber sans avoir à régulièrement visiter ce site. Cela permet d’éviter d’avoir à vérifier régulièrement l’existence de nouveautés (ça tombe bien car j’écris peu souvent, donc si vous deviez venir souvent, ça serait inutile; et si vous ne veniez jamais, vous oublieriez ce site).

Évidemment le gros problème — car il y en a un — est que peu de clients Jabber ont à l’heure actuelle un bon support, sinon aucun, de cette partie du protocole Jabber. Il y a donc peu de chances que vous puissiez tester mon plugin dans l’immédiat en tant qu’utilisateur (il y a cependant des méthodes de contournement dont je peux parler, mais un peu compliquées et qui ne servent que dans un but de test). Pour l’instant il s’agit donc d’une “Démonstration Conceptuelle” qui, espérons le, va faire partie d’un début pour accélérer les implémentations.
En tous les cas, sachez que je tiendrai régulièrement au courant des nouveautés autour de ce plugin (j’ai créé une nouvelle page permanente sur mon havre pour lui ici et héberge le code pour installer le plugin sur le dépôt officiel des plugins Wordpress), ainsi que des technologies associées.

Néanmoins si vous connaissez suffisamment le protocole, vous pouvez vous inscrire sur le nœud ‘home/zemarmot.net/jehan/blog/posts‘ pour recevoir automatiquement les nouveaux billets et sur ‘home/zemarmot.net/jehan/blog/comments‘ pour les commentaires, le tout sur le serveur pubsub.zemarmot.net.

21 Responses to “Jabber est plus qu’un réseau de messagerie instantanée: publication et notification”

  1. kael Says:

    Bravo et merci pour ce plugin.

    J’avais suggéré l’idée pour le GSoC2008 mais il ne faudra pas attendre jusque là pour l’utiliser. :)

    S’agissant des clients Jabber, il existe Synapse-IM, un fork de Psi, qui supporte PubSub (la dernière version SVN contient moins de fonctionnalités mais permet de recevoir les messages ATOM).

    Et j’ai proposé l’idée d’un agrégateur XMPP en XUL qui supporterait PubSub et l’archivage des messages.

    J’ai essayé de m’inscrire aux noeuds de publication mais xmpp:pubsub.zemarmot.net apparaît grisé et n’est pas accessible (avec Gajim SVN).

  2. kael Says:

    Addendum : Lors de la publication du commentaire précédent, WordPress a retourné un message d’erreur contenant une partie de la session de publication XMPP.

  3. Jehan Says:
    Ah wi désolé, j’étais en train de faire des tests et j’ai laissé quelques traces en utilisant mon blog comme “cobaye” (bon j’ai pas vraiment d’autres instances réelles de Wordpress, même si j’ai bien pensé à en monter une spécialement…). Désolé, je m’attendais pas à ce que qqun commente au même moment! :p

    En tous cas, j’ai qd même reçu une notification succinte sur Gajim. :-)

  4. Jehan Says:
    C’est retiré normalement.
  5. kael Says:

    Est-ce que le code sera bientôt disponible ?

    Aussi, lorsque j’essaye de m’inscrire, le serveur retourne :

  6. kael Says:

    … le serveur retroune :
    error code=’404′ type=’cancel’
    remote-server-not-found xmlns=’urn:ietf:params:xml:ns:xmpp-stanzas’

  7. Jehan Says:
    Salut,

    j’ai fait un test. Effectivement je n’arrive pas non plus à m’inscrire (et obtient cette même erreur) à partir d’un jid qui ne soit pas du serveur apparemment. Pourtant j’utilise les params par défaut d’ejabberd sur ce serveur privé, qui sont assez peu restrictifs (du moins le croyais-je!). En outre le manuel d’ejabberd est très très peu verbeux en ce qui concerne le module pubsub.

    Je n’ai donc pas le temps de configurer ce serveur vraiment mieux puisque j’ai un avion qui m’emmène 2 semaines en vacances dans quelques heures (et je ne vais pas dans des cybers ou autre en vacances, ni ne prévois d’emmener mon portable. Donc il n’y a absolument aucune chance que je regarde tout cela avant le 17!).

    Par contre je viens de mettre le source en ligne (3 petits fichiers) sur le serveur subversion fourni par le dépôt de plugin Wordpress.
    C’est accessible ici: http://svn.wp-plugins.org/jabber-feed/

    Bon c’est vraiment à améliorer (autant dans les fonctionnalités que la gestion d’erreur et la simplification du code aussi), et je suis en train en fait. Je reprends donc tout cela dans 2 semaines! :-) En tous cas, cette première version fonctionne basiquement et c’est déjà un début.

  8. Cédric Says:

    Salut,

    Ton article est intéressant, pour ton plugin tu as l’intention de le maintenir par la suite?

  9. Jehan Says:
    Salut,

    oui, je vais l’améliorer d’une part, le maintenir d’autre part, tout en étudiant exactement ce que permet la fonctionnalité pubsub de xmpp pour en tirer parti au mieux.
    Et tout ça en attendant d’avoir des produits qui ont un support décent de pubsub. :-)
    ‘lus.

  10. kael Says:

    J’ai testé Jabber-Feed et à nouveau je te remercie pour ce plugin. C’est tout simplement génial !

    Il est possible de l’utiliser comme un Twitter décentralisé. Il ne manque plus que des agrégateurs.

    S’agissant des modes de souscription, il pourrait être possible d’ajouter un méchanisme d’“autodiscovery”, pour les billets et pour les commentaires, en ajoutant dans le “Head” de la page HTML :

    link rel=’alternate’ type=’xxxx’ href=’xmpp:stpeter at jabber.org’

    comme suggéré ici et discuté .

    Egalement, il pourrait être possible de s’abonner au “thread i.e. aux commentaires, en cliquant sur un bouton qui pointerait vers une URL du type :

    xmpp:pubsub.shakespeare.lit?pubsub;action=subscribe;node=princely_musings.

    Mais pour l’instant, à ma connaissance, aucun client jabber n’implémente la XEP-147 intégralement.

    J’ai pensé aussi à une interface web qui permettrait de gérer les souscriptions en utilisant la XEP-0070: Verifying HTTP Requests via XMPP, à la manière du South African XMPP Federation OpenID Server, de façon à pouvoir accéder à une interface de manière authentifiée mais sans mot de passe. Mais en y réflechissant un peu plus, je me rends compte que cela nécessiterait une intégration avec le serveur (je ne sais pas comment cela pourrait fonctionner lorsque le serveur sur lequel les noeuds PubSub sont hébergés n’est pas sur le même domaine que le celui du blog - je ne suis pas très clair…).

  11. Jehan Says:
    Salut,

    je suis rentré du Japon y a juste 2 jours. Je n’ai pas encore eu le temps de me replonger dans tout ça. ;-) Mais oui j’ai pensé moi-même à pas mal de trucs pour rendre tout ça vraiment bien.
    Je lirai demain tes liens à tête reposée.

    Pour l’url, c’est évidemment une idée en cours. En fait, Peter Saint André disait justement qu’il est en train de travailler sur le format que pourraient avoir des liens de noeuds Jabber. Il est évident que si le mécanisme reposait uniquement sur une inscription manuelle à un noeud à travers un logiciel tiers, cela ne pourrait jamais “marcher” dans un public un peu plus élargi. Le vrai intérêt sera quand il existera un format normé de lien et que l’utilisateur n’aura qu’à cliquer sur le dit-lien, ce qui aura pour conséquent d’ouvrir son “agrégateur” Jabber qui lui proposera de s’inscrire au noeud associé.

    En tous cas, pour l’idée d’avoir un noeud par article pour ne s’abonner qu’aux commentaires d’un article précis, c’est en projet de dév et devrait être intégré très bientôt, car je pense que c’est une des fonctionnalités majeures qui rendrait ce plugin cool. En gros, l’idée serait un noeud de type feuille qui contiendrait tous les articles seulement (un “item” par article) et un noeud de type conteneur qui contiendrait autant de noeud feuille qu’il y a d’article. Dans chacun de ces noeuds feuille, il y aurait les commentaires (items) qui correspondent à l’article associé. Ainsi un utilisateur pourrait s’inscrire d’une part au noeud des articles et n’aurait que les articles; d’autre part au noeud global des commentaires pour n’avoir que les commentaires (mais tous), ou alors à un sous-noeud final précis pour n’avoir les commentaires que d’un article qui l’a intéressé.
    Bon je sais pas si je suis clair, mais faudrait faire un dessin, c’est assez basique. Et évidemment tout ça serait généré automatiquement et transparent pour un utilisateur qui ne fera que cliquer sur les liens Jabber qui l’intéressent.

    Pour le reste, j’ai pas tout compris. Je lirai plus tard tes liens comme je disais.

  12. Jehan Says:
    Ah et aussi, tant que j’y pense, tu disais qu’il ne manque plus que des agrégateurs, mais je pense que les serveurs Jabber sont aussi à améliorer quant à cette fonctionnalité. Là je trouve que mon serveur (ejabberd 2.0 pour ma part, qui est pourtant sensé avoir bien amélioré le pubsub) me fait quand même des trucs bizarre. Genre par exemple il me renvoie inlassablement les derniers billets du noeud à chaque reconnexion j’ai l’impression. Ou alors c’est peut-être quelque chose lié au paramétrage par défaut du noeud…

    En tous cas, c’était aussi dans mes projets, de tester simplement comment fonctionne le serveur dans divers cas de publication. Et éventuellement, si je confirme bien qu’il y a des comportements bizarres dans les publications ou les notifications, je ferai des rapports de bug (voire des patchs si je trouve du temps). A voir donc…

  13. kael Says:

    Je viens de découvrir une XEP abandonnée, XEP-0173: Pubsub Subscription Storage qui pourrait être d’intérêt.

  14. Jehan Says:
    Sympa. Encore un truc à regarder! Tu me donnes du boulot dis donc. ;-) C’est justement qque chose auquel j’ai pensé. Mais ça devrait être mieux travaillé, là c’est trop simpliste à mon avis. En fait pour moi, il devrait y avoir une sorte de “roster” des noeuds, géré au niveau serveur.

    Cela permettrait notamment un filtrage au niveau serveur des publications. En particulier on évite le spam puisque le serveur garde de manière centralisé les infos sur l’ensemble des inscriptions de ses utilisateurs. Un noeud n’aurait donc pas la possibilité d’envoyer un message à un jid parce qu’il serait bloqué par le serveur s’il ne le trouve pas dans le roster (l’utilisateur final ne serait pas notifié et même pas au courant du spam). Evidemment ça implique d’avoir confiance en son serveur, mais c’est là tout l’avantage d’un système décentralisé comme Jabber: on peut toujours changer de fournisseur de service si on se rend compte que le sien n’est pas net ou qu’on est en désaccord avec sa philosophie.

    Il y a évidemment le simple fait aussi de pouvoir se rappeler, “voir” toutes ses inscriptions et ainsi pouvoir les administrer facilement (supprimer des inscriptions obsolètes, etc.). Ca peut être fait au niveau client, mais dans ce cas, c’est tjrs le même blem qd on change d’ordi/client/etc.

    Je voulais justement parler à ce sujet avec Peter Saint André pour voir ce qu’il en pense.

    Quoiqu’il en soit, j’avance lentement, mais petit à petit sur le plugin. Là je viens de rajouter des templates pour rajouter en une fonction les urls vers les noeuds (je sais plus si j’ai committé ça dans le svn hier, sinon ce sera sûrement ce soir, ou demain puisque ce soir je sors tard, ou après demain au pire parce que demain soir c’est pareil). Bon évidemment ces urls sont peut-être pas dans la bonne norme final (inexistante à l’heure actuelle), mais c’est pour le test. Ils sont inspirés de ce qu’a proposé Peter Saint André la dernière fois que j’ai mentionné ce point.

    Ensuite je vais commencer à améliorer l’organisation du noeud comme je le disais pour pouvoir s’inscrire sur un noeud en particulier.

    Note pour moi-même: me rappeler aussi que je dois discuter aussi des possibilités de configuration des inscriptions avec filtrage sur un même noeud…

  15. kael Says:

    J’ai une autre idée de plugin (mais pas les connaissances PHP pour la coder) qui pourrait t’intéresser.

    Il s’agirait d’un agrégateur PEP pour WordPress qui serait un mix du PEP aggregator et du WP DiSo ActionStream plugin (qui ressemble à ça).

    Il permettrait de publier sur une page dédiée ou sur une colonne du blog les évènements PEP comme user-tune, user-mood, user-activity et user-location, mais aussi user-browsing (comme un social bookmark) et peut-être user-viewing, user-gaming et user-chatting, selon les paramètres définis par l’utilisateur.

    Et il pourrait afficher les flux en temps réels avec du COMET, BOSH ou AJAX (je n’y connais rien concernant le XMPP over HTTP) de manière similaire à cette page qui affiche en Flash les user-tune de la BBC Radio.

    Il pourrait éventuellement permettre par la suite de publier les flux Twitter, Jaiku et de tous ces services - complètement inutiles et donc absolument indispensables :) - selon la proto-XEP Microblogging over XMPP ; mais là, je ne n’ai pas vraiment plus réflechi à ce cas si ce n’est que je pense à quelque chose de similaire à FriendFeed qui utilise aussi un système de chatroom.

    Dans un monde parfait, tous ces services utiliseraient le XMPP de manière interopérable et permettraient ainsi de facilement agréger ces flux, notamment sur une page HTTP.

    Et une dernière idée pour Jabber-Feed.

    D’après la XEP-0060, il est possible d’inclure un élement “body” avec l’option “pubsub#include_body” et d’utiliser un fichier XSLT avec l’option “pubsub#body_xslt” pour transformer le message pubsub en y ajoutant un élement “body” représentant par exemple l’“atom:summary” voire l’“atom:content” du message.

    Avec cette option, il serait possible de publier des messges pubsub lisibles par tous les clients Jabber et ainsi de faciliter le déployement de Jabber-Feed.

    Le seul hic, c’est qu’apparemment l’option “pubsub#body_xslt” n’est supportée par aucun serveur.

  16. kael Says:

    Addendum: deux examples de message Pubsub de Twitter et de Seesmic avec un élement “body” lisibles par tous les clients Jabber.

  17. Jehan Says:
    Cool, ça a l’air pas mal. Je vais regarder ça. Désolé là je suis pas en forme depuis 2 semaines, j’ai encore fait une chute de moto (petite cette fois par contre, à basse vitesse, quelqu’un qui a ouvert sa portière devant moi) et je me suis cassé à nouveau la clavicule (chute du même côté). Donc j’ai pas regardé mon code depuis 2 semaines. Mais je vais m’y remettre. ;-)
  18. kael Says:

    La vie des utilisateurs de deux roues n’est pas facile. :) Je me suis fait percuté par un taxi alors que j’étais à Vélib’, également à basse vitesse. Je compatis.

    J’ai encore une idée, complémentaire de la précédente et de Jabber-Feed, qui interfacerait Pubsub et AtomPub.

    Sylvain Hellegouarch écrit actuellement une application en Python qui mappe et interface PubSub et AtomPub (ici, ici et ) , et quelqu’un a écrit un bot en Ruby pour transformer des messages XMPP en entrées AtomPub.

    L’idée serait donc d’utiliser le protocole AtomPub pour publier sur WordPress en mappant les entrées publiées sous AtomPub avec les nodes Pubsub.

    Cela permettrait une intégration plus poussée, notamment avec les commentaires et probablement avec les évènements PEP, ainsi que de modes de publication supplémentaires.

    /me va p’être devoir apprendre PHP :)

    En aparté et en vrac, une authentification avec OpenID serait bien pour commenter sur ton blog, les liens hypertextes sont difficilement visibles, et j’ai changé d’adresse email. :)

  19. kael Says:

    Un module Ejabberd-AtomPub vient d’être publié ! :)

  20. Jehan Says:
    Sympa. C’est pas la même logique, mais la finalité est assez similaire à ce que je fais… Enfin bon, maintenant que j’en suis là, je vais quand même aller jusqu’au bout. :-)

    Je me suis bien remis à bosser sur le plugin ce soir d’ailleurs. Et j’ai fait pas mal de test sur mon serveur perso. Maintenant je dois faire des tests intensifs sur l’instance Wordpress de test que j’ai montée afin de débugguer tout ça. Je vais faire ça vendredi soir ou ce week-end (quoique… ce week-end, je suis un peu pris tout le temps…).

    Sinon pour ton aparté, je vais voir pour OpenID, mais bon… puisque je laisse les commentaires en libre accès, sans nécessiter de compte (ce qui certes pose le problème des spams… heureusement que l’anti-spam Wordpress est vraiment efficace), cela est-il vraiment utile?
    Et pis pour les liens hypertextes, tu parles de ceux dans les commentaires, pas dans les billets, n’est-ce pas? Effectivement, maintenant que tu le dis… je vais regarder pour les mettre dans une autre couleur quand j’ai 5 minutes.
    Bye et merci pour tous ces commentaires constructifs. :-)

  21. Jehan Says:
    La v0.2 du plugin devrait sortir incessament sous peu. Ca a été énormément amélioré et ce sera 100 fois mieux que la v0.1.
    Il reste néanmoins que les clients comme les serveurs Jabber sont encore très très buggués (ou simplement n’implémentent pas suffisamment) quant à la fonctionnalité pubsub. Peut-être pourrais-je faire quelque chose à ce sujet si je trouve le temps de contribuer… Ou alors il faut attendre que les dévs principaux des dits-logiciels améliorent.

    Par contre pour l’idée très intéressante que tu soulevais vis à vis de l’élément body, mes tests n’ont rien donné de concluant. Par simple hasard, aurais-tu fait toi-même des tests de publication avec cet élément body? Et cela a-t-il donné quelque chose?

Leave a Reply