The first server-side part of docs/spec/features/relay.md ("Registry
objects", "Joining and reset"):
- inbuxa:Relay/get and /set under urn:inbuxa:jmap, kept in the fork's
subspace under E (crates/features/src/relay). A relay has its name,
the address and link port the downstream dials, enabled, sendThrough,
inboundOnly, and the settings pushed to it, which reuse the link's own
RelaySettings and are checked the way the relay would check them.
Settings change one at a time as settings/<name>; null puts one back
to its default; an unknown name is refused.
- A create returns the join token once. The first relay makes the
downstream's keys, shared by every node: a P-256 link CA, whose key
pin goes in every token, and the X25519 key held mail is sealed to.
Each relay gets its own recipient key. An update with rejoin: true
issues a new token for a relay that was reset, and forgets its pinned
key and recipient key (the spec gains this paragraph).
- smtpCertificate and smtpPrivateKey: the key reads back as ****, and
**** written back keeps it. The audit log redacts any property ending
in privateKey, and records a relay's before-values without its keys.
- Updates are compare-and-set on the stored bytes, retried, so a node
recording a join and an administrator's edit can't overwrite each
other.
- Four permissions, ids 690-693 (enum and schema labels):
sysRelayGet/Update and sysRelayQueueGet/QueueUpdate. Administrators
get all four, granted once to existing administrator roles; nobody in
a tenant gets any, and a tenant is refused.
- Privacy catalog entry for inbuxa:Relay.
tests/src/system/relay.rs: tokens decode with one CA pin for every
relay, validation, server-set properties refused, single settings and
defaults, the masked key kept, the stale write refused, rejoin, a tenant
administrator refused, destroy, and an audit log without the key or a
token.
59 lines
1.8 KiB
TOML
59 lines
1.8 KiB
TOML
[package]
|
|
name = "jmap"
|
|
version.workspace = true
|
|
edition = "2024"
|
|
|
|
[dependencies]
|
|
store = { path = "../store" }
|
|
nlp = { path = "../nlp" }
|
|
http_proto = { path = "../http-proto" }
|
|
jmap_proto = { path = "../jmap-proto" }
|
|
types = { path = "../types" }
|
|
smtp = { path = "../smtp" }
|
|
utils = { path = "../utils" }
|
|
common = { path = "../common" }
|
|
services = { path = "../services" }
|
|
directory = { path = "../directory" }
|
|
trc = { path = "../trc" }
|
|
spam-filter = { path = "../spam-filter" }
|
|
email = { path = "../email" }
|
|
groupware = { path = "../groupware" }
|
|
registry = { path = "../registry" }
|
|
inbuxa-features = { path = "../features" }
|
|
inbuxa-relay-proto = { path = "../relay-proto" }
|
|
calcard = { version = "0.3" }
|
|
smtp-proto = { version = "0.2" }
|
|
mail-parser = { version = "0.11", features = ["full_encoding", "rkyv"] }
|
|
mail-builder = { version = "1.0" }
|
|
mail-auth = { version = "0.13", features = ["generate", "arc"] }
|
|
sieve-rs = { version = "0.7", features = ["rkyv"] }
|
|
jmap-tools = { version = "0.1", features = ["rkyv"] }
|
|
serde = { version = "1.0", features = ["derive"]}
|
|
serde_json = "1.0"
|
|
hyper = { version = "1.11.1", features = ["server", "http1", "http2"] }
|
|
hyper-util = { version = "0.1.20", features = ["tokio"] }
|
|
http-body-util = "0.1.5"
|
|
tokio = { version = "1.53", features = ["rt"] }
|
|
futures-util = "0.3.34"
|
|
async-stream = "0.3.6"
|
|
base64 = "0.23"
|
|
p256 = { version = "0.13", features = ["ecdh"] }
|
|
sha1 = "0.11"
|
|
sha2 = "0.11"
|
|
zip = "8.6" # inbuxa: legal hold exports (LH-12)
|
|
reqwest = { version = "0.13", default-features = false, features = ["rustls", "http2"]}
|
|
tokio-tungstenite = "0.30"
|
|
tungstenite = "0.30"
|
|
chrono = "0.4"
|
|
rand = "0.10.2"
|
|
rkyv = { version = "0.8.18", features = ["little_endian"] }
|
|
hashify = "0.2"
|
|
|
|
[features]
|
|
test_mode = []
|
|
dev_mode = []
|
|
enterprise = []
|
|
|
|
[lints]
|
|
workspace = true
|