Commit Graph

1617 Commits

Author SHA1 Message Date
29b3a3a0ea test(19.4-04): gate requires the PHP method map and the plugin internals
TestPHPMethodMap, the zero-edit port and the Docker-free internals join
the plugin stage, the Postgres internals the docker stage; the plugin
stage points SUMMERCMS_ROOT and USER_PLUGIN at this run's checkouts.
2026-10-19 21:34:43 +02:00
e1696beb80 test(19.4-04): gate requires the plugin's PHP feature and security ports
The docker stage now requires the Postgres ports of the PHP feature and
security suites and TestConsentRedirectMode by name.
2026-10-19 21:18:32 +02:00
dd167466d2 test(19.4-04): unit tests for wristband's OIDC flavour
- PHP protocol cases, one subtest per PHP method: TestPKCEVerifier,
  TestRedirectURIMatch, TestTokenIssuer, TestAuthCodeLifecycle,
  TestPKCEAndReplay, TestConsentCSRF (cases 1-5)
- Go-only behaviour: discovery bytes, JWKS shapes, PEM parsing, ES256 and
  mixed rings, validation order, repeated parameters, PHP encoding,
  resume, switch account, JSON consent, client authentication, uniform
  userinfo 401, pairwise subjects, opt-in refresh, kind isolation,
  flavour dispatch, SetOIDCBackend checks, MCP refuses openid
- every name required by the gate's go stage
2026-10-19 21:05:21 +02:00
028e8da7e8 test(19.4-04): fail-closed phase gate across the four repositories
- scripts/check-phase19.4.sh: go, plugin, userplugin, fonoteka, docker,
  parity and docs stages; go test -json detectors refuse a fail, a skip,
  zero tests or a missing name
- additive check on the user plugin since c077029; NOT RUN rules for
  docker and parity proven on a faked host by --self-test
- required names: the smoke tests of plans 01-03
2026-10-19 20:54:10 +02:00
6d7193c9a5 docs(19.4-03): record plan state and roadmap progress 2026-10-19 20:41:49 +02:00
2ace6a2b9d docs(19.4-03): complete cutover, operations, parity harness and security review plan 2026-10-19 20:40:57 +02:00
7f56382106 docs(19.4): security review
ASVS L1 walk over the wristband OIDC flavour, sm-oauthserver-plugin and the
sm-user-plugin additions. T-19.4-01..34 and T-19.4-SC verified or fixed (test
pins in summercms.go eaa545c and sm-oauthserver-plugin b4223be, f8eaf70);
new findings T-19.4-36..39 accepted with reasons; nothing left unresolved.
2026-10-19 20:38:36 +02:00
eaa545c6f3 test(19.4-03): pin OIDC code binding, credential-free logs and random subjects
- a code is refused for another client or redirect URI and burned
- authorize refuses plain and malformed challenges; verifier rules; 60 s code TTL
- rejected token exchanges log client id, IP and reason only; key parse errors quote no key
- a public sub is a random UUIDv4
2026-10-19 20:32:19 +02:00
3386cbef83 docs(19.4): defer PHP OIDC parity recording to the WavePath cutover
The user skipped the parity recording at 19.4-03 Task 5 and decided the
phase passes without it. D-14 in this phase is the fail-closed harness;
recording WavePath and a green replay move to the WavePath cutover phase
(todo 2026-10-19-record-php-oidc-parity-against-wavepath).
2026-10-19 20:26:05 +02:00
8a1d413b7d docs: capture todo - Record PHP OIDC parity against WavePath before the OIDC cutover 2026-10-19 20:25:27 +02:00
bb4b8d448d feat(19.4-03): tide captures a named input of an HTML response
- capture rule from: response.form reads the value of the <input> with
  the rule's name (a server-rendered form's one-shot token), so a parity
  flow can post a consent form back
- README and parity docs list the capture sources
2026-10-19 19:59:24 +02:00
1e37926ee9 docs(19.4-02): record plan state and roadmap progress 2026-10-19 19:28:09 +02:00
8171eb25ef docs(19.4-02): complete sm-oauthserver-plugin plan 2026-10-19 19:27:30 +02:00
1c0d22a216 docs(19.4-01): record plan state and self-check 2026-10-19 18:36:18 +02:00
49e772afb8 docs(19.4-01): complete OIDC provider on wristband plan 2026-10-19 18:35:37 +02:00
811124259c docs(19.4): close neutral wristband resource todo 2026-10-19 18:32:10 +02:00
ddda59a12b feat(19.4-01): neutral wristband resource default and OIDC provider docs
- DefaultOptions().Resource is empty; comments name the host application,
  no consuming application (folded todo)
