70.1.29. pepsi-stage-secure-link¶

hold a message that could not be encrypted, and mail the link

Manual section:

1

70.1.29.1.1. Name¶

pepsi-stage-secure-link - the secure-link fallback stage of the Pepsi pipeline.

70.1.29.1.2. Synopsis¶

pepsi-stage-secure-link [GLOBAL-OPTIONS] worker

70.1.29.1.3. Description¶

pepsi-stage-secure-link is a stage program run by pepsi-dispatch(1) as a persistent worker reading message ids on standard input.

It is the far end of [stage-encrypt] ON_NO_KEY = secure-link. When pepsi-stage-encrypt(1) must encrypt a message and the recipient publishes no usable key, it routes the message here instead of sending it in the clear or bouncing it. This stage then takes the message off the wire entirely:

  1. it generates a PIN and a random URL token, derives a content key from them and the server-side pepper, and stores only the AEAD ciphertext of the whole message in pepsi.secure_message;

  2. it injects a notification mail to the recipient carrying the link, and — under the default PIN_DELIVERY = sender — a second mail to the sender carrying the PIN, for the sender to relay by telephone or text message;

  3. it deletes the queue row.

The row is deleted rather than advanced because advancing it would transmit the cleartext to the very recipient who must not receive cleartext. The message’s continuation is the notification, which is an ordinary outbound message injected at [pepsi-secure-link] NOTIFY_STAGE and signed and relayed like any other. The stage is therefore terminal and has no NEXT_STAGE.

A message with several keyless recipients produces one stored message per recipient, each with its own token, PIN and ciphertext, so one recipient’s PIN never opens another’s copy and the recipient list is not disclosed to any of them.

70.1.29.1.4. Configuration¶

The stage’s [stage-<name>] section carries only PROGRAM. Everything else lives in the global [pepsi-secure-link] section (see pepsi.conf(5)), deliberately: the expiry window, the PIN length and the lockout are not behavioural knobs a correspondent may edit by e-mail through pepsi-stage-edit-settings(1), and a global section is out of reach of the per-address override layer.

70.1.29.1.5. Example¶

[stage-encrypt]
PROGRAM = pepsi-stage-encrypt
ENCRYPT = required
SECURE_LINK_STAGE = secure-link
NEXT_STAGE = srs

[stage-secure-link]
PROGRAM = pepsi-stage-secure-link

[pepsi-secure-link]
BASE_URL = https://secure.example.org
NOTIFY_STAGE = srs
# PEPPER is written to secrets.d/pepsi-secure-link.secret by pepsi-setup.

70.1.29.1.6. Failure¶

Everything that can fail is done before the queue row is deleted, and a failure fails the message rather than dropping it: a message that reached this stage is by definition one the operator said must not go out unprotected. In particular the stage fails when [pepsi-secure-link] is unconfigured, when NOTIFY_STAGE is unset, when a notification template is missing, when PIN_DELIVERY = command and the gateway command fails, and when the envelope sender is null (there would be nobody to give the PIN to).

70.1.29.1.7. Exit status¶

The worker exits 0 on a clean end of input. Per-message failure is reported through the queue, not the exit status.

70.1.29.1.8. See also¶

pepsi-secure-link(1), pepsi-stage-encrypt(1), pepsi-httpd(1), pepsi-dispatch(1), pepsi.conf(5), pepsi.state(7)

Pepsi

Navigation

Contents

  • 1. Introduction
  • 2. Getting started on a cheap VPS
  • 3. Installation
  • 4. Debian packages
  • 5. The Wizard
  • 6. Configuration
  • 7. Supported Features
  • 8. SMTP Protocol Extensions
  • 9. Key management
  • 10. The secure-link fallback portal
  • 11. Client interoperability
  • 12. Security model
  • 13. Microsoft Exchange as a gateway
  • 14. The administrative API
  • 15. The administration console
  • 16. Architecture
  • 17. The message state
  • 18. Extending the Pipeline
  • 19. Test Suite
  • 20. Benchmark Suite
  • 21. Performance
  • 22. pepsi-ingress
  • 23. pepsi-dispatch
  • 24. pepsi-httpd
  • 25. pepsi-stage-arc
  • 26. pepsi-stage-srs
  • 27. pepsi-stage-encrypt
  • 28. pepsi-stage-decrypt
  • 29. pepsi-stage-dkim-sign
  • 30. pepsi-stage-bounce
  • 31. pepsi-stage-aliases
  • 32. pepsi-stage-relay-to-internet
  • 33. pepsi-stage-relay-to-smarthost
  • 34. pepsi-stage-relay-to-maildir
  • 35. pepsi-stage-dot-forward
  • 36. pepsi-stage-relay-to-lmtp
  • 37. pepsi-stage-discard
  • 38. pepsi-stage-anti-spam
  • 39. pepsi-stage-auto-pay
  • 40. pepsi-stage-check-whitelist
  • 41. pepsi-stage-auto-whitelist
  • 42. pepsi-stage-autocrypt-learn
  • 43. pepsi-stage-detect-language
  • 44. pepsi-detect-language
  • 45. pepsi-stage-block-language
  • 46. pepsi-stage-vacation
  • 47. pepsi-stage-edit-settings
  • 48. pepsi-stage-if
  • 49. pepsi-stage-milter
  • 50. pepsi-stage-route
  • 51. pepsi-stage-vks-confirm
  • 52. pepsi-stage-secure-link
  • 53. pepsi-setup
  • 54. pepsi-queue
  • 55. pepsi-status
  • 56. pepsi-sendmail
  • 57. pepsi-whitelist
  • 58. pepsi-keys
  • 59. pepsi-keydisc
  • 60. pepsi-settings
  • 61. pepsi-tlsrpt
  • 62. pepsi-secure-link
  • 63. pepsi-failure-bouncer
  • 64. pepsi-quota
  • 65. pepsi-helper-token-refresh
  • 66. pepsi-telemetry
  • 67. pepsi-telemetry-client
  • 68. pepsi-config
  • 69. Feature stability
  • 70. Manual pages
    • 70.1. Commands (section 1)
    • 70.2. Configuration file (section 5)
    • 70.3. Message state (section 7)
  • 71. RFC Index

Related Topics

  • Documentation overview
    • 70. Manual pages
      • Previous: 70.1.28. pepsi-stage-vks-confirm
      • Next: 70.1.30. pepsi-setup

Quick search

©2026, Pepsi contributors. | Powered by Sphinx 8.1.3 & Alabaster 0.7.16 | Page source