|
| 1 | +--- |
| 2 | +"@objectstack/plugin-auth": minor |
| 3 | +"@objectstack/types": minor |
| 4 | +"@objectstack/plugin-security": patch |
| 5 | +--- |
| 6 | + |
| 7 | +feat(auth): walled deployment's declared owner is email-verified at operator-provisioned creation (#12751) |
| 8 | + |
| 9 | +On a **walled** deployment (`OS_TENANCY_POSTURE` in the wall-enforcing |
| 10 | +family), the account whose email equals the declared platform owner |
| 11 | +(`OS_PLATFORM_OWNER_EMAIL`) is stamped `emailVerified` **at creation** when |
| 12 | +it comes into existence through an **operator provisioning path** — extending |
| 13 | +the #11343 dev-boot seeded-admin precedent to production walled boots |
| 14 | +(maintainer ruling 2026-08-28, cloud#1677: 「运营方创建即视为已验证」; the |
| 15 | +trust anchor is the operator's env-var declaration plus the |
| 16 | +operator-executed creation, not a mailbox round-trip; SMTP stays required |
| 17 | +only for inviting others). |
| 18 | + |
| 19 | +**Which creation paths qualify** (the [#11739] audience taxonomy, not a |
| 20 | +second classification): |
| 21 | + |
| 22 | +- the **bootstrap carve-out** — the very first account on a fresh install |
| 23 | + (zero human users), the one self-serve creation a walled boot admits; |
| 24 | +- **admin create-user / bulk import** (`method: 'admin'`) — an act only an |
| 25 | + authenticated admin session can perform; |
| 26 | +- **SCIM** (`method: 'scim'`) — provisioning executed by the |
| 27 | + operator-registered directory. |
| 28 | + |
| 29 | +**Never**: non-bootstrap self-registration (including an |
| 30 | +invitation-admitted registration typing the owner address), provider-class |
| 31 | +JIT (the IdP asserts its own `emailVerified` at insert), any non-owner |
| 32 | +address, any unwalled posture, and a later email **update** to the owner |
| 33 | +address (the stamp is staged at the admission gate and consumed once by the |
| 34 | +`user.create` before-hook — a seam an update cannot traverse). Dev-boot |
| 35 | +behaviour (#11343) is unchanged. |
| 36 | + |
| 37 | +The `WALLED_OWNER_NO_VERIFICATION_PATH` boot warning now probes the owner |
| 38 | +account's state: a fresh walled boot with no transport and no federated |
| 39 | +sign-in is **silent** (the operator's own first-account creation arrives |
| 40 | +verified — the case this closes), while an owner account that already |
| 41 | +exists **unverified**, a populated store whose bootstrap window is spent, |
| 42 | +and an unanswerable probe keep warning. A settled deployment whose owner is |
| 43 | +verified stops re-warning on every boot. |
| 44 | + |
| 45 | +`@objectstack/types` gains `isEmailVerifiedUserRow` — the [#11343] |
| 46 | +fail-closed verified-representation allow-list, moved from |
| 47 | +`plugin-security`'s private copy so the elevation gate and the boot |
| 48 | +diagnostic read ONE resolution (`plugin-security` now consumes it; no |
| 49 | +behaviour change there). |
0 commit comments