41. pepsi-stage-dot-forward¶
Verarbeitet benutzerspezifische ~/.forward-Dateien.
41.1. Rolle¶
pepsi-stage-dot-forward lässt einen lokalen Kontoinhaber seine eigene Mail mit einer ~/.forward-Datei umleiten. Für jeden Umschlagempfänger, der lokal ist (dieselbe LOCAL_DOMAINS / TARGETS / RECIPIENT_DELIMITER-Prüfung wie pepsi-stage-relay-to-maildir), führt sie das ~/.forward dieses Benutzers über den setuid-root pepsi-helper-dot-forward(1)-Helper aus, der zuerst zum Benutzer wechselt. Nicht lokale Empfänger bleiben unberührt. Normalerweise direkt vor der lokalen Zustellung platziert. Referenz: pepsi-stage-dot-forward(1).
41.2. Funktionen¶
41.2.1. Ergebnisse pro Empfänger¶
Kein ~/.forward — der Empfänger ist eine Durchleitung und schaltet zu
NEXT_STAGEweiter (typischerweise lokale Zustellung).Weitergeleitet — der Empfänger wird durch die vom
~/.forwardbenannten Adressen ersetzt; diese starten die Pipeline beiRESTART_STAGE(Standardwertinit) neu, sodass sie wie frische Mail neu authentifiziert und neu geroutet werden. Ein leeres Ergebnis (die Nachricht wurde von einer|pipe//file-Direktive verbraucht) lässt den Empfänger fallen.Fehlgeschlagen — ein fehlgeschlagenes
~/.forward(Pipe-Befehlsfehler, Dateischreibfehler oder eine deaktivierte Direktive) routet den Empfänger zuBOUNCE_STAGE.Host-Problem — der Helfer konnte überhaupt nicht handeln (nicht setuid-root installiert, ein Fehler bei der passwd-Abfrage, ein Home-Verzeichnis oder eine
~/.forward, die nicht ausschließlich dem Benutzer gehört). Nichts wird gebounct: Die Nachricht bleibt in der Warteschlange und wird erneut versucht, sobald der Host repariert ist.
Eine Nachricht mit mehreren Empfängern kann diese mischen; die weitergeleiteten Adressen, die Bounces je Empfänger und die behaltenen Empfänger werden in einem Datenbank-Round-Trip abgeglichen.
41.2.2. ~/.forward-Direktiven¶
Der Helper handelt an jeder nicht leeren, nicht mit # beginnenden Zeile als der Benutzer: eine bloße Adresse wird zu einer Weiterleitungsadresse; |command leitet die Nachricht per Pipe an eine Shell, wenn ALLOW_PIPE an ist; /absolute/path hängt die Nachricht an eine Datei an, wenn ALLOW_FILE an ist. Wenn sowohl ALLOW_PIPE als auch ALLOW_FILE aus sind, wird der Nachrichtentext dem Helper nicht einmal übergeben.
Eine mit sendmails führendem \ geschriebene Adresse bedeutet „an diesen Namen zustellen und ihn nicht weiter expandieren“ und wird nicht bei RESTART_STAGE neu gestartet. Die kanonische Zeile, die eine lokale Kopie behält — \bob in ~bob/.forward —, hält diesen Umschlagempfänger schlicht auf diesem Datensatz, sodass er zu NEXT_STAGE weiterrückt und lokal zugestellt wird; jedes andere \name wird zu einem Geschwisterdatensatz bei NEXT_STAGE. Das ist zugleich, was einen \-Eintrag daran hindert, diese Stage erneut zu betreten.
41.2.3. Schleifenverhinderung¶
Weil eine Weiterleitung die Pipeline neu startet, trägt jeder weitergeleitete Datensatz seine Weiterleitungskette in state["dot-forwarders"] (siehe Der Nachrichten-State): die Kette des Datensatzes, aus dem er stammt, plus den Login, dessen ~/.forward ihn weitergeleitet hat. Ein Empfänger, dessen Benutzer bereits in der Kette seines Datensatzes steht, wird an BOUNCE_STAGE geroutet, ohne seine ~/.forward erneut auszuführen (eine Nachricht mit Null-Absender wird stattdessen verworfen), sodass ein Weiterleitungszyklus endet und der Absender davon erfährt. Die Kette gilt je Weiterleitungspfad: Mehrere weiterleitende Empfänger einer Nachricht erhalten jeweils einen Geschwisterdatensatz, der nur ihre eigene Kette trägt.
41.3. Privilegien¶
Die Stage muss setgid pepsi-forward installiert sein (Modus 2550, Eigentümer pepsi:pepsi-forward — ausführbar für den Eigentümer, sodass kein anderer lokaler Benutzer an das setgid-Bit gelangt); diese Gruppenmitgliedschaft ist das, was dem pepsi-Worker des Dispatchers erlaubt, den 4750 root:pepsi-forward-Helper auszuführen, der allein das ~/.forward als der Zielbenutzer ausführt und sich weigert, für root zu handeln. Dieses Bit zu tragen ist der Grund, warum die Stage ein eigenständiges Binärprogramm ist statt eines der Programme, die in das vereinheitlichte pepsi-Binärprogramm gefaltet sind.
41.4. Konfiguration¶
[stage-<name>]: PROGRAM = pepsi-stage-dot-forward, NEXT_STAGE (wohin ein durchgereichter Empfänger geht — normalerweise die lokale Zustellung), BOUNCE_STAGE (wohin ein fehlgeschlagener ~/.forward-Empfänger geht), RESTART_STAGE (Standardwert init), ALLOW_PIPE und ALLOW_FILE (beide standardmäßig yes), HELPER (Standardwert pepsi-helper-dot-forward) und die gemeinsamen Lokalitätsoptionen LOCAL_DOMAINS (standardmäßig [pepsi-ingress] ACCEPTED_DOMAINS), TARGETS und RECIPIENT_DELIMITER. pepsi-setup prüft, dass RESTART_STAGE eine echte Stage benennt. Siehe pepsi-stage-dot-forward(1).
41.5. State¶
Eingaben:
state["dot-forwarders"](der Schleifenschutz) undstate.dsn.Ausgaben:
state["dot-forwarders"], erweitert um jedes Login, dessen~/.forwardausgeführt wurde, auf jedem Datensatz, den das Fan-out erzeugt;state.dsn.rcptwird im Gleichschritt mit den Empfängern jedes Datensatzes neu aufgebaut, und der Datensatz eines gebouncten Empfängers trägtstate.bounce.
41.6. Siehe auch¶
pepsi-stage-relay-to-maildir, pepsi-stage-aliases, pepsi-stage-bounce, Unterstützte Funktionen, pepsi-stage-dot-forward(1), pepsi-helper-dot-forward(1).