Nos correctifs acceptés par SnappyMail et Tachyon

· Convergent · 5 min

Nous construisons notre messagerie sur du logiciel libre. Quand nous y trouvons un défaut, nous le corrigeons chez nous, puis nous proposons le correctif au projet d’origine : il profite alors à tous ses utilisateurs, et nous n’avons pas à maintenir un écart. En octobre 2026, douze de ces propositions ont été acceptées par deux projets : SnappyMail et Tachyon.

SnappyMail est un webmail libre, léger et rapide, maintenu par the-djmaze. Tachyon en est une branche dérivée, publiée sous AGPL et maintenue par kimusan. Les deux partagent l’essentiel de leur code, si bien qu’un même défaut s’y trouve souvent des deux côtés — et qu’un même correctif peut servir aux deux.

Nous remercions leurs mainteneurs pour leurs relectures et pour l’accueil fait à ces contributions.

Fiabilité des données : le carnet d’adresses

Une synchronisation dont un côté est vide n’efface plus l’autre. La synchronisation CardDAV traitait une liste vide comme une instruction : si le serveur renvoyait zéro contact, les contacts locaux déjà synchronisés étaient supprimés ; si la base locale était vide, c’est le serveur qui était élagué. Or une liste vide est bien plus souvent une panne — un index de serveur à reconstruire, une réponse illisible, un incident d’authentification passager — qu’une vraie demande de tout effacer. Le correctif suspend les suppressions dans le sens où la source est vide et laisse l’import et l’export réconcilier les deux côtés. SnappyMail #2060 · Tachyon #125

GetContactByEmail() interrogeait les mauvaises colonnes. La recherche d’un contact par adresse renvoyait les bonnes données, mais sans ses métadonnées de synchronisation (identifiant, date de modification, etag), avec trois avertissements PHP par appel. Rien de visible pour l’utilisateur, des valeurs fausses pour une synchronisation CardDAV. Le contact est désormais relu par son identifiant, avec toutes ses colonnes. SnappyMail #2074

Les en-têtes HTTP passés en tableau associatif sont envoyés correctement. Plusieurs appels transmettaient leurs en-têtes sous la forme nom => valeur, que curl attend en lignes Nom: valeur : il les envoyait mal formés, puis les ignorait. Conséquence la plus visible, l’envoi d’un contact vers le serveur CardDAV était refusé. Les deux transports construisent maintenant leurs lignes d’en-tête au même endroit, avec un test. Tachyon #124

La photo enregistrée sur un contact sert d’avatar. Le greffon avatars annonçait la recherche dans les contacts comme « à faire ». Elle est en place : la photo du contact, sous ses trois formes vCard (URI data:, binaire encodé, URL), passe avant Gravatar, BIMI ou le favicon du site. Une photo choisie par l’utilisateur l’emporte sur un avatar deviné, et un expéditeur dont la fiche porte une photo n’entraîne plus aucune requête vers des services extérieurs. SnappyMail #2061

Sécurité

Tous les attributs data-* sont retirés du HTML des messages, pas seulement le premier. Le nettoyage du HTML des messages entendait supprimer tous les attributs data-*. Mais la boucle retirait l’attribut sur lequel elle se trouvait, dans une collection vivante : l’itération s’arrêtait là, et un seul data-* disparaissait par élément, quel que soit leur nombre. Le correctif, mesuré attribut par attribut, rend au code le comportement que son commentaire annonçait. SnappyMail #2075 · Tachyon #126

Double authentification durcie. Le greffon two-factor-auth de Tachyon passe en 2.20.0 :

  • le secret TOTP est scellé (libsodium), les codes de secours ne sont plus conservés qu’en empreinte HMAC et ne s’affichent qu’une fois ;
  • un code déjà accepté ne peut pas être rejoué ;
  • cinq échecs en quinze minutes verrouillent le second facteur pendant quinze minutes ;
  • le QR code, qui encode le secret, n’est plus renvoyé par la consultation de l’état du second facteur.

Les comptes déjà inscrits conservent leur second facteur : les anciens enregistrements sont lus puis scellés à la première lecture. Des tests accompagnent chaque contrôle de sécurité. Tachyon #128

Interopérabilité : agenda, annuaire, en-têtes

Les invitations d’agenda en pièce jointe sont reconnues plus largement. Une invitation envoyée par Evolution ou Exchange porte souvent sa partie d’agenda en ligne, et la pièce jointe sous le type application/ics. Le greffon ics-viewer ne cherchait que text/calendar et n’affichait rien. Il reconnaît désormais text/calendar, application/ics, text/x-vcalendar et les fichiers .ics. SnappyMail #2064 · Tachyon #127

La suggestion de contacts cherche dans plusieurs branches de l’annuaire. Le greffon ldap-contacts-suggestions n’interrogeait qu’une base DN. Or un annuaire range rarement tout au même endroit : les personnes d’un côté, les salles de réunion de l’autre. Le réglage base_dn accepte maintenant plusieurs branches séparées par |, par exemple ou=People,dc=example,dc=com|ou=Resources,dc=example,dc=com. Une valeur existante se comporte exactement comme avant, et une branche en échec n’empêche plus les autres de répondre. SnappyMail #2070

Un objet de message plié garde son espace. Quand un objet long est plié juste avant un mot encodé (RFC 2047), l’espace qui le précède était supprimé à l’affichage du message : « vos équipements » devenait « voséquipements ». Les RFC 2047 et 5322 n’autorisent ce retrait qu’entre deux mots encodés ; le correctif s’y tient. Tachyon #170

Où en sont ces correctifs

ProjetAcceptéesPubliées
SnappyMail#2060, #2061, #2064, #2070, #2074, #2075 — fusionnées le 22 octobre 2026Pas encore : la dernière version publiée, 2.38.2, date d’octobre 2024
Tachyon#124, #125, #126, #127, #128 — fusionnées le 7 octobre 2026Oui, depuis Tachyon 4.4.2
Tachyon#170 — fusionnée le 22 octobre 2026Pas encore dans une version publiée

Une modification fusionnée n’est pas encore une modification livrée : elle le devient avec la version suivante de chaque projet.

Pourquoi rendre à l’amont

Un correctif gardé pour soi doit être réappliqué à chaque mise à jour, et ne protège que ses propres utilisateurs. Rendu au projet, il est relu par ceux qui connaissent le code le mieux, il protège toutes les installations, et il ne nous coûte plus rien à maintenir. Chacune de ces propositions décrit le défaut, la façon de le reproduire et le test qui le garde fermé : c’est ce qui permet à un mainteneur de l’accepter en confiance.


Vous cherchez un webmail libre, avec agenda et contacts, exploité par une équipe qui connaît son code ? Découvrez nos services ou parlons-en. Et suivez-nous sur GitHub.