73. pepsi-stage-list-deliver¶
Fait de la copie d’un message de liste la copie propre d’un membre.
73.1. Rôle¶
pepsi-stage-list-post a déjà produit un enregistrement par destinataire ; pepsi-stage-list-deliver est ce qui fait de chacun d’eux la copie de ce membre plutôt qu’une copie de plus du même message. Un enregistrement entre, un enregistrement sort. L’étape achève List-Unsubscribe avec l’URI https: en un clic propre à ce membre, à côté de la forme mailto:, et ajoute List-Unsubscribe-Post: List-Unsubscribe=One-Click (RFC 8058) ; elle décore le message avec l’en-tête et le pied de page de la liste dans la langue du membre lorsque le personalize de la liste vaut individual ou full ; et elle réécrit To: pour nommer le membre, mais pour full seulement – le personalize_to d’amont est une opération vide pour individual, et il en va de même ici. Référence : pepsi-stage-list-deliver(1).
Ce sous-système est une réimplémentation de GNU Mailman 3 ; voir Listes de diffusion, qui nomme ce qui a été repris d’amont.
Avertissement
Cette étape doit s’exécuter avant la signature. Chaque en-tête qu’elle touche appartient à la liste h= de DKIM, et List-Unsubscribe est précisément l’en-tête qu’un fournisseur de boîtes inspecte pour décider s’il affiche un bouton de désabonnement. Un pipeline qui signerait d’abord produirait du courrier signé puis modifié, qui échoue à DKIM partout. NEXT_STAGE pointe donc vers pepsi-stage-dkim-sign et non vers un relais, et pepsi-setup refuse l’ordre inverse. Amont dit la même chose dans le commentaire qui retire arc-sign de son propre pipeline.
73.2. Désabonnement en un clic¶
Le jeton de l’URI https: est un condensé à clé calculé sur la liste, l’adresse du membre et un numéro de série que le membre peut faire tourner. Il n’est pas stocké : une URI List-Unsubscribe est émise une fois par membre et par message, une table de ces URI croîtrait donc avec les remises et non avec les membres. Trois conséquences.
Le jeton ne voyage jamais entre les étapes – celle-ci détient le secret et le calcule pour chaque copie.
Révoquer toutes les URI jamais émises pour un abonnement consiste à incrémenter le
unsubscribe_serialde ce membre : une mise à jour de compteur et non un balayage de table.Il n’y a rien à faire expirer, car un abonnement qui n’existe plus échoue à la recherche d’appartenance, quoi que dise le jeton.
Le secret est [pepsi-list] UNSUBSCRIBE_SECRET. Sans secret, ou sans BASE_URL pour construire une URI, la forme mailto: reste seule, comme chez amont : une URI invérifiable est pire que pas d’URI. Changer le secret invalide toutes les URI déjà présentes dans la boîte de chaque abonné.
73.3. Décoration¶
L’en-tête et le pied de page sont produits depuis [pepsi] TEMPLATE_DIR sous les noms list-header.<lang>.body et list-footer.<lang>.body, la langue du membre d’abord et en en recours. Une liste sans fichiers de modèle n’est pas décorée, ce qui est le cas courant et ne coûte rien.
Le pied de page est ajouté à la première partie ``text/plain`` et à rien d’autre. Ajouté à une partie multipart/signed il casse la signature, ajouté à un PDF il le corrompt : un message sans partie en texte brut est donc remis sans décoration plutôt qu’abîmé.
Une copie signalée par avoid-duplicates – le membre figurait déjà dans le To ou le Cc du message et a conservé malgré tout sa copie de liste – porte X-Pepsi-List-Copy: yes, pour que le lecteur voie pourquoi il en a deux.
73.4. Deux invariants¶
Les enregistrements frères commencent ici, jamais en tête de pipeline. Rentrer à init relancerait la vérification ARC et repasserait par le routeur, ce qui explose de façon combinatoire sur une liste chapeau.
Les préférences personnelles d’un membre ne reconfigurent pas la remise de liste. Pepsi superpose automatiquement les surcharges pepsi.settings par adresse (voir Configuration), et l’unique destinataire d’un enregistrement frère est un membre, dont la surcharge d’absence ou de langue n’a pas à changer les cibles de cette étape — un NEXT_STAGE qui en serait tiré pourrait acheminer la copie en contournant la signature. Aussi NEXT_STAGE, les options [pepsi-list] et le TEMPLATE_DIR de [pepsi] sont-ils lus dans la configuration globale du site, qu’aucune surcharge de configuration domain: ou address: ni aucune ligne pepsi.settings n’atteint, et la langue du membre vient du descripteur écrit par l’éclatement. Rien n’est repris de la surcouche.
73.5. Configuration¶
[stage-<name>] : PROGRAM = pepsi-stage-list-deliver et NEXT_STAGE (obligatoire – la queue de signature ; pepsi-setup refuse un relais). Tout le reste est le descripteur de membre écrit par l’éclatement et les attributs propres de la liste, plus [pepsi-list] BASE_URL et UNSUBSCRIBE_SECRET pris dans la section du serveur.
73.6. State¶
Entrées :
state.list– l’identifiant de liste, la langue du membre, son numéro de série de désabonnement et l’indicateur de doublon – ainsi que l’uniquercpt_tode l’enregistrement, qui fait autorité sur l’adresse.Sorties : un bloc d’en-têtes et un corps réécrits. Aucun
staten’est modifié.Transitions : passage à
NEXT_STAGE, la seule transition.
73.7. Voir aussi¶
Listes de diffusion, pepsi-stage-list-post, pepsi-stage-dkim-sign, pepsi-list, pepsi-stage-list-deliver(1).