Recevez et envoyez vos messages XMPP/Jabber avec votre lecteur de courriel grâce à Salut à Toi !

Le courriel est un outil extrêmement pratique, mais qui souffre de plusieurs défauts majeurs. Par exemple, il est très facile de faire de l'usurpation d'identité (e-mail spoofing): juste en changeant les paramètres de n'importe quel lecteur courriel, vous pouvez faire croire que le courriel que vous avez envoyé vient d'une autre personne, une banque, ou autre. C'est une technique très utilisée par les pirates du dimanche pour avoir un mot de passe (en se faisant passer par exemple pour une banque et en disant que le mot de passe a été perdu) ou les spammeurs (une technique courante est d'utiliser votre propre adresse pour tenter de berner les filtres anti-spam).

XMPP/Jabber ne souffre pas de ce problème: les serveurs sont chargés de vérifier que l'émetteur d'un message est bien celui qu'il prétend être.

Or, XMPP définit un type de message, "normal", qui est très proche du courriel classique: il dispose d'un sujet et attend une réponse. Ces messages sont gérés par les clients classiques (c'est dans la norme de base), mais souvent de manière relativement basique.

Voulant gérer correctement ces messages avec SàT, je me suis dit qu'il me faudrait beaucoup trop de travail pour arriver au niveau de fonctionnalités d'un client courriel (ou MUA) correct. Aussi, je me suis dit « Pourquoi ne pas tout simplement réutiliser ces clients ? ».

Et c'est ainsi que j'ai développé un petit serveur courriel qui permet de déléguer la charge des messages de type "normal" à votre client courrier usuel (KMail, Mutt, Thunderbird, Roundcube ou que sais-je d'autre). L'idée est que la messagerie instantanée (messages de type "chat", "groupchat" - salon de discussion -, etc) reste affichée via les interfaces usuelles (Wix/Primitivus), et les messages normaux soient stockées par SàT et gérés par votre client courriel. C'est un pas vers le remplacement du courriel vers un protocole qui a de nombreux atouts.

Quelques raisons qui me font penser que XMPP/Jabber peut remplacer avantageusement (et pratiquement de manière transparente) le courriel:

  • les identifiants jabber (JID) sont similaires aux adresses courriel
  • si une passerelle courriel est disponible côté serveur, on peut utiliser aussi le réseau courriel normal, la boucle est bouclée :)
  • l'usurpation d'identité (spoofing) n'est (théoriquement) pas possible avec XMPP (les serveurs se chargent de vérifier ça)
  • Jabber n'est (pour le moment) pas touché par les messages indésirables autant que le réseau de courriels traditionnel
  • les serveurs XMPP sont souvent plus stricts à l'inscription, et il est plus difficile d'envoyer un message anonymement, pas de relai ouvert: une bonne protection contre le pourriel
  • vous pouvez configurer un compte XMPP pour ne recevoir des messages que depuis quelqu'un de connu (dans votre liste de contacts - roster list- )
  • les connections entre les serveurs Jabber sont chiffrées
  • Toutes les fonctionnalités du courriel (accusé de réception, message HTML, etc) sont soit déjà disponibles sur XMPP, soit peuvent l'être avec une extension
  • ...

De plus, il me semble peu probable qu'une adresse jabber ( ex.: errico@caserte.it ) et une adresse courriel similaire appartiennent à 2 personnes différentes. Il me semble tout à fait possible par la suite que SàT envoie automatiquement le message à la bonne adresse: d'abord tester si l'adresse XMPP existe, et dans le cas contraire envoyer via une passerelle courriel. Quitte à faire une petite bidouille syntaxique pour spécifier si on veut envoyer à une adresse Jabber ou à un serveur de courriel. L'avantage le plus évident d'une adresse courriel est sont côté standard: tout le monde ou presque en a une. Avec XMPP et ses passerelles, la transition entre messagerie courriel et Jabber est possible et quasi-transparente.

Les considérations techniques maintenant

Les serveurs utilisés sont IMAP v4 et SMTP: ce sont des protocoles que pratiquement tous les lecteurs de courriels connaissent. IMAP a l'avantage de permettre une synchronisation avec SàT (y compris l'état du message: est-ce qu-il est lu ? Est-ce qu'on y a répondu ?), et permet d'envoyer des notifications en temps réel de l'arrivée de nouveaux messages. SMTP est utilisé pour l'envoi de messages, c'est tout simplement le protocole le plus utilisé, et ça fonctionne bien. Les identifiants et mots de passes utilisés sont ceux du profil SàT à utiliser (identifiant: nom du profil, mot de passe: mot de passe du compte jabber). Les ports par défaut sont le port 10143 pour IMAP, et 10125 pour SMTP, j'ai pris soin de prendre des ports utilisables sans les droits root, et qui n'ont pas d'utilisation connue.

