41. pepsi-stage-dot-forward

Traiter les fichiers ~/.forward par utilisateur.

41.1. Rôle

pepsi-stage-dot-forward permet au propriétaire d’un compte local de rediriger son propre courrier avec un fichier ~/.forward. Pour chaque destinataire d’enveloppe qui est local (le même test LOCAL_DOMAINS / TARGETS / RECIPIENT_DELIMITER que pepsi-stage-relay-to-maildir), elle exécute le ~/.forward de cet utilisateur via le helper pepsi-helper-dot-forward(1) setuid-root, qui abandonne d’abord ses privilèges vers l’utilisateur. Les destinataires non locaux sont laissés intacts. Normalement placée juste avant la remise locale. Référence : pepsi-stage-dot-forward(1).

41.2. Fonctionnalités

41.2.1. Issues par destinataire

  • Pas de ~/.forward — le destinataire est laissé passer tel quel et avance vers NEXT_STAGE (typiquement la remise locale).

  • Redirigé — le destinataire est remplacé par les adresses que le ~/.forward a nommées ; celles-ci redémarrent le pipeline à RESTART_STAGE (par défaut init) afin d’être réauthentifiées et réacheminées comme un courrier nouvellement arrivé. Un résultat vide (le message a été consommé par une directive |pipe//file) supprime le destinataire.

  • Échoué — un ~/.forward en échec (erreur de commande de pipe, erreur d’écriture de fichier, ou une directive désactivée) achemine le destinataire vers BOUNCE_STAGE.

  • Problème d’hôte — le helper n’a pas pu agir du tout (pas installé setuid-root, échec d’une recherche passwd, un répertoire personnel ou un ~/.forward qui n’appartient pas exclusivement à l’utilisateur). Rien n’est rebondi : le message reste en file et est retenté une fois l’hôte réparé.

Un message comportant plusieurs destinataires peut mêler ces issues ; les adresses redirigées, les rebonds par destinataire et les destinataires conservés sont réconciliés en un seul aller-retour de base de données.

41.2.2. Directives ~/.forward

Le helper agit sur chaque ligne non vide et non-# en tant que l’utilisateur : une adresse nue devient une adresse de redirection ; |command envoie le message à un shell par tube lorsque ALLOW_PIPE est activé ; /absolute/path ajoute le message à un fichier lorsque ALLOW_FILE est activé. Lorsque ALLOW_PIPE et ALLOW_FILE sont tous deux désactivés, le corps du message n’est même pas remis au helper.

Une adresse écrite avec le \ initial de sendmail signifie « remettre à ce nom et ne pas le développer davantage », et n’est pas relancée à RESTART_STAGE. La ligne canonique de conservation d’une copie locale — \bob dans ~bob/.forward — conserve simplement ce destinataire d’enveloppe sur cette ligne, de sorte qu’elle avance vers NEXT_STAGE et est remise localement ; tout autre \name devient une ligne sœur à NEXT_STAGE. C’est aussi ce qui empêche une entrée \ de rentrer de nouveau dans cette étape.

41.2.3. Prévention des boucles

Comme la redirection relance le pipeline, chaque ligne redirigée porte sa chaîne de redirection dans state["dot-forwarders"] (voir L’état du message) : la chaîne de la ligne dont elle provient, plus le login dont le ~/.forward l’a redirigée. Un destinataire dont l’utilisateur figure déjà dans la chaîne de sa ligne est acheminé vers BOUNCE_STAGE sans que son ~/.forward soit réexécuté (un message à expéditeur nul est supprimé à la place), de sorte qu’un cycle de redirection se termine et que l’expéditeur en est informé. La chaîne est propre à chaque chemin de redirection : plusieurs destinataires d’un même message qui redirigent reçoivent chacun une ligne sœur ne portant que leur propre chaîne.

41.3. Privilèges

L’étape doit être installée setgid pepsi-forward (mode 2550, propriétaire pepsi:pepsi-forward — exécutable par le seul propriétaire, de sorte qu’aucun autre utilisateur local n’atteint le bit setgid) ; cette appartenance au groupe est ce qui permet au worker pepsi du dispatcher d’exécuter le helper 4750 root:pepsi-forward, qui seul exécute le ~/.forward en tant qu’utilisateur cible et refuse d’agir pour root. Porter ce bit est la raison pour laquelle l’étape est un binaire autonome plutôt que l’un des programmes repliés dans le binaire pepsi unifié.

41.4. Configuration

[stage-<name>] : PROGRAM = pepsi-stage-dot-forward, NEXT_STAGE (où va un destinataire en passage direct — normalement la remise locale), BOUNCE_STAGE (où va un destinataire dont le ~/.forward a échoué), RESTART_STAGE (par défaut init), ALLOW_PIPE et ALLOW_FILE (tous deux yes par défaut), HELPER (par défaut pepsi-helper-dot-forward) et les options de localité partagées LOCAL_DOMAINS (valant par défaut [pepsi-ingress] ACCEPTED_DOMAINS), TARGETS et RECIPIENT_DELIMITER. pepsi-setup vérifie que RESTART_STAGE nomme une étape réelle. Voir pepsi-stage-dot-forward(1).

41.5. État

  • Entrées : state["dot-forwarders"] (la protection contre les boucles) et state.dsn.

  • Sorties : state["dot-forwarders"] étendu avec chaque identifiant de connexion dont le ~/.forward s’est exécuté, sur chaque ligne que l’éclatement produit ; state.dsn.rcpt est reconstruit de concert avec les destinataires de chaque ligne, et la ligne d’un destinataire rebondi porte state.bounce.

41.6. Voir aussi

pepsi-stage-relay-to-maildir, pepsi-stage-aliases, pepsi-stage-bounce, Fonctionnalités prises en charge, pepsi-stage-dot-forward(1), pepsi-helper-dot-forward(1).