URL: https://linuxfr.org/users/therealnicoco/journaux/ma-passerelle-xmpp-signal Title: Ma passerelle XMPP/Signal Authors: Nicoco Date: 2021年01月26日T16:41:52+01:00 License: CC By-SA Tags: xmpp, signal, passerelle, python et asyncio Score: 40 # Préambule Récemment, wazzzzaaaaap a perdu pas mal d'utilisateurs dans mon entourage proche. J'aurais aimé avoir la [puissance de tweet](https://nitter.net/elonmusk/status/1347165127036977153?ref_src=twsrc%5Etfw) de l'ami Elon pour conseiller à tout le monde de migrer vers XMPP, mais je n'ai ni fanclub ni compte twitter, donc ça commençait mal... [*] Cependant, Signal étant open source, on devrait pouvoir trouver un moyen pas trop alambiqué de communiquer avec ses utilisateurs via XMPP, non ? La réponse est oui, en théorie. Il existe en effet un [plugin libpurple pour signal](https://github.com/ttlmax/libpurple-signald) et un logiciel nommé [spectrum](https://www.spectrum.im/) pour faire des passerelles XMPP/libpurple. Malheureusement tous les plugins *libpurple* ne fonctionnent pas toujours très bien avec, et chez moi ça a pas marché. Bien incapable de comprendre et déboguer le bousin, j'ai décidé d'essayer d'implémenter ma solution avec ce que je connais (c'est-à-dire python), profitant de l'occasion pour apprendre à programmer un poil moins mal. ## Pas taper SVP Coder est un hobby pour moi, et j'apprends sur le tas, donc c'est très rudimentaire et la qualité de code n'est pas au rendez-vous, mais je partage avec vous aujourd'hui mon petit bébé : [spectrum2_signald](https://gitlab.com/nicocool84/spectrum2_signald). # Détails techniques ## Signald C'est basé sur [signald](https://gitlab.com/signald/signald), un client Signal non officiel sous forme d'un *daemon*. On communique avec par un socket UNIX, c'était une bonne occasion pour moi d'enfin comprendre pourquoi et comment `async/await` en python, et de ce côté, je suis content de moi. J'ai compris comment on pouvait rapidement se retrouver dans l'enfer des *callbacks* et ma sous-mission est donc réussie: je comprends à quoi correspondent ces `event_loops`, `coroutines` et autres `Futures` qui ne me semblaient jusqu'à présent être là que pour m'empêcher d'utiliser des bibliothèques qu'elles avaient l'air bien mais qu'elles faisaient trop peur avec leur `asyncio`. Il y a bien une [bibliothèque python](https://gitlab.com/stavros/pysignald) qui avait l'air de faciliter la communication avec signald, mais en fait elle est très limitée. Le module [signald](https://gitlab.com/nicocool84/spectrum2_signald/-/blob/master/spectrum2_signald/signald.py) que j'ai écrit m'a l'air aujourd'hui plus avancé et j'ai contacté les auteurs de `pysignald` pour savoir si ça les intéressait de joindre nos forces. *Signald* est en développement actif et l'API est pas très très bien documentée et cohérente, mais je ne regrette pas mon choix. Je pense que ça va aller en s'améliorant! ## Spectrum J'ai été surpris dans mes recherches de trouver assez peu de solutions qui permettent de facilement écrire une passerelle XMPP. [Slixmpp](https://slixmpp.readthedocs.io/) m'avait l'air d'un bon choix, mais il nécessite une connaissance des XEP un peu trop bas niveau pour mes compétences, c'est pourquoi j'ai décidé d'écrire la passerelle comme un *backend* spectrum2 (spectrum2_purple_backend est un autre exemple de backend pour spectrum2). Spectrum2 est [mal documenté](https://spectrum.im/documentation/), mais j'avais déjà discuté avec le mainteneur principal, donc je me suis dit qu'il m'aiderait à m'en sortir, et ça a été le cas. J'avais un point de départ qui m'a bien motivé: des [bindings python](https://pypi.org/project/pyspectrum2/) (presque) tout prêts. Contribuer à la doc de spectrum2 est quelque chose que je dois faire dans un avenir proche, car une partie est obsolète, et je me suis pris la tête pour arriver à correctement communiquer avec. # Ce qui va Si vous êtes intéressés par cette passerelles, elle permet déjà de communiquer avec les utilisateurs signal, en messages privés et en groupes, avec un support pour les pièces jointes et la synchronisation des messages entre les clients (officiels ou non). # Ce qui ne va pas Beaucoup de choses. N'hésitez pas à tester et me faire des retours de bugs, ou à me signaler les énormes défauts de conception qui m'auraient échappé. ## Des tests, c'est quoi ? Malgré la présence d'un répertoire `tests` dans le dépôt git, il n'y a pas de tests. Je ne sais pas en écrire car je n'ai jamais fait ça (un hobby, je vous le rappelle), et en plus je pense que la nature du projet ne rend pas les tests triviaux à écrire. En effet, pour tester il faudrait un serveur XMPP, signald, spectrum, un client XMPP, et surtout un plusieurs comptes signal. J'ai réussi à faire bannir mon numéro de téléphone temporairement (*too many requests*) pendant que j'ai écrit les lignes de code que je partage avec vous aujourd'hui alors je ne sais pas trop comment je devrais m'y prendre. ## Qualité de code J'ai deux grosses classes qui font tout et qui sont assez peu commentées. J'ai essayé de choisir des noms pas trop cryptiques pour mes méthodes et j'ai commencé à écrire des docstrings, mais ce n'est pas encore ça. ## Sécurité En l'état actuel, ce n'est pas du tout adapté à être déployé comme une passerelle ouverte à plusieurs utilisateurs. En effet, il faudra attendre la prochaine version de [spectrum2](https://github.com/SpectrumIM/spectrum2/pull/403/files) pour empêcher n'importe quel JID d'utiliser n'importe quel numéro de téléphone déjà enregistré sur signald et il faudra que je comprenne [comment supprimer un compte de signald](https://gitlab.com/signald/signald/-/issues/119) lorsque l'utilisateur se désinscrit de la passerelle pour éviter des attaques un peu trop faciles. Cependant, l'ensemble des gens potentiellement utilisés par cette passerelle et l'ensemble des gens qui ont leur propre serveur XMPP sont probablement égaux, donc je me dit qu'il y aura peut être du monde intéressé ici... # Conclusion Voilà voilà, j'ai écrit un bout de code, j'ai appris des choses en python et programmation asynchrone, j'ai communiqué avec des inconnus sur des MUCs et canaux IRC, et peut-être vous allez vouloir m'aider à faire mûrir tout ça avec vos suggestions. [*] J'ai quand même réussi à faire migrer pas mal de potes et de famille sur XMPP grâce à l'excellent et utilisateur-amical [Conversations](https://github.com/iNPUTmice/Conversations/), mais il faut bien avouer que pour les utilisateur de la marque à la pomme, ça n'est pas encore ça...