Les messages sont sauvés dans une boite de type Maildir , idéal pour l'archivage et l'utilisation avec IMAP. De plus, de très nombreux outils existent pour faire à peu près ce que vous voulez avec ces messages. La boîte se trouve dans votre répertoire SàT personnel: ~/.sat/[nom_du_profil]/Maildir

Pourquoi faire ça côté client (SàT) et non côté serveur XMPP ? Déjà au niveau sécurité c'est clairement un plus: le serveur IMAP est local, pas besoin d'ouvrir un nouveau port et donc une brèche éventuelle sur un serveur public plus sujet aux attaques, et une simple règle iptable (pare-feu) interdira les connexions en dehors de votre machine. Ensuite, il faudrait élaborer une XEP, et attendre qu'elle soit implémentée et répandue dans les serveurs. Et puis, j'ai pu faire ça rapidement (merci Twisted), et SàT permet de choisir d'utiliser ou pas cette fonctionnalité (grâce aux extensions), pourquoi s'en priver ? Un des buts de SàT est justement le prototypage rapide d'idées de ce genre...

L'installation

Si vous voulez essayer ça, installez la dernière version de développement, les détails sont sur le wiki.
Sur une *buntu, vous pouvez faire (en console):
sudo apt-get install python-pip python-dev mercurial
sudo pip install "hg+http://repos.goffi.org/sat/"

Évidemment, tout ceci est en développement: il n'est pas encore possible de créer un dossier avec IMAP par exemple, et y'a des tas de petites bricoles du genre qui vont s'améliorer avec le temps. Mais ça permet déjà de se donner une idée.

PS: petite précision: j'utilise parfois XMPP, parfois Jabber. XMPP est le nom du protocole utilisé par SàT (ce qui lui permet de communiquer avec d'autres logiciels similaires), et Jabber est le nom du réseau global qui utilise ce protocole.

Commentaires

1. Le jeudi 20 janvier 2011, 22:38 par xma

Salut,

je viens de tester et je pense ne pas avoir tout compris. J'ai bien tout suivi, fait le sat, crée le profil mais rien ne se passe. Mon compte reste desesperement a 'offline' alors même que les informations sont correctes.

Quelle est l'astuce ?

2. Le vendredi 21 janvier 2011, 00:17 par Goffi

Tu utilises quel frontend ? Primitivus ou Wix ?
Essaye de cliquer explicitement sur « connect » si tu ne l'as pas déjà fait.
As tu quelque chose de suspect dans ~/.sat/sat.log ?

3. Le samedi 22 janvier 2011, 23:39 par xma

Salut

merci pour l'astuce du fichier de log que je n'avais pas trouvé...

C'est tombé en marche après bidouille immonde dans le /etc/hosts

Il faut que je regarde ça de plus près.

Je vais pouvoir tester un peu plus maintenant car l'idée du projet me séduit.

4. Le samedi 22 janvier 2011, 23:51 par xma

J'ai parlé un peu vite. La connexion s'effectue mais point de message dans le répertoire mentionné probablement dû à cette erreur:

2011-01-22 23:49:12+0100 [XmlStream,client] Unhandled Error
Traceback (most recent call last):
File "/builddir/build/BUILD/Python-2.6.4/Modules/pyexpat.c", line 656, in EndElement

