configuration.md 4.1 KB

Configuration reference

All configuration lives in config.toml (copy from config.example.toml). The file is round-tripped by the admin panel — comments and formatting are preserved on save, so keep comments meaningful. The file is written 0600; a config.toml.bak is kept from the previous save.

Zones: (S) server-only — edit the file directly, never shown/written by the panel. (A) admin-editable in the panel. (W) write-only secret — never returned by any API. live — applies immediately; otherwise a restart is required.

[pps] — connection to Proofpoint (A, live)

Key Type Notes
base_url str https://host:10000. http:// requires PPSQ_ALLOW_INSECURE=1.
username str API user with the Quarantine module role.
password str (W) Never returned; blank on save = unchanged.
verify_tls bool | path false skips verification; or a CA-bundle path.
timeout int Seconds per call, 5..600.
client_cert path Mutual-TLS client cert (combined PEM, or cert with client_key).
client_key path Private key, if client_cert is cert-only.

[quarantine] (A, live)

Key Type Notes
default_folder str Must be in folders. Per-user overridable.
folders list[str] Source of truth (API can't enumerate). Exact names, no commas.
deleted_folder str Target of Delete. Must be in folders.
default_limit int UI row cap 1..1000. Per-user overridable.
list_query str Search filter; from=* = match-all (API rejects folder-only).
default_days_back int How far back sync reaches (API alone gives 24h).
chunk_size int localguids per PPS POST, 1..500.
default_sort_field str subject|date|from|rcpt. Per-user overridable.
default_sort_dir str asc|desc. Per-user overridable.

[quarantine.report_release] (A, live)

Key Type Notes
steps list[str] Subsequence of ["release","move","delete"], run in that fixed order.
move_target str Required if move in steps; must be in folders.

Outcomes: ["release"] delivers in place; ["release","move"] delivers + copies to move_target; ["release","delete"] delivers + removes to deleted_folder; ["release","move","delete"] delivers, moves, then removes.

[app] (S, restart — except log_level)

Key Notes
secret_key Session signing key, ≥32 chars. Rotating it logs everyone out.
listen, port Bind address. Keep loopback unless behind a reverse proxy.
db_path SQLite file (jobs + prefs).
log_level (A, live) INFO/DEBUG/…
worker_log, app_log Rotating log file paths (5 MB × 5).
cookie_secure true in production; false only for plain-http localhost.

[auth]

Key Zone Notes
mode (S) oidc (production) or static (dev). Not admin-editable.
denied_message (A, live) Shown to authenticated-but-unlisted users.
users (A, live) [[auth.users]] entries {email, role}; role admin|user.
[auth.static] (S) Dev shared account (username/password/email/role). Ignored under oidc.

[okta] (S, restart — never admin-editable)

Key Notes
issuer e.g. https://TENANT.okta.com/oauth2/default.
client_id Okta app client id.
client_secret (W) Okta app secret.
redirect_uri Must EXACTLY match the Okta app registration. Ends in /authorize.

Environment variables

Var Purpose
PPSQ_CONFIG Path to the config file (default: ./config.toml).
PPSQ_ALLOW_INSECURE Allow an http:// PPS base_url (dev only).
PPSQ_ALLOW_INSECURE_AUTH Allow static auth on a non-loopback interface (dev only).

Live vs restart

Live: pps.*, quarantine.*, auth.users, auth.denied_message, app.log_level. Restart: app.secret_key/listen/port/db_path/worker_log/app_log/cookie_secure, auth.mode, all okta.*. The panel reports restart_required after a save.