Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
946 commits
Select commit Hold shift + click to select a range
0045f62
feat(oidc_default_store): support the new SharedPreferencesAsync API …
ahmednfwela Jul 13, 2026
c5e7420
fix(oidc_core): send dpop_jkt on the direct authorization request (#3…
ahmednfwela Jul 13, 2026
4abc4e7
fix(oidc_core): honor expectedIssuer in validateUser (Entra multi-ten…
ahmednfwela Jul 13, 2026
5e9cf93
fix(oidc_cli): bound the interactive loopback wait with flowTimeoutSe…
ahmednfwela Jul 13, 2026
0b581df
feat(oidc_core): emit OidcTokenRefreshFailedEvent on refresh failures…
ahmednfwela Jul 13, 2026
3ea1192
feat(oidc_web_core): status-driven redirect.html + app-ack wire (#116…
ahmednfwela Jul 13, 2026
a8d758f
feat(oidc_darwin): add macOS loopback system-browser navigation mode …
ahmednfwela Jul 13, 2026
1619c99
ci(oidc_web): actually load the chrome-tagged browser test suite (#37…
ahmednfwela Jul 13, 2026
933e0ed
feat(oidc_core): react to a UserInfo 401 during session resume (#302)…
ahmednfwela Jul 13, 2026
bd250ff
fix(oidc_core): route deleteClientConfiguration through typed error p…
ahmednfwela Jul 13, 2026
32f4cbb
fix(oidc_core): protect the PKCE code_verifier at rest (#324 item 20)…
ahmednfwela Jul 13, 2026
de3e228
feat(oidc_core)!: cache-first init as the new default, discovery TTL …
ahmednfwela Jul 13, 2026
c07e881
feat(oidc_core): DCR integration helpers (#385) (#413)
ahmednfwela Jul 13, 2026
f9b1446
feat(oidc_core): mTLS RFC 8705 phase 1 core surface (#386) (#412)
ahmednfwela Jul 14, 2026
2d63a2d
chore(release): Publish packages (#415)
github-actions[bot] Jul 14, 2026
ca58600
build(melos): regenerate build_version files during `melos version` (…
ahmednfwela Jul 14, 2026
8df8bc6
fix(oidc_android)!: restore the redirect receiver as a fallback captu…
ahmednfwela Jul 25, 2026
97ac60e
feat(oidc_core): silent-acquisition API at the manager/app boundary (…
ahmednfwela Jul 25, 2026
78529f9
chore(release): publish packages (#426)
github-actions[bot] Jul 25, 2026
1f210d0
docs(oidc_android): state the minSdk 23 requirement, and stop instruc…
ahmednfwela Jul 26, 2026
cf6d6c1
chore(release): publish packages (#428)
github-actions[bot] Jul 26, 2026
34a8369
fix(oidc_android): dismiss the Custom Tab after the intent-filter red…
ahmednfwela Jul 26, 2026
9e83a10
fix(oidc_android)!: apply the documented Custom Tabs options natively
ahmednfwela Jul 26, 2026
e25e04b
docs(test): state the wiring guard's single-layer scope
ahmednfwela Jul 26, 2026
2f75485
test(conformance): run the Config RP plan, not only Basic
ahmednfwela Jul 26, 2026
a6584d8
test(example): report why a conformance plan was rejected, and fix fo…
ahmednfwela Jul 26, 2026
250cf86
test(example): pass client_auth_type for the Config RP conformance plan
ahmednfwela Jul 26, 2026
dbb23ad
test(example): fail locally when a conformance plan is missing a requ…
ahmednfwela Jul 26, 2026
a28140f
test(example): give the desktop conformance runs a flow timeout
ahmednfwela Jul 26, 2026
7282efa
feat(oidc_core,oidc_web_core): bound the interactive web flow with fl…
ahmednfwela Jul 26, 2026
9afa315
feat(oidc_core): add loginHybridFlow (OIDC Core §3.3)
ahmednfwela Jul 26, 2026
465766d
test(example): run the Hybrid and Implicit RP conformance plans
ahmednfwela Jul 26, 2026
8865668
test(example): stop sending client_auth_type to the hybrid and implic…
ahmednfwela Jul 26, 2026
67883ce
test(example): ask the suite for its own plan ids, and record the fou…
ahmednfwela Jul 26, 2026
834393f
test(example): run the four OIDC logout conformance profiles
ahmednfwela Jul 26, 2026
aa3a1cb
test(example): the logout plans require client_auth_type too
ahmednfwela Jul 26, 2026
4812b0f
test(example): wire the Form Post and 3rd-party-init conformance prof…
ahmednfwela Jul 26, 2026
5deafaf
test(example): wire the Dynamic RP conformance profile
ahmednfwela Jul 26, 2026
ece0e18
test(example): fix both conformance plan-creation failures, and corre…
ahmednfwela Jul 26, 2026
fcaeec8
test(example): drive a logout on the logout conformance profiles
ahmednfwela Jul 26, 2026
040312a
test(example): skip the formpost plans where the redirect cannot rece…
ahmednfwela Jul 26, 2026
6307a75
test(example): ask the suite why a module returned no user
ahmednfwela Jul 26, 2026
5b1ba8f
test(example): 3rd-party-init needs response_type; dynamic forbids cl…
ahmednfwela Jul 26, 2026
7ffda6a
fix(oidc_android): forward Map-valued raw intent extras instead of dr…
ahmednfwela Jul 26, 2026
be6a531
fix(oidc_web_core): surface the flow timeout as OidcException, not Ti…
ahmednfwela Jul 27, 2026
8b7226c
fix(oidc_android)!: report the options the Auth Tab path cannot apply
ahmednfwela Jul 27, 2026
7214792
test(example): skip the formpost plans everywhere, and say why honestly
ahmednfwela Jul 27, 2026
cedaf1a
fix(oidc_core): reject `code`-only in loginHybridFlow, and stop overc…
ahmednfwela Jul 27, 2026
de71aa7
test(oidc_android): cover the Auth Tab path, which no test could reach
ahmednfwela Jul 27, 2026
7700ca4
test(example): skip 3rd-party-init, which hangs and starves the plans…
ahmednfwela Jul 27, 2026
918d3ae
fix(oidc_android)!: dismiss the Custom Tab, apply dropped options, an…
ahmednfwela Jul 27, 2026
09934c4
test(example): dynamic RP also REQUIRES client_auth_type
ahmednfwela Jul 27, 2026
d6ed5f4
merge: bring main into the branch after #429 was squash-merged
ahmednfwela Jul 27, 2026
1532953
test(example): report why a module instance was rejected, not just "500"
ahmednfwela Jul 27, 2026
2ad3d8e
test(example): dynamic RP needs client_registration at the MODULE end…
ahmednfwela Jul 27, 2026
e90c679
test(example): dynamic RP needs request_type at the MODULE endpoint too
ahmednfwela Jul 27, 2026
213657b
feat(oidc_core): implement WebFinger issuer discovery (OIDC Discovery…
ahmednfwela Jul 27, 2026
3406f07
fix(example): resolve WebFinger after setup, and dump the plan on a 500
ahmednfwela Jul 27, 2026
05b0c84
fix(example): let the suite supply Dynamic RP's module variant
ahmednfwela Jul 27, 2026
bfa48db
fix(example): gate the logout profiles the suite cannot run, and coun…
ahmednfwela Jul 27, 2026
fe4b4c4
feat(oidc_core): manager-level dynamic client registration (RFC 7591)
ahmednfwela Jul 27, 2026
dda2cae
fix(example): gate Dynamic RP, which needs an RP-hosted request_uri
ahmednfwela Jul 28, 2026
262bdfd
fix(oidc_core)!: the REGISTERED token_endpoint_auth_method wins over …
ahmednfwela Jul 28, 2026
624a502
fix(example): web loses Hybrid/Implicit to a timeout budget, not a fr…
ahmednfwela Jul 28, 2026
c34015a
style(oidc): format example/tool/patrol_tally.dart
ahmednfwela Jul 28, 2026
932fb6c
fix(example): size the web per-test cap to the workload, not the reverse
ahmednfwela Jul 28, 2026
6353206
fix(oidc_web_core): say what the auth window did when a flow times out
ahmednfwela Jul 28, 2026
f790416
test(example): dump the suite's own log when a module returns no user
ahmednfwela Jul 29, 2026
7d34e43
ci: let the web job fail the build
ahmednfwela Jul 29, 2026
e62500b
fix(example): serve the web RP at a conformant https origin
ahmednfwela Jul 30, 2026
be8a896
fix(example): keep the front-channel logout URI off Uri.base on native
ahmednfwela Jul 30, 2026
dbb2a89
ci: consume patrol_cli_plus 5.5.0 from pub.dev, drop the git pin
ahmednfwela Jul 30, 2026
3bc512c
feat(oidc_loopback_listener): capture form_post bodies and fragments
ahmednfwela Jul 30, 2026
aeaaddf
style(oidc_loopback_listener): restore canonical formatting in the te…
ahmednfwela Aug 1, 2026
c0f20bf
test(oidc_loopback_listener): await the relay test's timeout instead …
ahmednfwela Aug 1, 2026
08b3e4e
test(oidc_darwin): the third copy of the 405-asserted-as-spec test
ahmednfwela Aug 1, 2026
cb8d8f3
Merge pull request #430 from Bdaya-Dev/feat/hybrid-implicit-conformance
ahmednfwela Aug 1, 2026
a0c991c
fix(oidc_core)!: drop the legacy in-payload code_verifier fallback (#…
ahmednfwela Aug 1, 2026
9a6006e
fix(oidc_core)!: never take the PKCE code_verifier from the authoriza…
ahmednfwela Aug 1, 2026
c3b01b7
fix(oidc_core): log offline userinfo failures as WARNING, not SEVERE …
ahmednfwela Aug 1, 2026
f50cd75
fix(oidc_core): allow valid multi-audience ID tokens by default (#441)
ahmednfwela Aug 1, 2026
13bc3ec
Merge pull request #442 from Bdaya-Dev/fix/404-drop-legacy-code-verifier
ahmednfwela Aug 1, 2026
727d8c1
build(deps): Bump actions/setup-node from 6 to 7
dependabot[bot] Aug 1, 2026
aa010a9
build(deps): Bump actions/configure-pages from 5 to 6
dependabot[bot] Aug 1, 2026
798f771
build(deps): Bump actions/upload-pages-artifact from 4 to 5
dependabot[bot] Aug 1, 2026
32d38ef
build(deps): Bump actions/setup-python from 6 to 7
dependabot[bot] Aug 1, 2026
8bad329
build(deps): Bump actions/cache from 5 to 6
dependabot[bot] Aug 1, 2026
eedd79f
chore(release): publish packages (#445)
github-actions[bot] Aug 1, 2026
57d4c4f
ci: size the web tally floor to the path the harness actually ran
ahmednfwela Aug 1, 2026
0a19c64
test(example): claim fragment and form_post conformance on linux/windows
ahmednfwela Aug 1, 2026
1253d9b
fix(example): register the RP's true application_type with the test plan
ahmednfwela Aug 1, 2026
db4381a
fix(oidc_loopback_listener): never relay a POST; its body is the resp…
ahmednfwela Aug 1, 2026
aa20db6
fix(jose_plus): pass apu/apv to the ECDH-ES Concat KDF in build()
lfi4id Sep 7, 2026
949279c
chore: remove unused deps
lsaudon Sep 14, 2026
7e5cdc8
Merge pull request #446 from Bdaya-Dev/fix/web-tally-floor-smoke-path
ahmednfwela Oct 4, 2026
7964f85
Merge branch 'main' into dependabot/github_actions/actions/setup-node-7
ahmednfwela Oct 4, 2026
f75ce5c
Merge branch 'main' into dependabot/github_actions/actions/setup-pyth…
ahmednfwela Oct 4, 2026
c3fe184
Merge branch 'main' into dependabot/github_actions/actions/configure-…
ahmednfwela Oct 4, 2026
ba6fc8a
Merge branch 'main' into dependabot/github_actions/actions/cache-6
ahmednfwela Oct 4, 2026
9bbde98
Merge branch 'main' into dependabot/github_actions/actions/upload-pag…
ahmednfwela Oct 4, 2026
ff4edee
Merge remote-tracking branch 'origin/main' into work/447-hash
ahmednfwela Oct 4, 2026
e3ad396
test(oidc_core): assert code_verifier is absent under its real key in…
ahmednfwela Oct 4, 2026
29b09f7
feat(oidc_core): add userChangesAfterInit() to tell "not initialized"…
ahmednfwela Oct 4, 2026
7b3b2ec
fix(oidc_core): require c_hash and at_hash on the hybrid front-channe…
ahmednfwela Oct 4, 2026
c1b00dd
ci(example): cap each headless Chrome launch on the linux runner
ahmednfwela Oct 4, 2026
0b6f57c
feat(oidc_core): adopt and persist RFC 7592 credential rotation throu…
ahmednfwela Oct 4, 2026
d3bd721
feat(oidc_core): mTLS transport, end-to-end alias routing and web gua…
ahmednfwela Oct 4, 2026
42995a3
style: dart format mock_client.dart and app_state.dart for stable-SDK…
ahmednfwela Oct 4, 2026
0081375
chore(oidc_android): migrate to AGP built-in Kotlin (#448)
ahmednfwela Oct 4, 2026
166f394
feat(oidc_default_store)!: bump flutter_secure_storage to ^11 (#451)
ahmednfwela Oct 4, 2026
43b3eeb
docs(oidc_core): align DCR dartdoc with manager-driven rotation (#385)
ahmednfwela Oct 4, 2026
c0d8c48
fix(oidc_core): don't retain userChangesAfterInit listeners until dis…
ahmednfwela Oct 4, 2026
85bc47c
fix(oidc_core): close mTLS phase 2 review gaps (#386)
ahmednfwela Oct 4, 2026
9282ada
docs(oidc_core): state the exact DCR carry-over set (#385)
ahmednfwela Oct 4, 2026
452d6ee
fix: await futures returned inside try blocks (unawaited_return_in_tr…
ahmednfwela Oct 4, 2026
e239f8a
fix(oidc_core): userChangesAfterInit — single init attachment, closed…
ahmednfwela Oct 4, 2026
98db953
Merge pull request #461 from Bdaya-Dev/chore/format-stable-sdk
ahmednfwela Oct 4, 2026
a9d3ebc
Merge branch 'main' into feat/desktop-fragment-formpost-conformance
ahmednfwela Oct 4, 2026
7dbed5d
Merge branch 'main' into fix/ecdh-es-apu-apv-in-kdf
ahmednfwela Oct 4, 2026
ccb5ff1
Merge branch 'main' into chore/remove_unused_deps
ahmednfwela Oct 4, 2026
61f65b2
Merge branch 'main' into test/404-namespace-assertion
ahmednfwela Oct 4, 2026
daaba50
Merge branch 'main' into feat/453-userchanges-init-state
ahmednfwela Oct 4, 2026
f9e6d7a
Merge branch 'main' into feat/385-dcr-phase2
ahmednfwela Oct 4, 2026
217186f
Merge branch 'main' into feat/386-mtls-phase2
ahmednfwela Oct 4, 2026
aad1887
Merge branch 'main' into chore/448-built-in-kotlin
ahmednfwela Oct 4, 2026
5f600bc
Merge branch 'main' into chore/451-flutter-secure-storage-11
ahmednfwela Oct 4, 2026
1ff460a
Merge branch 'main' into dependabot/github_actions/actions/setup-node-7
ahmednfwela Oct 4, 2026
73da3e7
Merge branch 'main' into dependabot/github_actions/actions/setup-pyth…
ahmednfwela Oct 4, 2026
26467a9
Merge branch 'main' into dependabot/github_actions/actions/configure-…
ahmednfwela Oct 4, 2026
9d3a70c
Merge branch 'main' into dependabot/github_actions/actions/cache-6
ahmednfwela Oct 4, 2026
30433b1
Merge branch 'main' into dependabot/github_actions/actions/upload-pag…
ahmednfwela Oct 4, 2026
ab422b7
fix(oidc): rethrow platform OidcException from getPlatformEndSessionR…
ahmednfwela Oct 4, 2026
a349ae9
fix(oidc_core): settle userChangesAfterInit from inside init(), not v…
ahmednfwela Oct 4, 2026
147e8a0
style(oidc_android): format for the ^3.12 language version (#448)
ahmednfwela Oct 4, 2026
ff5eec3
build(oidc_platform_interface): bump pigeon to ^29 for analyzer 13 (b…
ahmednfwela Oct 4, 2026
9569215
Merge branch 'main' into chore/pigeon-29-beta-resolution
ahmednfwela Oct 4, 2026
ce85082
ci: pin stable Flutter 3.47.6 so the workspace resolves with pigeon 29
ahmednfwela Oct 4, 2026
b1ceb4b
Merge pull request #455 from Bdaya-Dev/test/404-namespace-assertion
ahmednfwela Oct 4, 2026
d5a7d8e
style(oidc_default_store): format for the ^3.8 language version (#451)
ahmednfwela Oct 4, 2026
ab979dc
Merge pull request #435 from Bdaya-Dev/dependabot/github_actions/acti…
ahmednfwela Oct 4, 2026
ae2bda4
Merge pull request #447 from Bdaya-Dev/feat/desktop-fragment-formpost…
ahmednfwela Oct 4, 2026
6b3beaa
Merge pull request #449 from LuigiFiorillo/fix/ecdh-es-apu-apv-in-kdf
ahmednfwela Oct 4, 2026
6cd96cd
fix(oidc_core): require at_hash on the implicit id_token token response
ahmednfwela Oct 4, 2026
fab591c
Merge pull request #436 from Bdaya-Dev/dependabot/github_actions/acti…
ahmednfwela Oct 4, 2026
0f3758b
Merge pull request #438 from Bdaya-Dev/dependabot/github_actions/acti…
ahmednfwela Oct 4, 2026
8ba408e
Merge pull request #460 from Bdaya-Dev/chore/448-built-in-kotlin
ahmednfwela Oct 4, 2026
d42d8ed
Merge pull request #459 from Bdaya-Dev/feat/386-mtls-phase2
ahmednfwela Oct 4, 2026
c019397
Merge pull request #462 from Bdaya-Dev/chore/451-flutter-secure-stora…
ahmednfwela Oct 4, 2026
be1fc72
Merge pull request #464 from Bdaya-Dev/fix/end-session-oidcexception-…
ahmednfwela Oct 4, 2026
943c883
build(android): Gradle 8.14.5 / AGP 8.11.1 for Flutter 3.47.6
ahmednfwela Oct 4, 2026
56ff2d9
Merge branch 'main' into feat/385-dcr-phase2
ahmednfwela Oct 4, 2026
15a691b
Merge branch 'main' into feat/453-userchanges-init-state
ahmednfwela Oct 4, 2026
38b4afb
Merge pull request #439 from Bdaya-Dev/dependabot/github_actions/acti…
ahmednfwela Oct 4, 2026
1c13521
Merge pull request #452 from lsaudon/chore/remove_unused_deps
ahmednfwela Oct 4, 2026
e91c2a7
Merge branch 'main' into dependabot/github_actions/actions/configure-…
ahmednfwela Oct 4, 2026
3b48a01
Merge pull request #465 from Bdaya-Dev/chore/pigeon-29-beta-resolution
ahmednfwela Oct 4, 2026
025d2bd
Merge pull request #456 from Bdaya-Dev/feat/453-userchanges-init-state
ahmednfwela Oct 4, 2026
cf1aa79
Merge pull request #457 from Bdaya-Dev/feat/385-dcr-phase2
ahmednfwela Oct 4, 2026
1aeb60d
Merge pull request #437 from Bdaya-Dev/dependabot/github_actions/acti…
ahmednfwela Oct 4, 2026
6ca3f57
fix(oidc_core)!: require at_hash on implicit id_token token (signatur…
ahmednfwela Oct 4, 2026
8778be1
Merge branch 'main' into fix/implicit-require-at-hash
ahmednfwela Oct 4, 2026
db22907
test(example): assert per-module conformance verdicts, not just any l…
ahmednfwela Oct 4, 2026
d5538e5
feat(oidc_core)!: OidcIdTokenValidationContext for flow-aware id_toke…
ahmednfwela Oct 4, 2026
88d922b
fix(oidc_core): judge id_token hash requiredness from the response's …
ahmednfwela Oct 5, 2026
7d051c4
Merge pull request #466 from Bdaya-Dev/fix/implicit-require-at-hash
ahmednfwela Oct 5, 2026
0e8cd12
Merge branch 'main' into test/467-per-module-conformance
ahmednfwela Oct 5, 2026
4213caa
test(example): drive the Config RP plan's remaining modules per-spec …
ahmednfwela Oct 5, 2026
fab65a0
fix(oidc_core)!: reject a discovery document whose issuer does not match
ahmednfwela Oct 5, 2026
ab6e662
test(example): keep OpenID Session Management web-only, gate + docume…
ahmednfwela Oct 5, 2026
c3540c2
fix(oidc_core): probe check_session_iframe once more after RP-initiat…
ahmednfwela Oct 5, 2026
c9ca9cd
docs(oidc_core): document Azure AD B2C and Entra options for strict i…
ahmednfwela Oct 5, 2026
444421d
ci(release): support release/** maintenance branches
ahmednfwela Oct 5, 2026
4eea7cd
fix(example): stop corrupting the web conformance POST through cors-p…
ahmednfwela Oct 5, 2026
457e32c
feat(oidc_core): report the post-logout session check as OidcEndSessi…
ahmednfwela Oct 5, 2026
14db08c
fix(oidc_core): never keep or use a rejected discovery document
ahmednfwela Oct 5, 2026
5f595bc
test(example): expect init() to reject the discovery-issuer-mismatch …
ahmednfwela Oct 5, 2026
825f4a7
Merge pull request #470 from Bdaya-Dev/ci/release-maintenance-branches
ahmednfwela Oct 5, 2026
10ea81d
test(oidc_core): cover a new sign-in while the post-logout probe is p…
ahmednfwela Oct 5, 2026
333d0a6
docs(oidc_core): do not present `changed` as proof the OP logout worked
ahmednfwela Oct 5, 2026
4771e74
fix(oidc_web_core): each session monitor owns its own iframe (#474)
ahmednfwela Oct 5, 2026
bb2badc
Merge pull request #473 from Bdaya-Dev/fix/web-conformance-plan-creation
ahmednfwela Oct 5, 2026
233d92f
Merge branch 'main' into fix/session-monitor-post-logout-probe
ahmednfwela Oct 5, 2026
d9ed67a
Merge branch 'main' into test/467-per-module-conformance
ahmednfwela Oct 5, 2026
054cacd
Merge remote-tracking branch 'origin/main' into fix/discovery-issuer-…
ahmednfwela Oct 5, 2026
80381f4
fix(oidc_core): re-verify the restored session when a background disc…
ahmednfwela Oct 5, 2026
e991dd7
test(example): count only an issuer-mismatch rejection for the discov…
ahmednfwela Oct 5, 2026
b434693
fix(oidc_web_core): require event.source to match a monitor's own ifr…
ahmednfwela Oct 5, 2026
e55905d
Merge pull request #480 from Bdaya-Dev/fix/474-session-monitor-iframe…
ahmednfwela Oct 5, 2026
2d25e00
build(oidc_core): declare the test-only mTLS fixture keys as pub fals…
ahmednfwela Oct 5, 2026
c2cfb07
Merge pull request #475 from Bdaya-Dev/fix/session-monitor-post-logou…
ahmednfwela Oct 5, 2026
8c5ddda
Merge pull request #481 from Bdaya-Dev/fix/oidc-core-false-secrets
ahmednfwela Oct 5, 2026
8f14c79
chore: commit the build/** analyzer exclude Flutter 3.47 adds on pub get
ahmednfwela Oct 5, 2026
b4beca8
Merge pull request #483 from Bdaya-Dev/chore/commit-sdk-analysis-options
ahmednfwela Oct 5, 2026
5afcf21
Merge pull request #482 from Bdaya-Dev/fix/discovery-issuer-validation
ahmednfwela Oct 5, 2026
8977cc4
Merge branch 'main' into test/467-per-module-conformance
Oct 5, 2026
d415c04
chore(release): publish packages
github-actions[bot] Oct 5, 2026
d3a0b46
test(example): drive OpenID Session Management for real on web (#467)
Oct 5, 2026
5269c03
chore(release): Publish packages (#485)
ahmednfwela Oct 5, 2026
1dc7598
fix(oidc_web_core): compare the session iframe's window by JS identity
Oct 5, 2026
3b6b1c4
Merge remote-tracking branch 'origin/fix/web-session-source-identity'…
Oct 5, 2026
40d8a94
Merge pull request #486 from Bdaya-Dev/fix/web-session-source-identity
ahmednfwela Oct 5, 2026
bb40826
test(oidc_core): force a real full GC in the #453 retention tests
Oct 5, 2026
d116416
test(example): poll the issuer-mismatch module's suite verdict too
Oct 5, 2026
36e221d
Merge pull request #488 from Bdaya-Dev/test/453-gc-flake
ahmednfwela Oct 5, 2026
1902086
test(example): put the suite's log digest in the per-module failure line
Oct 5, 2026
c07ab05
test(example): time the native browser flow against the suite's log
Oct 5, 2026
f5924fb
test(example): give the iOS simulator's browser time to start (#469)
Oct 5, 2026
f2e36ae
style(example): dart format the conformance tests
Oct 5, 2026
8b602a9
ci: shard native conformance plans and overlap iOS simulator boot
Oct 6, 2026
c171634
Merge pull request #469 from Bdaya-Dev/test/467-per-module-conformance
ahmednfwela Oct 6, 2026
832dfda
chore(release): publish packages
github-actions[bot] Oct 6, 2026
091889c
fix(ci): drive macos shard plans one at a time, not via --name regex
Oct 6, 2026
4998c18
test(example): don't lose suite log entries that share a millisecond
Oct 6, 2026
3903937
test(example): rerun a module once when its browser never reached the…
Oct 6, 2026
99466bd
chore(release): Publish packages (#490)
ahmednfwela Oct 6, 2026
9e8afbf
Merge pull request #491 from Bdaya-Dev/fix/conformance-log-since-race
ahmednfwela Oct 6, 2026
2eca843
test(example): capture what is on screen when an iOS login stalls
Oct 6, 2026
4f57f12
test(example): make the iOS dialog probe provable and its screenshots…
Oct 6, 2026
f766cc8
test(example): keep the iOS probe from failing the plans it observes
Oct 6, 2026
79e5031
fix(ci): respect GitHub's 5-concurrent-macOS-jobs cap, un-shard macos
Oct 6, 2026
eb9ca30
test(example): drop the XCUITest screen probe for a passive screen re…
Oct 6, 2026
8fc81af
ci(ios): cheap diagnostics by default, and an experiment switch for h…
Oct 6, 2026
0a59be7
ci(ios): name the processes ReportCrash reported on during the job
Oct 6, 2026
363fb6d
ci(ios): do not let a missing video.pid fail the collect step
Oct 6, 2026
c748b24
Merge origin/main into ci/shard-native-conformance
Oct 6, 2026
6ada33a
Merge pull request #492 from Bdaya-Dev/ci/shard-native-conformance
ahmednfwela Oct 6, 2026
c728940
Merge origin/main (PR #492 iOS sharding) into test/ios-browser-warmup
Oct 6, 2026
cb6ddfb
ci(ios): start the background simulator boot after Set up Environment
Oct 6, 2026
d1b2b90
ci: split unit_tests into parallel jobs, shard jose_plus, fix pub/SDK…
Oct 6, 2026
3368c6a
test(example): rerun a module once when its browser never reached the…
Oct 6, 2026
26ff022
fix(ci): restore package-relative layout before merging unit coverage
Oct 6, 2026
a5f0bd6
ci(ios): drop the load-reduction and runner experiments that did not …
Oct 6, 2026
7cac4b8
fix(ci): move (not copy) flat coverage shards, guard against dup/phan…
Oct 6, 2026
433fb91
test(example): rerun only a WAITING instance that no request ever rea…
Oct 6, 2026
a3169e3
Merge pull request #494 from Bdaya-Dev/ci/speed-unit-tests
ahmednfwela Oct 6, 2026
8a8ea48
Merge origin/main (#494 unit-test split) into test/ios-browser-warmup
Oct 6, 2026
d50cea5
ci: add timeout-minutes to every unit_* job, bound the VM test step
Oct 6, 2026
d53a6d7
Merge pull request #495 from Bdaya-Dev/test/ios-browser-warmup
ahmednfwela Oct 6, 2026
ae0570d
chore(release): publish packages
github-actions[bot] Oct 6, 2026
7774757
fix(ci): use the proven melos exec -c pattern for test:vm, not exec: map
Oct 6, 2026
8e08867
chore(release): Publish packages (#497)
ahmednfwela Oct 6, 2026
59061f0
test(example): give a desktop plan's first login time for a cold browser
Oct 6, 2026
353ac2c
ci: let timeout signal the VM test step's whole process group
Oct 6, 2026
8e30688
Merge pull request #498 from Bdaya-Dev/ci/unit-job-timeouts
ahmednfwela Oct 6, 2026
48fa727
Merge pull request #499 from Bdaya-Dev/test/desktop-flow-timeout
ahmednfwela Oct 6, 2026
d2e7f06
fix(ci): stop relying on flutter-action's own broken SDK cache save
Oct 6, 2026
41dec2e
fix(ci): route SDK cache coordinates through env vars, not step outputs
Oct 7, 2026
4132706
fix(ci): single-writer Gradle cache per shard, main-only Flutter SDK …
Oct 7, 2026
b44d9b3
ci: skip the Flutter SDK cache save when the restore hit the exact key
Oct 8, 2026
fce87b9
Merge pull request #500 from Bdaya-Dev/ci/flutter-sdk-cache
ahmednfwela Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .firebaserc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"projects": {
"default": "bdaya-oidc"
},
"targets": {
"bdaya-oidc": {
"hosting": {
"oidc-flutter-example": [
"oidc-flutter-example"
],
"oidc-flutter-docs": [
"oidc-flutter-docs"
]
}
}
}
}
9 changes: 9 additions & 0 deletions .gitguardian.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
version: 2

secret:
# PR #459 / #386 review: these are test-only mTLS fixtures generated by
# packages/oidc_core/test/fixtures/mtls/generate.sh for the RFC 8705
# client-certificate-authentication test suite. They are not real secrets
# and are never used outside `dart test`.
ignored_paths:
- 'packages/oidc_core/test/fixtures/mtls/*.key'
177 changes: 170 additions & 7 deletions .github/actions/flutter_base/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,188 @@ inputs:
default: "stable"
flutter-version:
description: "Flutter version to use"
default: "3.22.0"
# >=3.41 required: the SwiftPM (FlutterFramework) plugin layout in
# oidc_darwin needs Flutter 3.41+ / Dart 3.11+.
default: "3.47.6"

runs:
using: "composite"
steps:
# Resolve the exact (channel, version, arch, hash) this run will use,
# and the cache coordinates subosito/flutter-action would itself use for
# them, WITHOUT installing anything yet. `dry-run: true` short-circuits
# only flutter-action's own "Run setup script" step; its "Set action
# inputs" step always runs in print-only mode regardless and is what
# sets the CACHE-PATH/CACHE-KEY outputs read below. `cache`/`pub-cache`
# are both false here: we only want these outputs, never flutter-
# action's own cache steps -- see the next step's comment for why.
- name: Resolve Flutter SDK version + cache coordinates
id: flutter_sdk_info
uses: subosito/flutter-action@v2
with:
channel: ${{ inputs.channel }}
flutter-version: ${{ inputs.flutter-version }}
cache: false
pub-cache: "false"
dry-run: true

# subosito/flutter-action's OWN `cache: true` (an internal actions/cache
# step keyed on the same CACHE-KEY/CACHE-PATH resolved above) is broken
# on macOS and Windows runners: a long-standing, still-open upstream bug
# (subosito/flutter-action#350 -- multiple independent reporters,
# including one whose experience exactly matches ours: "Caches
# perfectly for android builds ('linux') but fails for macOS"). By the
# time its cache step's POST (save) phase runs at the end of the job, it
# cannot re-resolve the `${{ steps.flutter-action.outputs.CACHE-PATH }}`
# expression its own `with: path:` depends on, logs "Input required and
# not supplied: path", and silently no-ops -- so the SDK is NEVER
# persisted and every run on those OSes re-downloads+extracts it from
# scratch (65s+ on macOS, worse under load). Confirmed live on this
# repo's own main-branch runs (e.g. run 37523659563, 2026-10-06): the
# windows/macos/ios "Cache Flutter" POST step prints exactly that
# warning every time, while the Linux jobs (unit_core, linux, android,
# web) -- which go through this exact same flutter_base action -- cache
# and restore it just fine, because they hit an already-warm cache and
# never even reach the broken save path.
#
# The bug is NOT specific to flutter-action's own internal step, or to
# being nested inside a third-party composite action: a first attempt
# at this fix routed the same key/path through our own, non-nested
# actions/cache step below, referencing them via
# `${{ steps.flutter_sdk_info.outputs.CACHE-PATH }}` (an output of the
# step above) directly in its `with:` -- and hit the EXACT SAME "Input
# required and not supplied: path" warning on macOS/Windows (confirmed
# live, run 37532075225). The actual trigger is narrower: a `with:`
# expression in ANY step (ours or a third party's) that reads
# `steps.<id>.outputs.*` cannot be re-resolved when that step's POST
# hook runs at the end of the job, on macOS/Windows runners specifically
# -- regardless of nesting. Our own pub-cache step below has never hit
# this because its `key`/`path` only reference flat, non-output values
# (`inputs.channel`, `runner.os`, `hashFiles(...)`), which DO replay
# correctly in POST on every OS (its POST logs a real "Failed to save:
# ... another job may be creating this cache" race, never an
# empty-input warning).
#
# Fix: copy the two outputs we need into plain environment variables via
# $GITHUB_ENV right away, then have the restore/save steps below
# reference `env.*` instead of `steps.flutter_sdk_info.outputs.*`. Env-var-backed
# context (`env.*`, `inputs.*`) is a flat key/value store the runner
# persists for the rest of the job and replays correctly in POST on
# every OS; the `steps.*.outputs` context is the piece that doesn't
# survive the replay.
- name: Export Flutter SDK cache coordinates
shell: bash
run: |
set -eu
echo "FLUTTER_SDK_CACHE_PATH=${{ steps.flutter_sdk_info.outputs.CACHE-PATH }}" >> "$GITHUB_ENV"
echo "FLUTTER_SDK_CACHE_KEY=${{ steps.flutter_sdk_info.outputs.CACHE-KEY }}" >> "$GITHUB_ENV"

- name: Restore Flutter SDK cache
id: flutter_sdk_cache
uses: actions/cache/restore@v6
with:
path: ${{ env.FLUTTER_SDK_CACHE_PATH }}
key: ${{ env.FLUTTER_SDK_CACHE_KEY }}

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
cache: true
# Both false: the SDK cache is handled entirely by our own step
# above (flutter-action's internal version is the broken one on
# macOS/Windows -- see that step's comment). `cache: true` with no
# explicit `pub-cache` input would ALSO silently enable flutter-
# action's OWN internal pub-cache step (its action.yaml: `if:
# (inputs.pub-cache == '' && inputs.cache == 'true') || ...`), whose
# key unconditionally appends `${{ hashFiles('**/pubspec.lock') }}`
# -- an UNSCOPED glob from the repo root, not the narrower
# `packages/**/pubspec.yaml` below. Confirmed live: a run on this
# exact composite action hit "hashFiles('**/pubspec.lock') couldn't
# finish within 120 seconds" on a macOS leg, and the GH Actions
# cache listing (`gh api repos/Bdaya-Dev/oidc/actions/caches`)
# showed a `flutter-linux-...-<hash>-` key with an EMPTY trailing
# segment -- the same hashFiles call degrading to "" on Linux too,
# just not fatally there. pub-cache: "false" keeps that disabled
# regardless (we run our own narrowly-scoped pub cache below
# instead) for every job that goes through this action, including
# ios/macos/android/web/linux/windows via integration_test_base --
# without changing anything those jobs own.
cache: false
pub-cache: "false"
channel: ${{ inputs.channel }}
flutter-version: ${{ inputs.flutter-version }}

# Save, split from restore above (actions/cache/save, not the combined
# actions/cache action), and gated to pushes on main only: every other
# ref (PR runs, workflow_dispatch runs like the ones used to verify this
# fix) restores whatever main has already populated but never saves its
# own copy. The SDK archive is multi-GB per OS (~1.7-2.2GB each); since
# this repo's total GH Actions cache is capped at 10GB and already
# shares that budget with the pub cache above and the Gradle caches the
# android job writes, letting every PR/dispatch run freely create its
# own branch-scoped SDK entry would grow the total without bound (GH
# cache entries are scoped per-ref, so PR branches don't share main's
# entries for writes, only for reads). A `restore-keys` fallback isn't
# meaningful here either way -- a different (channel, version, arch,
# hash) tuple is simply a different, non-interchangeable SDK build, not
# a partial match worth falling back to.
# Split into separate restore/save actions (rather than the combined
# actions/cache@v6 used for the pub cache below) specifically so this
# step runs and completes synchronously, right here, instead of
# deferring the actual save to a POST hook at the end of the job: no
# POST-phase replay is involved at all, which sidesteps the whole class
# of bug described on the restore step above (both actions/cache/
# restore and actions/cache/save are plain `main`-only actions with no
# `post:` step).
- name: Save Flutter SDK cache
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && steps.flutter_sdk_cache.outputs.cache-hit != 'true' }}
uses: actions/cache/save@v6
with:
path: ${{ env.FLUTTER_SDK_CACHE_PATH }}
key: ${{ env.FLUTTER_SDK_CACHE_KEY }}

# Replaces the internal pub-cache step disabled above. subosito/
# flutter-action's own `cache: true` only caches the downloaded
# Flutter/Dart SDK (keyed by version), not the hosted-package pub cache
# that `melos bootstrap` below populates via `pub get` across every
# workspace package, nor the pub-global packages activated later by
# the coverage-formatting steps (coverage/combine_coverage/
# remove_from_coverage). Missing previously (every job paid a cold
# `pub get` + cold global-package resolve/compile on every run). Now
# that unit_tests is split into many parallel jobs (see tests.yaml),
# this matters more, not less: every one of those jobs runs its own
# `melos bootstrap` independently, so a warm cache is shared across all
# of them (and across sdk channels via the key).
# Keyed on the channel (stable/beta resolve different dependency sets)
# and a hash of every pubspec, scoped under packages/ (cheap: at this
# point in the job nothing has generated android/Pods/build dirs yet,
# so the glob only walks source files) instead of an unscoped `**` from
# the repo root -- a dependency change invalidates it; restore-keys
# fall back to the most recent cache for the same channel so a partial
# hit still saves most of the network/compile cost. Concurrent jobs
# racing to save the same key is harmless: actions/cache only lets the
# first writer persist it, and the pub cache's own content is derived
# purely from pubspec.yaml/pubspec.lock, so two independent
# populations of the same key are equivalent.
- name: Cache pub dependencies
uses: actions/cache@v6
with:
# Two paths, not one: this action also runs on windows-latest (the
# `windows` job, via integration_test_base) where the global pub
# cache lives under %LOCALAPPDATA%\Pub\Cache
# (~/AppData/Local/Pub/Cache under this workflow's bash shell), not
# ~/.pub-cache -- see the windows job's own PATH export in
# tests.yaml, which adds both for the same reason. A path that
# doesn't exist on a given OS is simply skipped by actions/cache,
# so listing both is harmless on Linux/macOS.
path: |
~/.pub-cache
~/AppData/Local/Pub/Cache
key: pub-${{ runner.os }}-${{ inputs.channel }}-${{ hashFiles('pubspec.yaml', 'pubspec.lock', 'packages/**/pubspec.yaml') }}
restore-keys: |
pub-${{ runner.os }}-${{ inputs.channel }}-

# see https://github.com/invertase/melos/issues/796
- uses: bluefireteam/melos-action@main
continue-on-error: true
with:
run-bootstrap: true
bootstrap-no-example: false
- uses: bluefireteam/melos-action@main
with:
run-bootstrap: true
bootstrap-no-example: true
4 changes: 3 additions & 1 deletion .github/actions/integration_test_base/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ inputs:
default: "stable"
flutter-version:
description: "Flutter version to use"
default: "3.22.0"
# >=3.41 required: the SwiftPM (FlutterFramework) plugin layout in
# oidc_darwin needs Flutter 3.41+ / Dart 3.11+.
default: "3.47.6"

runs:
using: "composite"
Expand Down
6 changes: 1 addition & 5 deletions .github/dependabot.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,13 @@ updates:
schedule:
interval: "monthly"
- package-ecosystem: "pub"
directory: "/packages/oidc_ios"
directory: "/packages/oidc_darwin"
schedule:
interval: "monthly"
- package-ecosystem: "pub"
directory: "/packages/oidc_linux"
schedule:
interval: "monthly"
- package-ecosystem: "pub"
directory: "/packages/oidc_macos"
schedule:
interval: "monthly"
- package-ecosystem: "pub"
directory: "/packages/oidc_web"
schedule:
Expand Down
55 changes: 55 additions & 0 deletions .github/scripts/firebase_channel_deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
# Deploy one Firebase Hosting preview channel with honest error classification.
#
# Why not FirebaseExtended/action-hosting-deploy: firebase-tools' apiv2 client
# retries POSTs after transient "premature close" network errors even though
# the channel-release POST is not idempotent. The first POST usually succeeds
# server-side, so the retry gets HTTP 400 FAILED_PRECONDITION ("supplied
# version ... is the current active version"). The action treats that as a
# hard failure and, when given a repoToken, writes a failing "Deploy Preview"
# check-run onto the PR even when the job is green. Here that error means
# "the content is already live" and is classified as success; anything else
# fails the step for real (no blanket continue-on-error).
#
# Inputs (env): FIREBASE_SERVICE_ACCOUNT, PROJECT_ID, TARGET, CHANNEL
# Outputs (GITHUB_OUTPUT): url=<stable channel URL>
set -uo pipefail

: "${FIREBASE_SERVICE_ACCOUNT:?}" "${PROJECT_ID:?}" "${TARGET:?}" "${CHANNEL:?}"

export GOOGLE_APPLICATION_CREDENTIALS="${RUNNER_TEMP}/firebase-sa-${TARGET}.json"
printf '%s' "$FIREBASE_SERVICE_ACCOUNT" > "$GOOGLE_APPLICATION_CREDENTIALS"
trap 'rm -f "$GOOGLE_APPLICATION_CREDENTIALS"' EXIT

FIREBASE="npx --yes firebase-tools@15"

set +e
out="$($FIREBASE hosting:channel:deploy "$CHANNEL" \
--only "$TARGET" --expires 7d --project "$PROJECT_ID" --json 2>&1)"
code=$?
set -e
echo "$out"

if [ "$code" -ne 0 ]; then
if grep -q "is the current active version" <<<"$out"; then
echo "::notice title=Redundant release::${TARGET}/${CHANNEL}: content already live; treating as success."
else
echo "::error title=Firebase preview deploy failed::target=${TARGET} channel=${CHANNEL}"
exit 1
fi
fi

# Channel URLs are stable per channel (https://<site>--<channel>-<hash>.web.app).
# Take it from the deploy output; on the redundant-release path fall back to
# the channel list.
url="$(grep -oE "https://[A-Za-z0-9-]+\.web\.app" <<<"$out" | grep -- "--${CHANNEL}-" | head -1 || true)"
if [ -z "$url" ]; then
list_out="$($FIREBASE hosting:channel:list --site "$TARGET" --project "$PROJECT_ID" 2>&1 || true)"
url="$(grep -oE "https://[A-Za-z0-9-]+\.web\.app" <<<"$list_out" | grep -- "--${CHANNEL}-" | head -1 || true)"
fi

echo "url=${url}" >> "$GITHUB_OUTPUT"
{
echo "### Firebase preview: \`${TARGET}\`"
if [ -n "$url" ]; then echo "${url} (expires 7d after last deploy)"; else echo "_deployed, but URL could not be determined_"; fi
} >> "$GITHUB_STEP_SUMMARY"
Loading
Loading