docs(mail): the Sweego key is fine — authorisation is per-domain, not per-address #382
Inga granskare
Etiketter
Inga etiketter
area/backups
area/ci
area/control-panel
area/identity
area/infra
area/observability
area/payments
area/security
area/storage
area/web
blocked
needs-info
needs-triage
ready-for-implementation
type
bug
type
chore
type
docs
type
epic
type
feature
type
task
wontfix
Ingen milstolpe
Inget projekt
Inga tilldelade
1 deltagare
Notiser
Förfallodatum
Inget förfallodatum satt.
Beroenden
Inga beroenden satta
Referens
bitborg/bitborg-infra!382
Läser in…
Hänvisa till i nytt ärende
Ingen beskrivning angiven.
Ta bort grenen "docs/mail-block-tightened"
Borttagning av en gren är permanent. Även om den borttagna grenen kan fortsätta existera en kort tid innan den faktiskt tas bort, kan det INTE ångras i de flesta fall. Vill du fortsätta?
Narrows yesterday's block (#381). The previous note speculated the API key might be bound to a sending identity and need re-scoping or re-minting. It does not — that speculation is removed rather than softened.
Authorisation is per-domain
The discriminating test is a local part that has never been used through the API, on the known-good domain:
alerts@mail.gitborg.se— brand-new local partno-reply@email.bitborg.se{"detail":"Unauthorized"}So any address under an authorised domain works, and the only thing
email.bitborg.selacks is that authorisation. No vault edit, no new key.Alternatives ruled out
The domain is not unknown to Sweego
Only these two carry DKIM CNAMEs, each with its own account token:
A distinct token means
email.bitborg.sehas its own registration, so what is missing is its state, not its existence.Corroborated by response shape: the gateway answers
{"error_msg":"404 Route Not Found"}for routes that do not exist, whereas/sendanswers{"detail":"Unauthorized"}— the shape authenticated routes use. Sweego accepted the key and then refused the sender.Why this stays a runbook step
There is no API surface for any of it.
/domains,/senders,/sending-domains,/identities,/account,/me,/v1/domains,/domain,/sending_domains,/transac/domains— all 404. It cannot be inspected or fixed from a host, so unblocking is a dashboard action: complete the domain's validation, or confirm it lives in the same project/workspace as the key.Narrows yesterday's block. The previous note speculated that the API key might be bound to a sending identity and need re-scoping or re-minting. It does not, and that speculation is removed rather than softened. Authorisation is PER-DOMAIN. The discriminating test is a local part that has never been used through the API, on the known-good domain: alerts@mail.gitborg.se -> HTTP 200 (brand-new local part, sends immediately) no-reply@email.bitborg.se -> HTTP 401 {"detail":"Unauthorized"} So any address under an authorised domain works, and the only thing email.bitborg.se lacks is that authorisation. Ordering, rate limiting, flapping and payload are ruled out: the new domain 401s when sent FIRST, 401s again on repeat within one run, and the two requests are byte-identical apart from the From address while the old domain returns 200 mid-sequence. The domain is also not unknown to Sweego. Only mail.gitborg.se and email.bitborg.se carry DKIM CNAMEs and each has its own account token, so the new domain has its own registration — what is missing is its STATE, not its existence. Corroborated by the response shape: the gateway answers {"error_msg":"404 Route Not Found"} for routes that do not exist, whereas /send answers {"detail":"Unauthorized"}, the shape authenticated routes use. Sweego accepted the key and then refused the sender. Records that there is no API surface for any of this — /domains, /senders, /sending-domains, /identities, /account, /me, /v1/domains, /domain, /sending_domains and /transac/domains all 404 — which is why unblocking is a dashboard step in a runbook rather than a task in this repo, and why no vault edit should be expected.