The second server-side part of docs/spec/features/relay.md ("The link",
"Recipients", "Joining and reset"):
- Every node dials each enabled relay over JMAP on WebSocket, with TLS
1.3 and a client certificate signed by the downstream's link CA. Node
certificates last 30 days and are renewed after 20; the relay pins
the CA, not the node.
- Joining: while a relay waits for its join, a node posts Relay/join
with a fresh nonce, checks the proof against the token's secret and
the relay's key, and records the pin by compare-and-set, so two nodes
joining at once agree. An expired token reports joinFailed. Once
joined, a node only talks to the pinned key.
- Settings: the relay's settings are pushed whole when they change,
with the domains, the sealing key, the recipient key and the SMTP
certificate filled in by the downstream.
- Recipients: the relay's domains (all enabled local domains, or the
ones it names), with catch-all and the sub-address separator; every
account, list and alias address at each domain name, and masked
emails that take mail. The first push is the whole hashed set as a
blob (Recipient/replace); after that, deltas through Recipient/set,
falling back to a whole push past 2000 changes.
- A relay change wakes the links at once; otherwise they resync every
15 s and on the relay's Relay push. Moving a relay restarts its link;
turning one off closes it.
- Each node's link (state, since, last seen, last error, the relay's
own status and recipient count) is kept per node and read back as
the relay's links property; destroying a relay clears it.
- A system test runs the real inbuxa-relay binary: join, pin, recipient
push, RCPT accept and reject, a new user reaching the relay, a
settings push, and turning it off.
43 lines
1.5 KiB
TOML
43 lines
1.5 KiB
TOML
[package]
|
|
name = "inbuxa-features"
|
|
description = "inbuxa's rebuilt features: behavior Stalwart ships only in its Enterprise Edition, rebuilt clean-room"
|
|
license = "AGPL-3.0-only"
|
|
version.workspace = true
|
|
edition = "2024"
|
|
|
|
[dependencies]
|
|
registry = { path = "../registry" }
|
|
jmap_proto = { path = "../jmap-proto" }
|
|
store = { path = "../store" }
|
|
trc = { path = "../trc" }
|
|
types = { path = "../types" }
|
|
utils = { path = "../utils" }
|
|
ahash = { version = "0.8.12", features = ["serde"] }
|
|
serde = { version = "1.0", features = ["derive"] }
|
|
serde_json = "1.0"
|
|
toml = "1.1"
|
|
xxhash-rust = { version = "0.8.18", features = ["xxh3"] }
|
|
base64 = "0.23"
|
|
sha2 = "0.11"
|
|
flate2 = "1.1"
|
|
tokio = { version = "1.53", features = ["sync", "rt"] }
|
|
# inbuxa: DLP detectors and attachment text (dlp-and-mail-flow-rules spec)
|
|
regex = "1.13.1"
|
|
aho-corasick = "1.1"
|
|
zip = "8.6"
|
|
quick-xml = "0.41"
|
|
mail-parser = { version = "0.11", features = ["full_encoding"] }
|
|
mail-builder = { version = "1.0" }
|
|
# inbuxa: scheduled reports run at a local time (scheduled-reports spec, RP-15)
|
|
chrono = { version = "0.4", default-features = false, features = ["std"] }
|
|
chrono-tz = "0.10"
|
|
# inbuxa: the downstream side of inbuxa Relay (relay spec)
|
|
inbuxa-relay-proto = { path = "../relay-proto" }
|
|
aws-lc-rs = { version = "1" }
|
|
rcgen = { version = "0.14", default-features = false, features = ["crypto", "pem", "aws_lc_rs", "x509-parser"] }
|
|
time = "0.3"
|
|
|
|
[dev-dependencies]
|
|
x509-parser = "0.18"
|
|
tokio = { version = "1.53", features = ["macros", "rt"] }
|