|
| 1 | +--- |
| 2 | +'@objectstack/plugin-audit': minor |
| 3 | +'@objectstack/platform-objects': minor |
| 4 | +'@objectstack/plugin-auth': minor |
| 5 | +'@objectstack/plugin-sharing': minor |
| 6 | +'@objectstack/plugin-approvals': minor |
| 7 | +'@objectstack/objectql': minor |
| 8 | +'@objectstack/runtime': patch |
| 9 | +--- |
| 10 | + |
| 11 | +fix(plugin-audit,platform-objects,plugin-auth,plugin-sharing,plugin-approvals)!: the audit ledger no longer records fields declared `internal`, and the platform's credential-class fields are declared `internal` |
| 12 | + |
| 13 | +Clause-②: no (narrowing) |
| 14 | + |
| 15 | +<!-- adr-0087: not-required (no-migration-prescription) No authorable key, export or config field is removed or renamed: the change narrows what the generic data path and the audit ledger return for platform-owned columns, and nothing an author wrote needs rewriting. The objectql half adds exports only. --> |
| 16 | + |
| 17 | +**BREAKING for readers of credential-class columns on the generic data path and in the audit ledger.** |
| 18 | + |
| 19 | +**What changed.** |
| 20 | + |
| 21 | +- The audit plugin's CRUD mirror now omits every field declared `internal: true` from the |
| 22 | + rows it writes to `sys_audit_log` and `sys_activity`: create `new_value`, both sides of an |
| 23 | + update, delete `old_value`, and the activity row. It already masked `secret` and `password` |
| 24 | + fields; `internal` is the same contract the generic data path already enforces ("never |
| 25 | + returned on the generic data path"). An update that changes only an `internal` field still |
| 26 | + writes its row, with neither value. |
| 27 | +- These platform fields are now declared `internal: true`, so neither the generic data path |
| 28 | + nor the ledger returns them: the JWT signing key's private key (`sys_jwks`), both credential |
| 29 | + columns of the one-time verification object (`sys_verification`), the two-factor secret and |
| 30 | + backup codes, the SSO provider's OIDC and SAML protocol blobs, the OAuth access and refresh |
| 31 | + token columns, the OAuth client secret digest, the SCIM credential digest, the share link's |
| 32 | + token and password hash, and the approval action-token digest. API key digests and email |
| 33 | + headers were already `internal`; the ledger now honours that too. |
| 34 | +- Every built-in consumer that needs one of these values reads it back through the engine's |
| 35 | + privileged accessor rather than the generic path: JWT signing, password reset and the other |
| 36 | + one-time verification flows, two-factor verification, SSO sign-in and the legacy SSO secret |
| 37 | + migration, OAuth client authentication, share-link redemption (the password gate is held) |
| 38 | + and the creator's share-link list, which keeps returning each link's token. The runtime's |
| 39 | + share-link resolve route (the dispatcher twin of the plugin's) still answers "password |
| 40 | + required" for a protected link rather than the unknown-link shape. |
| 41 | +- The one-time verification object's record title is now the fixed label `Verification`; it no |
| 42 | + longer shows the identifier column. |
| 43 | +- `@objectstack/objectql` exports two helpers from its main and `/core` entries: |
| 44 | + `collectInternalReadFields` (the names of an object's `internal` fields) and |
| 45 | + `readInternalColumn` (recovers one `internal` column for rows already read, through the |
| 46 | + engine's privileged accessor, and fails closed when the value cannot be recovered). |
| 47 | + |
| 48 | +**What to do after upgrading.** |
| 49 | + |
| 50 | +- **Rotate the JWT signing keys.** Ledger rows written before this release are not rewritten |
| 51 | + (the ledger is append-only), so a signing key that existed before the upgrade may have a copy |
| 52 | + in the ledger. Rotate the keys so that copy signs nothing. |
| 53 | +- **Revoke and re-mint share links that must stay private.** A share link's token is a |
| 54 | + capability that stays valid until the link expires or is revoked, and links minted before this |
| 55 | + release may have a copy in the ledger. |
| 56 | +- A copy of a one-time verification credential is usable only while that credential is still |
| 57 | + outstanding: once it is consumed or expires, its copy names nothing that will be accepted. |
| 58 | +- An integration that read any of these columns through `GET /api/v1/data/...` no longer |
| 59 | + receives them. Read share links through `/api/v1/share-links`, and OAuth clients and SSO |
| 60 | + providers through their auth routes. |
0 commit comments