- Tests set an explicit neutral resource; TestDefaultOptionsResourceEmpty
- wristband README: new summary, two flavours, OIDC usage, API reference,
  OIDC defaults, dependencies, testing; root README row matches
- docs/services/oauth-server.md: OpenID Connect provider section;
  Resource described as required with an empty default
- ExampleNewOIDCServer and the newOIDCServer docs region
2026-10-19 18:32:03 +02:00
e25e73378c feat(19.4-01): OIDC token, keys, subjects and opt-in refresh
- ES256 keys, PKCS#1/SEC1 parsing fallbacks, EC JWKs, mixed RS256/ES256 rings
- Pairwise subjects per sector (SubjectSector, ErrSectorRequired)
- Opt-in refresh_token grant (OIDCOptions.RefreshEnabled): OfflineAccess clients
  only, rotation, lineage revocation on replay, fresh id_token without nonce
- IssueOIDCClientCredentials with the PHP oas_/oas_cs_ shapes
- Smoke tests: token errors, replay revocation, userinfo 401s, mixed key ring,
  pairwise subjects, refresh opt-in
2026-10-19 18:24:45 +02:00
dfa3c3e8b4 feat(19.4-01): OIDC authorize, consent and switch account match the PHP provider
- Full validation chain with PHP order and messages; repeated params last-wins
- is_dev loopback port matching (matchOIDCRedirectURI); PHP http_build_query redirects, no iss
- One-shot consent token burned under row lock; deny; SwitchAccount; JSON-mode
  ConsentRequest and DecideConsent
- ClientRecord.Kind with ClientKindMCP/ClientKindOIDC; each flavour refuses the
  other kind at authorize, token and userinfo (D-08)
- Smoke tests: start, resume/decide/switch, kind isolation, PHP encoding
2026-10-19 18:21:11 +02:00
659b42aaa8 feat(19.4-01): OIDC flavour of wristband with an end-to-end tracer
- NewOIDCServer/SetOIDCBackend build a second Server on the same engine;
  Authorize and Token dispatch by flavour, Metadata/Register 404 on OIDC
- OIDCBackend/OIDCTx, KeyStore and OIDCHost seams; MCP Backend untouched
- Discovery (PHP field order), JWKS (stdlib JWK encoding), authorize with
  resume and one-shot consent token, token with an RS256 id_token signed
  through golang-jwt map claims, userinfo
- TestOIDCTracerSmoke verifies the id_token against the served JWKS
2026-10-19 18:18:05 +02:00
756a97c181 docs(19.4): decide OIDC on wristband with golang-jwt
- Extend the hand-written wristband with an OIDC flavour; reject zitadel/oidc v3 (D-06, D-09, D-14)
- golang-jwt/jwt/v5 v5.3.1 signs id_tokens; JWKs encoded with the standard library
- go-oidc v3.21.0 and x/oauth2 v0.37.0 test-only in sm-oauthserver-plugin
- STACK.md zitadel/oidc row marked superseded
2026-10-19 18:06:54 +02:00
95051d26ce docs(state): sync state.json after phase 19.4 planning 2026-10-19 18:00:09 +02:00
cf8d48c092 docs(19.4): create phase plan 2026-10-19 17:59:57 +02:00
df0d8c1d55 docs(phase-19.4): add research and validation strategy 2026-10-19 17:06:42 +02:00
10992ea1a5 docs(quick-261019-hgw): Translate hook ValidationError phrase keys in the request locale v0.2.4 2026-10-19 12:54:34 +02:00
ce8d7efb67 fix(cabana): translate hook ValidationError phrase keys in the request locale
- One shared localizer for ValidationError and ForbiddenError, tested in
  writeCRUDError's order; replaces the ForbiddenError-only one.
- Applied on the CRUD and relation service transactions, the detached bulk
  branch, runAction, the record read (ShowRecord), and the reorder,
  singleton and relation-options routes, which localized neither type.
- Only strings containing "::" are looked up, so translated text passes
  through unchanged and logs no missing-key warning.