File "/usr/lib/python2.6/site-packages/twisted/words/xish/domish.py", line 797, in _onEndElement
self.ElementEvent(self.currElem)
File "/usr/lib/python2.6/site-packages/twisted/words/xish/xmlstream.py", line 107, in onElement
self.dispatch(element)
File "/usr/lib/python2.6/site-packages/twisted/words/xish/utility.py", line 317, in dispatch
callbacklist.callback(obj)
--- <exception caught here> ---
File "/usr/lib/python2.6/site-packages/twisted/words/xish/utility.py", line 107, in callback
methodwrapper(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/twisted/words/xish/utility.py", line 27, in __call__
self.method(*nargs, **nkwargs)
File "/usr/lib/python2.6/site-packages/wokkel-0.6.3-py2.6.egg/wokkel/xmppim.py", line 724, in _onMessage
self.onMessage(message)
File "/usr/lib/python2.6/site-packages/sat/sat.tac", line 130, in onMessage
if not self.host.trigger.point("MessageReceived",message, profile=self.parent.profile):
File "/usr/lib/python2.6/site-packages/sat/tools/misc.py", line 63, in point
if not trigger(*args, **kwargs):
File "/usr/lib/python2.6/site-packages/sat/plugins/plugin_misc_maildir.py", line 88, in messageReceivedTrigger
if message['type'] != 'normal':
File "/usr/lib/python2.6/site-packages/twisted/words/xish/domish.py", line 426, in __getitem__
return self.attributes[self._dqa(key)]
exceptions.KeyError: 'type'

P.S: peut-être serait-il plus simple de communiquer via IM ou e-mail ;) Mon jid est mon mail.

5. Le samedi 22 janvier 2011, 23:51 par xma

J'ai parlé un peu vite. La connexion s'effectue mais point de message dans le répertoire mentionné probablement dû à cette erreur:

2011-01-22 23:49:12+0100 [XmlStream,client] Unhandled Error
Traceback (most recent call last):
File "/builddir/build/BUILD/Python-2.6.4/Modules/pyexpat.c", line 656, in EndElement

File "/usr/lib/python2.6/site-packages/twisted/words/xish/domish.py", line 797, in _onEndElement
self.ElementEvent(self.currElem)
File "/usr/lib/python2.6/site-packages/twisted/words/xish/xmlstream.py", line 107, in onElement
self.dispatch(element)
File "/usr/lib/python2.6/site-packages/twisted/words/xish/utility.py", line 317, in dispatch
callbacklist.callback(obj)
--- <exception caught here> ---
File "/usr/lib/python2.6/site-packages/twisted/words/xish/utility.py", line 107, in callback
methodwrapper(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/twisted/words/xish/utility.py", line 27, in __call__
self.method(*nargs, **nkwargs)
File "/usr/lib/python2.6/site-packages/wokkel-0.6.3-py2.6.egg/wokkel/xmppim.py", line 724, in _onMessage
self.onMessage(message)
File "/usr/lib/python2.6/site-packages/sat/sat.tac", line 130, in onMessage
if not self.host.trigger.point("MessageReceived",message, profile=self.parent.profile):
File "/usr/lib/python2.6/site-packages/sat/tools/misc.py", line 63, in point
if not trigger(*args, **kwargs):
File "/usr/lib/python2.6/site-packages/sat/plugins/plugin_misc_maildir.py", line 88, in messageReceivedTrigger
if message['type'] != 'normal':
File "/usr/lib/python2.6/site-packages/twisted/words/xish/domish.py", line 426, in __getitem__
return self.attributes[self._dqa(key)]
exceptions.KeyError: 'type'

P.S: peut-être serait-il plus simple de communiquer via IM ou e-mail ;) Mon jid est mon mail.

6. Le dimanche 23 janvier 2011, 00:28 par xma

J'ai parlé un peu vite. La connexion s'effectue mais point de message dans le répertoire mentionné probablement dû à cette erreur

P.S: peut-être serait-il plus simple de communiquer via IM ou e-mail ;) Mon jid est mon mail.

7. Le dimanche 23 janvier 2011, 12:49 par Goffi

Ah oui un petit soucis en effet, mais facile à corriger

Je t'ajoute cette après midi et on voit ça dès que t'es dispo ;)

8. Le lundi 24 janvier 2011, 22:27 par Yag

Salut, existe il un salon jabber pour discuter autour de "salut a toi" ? Si non, ce serais pratique d'en créer un =) Je suis moi même en train d'étudier l'implémentation d'un lecteur de flux rss utilisant xmpp/pubsub et je me demandais s'il j'avais un avantage a le créer en tant qu'extension a salut a toi.

9. Le lundi 24 janvier 2011, 23:49 par Goffi

@Yag: Salut, non pas encore, mais vu que il commence à y avoir plusieurs personnes qui me posent des questions, je pense en créer un rapidement (demain si je trouve le temps ;) ). Je pense pouvoir commencer aussi la mailing list, ça permettra de garder trace des questions/réponses.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

URL de rétrolien : http://www.goffi.org/trackback/47

Fil des commentaires de ce billet