- Copy-on-write: the plugin's error value is never modified.
- README and backend docs describe the localized ValidationError.
2026-10-19 12:53:17 +02:00
d785958df2 docs(state): Phase 17 UAT and re-verification complete 2026-10-19 12:33:06 +02:00
1fca32042b docs(17): re-verify phase 17 — passed, release gap closed 2026-10-19 12:32:43 +02:00
c5b6a83299 test(17): complete UAT - 40 passed, 0 issues 2026-10-19 12:24:39 +02:00
0827865796 docs(todo): sitemap browser view without XSLT 2026-10-19 12:23:06 +02:00
96595633c0 docs(quick-261019-05g): Phase 17 verify-work unblock and console docs example 2026-10-19 00:16:46 +02:00
86c5a80496 docs(console): show the application binary run bare and with --help 2026-10-19 00:15:28 +02:00
59f57819cc docs(17): shorten the COVERAGE.md opt-out reason and state the goal as a user story 2026-10-19 00:13:45 +02:00
eb7e39d335 docs(g15office): map Phase 20 demo, 30 cutover and 31 chat polish tasks 2026-10-18 23:16:37 +02:00
4fb9f142df docs(roadmap): reorder — demo at 20, Płytarium cutover 20→30, chat polish 19.2→31
New Phase 20 is a public demo instance on sm-demo-app with every shared
plugin. Phases 21-29 stay off the roadmap until their goals firm up.
The cutover (closing v1.0) moves to 30; WavePath work starts at 31 with
the former 19.2, Horoskopia follows at 36-40. Seeds, notes and the
30-CONTEXT now point at the new numbers.
2026-10-18 23:16:08 +02:00
Jakub Zych
6aaaf59f43 docs(phase-19.1): complete phase transition v0.2.3 2026-10-18 19:26:07 +02:00
Jakub Zych
f1ff2f940b docs(19.1): re-verify after review fixes; mark WR-04 and WR-05 fixed 2026-10-18 19:25:32 +02:00
Jakub Zych
62c948f5e6 docs(quick-261018-qbs): fix 19.1 review WR-04 and WR-05, optional-dependency doc note
Registers T-19.1-13..17 in 19.1-SECURITY.md.
2026-10-18 19:19:20 +02:00
Jakub Zych
97daec593c docs(plugins): note optional dependencies still sit in go.mod
An optional dependency is optional at activation, not at compile time:
importing the package that declares a looked-up type keeps the other
plugin in go.mod; only party.Plugin.Requires leaves it out.
2026-10-18 19:16:35 +02:00
Jakub Zych
533fb7ccd9 chore(19.1): require chatvideo user-deletion test in phase 19.1 gate
- PG_CHATVIDEO_TESTS runs TestUserDeletionReassignsSession (WR-05)
- self-test lists the token and pins it in the PG_CHATVIDEO_TESTS line
- NOT RUN postgres banner names it
2026-10-18 19:16:11 +02:00
Jakub Zych
3b0f2c32b8 docs(state): log goldens secret-gate fast task 2026-10-18 18:05:47 +02:00
Jakub Zych
8553cd2afe docs(phase-19.1): close T-19.1-12 after goldens secret gate 2026-10-18 18:05:29 +02:00
Jakub Zych
8643195951 chore(19.1): scan sibling goldens for secrets in phase 19.1 gate
The docs stage now refuses secret-shaped content (key names, PEM private
keys, JWTs) in each sibling's testdata/goldens; --self-test plants each
pattern. Closes T-19.1-12.
2026-10-18 18:05:28 +02:00
Jakub Zych
2785bebd32 docs(phase-19.1): add security threat verification 2026-10-18 18:04:41 +02:00
Jakub Zych
b3f0b6ded0 test(19.1): complete UAT - 1 passed, 0 issues
Records the accepted userfriends go.mod override in VERIFICATION.md.
2026-10-18 17:54:54 +02:00
Jakub Zych
ebedba8c94 docs(19.1): persist verification, UAT and review disposition 2026-10-18 16:11:13 +02:00
Jakub Zych
905b035184 docs(19.1): add code review report 2026-10-18 16:10:02 +02:00
Jakub Zych
32617944a9 docs(19.1-06): record plan progress after maps and goldens SUMMARY
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 16:02:15 +02:00
Jakub Zych
7e51959b14 docs(19.1-06): complete PHP maps, goldens and phase gate plan
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 16:01:40 +02:00
Jakub Zych
b1a2c783e7 chore(19.1-06): add fail-closed phase 19.1 gate script
Copy the phase 19 detector shape onto five sibling plugin roots, named short tests, postgres tracers plus GDPR names, and the three decision-note greps.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-18 15:48:46 +02:00