Fix KeyCape claim interoperability and verify the composed Forgejo release
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Reject generated-only commits / generated-commit-guard (push) Successful in 9s

This commit is contained in:
codex 2026-10-18 02:40:01 +02:00
parent 81f2f59649
commit 1b8dc0a8fd
89 changed files with 19125 additions and 19 deletions

View file

@ -0,0 +1,182 @@
{
"objective": "Finish what you found missing and finish CUST-WP-0080",
"status": "active",
"observed_at": "2026-10-18T00:28:21.910794+00:00",
"full_scope_baseline": {
"path": "docs/changes/netkingdom-target-2026-10-18/cust80-completion-r1/completion-audit.json",
"sha256": "sha256:9bdee9a790db598956fe35d5954137bb4582c9f3810d2392f7ef3236c369b065",
"all_requirements_retained": true
},
"normative_architecture": {
"path": "docs/netkingdom-target-security-architecture.md",
"sha256": "ec2079be18c7cdb8a1e4fdbd22131c08c83721d7a1bf18b4802bc5e229520f35"
},
"acceptance_gates": [
{
"id": "TSA-01",
"required_outcome": "Every inventoried privileged PEP authenticates its decision",
"required_evidence": "PEP denominator; admitted signer/channel; forged, altered, wrong-key/pin, unsigned/downgrade, expired and rotation refusals. Start SECRETS-WP-0014.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-02",
"required_outcome": "Exact approval produces one bounded protected operation",
"required_evidence": "SECRETS-WP-0013/RPF-WP-0035-T12 native effect; Approval T01/T05 issuer/tenant provenance; wrong actor/tenant/body, expiry, replay and unavailable refusal.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-03",
"required_outcome": "Crashes preserve uncertainty and cleanup",
"required_evidence": "Actual ledger restart/concurrency, consumed-before-effect failure, target reconciliation, scoped cleanup and revocation evidence; no blind replay.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-04",
"required_outcome": "First reusable browser case is accepted",
"required_evidence": "NK-WP-0048 and named Mason/Warden/KeyCape adapters; independent native structure, sign-in/denial, delivery, revocation and rollback.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-05",
"required_outcome": "Human and browser consumers can use the delivered identity",
"required_evidence": "KEY-WP-0040/U08 real-factor recovery; User Engine journey; NK-WP-0050 and CUST-WP-0080-T05 human/agent Playwright acceptance.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-06",
"required_outcome": "Actual agent and runner authority is bounded",
"required_evidence": "CUST-WP-0073/GLAS-WP-0012 admitted runtime read-denial/tool-effect proof; Forge/Platform per-job credential and repository-workflow abuse tests.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-07",
"required_outcome": "Credential lifecycle is inventoried and simplified",
"required_evidence": "Current owner/consumer denominator, unknown/orphan findings, native-identity elimination candidates; sampled replacement/adoption/old-refusal and deletion semantics. G04/G09/G12.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-08",
"required_outcome": "Recovery is independent and measured",
"required_evidence": "NK-WP-0049 plus platform/root owners; isolated recovery with ordinary issuer unavailable, restore/reconnect/audit continuity and measured RTO/RPO. G08/G11.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-09",
"required_outcome": "Security effects have independently reconciled evidence",
"required_evidence": "Admitted source/class inventory, atomic outbox, receiver readback, lag/duplicate/boundary accounting and missing-class findings. Approval/Audit/Tenant/Secrets owners.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-10",
"required_outcome": "Source and delivery controls cover declared entry paths",
"required_evidence": "FORGE-WP-0006/RMGR-WP-0021: denominator, SSH/HTTP/UI/new repo/import/mirror coverage, required checks/provenance, private synthetic finding through resolution.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-11",
"required_outcome": "Discovery remains accurate",
"required_evidence": "All reviewed IDs exactly once, owner/index parity, usable source links, current limits/version aliases, drift checks and package-family disposition. Reuse/Repo Manager/provider owners.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-12",
"required_outcome": "Improvement operates without repeated manual polling",
"required_evidence": "CUST-WP-0079/Activity accepted schedule, unassisted firing, checkpoint and changed-state notifications; adopted cadence runtime/receiver receipts; owner change and native remeasurement.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-13",
"required_outcome": "Shared adapters reduce per-consumer implementation",
"required_evidence": "Producer-format cross-language fixtures, two real consumers, version compatibility, denied-path parity, upgrades and rollback; no second PDP.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-14",
"required_outcome": "Minimal profiles are independently reusable",
"required_evidence": "Version/provider lock, dependency and optional-provider declaration, provider adapters, second clean installation, complete positive/negative journeys and upgrade/recovery instructions.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-15",
"required_outcome": "Optimization improves measured operations",
"required_evidence": "Baseline and repeat measurements of onboarding time/touches, p50/p95 decision/effect latency, scanner throughput/failure, resources/headroom and owner effort with unchanged control coverage.",
"status": "incomplete",
"completion_evidence": []
},
{
"id": "TSA-16",
"required_outcome": "Governance and exceptions remain truthful",
"required_evidence": "Existing SEC-DSM ledger and close-down controls reconciled to exact evidence; real authority for changes, explicit residual promotions, preserved deferrals and no invented owner assent.",
"status": "incomplete",
"completion_evidence": []
}
],
"sec_dsm_requirements": {
"path": "docs/evidence/2026-10-12-netkingdom-security/sec-dsm-requirement-ledger.json",
"sha256": "sha256:ad81f7186ada04aa1cc410932fc8669d69dc2232f3c0be00657b17f3aa3a8184",
"count": 116,
"status_counts": {
"unverified": 84,
"incomplete": 12,
"reference": 20
},
"closure_status_unchanged": true
},
"gap_ids": [
"G01",
"G02",
"G03",
"G04",
"G05",
"G06",
"G07",
"G08",
"G09",
"G10",
"G11",
"G12",
"G13"
],
"separate_required_deliverables": [
"G01-G13 current closure evidence or already applicable approved exceptions",
"SEC-DSM requirement ledger reconciled with exact evidence",
"T05 real human and agent Playwright acceptance and supported discovery",
"Second real consumer and clean installation proves reuse",
"Residual handoffs before workplan finish; no required work left only in prose"
],
"source_progress": {
"packet": "docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1",
"producer_source_commit": "git:ca0cb75729a63c9288b7333382d0fa3eb1e8c9a3",
"consumer_owner_commit": "git:3fb031a47ff5379358fd8cc230b40961b3b5d3a8",
"consumer_paths": 37,
"patch_sha256": "sha256:15cb7f13b1b1d1095cc344176ca337f705333a436a70ae803fcfd3d7f802ccf4",
"actual_issuer_provider_callback_passes_including_subtests": 77,
"selected_composed_package_passes_including_subtests": 93,
"skips_in_these_suites": 0,
"complete_frontend_static_build": true,
"exact_embedded_assets": 2234,
"actual_release_cli_subprocesses": 48,
"synthetic_authentication": true,
"independent_owner_assent": false,
"native_gates_closed": 0,
"local_OCI_exports_exact": 2,
"local_OCI_manifest": "sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822"
},
"current_work": "Publish source evidence and continue existing owner operation/session/exclusion/custody and ongoing protected-path implementation; native acceptance remains required.",
"workplan_finished": false,
"goal_complete": false
}

View file

@ -0,0 +1,10 @@
{
"passed_including_subtests": 77,
"skipped": 0,
"failed": 0,
"receipt": "consumer-after-attempt3.json",
"actual_issuer_serializer": true,
"actual_provider_discovery_fetch_userinfo_and_callback": true,
"synthetic_completed_authorization_session": true,
"native_admission": false
}

View file

@ -0,0 +1,36 @@
"""Publish explicitly typed public asset digests, retaining byte-exact evidence."""
from pathlib import Path
import hashlib
import json
HERE = Path(__file__).resolve().parent
path = HERE / 'release-evidence/embedded-files.json'
raw = path.read_bytes()
records = json.loads(raw)
work = Path('/tmp/custodian-forgejo-release-r3')
verification = json.loads((HERE / 'release-evidence/verification.json').read_text())
sha = lambda data: hashlib.sha256(data).hexdigest()
assert sha(raw) == verification['embedded_file_manifest_sha256']
assert raw == (work / 'embedded-files.json').read_bytes()
for name, value in records.items():
assert sha((work / 'source' / name).read_bytes()) == value, name
assert sha((work / 'embedded-extracted' / name).read_bytes()) == value, name
published = (json.dumps({name: 'sha256:' + value for name, value in records.items()},
indent=2, sort_keys=True) + '\n').encode()
restored = (json.dumps({name: value.removeprefix('sha256:')
for name, value in json.loads(published).items()},
indent=2, sort_keys=True) + '\n').encode()
assert restored == raw
path.write_bytes(published)
(HERE / 'release-evidence/embedded-manifest-derivation.json').write_text(json.dumps({
'scope': 'Public generated/embedded asset SHA-256 identifiers only',
'assets_verified_against_both_actual_source_and_extracted_binary': len(records),
'runtime_original_manifest_sha256': 'sha256:' + sha(raw),
'published_manifest_sha256': 'sha256:' + sha(published),
'original_byte_exact_reconstructed': True,
'reconstruction': 'Remove the sha256: value prefix and serialize with json.dumps(indent=2, sort_keys=True) plus one newline.',
'runtime_verification_receipt_preserved': True,
'scanner_rules_or_allowlists_changed': False,
'credential_values_transformed': False,
}, indent=2) + '\n')
print(json.dumps({'public_asset_digests_verified': len(records), 'original_byte_exact_reconstructed': True}))

View file

@ -0,0 +1,9 @@
{
"paths_verified": 37,
"patch_sha256": "sha256:15cb7f13b1b1d1095cc344176ca337f705333a436a70ae803fcfd3d7f802ccf4",
"official_archive_sha256": "sha256:1ddd8c926ca07d40436897971458ace7dcf1d3496a0813ab9e0d869edef2365c",
"workspace": "/tmp/custodian-forgejo-replay-r3-kje_jqm_",
"fuzz": 0,
"all_postimages_exact": true,
"native_changes": false
}

View file

@ -0,0 +1,217 @@
{
"schema": "custodian.forgejo-composed-source.v1",
"status": "source candidate with actual KeyCape assurance interoperability",
"archive_sha256": "1ddd8c926ca07d40436897971458ace7dcf1d3496a0813ab9e0d869edef2365c",
"forgejo_version": "11.0.3",
"producer_source_commit": "ca0cb75729a63c9288b7333382d0fa3eb1e8c9a3",
"patch_sha256": "15cb7f13b1b1d1095cc344176ca337f705333a436a70ae803fcfd3d7f802ccf4",
"files": [
{
"path": "cmd/admin_auth_oauth.go",
"before_sha256": "d5faee30ffbb9a560256c92a0e05e652b79e95e016448cbac7dbb6ad0fdad937",
"after_sha256": "d718d817c46f6393488a9c5a894b7535640cd0ec1a1ae3f72f8411a2bbec3b38"
},
{
"path": "cmd/admin_auth_oauth_secret_linux.go",
"before_sha256": null,
"after_sha256": "6741961f1df67c1afbf34c796e549425f0e04a0d0678c6eedb05f66d4754c64b"
},
{
"path": "cmd/admin_auth_oauth_secret_linux_test.go",
"before_sha256": null,
"after_sha256": "b28c2369dfab9bf2ca48e707e01b4394a36c8be5490cfe5bb658017bb626c4b2"
},
{
"path": "cmd/admin_auth_oauth_secret_other.go",
"before_sha256": null,
"after_sha256": "54056c989a4757e73db0252130e7c16bf16f5ec8eaaca2468f019ba2ef5c532d"
},
{
"path": "go.mod",
"before_sha256": "652162a4a95c6d1c349d2a8c0b514def5abd837f001137b77b7b3f4a0f162d00",
"after_sha256": "130138c4c3ecc29fa0d7f1e2eef0589ddf3b06071f3cc0448aa7b2326847653a"
},
{
"path": "models/auth/source_operation.go",
"before_sha256": null,
"after_sha256": "ef1b07ef6cf454015d00cde8588835f5118d829da91eb0303d37184859345a31"
},
{
"path": "models/auth/source_operation_internal_test.go",
"before_sha256": null,
"after_sha256": "af0f424d3a1fd2b29793b64baa1fa07284fee7ea0b7721c503db4efac0d871cb"
},
{
"path": "models/auth/source_operation_process_test.go",
"before_sha256": null,
"after_sha256": "40d33b11a01cb659f0bf6f8b545c4d79910e8c082a789060bcbc9cadeee965bd"
},
{
"path": "models/auth/source_operation_test.go",
"before_sha256": null,
"after_sha256": "77d311bca42f48faf3fbdc15c53582e3d8a6d9108a72ed7bb6172e5b88951428"
},
{
"path": "models/db/context.go",
"before_sha256": "10774e272206c7a8d6ebfb106b37d535de77f7e96ba57657b4dad960639f8519",
"after_sha256": "d4c4acfcb8987071aecf5cd957b3821c8d2619a2696398d37c2970f2527686f7"
},
{
"path": "models/db/engine.go",
"before_sha256": "774cedc74e1a8d9ae6f9e5f106c6cbb66f12c11b42e99ef07a7affd03269c3d2",
"after_sha256": "43683804d0c5bc6ead1dba0344c69dd196825cf3d5eb502af8d932a7b8207b96"
},
{
"path": "models/db/sensitive_sql.go",
"before_sha256": null,
"after_sha256": "06a298d0d6e628e6920384d4ddeef449e40c090841ebaa3f6d175725a45ae584"
},
{
"path": "models/db/sensitive_sql_logging_test.go",
"before_sha256": null,
"after_sha256": "d924b35d30686473caf29601cf51cc363ba68158cb4ef0981c9e2fc7b03c04b7"
},
{
"path": "models/db/sensitive_sql_test.go",
"before_sha256": null,
"after_sha256": "de6353c955047c3311747e4777b9f9b2195e9efb19160b971dd758dfc94cf31b"
},
{
"path": "routers/web/admin/auths.go",
"before_sha256": "eeed6999e4655993b55873bb51efb4fcd946532255b9473d16e086e04a1ec911",
"after_sha256": "3498229e06fb9ff52396bcb5e68c0cc2d2ad24e6494533d8717d7c833f3e2923"
},
{
"path": "routers/web/auth/oauth.go",
"before_sha256": "6f454b3550b150178a8597a9437adb0c626556f34c15a13778c15d675b05659b",
"after_sha256": "58bff778e0dc17a521706289bf45c3e0d76a759a0874f76c379b3d1ddb419b17"
},
{
"path": "services/auth/source/oauth2/access_engine.go",
"before_sha256": null,
"after_sha256": "d5f07f9491ac2212410e1fa8c0248d68ba3a723e7ca99e363627c5292d187aa8"
},
{
"path": "services/auth/source/oauth2/access_engine_assurance.go",
"before_sha256": null,
"after_sha256": "42de751b1e9a243301d566260954813b770558ecb449639acaeab307fe788642"
},
{
"path": "services/auth/source/oauth2/access_engine_assurance_test.go",
"before_sha256": null,
"after_sha256": "44e7459f6c1106a264093c19d61d01a8365f6ad22682906552d832ba39d61dd3"
},
{
"path": "services/auth/source/oauth2/access_engine_azp_test.go",
"before_sha256": null,
"after_sha256": "5f94f43ade9a79b6b7ef529c80115a8c32acfece425dc8ed3f24e6ad839fc0ce"
},
{
"path": "services/auth/source/oauth2/access_engine_callback_test.go",
"before_sha256": null,
"after_sha256": "5cea36b630c895a9473dc876b7128526ddef65d9395b2fddc56343e162452472"
},
{
"path": "services/auth/source/oauth2/access_engine_test.go",
"before_sha256": null,
"after_sha256": "99edd6cfe3e834d73e0447a7915f52cc4ab7b82644669c5ae61963f850b447e8"
},
{
"path": "services/auth/source/oauth2/providers_openid.go",
"before_sha256": "6ddca7fb4ab8b16e6b096481cfb40ca5abdf3a327f38c895b95b3846cc7c2248",
"after_sha256": "5dd9b906cce434c774968d57fcc790cb678147345fea4d2e58477ec6eed70bcf"
},
{
"path": "services/auth/source/oauth2/required_claim_values.go",
"before_sha256": null,
"after_sha256": "29f16d07464bbe12e3f65616b6c1eb60561d04cd8ff89ecbfb56f93dbeaf1cda"
},
{
"path": "services/auth/source/oauth2/required_claim_values_test.go",
"before_sha256": null,
"after_sha256": "54a8bd97dc51c524a9adf0c6aefb9a19fa152d234b3bb929bf1a90932662d3d0"
},
{
"path": "services/auth/source/oauth2/source.go",
"before_sha256": "a6ee5146c07d8efb1837ef91f1ab5f3139f69a1ff66f814d5e9c6053bf9b0d8b",
"after_sha256": "44e99883c2ec479427b3f72c73353fe33936eed2e5c962b2fa40803576aa5642"
},
{
"path": "services/auth/source/oauth2/source_callout.go",
"before_sha256": "c30c418182d4cb98b1e448f621c93322accfbbf92d6a59e6df1ae45a7aa8fc7b",
"after_sha256": "6abba69df97afc62467f0328eaa5a6383cfb4900202a081dec4b84a21b37349c"
},
{
"path": "third_party/access-engine-pep/LICENSE",
"before_sha256": null,
"after_sha256": "ff413f361a3b3bf44cf50f110fbcc4837064d57eefbcef89df2b43997c6262b6"
},
{
"path": "third_party/access-engine-pep/go.mod",
"before_sha256": null,
"after_sha256": "fea700810e47c1ba5638b86a168f8531c083a6e1222ca80bd2a8947b2ea6f2c3"
},
{
"path": "third_party/access-engine-pep/internal/sign/sign.go",
"before_sha256": null,
"after_sha256": "0df9515922e90775ebbfac798361dcafb20da8a4213796b44e246b8a92046cde"
},
{
"path": "third_party/access-engine-pep/pkg/api/canonical.go",
"before_sha256": null,
"after_sha256": "a122a2e8cd524333b13c5939c7a3685e41efbe47497a64e0c7297c92b7f10d19"
},
{
"path": "third_party/access-engine-pep/pkg/api/caring.go",
"before_sha256": null,
"after_sha256": "1907156f0f889e7b9e9c14970cf7a86a20d00478a496efaf92c7231f27fec5e3"
},
{
"path": "third_party/access-engine-pep/pkg/api/resource_manifest.go",
"before_sha256": null,
"after_sha256": "f0fa4080287d389ed48c2b1d6af96cc62e57ef72c902333f677f964420be133f"
},
{
"path": "third_party/access-engine-pep/pkg/decisionpep/client.go",
"before_sha256": null,
"after_sha256": "0d57f6ddaca5c3f81ce426c0e8b14ba14ea5962096d3be5909aa456eef19eeba"
},
{
"path": "third_party/access-engine-pep/pkg/decisionpep/client_test.go",
"before_sha256": null,
"after_sha256": "1a6be3485f580f95a1f1406fb76e525f2c4bf02fe04a424cfe0095bb728e3f62"
},
{
"path": "third_party/access-engine-pep/producer-source.json",
"before_sha256": null,
"after_sha256": "c1d83e3d79f9860ffaa61ec19a6b3415e914d3058b11b07cdd05a7d1182cdceb"
},
{
"path": "third_party/access-engine-pep/testsupport/signfixture/sign.go",
"before_sha256": null,
"after_sha256": "fe4aa86f444dc20145aefbaca35b24f046264b2c5c8b4e3b057a4496b77a4d29"
}
],
"original_bad_context_snapshot": "empty; recovered from frozen patch and verified exact pre/postimage hashes",
"native_gates_closed": 0,
"issuer_source_commit": "git:d803e9282a47b49daf930fb905312fa5104c0ace",
"open_gates": [
"Complete release rebuild and artifact verification with this exact patch.",
"Current authenticated operation/inverse sessions and release-wide writer exclusion.",
"Ongoing HTTP/API/Git/SSH authorization; native issuer/factor/custody acceptance.",
"Owner source/package/type admission; no operational authority granted by source tests."
],
"preceding_packet_tests": {
"producer_race_passes_including_subtests": 494,
"producer_existing_skips": 3,
"consumer_passes_including_subtests": 76,
"consumer_skips": 0,
"actual_cli_subprocesses": 48
},
"actual_issuer_callback_tests": {
"receipt": "consumer-after-attempt2.json",
"passed_including_subtests": 71,
"skipped": 0,
"synthetic_authentication": true
}
}

View file

@ -0,0 +1,149 @@
{
"returncode": 0,
"seconds": 5.79,
"workspace": "/tmp/custodian-forgejo-wire-uxs0ekwk",
"argv": [
"bwrap",
"--unshare-pid",
"--die-with-parent",
"--new-session",
"--unshare-net",
"--ro-bind",
"/usr",
"/usr",
"--ro-bind",
"/lib",
"/lib",
"--ro-bind",
"/lib64",
"/lib64",
"--symlink",
"usr/bin",
"/bin",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--bind",
"/tmp/custodian-forgejo-successor-attempt2",
"/work",
"--ro-bind",
"/home/worsch/go/pkg/mod/cache/download",
"/cached",
"--ro-bind",
"/etc/ssl/certs",
"/etc/ssl/certs",
"--ro-bind",
"/etc/resolv.conf",
"/etc/resolv.conf",
"--chdir",
"/work/source",
"--clearenv",
"--dir",
"/run",
"--ro-bind",
"/tmp/custodian-forgejo-successor-attempt2/descriptor-fixtures",
"/run/forgejo-oidc",
"--bind",
"/tmp/custodian-forgejo-successor-attempt2/descriptor-fixtures",
"/run/writable-input",
"--setenv",
"PATH",
"/work/go/bin:/usr/bin:/bin",
"--setenv",
"HOME",
"/work/home",
"--setenv",
"GOPATH",
"/work/gopath",
"--setenv",
"GOTOOLCHAIN",
"local",
"--setenv",
"GOPROXY",
"off",
"--setenv",
"GOSUMDB",
"off",
"--setenv",
"GOVCS",
"*:off",
"--setenv",
"GOMODCACHE",
"/work/modules",
"--setenv",
"GOCACHE",
"/work/gocache",
"--setenv",
"GOMAXPROCS",
"4",
"--setenv",
"CGO_ENABLED",
"1",
"--setenv",
"GIT_CONFIG_NOSYSTEM",
"1",
"--setenv",
"GIT_CONFIG_GLOBAL",
"/work/home/test.gitconfig",
"--setenv",
"GIT_TERMINAL_PROMPT",
"0",
"--ro-bind",
"/tmp/custodian-forgejo-wire-uxs0ekwk/oauth2",
"/work/source/services/auth/source/oauth2",
"--ro-bind",
"/tmp/custodian-keycape-wire-jum8uowp/identity.json",
"/work/keycape-wire-fixture.json",
"--setenv",
"CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE",
"/work/keycape-wire-fixture.json",
"--",
"go",
"test",
"-p",
"1",
"-json",
"-tags",
"sqlite sqlite_unlock_notify",
"./services/auth/source/oauth2",
"-run",
"TestAccessEngine|TestVerifiedApplicationIdentity|TestRequired|TestCurrent",
"-count=1"
],
"actual_issuer_source": "d803e9282a47b49daf930fb905312fa5104c0ace",
"fixture_sha256": "a9465766c6edebf8e6ce77e2bcaef9d1bfa081c6472c731f95c0b9caaf684522",
"consumer_source_pins": {
"access_engine.go": "sha256:d5f07f9491ac2212410e1fa8c0248d68ba3a723e7ca99e363627c5292d187aa8",
"access_engine_assurance.go": "sha256:42de751b1e9a243301d566260954813b770558ecb449639acaeab307fe788642",
"access_engine_assurance_test.go": "sha256:44e7459f6c1106a264093c19d61d01a8365f6ad22682906552d832ba39d61dd3",
"access_engine_azp_test.go": "sha256:5f94f43ade9a79b6b7ef529c80115a8c32acfece425dc8ed3f24e6ad839fc0ce",
"access_engine_callback_test.go": "sha256:5cea36b630c895a9473dc876b7128526ddef65d9395b2fddc56343e162452472",
"access_engine_test.go": "sha256:99edd6cfe3e834d73e0447a7915f52cc4ab7b82644669c5ae61963f850b447e8",
"assert_interface_test.go": "sha256:a0db85e38b7ea61e21b0291e55c8b451c89a877bd3db229e35dbb4418458f54f",
"init.go": "sha256:98a8030ed005be67b237d54c3b197a629f8c289e3d74c8edfcf4d740831f87d1",
"jwtsigningkey.go": "sha256:0c6e8ac131fd41ad299073ca748dd95e5fd9c044219c4d7f36d50c4ffcd5b266",
"jwtsigningkey_test.go": "sha256:3e414a541479741773e48de84be7d5a3b794bcc7289627fbd2e8996832628321",
"keycape_wire_test.go": "sha256:e78c9b87ebbbc1da6f9985a394a6ba1bf5d5aa5041fc5a6bf4099d046d026b3e",
"providers.go": "sha256:7df0051f19932a68d16a33a5d41898e06e9612f839195e27c86802eeebb2e3e9",
"providers_base.go": "sha256:643dbc0561ec7aa7a975978ff2c21d256a5ab619b125e8077d2395281f628542",
"providers_custom.go": "sha256:265a526d209d86c24cbcfdde4c2d73957aaeaccfd329438c11ce99c5951ebb39",
"providers_openid.go": "sha256:5dd9b906cce434c774968d57fcc790cb678147345fea4d2e58477ec6eed70bcf",
"providers_simple.go": "sha256:53927b6bfc621dd1b68a074b6763abe5b27795d5a50ca6f0555f3e7a04fa1613",
"required_claim_values.go": "sha256:29f16d07464bbe12e3f65616b6c1eb60561d04cd8ff89ecbfb56f93dbeaf1cda",
"required_claim_values_test.go": "sha256:54a8bd97dc51c524a9adf0c6aefb9a19fa152d234b3bb929bf1a90932662d3d0",
"source.go": "sha256:44e99883c2ec479427b3f72c73353fe33936eed2e5c962b2fa40803576aa5642",
"source_authenticate.go": "sha256:c6551f00ef4349ccd6afdbb2cba847067528485ff621c3e507b9aab588bb96b5",
"source_callout.go": "sha256:6abba69df97afc62467f0328eaa5a6383cfb4900202a081dec4b84a21b37349c",
"source_name.go": "sha256:712943826e01f718ab4ca717df6c5f2171535cb2229dbf8460f542d757ef8d7f",
"source_register.go": "sha256:5ad9ccf213881734dc7fe7619cbe6c47cb6a4afdbbfc3e674ab4493857ebbf91",
"store.go": "sha256:35b244081569215384de07f8cdc1e83b5545a2e673ca1ac5a2a6ee686cb917a3",
"token.go": "sha256:c0a8868f904bb31842202b4e635a76403902adff9e638d5cb581e7e2d4954933",
"urlmapping.go": "sha256:f2132408d4a447e766e67495b1ca7b8cc2b47d4eb56b0c44b50ba01fe41ca83e"
},
"fixture_values_published": false,
"synthetic_authentication": true,
"real_credentials": false
}

View file

@ -0,0 +1,288 @@
{"Time":"2026-10-18T00:14:25.001478827Z","Action":"start","Package":"forgejo.org/services/auth/source/oauth2"}
{"Time":"2026-10-18T00:14:25.090083399Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals"}
{"Time":"2026-10-18T00:14:25.090150659Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals\n"}
{"Time":"2026-10-18T00:14:25.090225701Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at"}
{"Time":"2026-10-18T00:14:25.090232013Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/string-at\n"}
{"Time":"2026-10-18T00:14:25.093441211Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/string-at (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.09349949Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Elapsed":0}
{"Time":"2026-10-18T00:14:25.093755255Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa"}
{"Time":"2026-10-18T00:14:25.093780423Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa\n"}
{"Time":"2026-10-18T00:14:25.094191577Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.09424688Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Elapsed":0}
{"Time":"2026-10-18T00:14:25.094257439Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source"}
{"Time":"2026-10-18T00:14:25.094264112Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/wrong-source\n"}
{"Time":"2026-10-18T00:14:25.09501313Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/wrong-source (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.095076449Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Elapsed":0}
{"Time":"2026-10-18T00:14:25.095088784Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level"}
{"Time":"2026-10-18T00:14:25.095095448Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/wrong-level\n"}
{"Time":"2026-10-18T00:14:25.095673476Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/wrong-level (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.095731511Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Elapsed":0}
{"Time":"2026-10-18T00:14:25.09574116Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods"}
{"Time":"2026-10-18T00:14:25.095781278Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods\n"}
{"Time":"2026-10-18T00:14:25.09661682Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.096709382Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Elapsed":0}
{"Time":"2026-10-18T00:14:25.096721709Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication"}
{"Time":"2026-10-18T00:14:25.096726362Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication\n"}
{"Time":"2026-10-18T00:14:25.097476214Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.097535999Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Elapsed":0}
{"Time":"2026-10-18T00:14:25.097605936Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at"}
{"Time":"2026-10-18T00:14:25.097633006Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/fractional-at\n"}
{"Time":"2026-10-18T00:14:25.099145526Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/fractional-at (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.099199007Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Elapsed":0}
{"Time":"2026-10-18T00:14:25.099210234Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa"}
{"Time":"2026-10-18T00:14:25.099214842Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa\n"}
{"Time":"2026-10-18T00:14:25.100019903Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.10006361Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Elapsed":0}
{"Time":"2026-10-18T00:14:25.100073727Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods"}
{"Time":"2026-10-18T00:14:25.100077658Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/object-methods\n"}
{"Time":"2026-10-18T00:14:25.100849733Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/object-methods (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.100878985Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Elapsed":0}
{"Time":"2026-10-18T00:14:25.100912692Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods"}
{"Time":"2026-10-18T00:14:25.100918066Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/empty-methods\n"}
{"Time":"2026-10-18T00:14:25.10174212Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/empty-methods (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.10180763Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Elapsed":0}
{"Time":"2026-10-18T00:14:25.101924277Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods"}
{"Time":"2026-10-18T00:14:25.10193747Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods\n"}
{"Time":"2026-10-18T00:14:25.102648074Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.102683764Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Elapsed":0}
{"Time":"2026-10-18T00:14:25.102695523Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field"}
{"Time":"2026-10-18T00:14:25.102705712Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field\n"}
{"Time":"2026-10-18T00:14:25.103135191Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.103168501Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Elapsed":0}
{"Time":"2026-10-18T00:14:25.10317842Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication"}
{"Time":"2026-10-18T00:14:25.103182631Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/future-authentication\n"}
{"Time":"2026-10-18T00:14:25.103455818Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/future-authentication (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.103468829Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Elapsed":0}
{"Time":"2026-10-18T00:14:25.103474826Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at"}
{"Time":"2026-10-18T00:14:25.103479371Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/missing-at\n"}
{"Time":"2026-10-18T00:14:25.103770835Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/missing-at (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.103782657Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Elapsed":0}
{"Time":"2026-10-18T00:14:25.104434595Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.104448283Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.10445464Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds"}
{"Time":"2026-10-18T00:14:25.10445886Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Output":"=== RUN TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds\n"}
{"Time":"2026-10-18T00:14:25.105028819Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Output":"--- PASS: TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.105071353Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Elapsed":0}
{"Time":"2026-10-18T00:14:25.105079919Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact"}
{"Time":"2026-10-18T00:14:25.105084825Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Output":"=== RUN TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact\n"}
{"Time":"2026-10-18T00:14:25.105348881Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Output":"--- PASS: TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.1053732Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Elapsed":0}
{"Time":"2026-10-18T00:14:25.10537917Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient"}
{"Time":"2026-10-18T00:14:25.105383489Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient\n"}
{"Time":"2026-10-18T00:14:25.105391244Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client"}
{"Time":"2026-10-18T00:14:25.105395284Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client\n"}
{"Time":"2026-10-18T00:14:25.105899627Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.105934326Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Elapsed":0}
{"Time":"2026-10-18T00:14:25.105944163Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number"}
{"Time":"2026-10-18T00:14:25.105962586Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/number\n"}
{"Time":"2026-10-18T00:14:25.106270552Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/number (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.106287603Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Elapsed":0}
{"Time":"2026-10-18T00:14:25.106511477Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array"}
{"Time":"2026-10-18T00:14:25.106548889Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/array\n"}
{"Time":"2026-10-18T00:14:25.106992347Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/array (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.10705095Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Elapsed":0}
{"Time":"2026-10-18T00:14:25.107126505Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty"}
{"Time":"2026-10-18T00:14:25.107134314Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty\n"}
{"Time":"2026-10-18T00:14:25.107429458Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.107448998Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Elapsed":0}
{"Time":"2026-10-18T00:14:25.10745706Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.107462876Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Elapsed":0}
{"Time":"2026-10-18T00:14:25.107477493Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient"}
{"Time":"2026-10-18T00:14:25.107482452Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Output":"=== RUN TestAccessEngineAuthorizedPartyAcceptsAdmittedClient\n"}
{"Time":"2026-10-18T00:14:25.108268347Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Output":"--- PASS: TestAccessEngineAuthorizedPartyAcceptsAdmittedClient (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.108333839Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Elapsed":0}
{"Time":"2026-10-18T00:14:25.108346833Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision"}
{"Time":"2026-10-18T00:14:25.10837163Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision\n"}
{"Time":"2026-10-18T00:14:25.108378195Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins"}
{"Time":"2026-10-18T00:14:25.108382658Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins\n"}
{"Time":"2026-10-18T00:14:25.125694113Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins (0.02s)\n"}
{"Time":"2026-10-18T00:14:25.125761075Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Elapsed":0.02}
{"Time":"2026-10-18T00:14:25.125778541Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners"}
{"Time":"2026-10-18T00:14:25.125785557Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners\n"}
{"Time":"2026-10-18T00:14:25.133280734Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.133329869Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.133344649Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers"}
{"Time":"2026-10-18T00:14:25.13334987Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers\n"}
{"Time":"2026-10-18T00:14:25.142774698Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.142837386Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.142857756Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision (0.03s)\n"}
{"Time":"2026-10-18T00:14:25.142868035Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Elapsed":0.03}
{"Time":"2026-10-18T00:14:25.142878117Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP"}
{"Time":"2026-10-18T00:14:25.142881841Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP\n"}
{"Time":"2026-10-18T00:14:25.142898757Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny"}
{"Time":"2026-10-18T00:14:25.142902625Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny\n"}
{"Time":"2026-10-18T00:14:25.149749783Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.149826168Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.149843959Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned"}
{"Time":"2026-10-18T00:14:25.149849514Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned\n"}
{"Time":"2026-10-18T00:14:25.15804686Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.158097339Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.158105779Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key"}
{"Time":"2026-10-18T00:14:25.158110639Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key\n"}
{"Time":"2026-10-18T00:14:25.166132907Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.166182943Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.166194044Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin"}
{"Time":"2026-10-18T00:14:25.166199156Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin\n"}
{"Time":"2026-10-18T00:14:25.175201928Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.175248962Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.17525761Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding"}
{"Time":"2026-10-18T00:14:25.175262659Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding\n"}
{"Time":"2026-10-18T00:14:25.183524147Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.183585176Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.183599504Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired"}
{"Time":"2026-10-18T00:14:25.183606267Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired\n"}
{"Time":"2026-10-18T00:14:25.195309772Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.195374192Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.195389701Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP (0.05s)\n"}
{"Time":"2026-10-18T00:14:25.195397213Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Elapsed":0.05}
{"Time":"2026-10-18T00:14:25.195411126Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP"}
{"Time":"2026-10-18T00:14:25.195422389Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP\n"}
{"Time":"2026-10-18T00:14:25.195428503Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token"}
{"Time":"2026-10-18T00:14:25.195434436Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token\n"}
{"Time":"2026-10-18T00:14:25.198511181Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.198581876Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Elapsed":0}
{"Time":"2026-10-18T00:14:25.198595258Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user"}
{"Time":"2026-10-18T00:14:25.198600001Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user\n"}
{"Time":"2026-10-18T00:14:25.201479458Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.201621849Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Elapsed":0}
{"Time":"2026-10-18T00:14:25.20165845Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source"}
{"Time":"2026-10-18T00:14:25.201666106Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source\n"}
{"Time":"2026-10-18T00:14:25.20420718Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.204277686Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Elapsed":0}
{"Time":"2026-10-18T00:14:25.204293791Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity"}
{"Time":"2026-10-18T00:14:25.204300157Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity\n"}
{"Time":"2026-10-18T00:14:25.20731393Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.207374075Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Elapsed":0}
{"Time":"2026-10-18T00:14:25.207389143Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject"}
{"Time":"2026-10-18T00:14:25.207395347Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject\n"}
{"Time":"2026-10-18T00:14:25.209940713Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.210002788Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Elapsed":0}
{"Time":"2026-10-18T00:14:25.210013527Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups"}
{"Time":"2026-10-18T00:14:25.210019893Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups\n"}
{"Time":"2026-10-18T00:14:25.212774907Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.212853284Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Elapsed":0}
{"Time":"2026-10-18T00:14:25.212868857Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider"}
{"Time":"2026-10-18T00:14:25.212903276Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider\n"}
{"Time":"2026-10-18T00:14:25.218029528Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.21808199Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Elapsed":0}
{"Time":"2026-10-18T00:14:25.218094182Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience"}
{"Time":"2026-10-18T00:14:25.218101774Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience\n"}
{"Time":"2026-10-18T00:14:25.220432015Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.22050409Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Elapsed":0}
{"Time":"2026-10-18T00:14:25.220519456Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission"}
{"Time":"2026-10-18T00:14:25.220604407Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission\n"}
{"Time":"2026-10-18T00:14:25.223138132Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.223206429Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Elapsed":0}
{"Time":"2026-10-18T00:14:25.223225248Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token"}
{"Time":"2026-10-18T00:14:25.223232381Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token\n"}
{"Time":"2026-10-18T00:14:25.231732858Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.231803048Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.231817043Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP (0.04s)\n"}
{"Time":"2026-10-18T00:14:25.231828621Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Elapsed":0.04}
{"Time":"2026-10-18T00:14:25.231963447Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE"}
{"Time":"2026-10-18T00:14:25.231986459Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE\n"}
{"Time":"2026-10-18T00:14:25.232891505Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience"}
{"Time":"2026-10-18T00:14:25.232937196Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/audience\n"}
{"Time":"2026-10-18T00:14:25.233611719Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/audience (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.233681711Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Elapsed":0}
{"Time":"2026-10-18T00:14:25.233693496Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired"}
{"Time":"2026-10-18T00:14:25.233706815Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/expired\n"}
{"Time":"2026-10-18T00:14:25.234347123Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/expired (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.234401281Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Elapsed":0}
{"Time":"2026-10-18T00:14:25.234415149Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued"}
{"Time":"2026-10-18T00:14:25.234421479Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/future-issued\n"}
{"Time":"2026-10-18T00:14:25.235065678Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/future-issued (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.235125886Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Elapsed":0}
{"Time":"2026-10-18T00:14:25.235154696Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp"}
{"Time":"2026-10-18T00:14:25.235166888Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-exp\n"}
{"Time":"2026-10-18T00:14:25.237377394Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-exp (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.238624541Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Elapsed":0}
{"Time":"2026-10-18T00:14:25.243293199Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat"}
{"Time":"2026-10-18T00:14:25.24335007Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-iat\n"}
{"Time":"2026-10-18T00:14:25.243950687Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-iat (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.244009587Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Elapsed":0}
{"Time":"2026-10-18T00:14:25.244025936Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance"}
{"Time":"2026-10-18T00:14:25.244076405Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-assurance\n"}
{"Time":"2026-10-18T00:14:25.24469133Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-assurance (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.24474454Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Elapsed":0}
{"Time":"2026-10-18T00:14:25.244759247Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp"}
{"Time":"2026-10-18T00:14:25.244766398Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp\n"}
{"Time":"2026-10-18T00:14:25.245362057Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.245421003Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Elapsed":0}
{"Time":"2026-10-18T00:14:25.245439957Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject"}
{"Time":"2026-10-18T00:14:25.245447108Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/empty-subject\n"}
{"Time":"2026-10-18T00:14:25.246139326Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/empty-subject (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.246206054Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Elapsed":0}
{"Time":"2026-10-18T00:14:25.246218038Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer"}
{"Time":"2026-10-18T00:14:25.246233403Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/issuer\n"}
{"Time":"2026-10-18T00:14:25.246887145Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/issuer (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.246938489Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Elapsed":0}
{"Time":"2026-10-18T00:14:25.246974098Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued"}
{"Time":"2026-10-18T00:14:25.246987759Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/old-issued\n"}
{"Time":"2026-10-18T00:14:25.247529768Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/old-issued (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.247573727Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Elapsed":0}
{"Time":"2026-10-18T00:14:25.247587713Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant"}
{"Time":"2026-10-18T00:14:25.247594638Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-tenant\n"}
{"Time":"2026-10-18T00:14:25.248176165Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-tenant (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.248233118Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Elapsed":0}
{"Time":"2026-10-18T00:14:25.248247266Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal"}
{"Time":"2026-10-18T00:14:25.248255733Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-principal\n"}
{"Time":"2026-10-18T00:14:25.248864826Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-principal (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.248909777Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Elapsed":0}
{"Time":"2026-10-18T00:14:25.248922509Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key"}
{"Time":"2026-10-18T00:14:25.248936071Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/wrong-key\n"}
{"Time":"2026-10-18T00:14:25.249707093Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/wrong-key (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.249784632Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Elapsed":0}
{"Time":"2026-10-18T00:14:25.249803388Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key"}
{"Time":"2026-10-18T00:14:25.249810521Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/unknown-key\n"}
{"Time":"2026-10-18T00:14:25.25016838Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/unknown-key (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.25024481Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Elapsed":0}
{"Time":"2026-10-18T00:14:25.250261627Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type"}
{"Time":"2026-10-18T00:14:25.250267542Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/wrong-type\n"}
{"Time":"2026-10-18T00:14:25.250658699Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/wrong-type (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.250721333Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Elapsed":0}
{"Time":"2026-10-18T00:14:25.250744399Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion"}
{"Time":"2026-10-18T00:14:25.250752334Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion\n"}
{"Time":"2026-10-18T00:14:25.251065765Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.251120509Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Elapsed":0}
{"Time":"2026-10-18T00:14:25.25115261Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none"}
{"Time":"2026-10-18T00:14:25.25116491Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/none\n"}
{"Time":"2026-10-18T00:14:25.251447855Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/none (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.251495286Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Elapsed":0}
{"Time":"2026-10-18T00:14:25.251507216Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE (0.02s)\n"}
{"Time":"2026-10-18T00:14:25.251514033Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Elapsed":0.02}
{"Time":"2026-10-18T00:14:25.251536422Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer"}
{"Time":"2026-10-18T00:14:25.251544736Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Output":"=== RUN TestAccessEngineActualKeyCapeIssuer\n"}
{"Time":"2026-10-18T00:14:25.25223051Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/allow"}
{"Time":"2026-10-18T00:14:25.252290827Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/allow","Output":"=== RUN TestAccessEngineActualKeyCapeIssuer/allow\n"}
{"Time":"2026-10-18T00:14:25.269582031Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/allow","Output":"--- PASS: TestAccessEngineActualKeyCapeIssuer/allow (0.02s)\n"}
{"Time":"2026-10-18T00:14:25.269661283Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/allow","Elapsed":0.02}
{"Time":"2026-10-18T00:14:25.269672672Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/deny"}
{"Time":"2026-10-18T00:14:25.269684872Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/deny","Output":"=== RUN TestAccessEngineActualKeyCapeIssuer/deny\n"}
{"Time":"2026-10-18T00:14:25.280351239Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/deny","Output":"--- PASS: TestAccessEngineActualKeyCapeIssuer/deny (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.280431258Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/deny","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.280449482Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Output":"--- PASS: TestAccessEngineActualKeyCapeIssuer (0.03s)\n"}
{"Time":"2026-10-18T00:14:25.280458355Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Elapsed":0.03}
{"Time":"2026-10-18T00:14:25.280692825Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation"}
{"Time":"2026-10-18T00:14:25.280741563Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Output":"=== RUN TestRequiredClaimExactAnyOfAndNoMutation\n"}
{"Time":"2026-10-18T00:14:25.281438902Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Output":"--- PASS: TestRequiredClaimExactAnyOfAndNoMutation (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.281501914Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Elapsed":0}
{"Time":"2026-10-18T00:14:25.28159628Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation"}
{"Time":"2026-10-18T00:14:25.28163426Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Output":"=== RUN TestRequiredClaimConfigurationRefusalsAndLegacyIsolation\n"}
{"Time":"2026-10-18T00:14:25.282223103Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Output":"--- PASS: TestRequiredClaimConfigurationRefusalsAndLegacyIsolation (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.282279478Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Elapsed":0}
{"Time":"2026-10-18T00:14:25.28230772Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable"}
{"Time":"2026-10-18T00:14:25.282316512Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Output":"=== RUN TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable\n"}
{"Time":"2026-10-18T00:14:25.29206661Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Output":"--- PASS: TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable (0.01s)\n"}
{"Time":"2026-10-18T00:14:25.292834141Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Elapsed":0.01}
{"Time":"2026-10-18T00:14:25.292966226Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval"}
{"Time":"2026-10-18T00:14:25.292981023Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Output":"=== RUN TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval\n"}
{"Time":"2026-10-18T00:14:25.294295993Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Output":"--- PASS: TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.294383199Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Elapsed":0}
{"Time":"2026-10-18T00:14:25.29473842Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse"}
{"Time":"2026-10-18T00:14:25.294791035Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Output":"=== RUN TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse\n"}
{"Time":"2026-10-18T00:14:25.295614484Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Output":"--- PASS: TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse (0.00s)\n"}
{"Time":"2026-10-18T00:14:25.296007419Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Elapsed":0}
{"Time":"2026-10-18T00:14:25.296061866Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"PASS\n"}
{"Time":"2026-10-18T00:14:25.307733872Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"ok \tforgejo.org/services/auth/source/oauth2\t0.306s\n"}
{"Time":"2026-10-18T00:14:25.307834567Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Elapsed":0.306}

View file

@ -0,0 +1,149 @@
{
"returncode": 0,
"seconds": 31.56,
"workspace": "/tmp/custodian-forgejo-wire-338cr8ht",
"argv": [
"bwrap",
"--unshare-pid",
"--die-with-parent",
"--new-session",
"--unshare-net",
"--ro-bind",
"/usr",
"/usr",
"--ro-bind",
"/lib",
"/lib",
"--ro-bind",
"/lib64",
"/lib64",
"--symlink",
"usr/bin",
"/bin",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--bind",
"/tmp/custodian-forgejo-successor-attempt2",
"/work",
"--ro-bind",
"/home/worsch/go/pkg/mod/cache/download",
"/cached",
"--ro-bind",
"/etc/ssl/certs",
"/etc/ssl/certs",
"--ro-bind",
"/etc/resolv.conf",
"/etc/resolv.conf",
"--chdir",
"/work/source",
"--clearenv",
"--dir",
"/run",
"--ro-bind",
"/tmp/custodian-forgejo-successor-attempt2/descriptor-fixtures",
"/run/forgejo-oidc",
"--bind",
"/tmp/custodian-forgejo-successor-attempt2/descriptor-fixtures",
"/run/writable-input",
"--setenv",
"PATH",
"/work/go/bin:/usr/bin:/bin",
"--setenv",
"HOME",
"/work/home",
"--setenv",
"GOPATH",
"/work/gopath",
"--setenv",
"GOTOOLCHAIN",
"local",
"--setenv",
"GOPROXY",
"off",
"--setenv",
"GOSUMDB",
"off",
"--setenv",
"GOVCS",
"*:off",
"--setenv",
"GOMODCACHE",
"/work/modules",
"--setenv",
"GOCACHE",
"/work/gocache",
"--setenv",
"GOMAXPROCS",
"4",
"--setenv",
"CGO_ENABLED",
"1",
"--setenv",
"GIT_CONFIG_NOSYSTEM",
"1",
"--setenv",
"GIT_CONFIG_GLOBAL",
"/work/home/test.gitconfig",
"--setenv",
"GIT_TERMINAL_PROMPT",
"0",
"--ro-bind",
"/tmp/custodian-forgejo-wire-338cr8ht/oauth2",
"/work/source/services/auth/source/oauth2",
"--ro-bind",
"/tmp/custodian-keycape-wire-gvebji6u/identity.json",
"/work/keycape-wire-fixture.json",
"--setenv",
"CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE",
"/work/keycape-wire-fixture.json",
"--",
"go",
"test",
"-p",
"1",
"-json",
"-tags",
"sqlite sqlite_unlock_notify",
"./services/auth/source/oauth2",
"-run",
"TestAccessEngine|TestVerifiedApplicationIdentity|TestRequired|TestCurrent",
"-count=1"
],
"actual_issuer_source": "d803e9282a47b49daf930fb905312fa5104c0ace",
"fixture_sha256": "de14985f3087c72695ff013c7a6f2fd3f73e0709eff5939388d9bd0c21303b9b",
"consumer_source_pins": {
"access_engine.go": "sha256:d5f07f9491ac2212410e1fa8c0248d68ba3a723e7ca99e363627c5292d187aa8",
"access_engine_assurance.go": "sha256:42de751b1e9a243301d566260954813b770558ecb449639acaeab307fe788642",
"access_engine_assurance_test.go": "sha256:44e7459f6c1106a264093c19d61d01a8365f6ad22682906552d832ba39d61dd3",
"access_engine_azp_test.go": "sha256:5f94f43ade9a79b6b7ef529c80115a8c32acfece425dc8ed3f24e6ad839fc0ce",
"access_engine_callback_test.go": "sha256:5cea36b630c895a9473dc876b7128526ddef65d9395b2fddc56343e162452472",
"access_engine_test.go": "sha256:99edd6cfe3e834d73e0447a7915f52cc4ab7b82644669c5ae61963f850b447e8",
"assert_interface_test.go": "sha256:a0db85e38b7ea61e21b0291e55c8b451c89a877bd3db229e35dbb4418458f54f",
"init.go": "sha256:98a8030ed005be67b237d54c3b197a629f8c289e3d74c8edfcf4d740831f87d1",
"jwtsigningkey.go": "sha256:0c6e8ac131fd41ad299073ca748dd95e5fd9c044219c4d7f36d50c4ffcd5b266",
"jwtsigningkey_test.go": "sha256:3e414a541479741773e48de84be7d5a3b794bcc7289627fbd2e8996832628321",
"keycape_wire_test.go": "sha256:ca411819ebbe9f4576fa2dd8722ddcaf09d868dbafb3e9a2c6f114c865903a9a",
"providers.go": "sha256:7df0051f19932a68d16a33a5d41898e06e9612f839195e27c86802eeebb2e3e9",
"providers_base.go": "sha256:643dbc0561ec7aa7a975978ff2c21d256a5ab619b125e8077d2395281f628542",
"providers_custom.go": "sha256:265a526d209d86c24cbcfdde4c2d73957aaeaccfd329438c11ce99c5951ebb39",
"providers_openid.go": "sha256:5dd9b906cce434c774968d57fcc790cb678147345fea4d2e58477ec6eed70bcf",
"providers_simple.go": "sha256:53927b6bfc621dd1b68a074b6763abe5b27795d5a50ca6f0555f3e7a04fa1613",
"required_claim_values.go": "sha256:29f16d07464bbe12e3f65616b6c1eb60561d04cd8ff89ecbfb56f93dbeaf1cda",
"required_claim_values_test.go": "sha256:54a8bd97dc51c524a9adf0c6aefb9a19fa152d234b3bb929bf1a90932662d3d0",
"source.go": "sha256:44e99883c2ec479427b3f72c73353fe33936eed2e5c962b2fa40803576aa5642",
"source_authenticate.go": "sha256:c6551f00ef4349ccd6afdbb2cba847067528485ff621c3e507b9aab588bb96b5",
"source_callout.go": "sha256:6abba69df97afc62467f0328eaa5a6383cfb4900202a081dec4b84a21b37349c",
"source_name.go": "sha256:712943826e01f718ab4ca717df6c5f2171535cb2229dbf8460f542d757ef8d7f",
"source_register.go": "sha256:5ad9ccf213881734dc7fe7619cbe6c47cb6a4afdbbfc3e674ab4493857ebbf91",
"store.go": "sha256:35b244081569215384de07f8cdc1e83b5545a2e673ca1ac5a2a6ee686cb917a3",
"token.go": "sha256:c0a8868f904bb31842202b4e635a76403902adff9e638d5cb581e7e2d4954933",
"urlmapping.go": "sha256:f2132408d4a447e766e67495b1ca7b8cc2b47d4eb56b0c44b50ba01fe41ca83e"
},
"fixture_values_published": false,
"synthetic_authentication": true,
"real_credentials": false
}

View file

@ -0,0 +1,312 @@
{"Time":"2026-10-18T00:24:16.960143605Z","Action":"start","Package":"forgejo.org/services/auth/source/oauth2"}
{"Time":"2026-10-18T00:24:17.190347083Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals"}
{"Time":"2026-10-18T00:24:17.190462314Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals\n"}
{"Time":"2026-10-18T00:24:17.190522225Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at"}
{"Time":"2026-10-18T00:24:17.190531233Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/string-at\n"}
{"Time":"2026-10-18T00:24:17.197465801Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/string-at (0.01s)\n"}
{"Time":"2026-10-18T00:24:17.197552223Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Elapsed":0.01}
{"Time":"2026-10-18T00:24:17.197574829Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at"}
{"Time":"2026-10-18T00:24:17.197583702Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/fractional-at\n"}
{"Time":"2026-10-18T00:24:17.198942781Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/fractional-at (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.199015045Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Elapsed":0}
{"Time":"2026-10-18T00:24:17.199038075Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa"}
{"Time":"2026-10-18T00:24:17.199050808Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa\n"}
{"Time":"2026-10-18T00:24:17.200027646Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.200098368Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Elapsed":0}
{"Time":"2026-10-18T00:24:17.200123788Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa"}
{"Time":"2026-10-18T00:24:17.200141886Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa\n"}
{"Time":"2026-10-18T00:24:17.200872725Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.200932275Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Elapsed":0}
{"Time":"2026-10-18T00:24:17.200965611Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level"}
{"Time":"2026-10-18T00:24:17.201012276Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/wrong-level\n"}
{"Time":"2026-10-18T00:24:17.201973397Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/wrong-level (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.202024831Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Elapsed":0}
{"Time":"2026-10-18T00:24:17.202035923Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods"}
{"Time":"2026-10-18T00:24:17.202044137Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/object-methods\n"}
{"Time":"2026-10-18T00:24:17.203113626Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/object-methods (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.203380834Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Elapsed":0}
{"Time":"2026-10-18T00:24:17.203872076Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods"}
{"Time":"2026-10-18T00:24:17.203997932Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods\n"}
{"Time":"2026-10-18T00:24:17.205564559Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.206027959Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Elapsed":0}
{"Time":"2026-10-18T00:24:17.206493384Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication"}
{"Time":"2026-10-18T00:24:17.206533258Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/future-authentication\n"}
{"Time":"2026-10-18T00:24:17.208041005Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/future-authentication (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.208356492Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Elapsed":0}
{"Time":"2026-10-18T00:24:17.208570363Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at"}
{"Time":"2026-10-18T00:24:17.208594295Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/missing-at\n"}
{"Time":"2026-10-18T00:24:17.211646967Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/missing-at (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.211736698Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Elapsed":0}
{"Time":"2026-10-18T00:24:17.211752Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source"}
{"Time":"2026-10-18T00:24:17.211761062Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/wrong-source\n"}
{"Time":"2026-10-18T00:24:17.211772983Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/wrong-source (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.211783524Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Elapsed":0}
{"Time":"2026-10-18T00:24:17.211792794Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods"}
{"Time":"2026-10-18T00:24:17.211800549Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/empty-methods\n"}
{"Time":"2026-10-18T00:24:17.211810774Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/empty-methods (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.21182008Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Elapsed":0}
{"Time":"2026-10-18T00:24:17.211828971Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods"}
{"Time":"2026-10-18T00:24:17.211843462Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods\n"}
{"Time":"2026-10-18T00:24:17.212564986Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.212837875Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Elapsed":0}
{"Time":"2026-10-18T00:24:17.213075462Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field"}
{"Time":"2026-10-18T00:24:17.213106995Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field\n"}
{"Time":"2026-10-18T00:24:17.214229823Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.214435452Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Elapsed":0}
{"Time":"2026-10-18T00:24:17.214638935Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication"}
{"Time":"2026-10-18T00:24:17.214664364Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication\n"}
{"Time":"2026-10-18T00:24:17.215677957Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.215916121Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Elapsed":0}
{"Time":"2026-10-18T00:24:17.217396879Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals (0.03s)\n"}
{"Time":"2026-10-18T00:24:17.217713799Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Elapsed":0.03}
{"Time":"2026-10-18T00:24:17.217852683Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds"}
{"Time":"2026-10-18T00:24:17.217874802Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Output":"=== RUN TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds\n"}
{"Time":"2026-10-18T00:24:17.219232845Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Output":"--- PASS: TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.219544707Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Elapsed":0}
{"Time":"2026-10-18T00:24:17.219982819Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact"}
{"Time":"2026-10-18T00:24:17.220053667Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Output":"=== RUN TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact\n"}
{"Time":"2026-10-18T00:24:17.221091607Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Output":"--- PASS: TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.221335767Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Elapsed":0}
{"Time":"2026-10-18T00:24:17.223629132Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient"}
{"Time":"2026-10-18T00:24:17.223685779Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient\n"}
{"Time":"2026-10-18T00:24:17.223696275Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client"}
{"Time":"2026-10-18T00:24:17.223703002Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client\n"}
{"Time":"2026-10-18T00:24:17.223747312Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.223764761Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Elapsed":0}
{"Time":"2026-10-18T00:24:17.223774256Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number"}
{"Time":"2026-10-18T00:24:17.223798918Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/number\n"}
{"Time":"2026-10-18T00:24:17.2238078Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/number (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.223815077Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Elapsed":0}
{"Time":"2026-10-18T00:24:17.223828792Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array"}
{"Time":"2026-10-18T00:24:17.223834942Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/array\n"}
{"Time":"2026-10-18T00:24:17.223927215Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/array (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.224058759Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Elapsed":0}
{"Time":"2026-10-18T00:24:17.224153079Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty"}
{"Time":"2026-10-18T00:24:17.224165821Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty\n"}
{"Time":"2026-10-18T00:24:17.225138611Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.225386413Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Elapsed":0}
{"Time":"2026-10-18T00:24:17.225490409Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.225724777Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Elapsed":0}
{"Time":"2026-10-18T00:24:17.225875888Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient"}
{"Time":"2026-10-18T00:24:17.225894671Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Output":"=== RUN TestAccessEngineAuthorizedPartyAcceptsAdmittedClient\n"}
{"Time":"2026-10-18T00:24:17.227711655Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Output":"--- PASS: TestAccessEngineAuthorizedPartyAcceptsAdmittedClient (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.227978972Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Elapsed":0}
{"Time":"2026-10-18T00:24:17.228098369Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision"}
{"Time":"2026-10-18T00:24:17.22813313Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision\n"}
{"Time":"2026-10-18T00:24:17.228520106Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins"}
{"Time":"2026-10-18T00:24:17.228550773Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins\n"}
{"Time":"2026-10-18T00:24:17.281311607Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins (0.05s)\n"}
{"Time":"2026-10-18T00:24:17.281528859Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Elapsed":0.05}
{"Time":"2026-10-18T00:24:17.281666544Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners"}
{"Time":"2026-10-18T00:24:17.281686219Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners\n"}
{"Time":"2026-10-18T00:24:17.301492156Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.303700381Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.303789823Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers"}
{"Time":"2026-10-18T00:24:17.303815765Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers\n"}
{"Time":"2026-10-18T00:24:17.323628247Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.323712973Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.323734714Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision (0.09s)\n"}
{"Time":"2026-10-18T00:24:17.323748239Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Elapsed":0.09}
{"Time":"2026-10-18T00:24:17.323761513Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP"}
{"Time":"2026-10-18T00:24:17.323772063Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP\n"}
{"Time":"2026-10-18T00:24:17.323812045Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny"}
{"Time":"2026-10-18T00:24:17.323822433Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny\n"}
{"Time":"2026-10-18T00:24:17.336793262Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.336862298Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.336889494Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned"}
{"Time":"2026-10-18T00:24:17.336901586Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned\n"}
{"Time":"2026-10-18T00:24:17.352265272Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.352335787Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.352352315Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key"}
{"Time":"2026-10-18T00:24:17.352362631Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key\n"}
{"Time":"2026-10-18T00:24:17.370624001Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.370810676Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.370841028Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin"}
{"Time":"2026-10-18T00:24:17.370915754Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin\n"}
{"Time":"2026-10-18T00:24:17.387584798Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.387657865Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.387677315Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding"}
{"Time":"2026-10-18T00:24:17.387688974Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding\n"}
{"Time":"2026-10-18T00:24:17.402415306Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.402483666Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.402500122Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired"}
{"Time":"2026-10-18T00:24:17.402510799Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired\n"}
{"Time":"2026-10-18T00:24:17.417792972Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.417868068Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.417891657Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP (0.10s)\n"}
{"Time":"2026-10-18T00:24:17.417905436Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Elapsed":0.1}
{"Time":"2026-10-18T00:24:17.417916869Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP"}
{"Time":"2026-10-18T00:24:17.417927771Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP\n"}
{"Time":"2026-10-18T00:24:17.417945535Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission"}
{"Time":"2026-10-18T00:24:17.418001875Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission\n"}
{"Time":"2026-10-18T00:24:17.420364277Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.420431104Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Elapsed":0}
{"Time":"2026-10-18T00:24:17.420446577Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token"}
{"Time":"2026-10-18T00:24:17.420456938Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token\n"}
{"Time":"2026-10-18T00:24:17.422812687Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.42287698Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Elapsed":0}
{"Time":"2026-10-18T00:24:17.422938171Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user"}
{"Time":"2026-10-18T00:24:17.422947324Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user\n"}
{"Time":"2026-10-18T00:24:17.426344201Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.426415681Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Elapsed":0}
{"Time":"2026-10-18T00:24:17.426429125Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups"}
{"Time":"2026-10-18T00:24:17.426438206Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups\n"}
{"Time":"2026-10-18T00:24:17.42917688Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.429322301Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Elapsed":0}
{"Time":"2026-10-18T00:24:17.429347261Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token"}
{"Time":"2026-10-18T00:24:17.429357612Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token\n"}
{"Time":"2026-10-18T00:24:17.432561513Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.432646879Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Elapsed":0}
{"Time":"2026-10-18T00:24:17.432672209Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity"}
{"Time":"2026-10-18T00:24:17.432682119Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity\n"}
{"Time":"2026-10-18T00:24:17.435052031Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.435134818Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Elapsed":0}
{"Time":"2026-10-18T00:24:17.435158939Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject"}
{"Time":"2026-10-18T00:24:17.435191609Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject\n"}
{"Time":"2026-10-18T00:24:17.439070957Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.439163771Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Elapsed":0}
{"Time":"2026-10-18T00:24:17.439267226Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source"}
{"Time":"2026-10-18T00:24:17.439294377Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source\n"}
{"Time":"2026-10-18T00:24:17.443065425Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.443162956Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Elapsed":0}
{"Time":"2026-10-18T00:24:17.443192677Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider"}
{"Time":"2026-10-18T00:24:17.443233895Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider\n"}
{"Time":"2026-10-18T00:24:17.446044019Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.446129286Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Elapsed":0}
{"Time":"2026-10-18T00:24:17.446185896Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience"}
{"Time":"2026-10-18T00:24:17.44621183Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience\n"}
{"Time":"2026-10-18T00:24:17.449608865Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.449680263Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Elapsed":0}
{"Time":"2026-10-18T00:24:17.449698217Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP (0.03s)\n"}
{"Time":"2026-10-18T00:24:17.449717225Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Elapsed":0.03}
{"Time":"2026-10-18T00:24:17.449760859Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE"}
{"Time":"2026-10-18T00:24:17.449773475Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE\n"}
{"Time":"2026-10-18T00:24:17.451095376Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer"}
{"Time":"2026-10-18T00:24:17.451157405Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/issuer\n"}
{"Time":"2026-10-18T00:24:17.45210629Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/issuer (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.452195823Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Elapsed":0}
{"Time":"2026-10-18T00:24:17.452234083Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience"}
{"Time":"2026-10-18T00:24:17.452256328Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/audience\n"}
{"Time":"2026-10-18T00:24:17.452972749Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/audience (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.453016807Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Elapsed":0}
{"Time":"2026-10-18T00:24:17.453053994Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued"}
{"Time":"2026-10-18T00:24:17.453069459Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/old-issued\n"}
{"Time":"2026-10-18T00:24:17.453793003Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/old-issued (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.453857512Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Elapsed":0}
{"Time":"2026-10-18T00:24:17.45388928Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant"}
{"Time":"2026-10-18T00:24:17.453902806Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-tenant\n"}
{"Time":"2026-10-18T00:24:17.45468434Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-tenant (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.454759661Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Elapsed":0}
{"Time":"2026-10-18T00:24:17.454790491Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal"}
{"Time":"2026-10-18T00:24:17.454802989Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-principal\n"}
{"Time":"2026-10-18T00:24:17.455662585Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-principal (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.455746499Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Elapsed":0}
{"Time":"2026-10-18T00:24:17.455770684Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance"}
{"Time":"2026-10-18T00:24:17.455781856Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-assurance\n"}
{"Time":"2026-10-18T00:24:17.456508628Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-assurance (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.45657257Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Elapsed":0}
{"Time":"2026-10-18T00:24:17.456597223Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp"}
{"Time":"2026-10-18T00:24:17.456615636Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp\n"}
{"Time":"2026-10-18T00:24:17.457276826Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.457328855Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Elapsed":0}
{"Time":"2026-10-18T00:24:17.457356782Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired"}
{"Time":"2026-10-18T00:24:17.457369225Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/expired\n"}
{"Time":"2026-10-18T00:24:17.458155331Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/expired (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.458195341Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Elapsed":0}
{"Time":"2026-10-18T00:24:17.45823159Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued"}
{"Time":"2026-10-18T00:24:17.458245594Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/future-issued\n"}
{"Time":"2026-10-18T00:24:17.458904361Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/future-issued (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.458957238Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Elapsed":0}
{"Time":"2026-10-18T00:24:17.459040828Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp"}
{"Time":"2026-10-18T00:24:17.459058971Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-exp\n"}
{"Time":"2026-10-18T00:24:17.459885002Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-exp (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.459973903Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Elapsed":0}
{"Time":"2026-10-18T00:24:17.460006744Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat"}
{"Time":"2026-10-18T00:24:17.460035013Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-iat\n"}
{"Time":"2026-10-18T00:24:17.460672244Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-iat (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.460715941Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Elapsed":0}
{"Time":"2026-10-18T00:24:17.46099698Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject"}
{"Time":"2026-10-18T00:24:17.461045168Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/empty-subject\n"}
{"Time":"2026-10-18T00:24:17.463612573Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/empty-subject (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.463702854Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Elapsed":0}
{"Time":"2026-10-18T00:24:17.463725379Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key"}
{"Time":"2026-10-18T00:24:17.463734576Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/wrong-key\n"}
{"Time":"2026-10-18T00:24:17.463747832Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/wrong-key (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.463757661Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Elapsed":0}
{"Time":"2026-10-18T00:24:17.463779942Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key"}
{"Time":"2026-10-18T00:24:17.463788887Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/unknown-key\n"}
{"Time":"2026-10-18T00:24:17.463800583Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/unknown-key (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.463850619Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Elapsed":0}
{"Time":"2026-10-18T00:24:17.463864749Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type"}
{"Time":"2026-10-18T00:24:17.463873397Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/wrong-type\n"}
{"Time":"2026-10-18T00:24:17.463886219Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/wrong-type (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.463896256Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Elapsed":0}
{"Time":"2026-10-18T00:24:17.463904885Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion"}
{"Time":"2026-10-18T00:24:17.463911783Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion\n"}
{"Time":"2026-10-18T00:24:17.464386161Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.464439317Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Elapsed":0}
{"Time":"2026-10-18T00:24:17.464460093Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none"}
{"Time":"2026-10-18T00:24:17.464471265Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/none\n"}
{"Time":"2026-10-18T00:24:17.464961164Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/none (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.465010317Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Elapsed":0}
{"Time":"2026-10-18T00:24:17.465035231Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.465052616Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.465372945Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer"}
{"Time":"2026-10-18T00:24:17.465415362Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Output":"=== RUN TestAccessEngineActualKeyCapeIssuer\n"}
{"Time":"2026-10-18T00:24:17.466437738Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/allow"}
{"Time":"2026-10-18T00:24:17.466492797Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/allow","Output":"=== RUN TestAccessEngineActualKeyCapeIssuer/allow\n"}
{"Time":"2026-10-18T00:24:17.481732933Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/allow","Output":"--- PASS: TestAccessEngineActualKeyCapeIssuer/allow (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.481832546Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/allow","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.481852267Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/deny"}
{"Time":"2026-10-18T00:24:17.481862538Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/deny","Output":"=== RUN TestAccessEngineActualKeyCapeIssuer/deny\n"}
{"Time":"2026-10-18T00:24:17.497929732Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/deny","Output":"--- PASS: TestAccessEngineActualKeyCapeIssuer/deny (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.498011906Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer/deny","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.498034341Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Output":"--- PASS: TestAccessEngineActualKeyCapeIssuer (0.03s)\n"}
{"Time":"2026-10-18T00:24:17.498047353Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Elapsed":0.03}
{"Time":"2026-10-18T00:24:17.498068787Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo"}
{"Time":"2026-10-18T00:24:17.498079445Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo","Output":"=== RUN TestAccessEngineActualKeyCapeProviderUserInfo\n"}
{"Time":"2026-10-18T00:24:17.499710854Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/allow"}
{"Time":"2026-10-18T00:24:17.499786671Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/allow","Output":"=== RUN TestAccessEngineActualKeyCapeProviderUserInfo/allow\n"}
{"Time":"2026-10-18T00:24:17.527254482Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/allow","Output":"--- PASS: TestAccessEngineActualKeyCapeProviderUserInfo/allow (0.03s)\n"}
{"Time":"2026-10-18T00:24:17.527320011Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/allow","Elapsed":0.03}
{"Time":"2026-10-18T00:24:17.527334186Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/missing-groups"}
{"Time":"2026-10-18T00:24:17.527342319Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/missing-groups","Output":"=== RUN TestAccessEngineActualKeyCapeProviderUserInfo/missing-groups\n"}
{"Time":"2026-10-18T00:24:17.542686711Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/missing-groups","Output":"--- PASS: TestAccessEngineActualKeyCapeProviderUserInfo/missing-groups (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.542770571Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/missing-groups","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.542793845Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/missing-subject"}
{"Time":"2026-10-18T00:24:17.542803872Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/missing-subject","Output":"=== RUN TestAccessEngineActualKeyCapeProviderUserInfo/missing-subject\n"}
{"Time":"2026-10-18T00:24:17.561867325Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/missing-subject","Output":"--- PASS: TestAccessEngineActualKeyCapeProviderUserInfo/missing-subject (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.561941672Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/missing-subject","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.561960609Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/wrong-subject"}
{"Time":"2026-10-18T00:24:17.561971285Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/wrong-subject","Output":"=== RUN TestAccessEngineActualKeyCapeProviderUserInfo/wrong-subject\n"}
{"Time":"2026-10-18T00:24:17.583591831Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/wrong-subject","Output":"--- PASS: TestAccessEngineActualKeyCapeProviderUserInfo/wrong-subject (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.58370112Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/wrong-subject","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.583726648Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/malformed-groups"}
{"Time":"2026-10-18T00:24:17.58373544Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/malformed-groups","Output":"=== RUN TestAccessEngineActualKeyCapeProviderUserInfo/malformed-groups\n"}
{"Time":"2026-10-18T00:24:17.598088131Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/malformed-groups","Output":"--- PASS: TestAccessEngineActualKeyCapeProviderUserInfo/malformed-groups (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.598380606Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo/malformed-groups","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.598539967Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo","Output":"--- PASS: TestAccessEngineActualKeyCapeProviderUserInfo (0.10s)\n"}
{"Time":"2026-10-18T00:24:17.599647599Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeProviderUserInfo","Elapsed":0.1}
{"Time":"2026-10-18T00:24:17.599717375Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation"}
{"Time":"2026-10-18T00:24:17.599728186Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Output":"=== RUN TestRequiredClaimExactAnyOfAndNoMutation\n"}
{"Time":"2026-10-18T00:24:17.599743921Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Output":"--- PASS: TestRequiredClaimExactAnyOfAndNoMutation (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.599752884Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Elapsed":0}
{"Time":"2026-10-18T00:24:17.599762253Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation"}
{"Time":"2026-10-18T00:24:17.59976935Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Output":"=== RUN TestRequiredClaimConfigurationRefusalsAndLegacyIsolation\n"}
{"Time":"2026-10-18T00:24:17.599781244Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Output":"--- PASS: TestRequiredClaimConfigurationRefusalsAndLegacyIsolation (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.599809846Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Elapsed":0}
{"Time":"2026-10-18T00:24:17.599819423Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable"}
{"Time":"2026-10-18T00:24:17.59982688Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Output":"=== RUN TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable\n"}
{"Time":"2026-10-18T00:24:17.624318235Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Output":"--- PASS: TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable (0.02s)\n"}
{"Time":"2026-10-18T00:24:17.624416938Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Elapsed":0.02}
{"Time":"2026-10-18T00:24:17.624473575Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval"}
{"Time":"2026-10-18T00:24:17.624487462Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Output":"=== RUN TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval\n"}
{"Time":"2026-10-18T00:24:17.625608648Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Output":"--- PASS: TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.625668189Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Elapsed":0}
{"Time":"2026-10-18T00:24:17.625679136Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse"}
{"Time":"2026-10-18T00:24:17.625686756Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Output":"=== RUN TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse\n"}
{"Time":"2026-10-18T00:24:17.625700561Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Output":"--- PASS: TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse (0.00s)\n"}
{"Time":"2026-10-18T00:24:17.625709687Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Elapsed":0}
{"Time":"2026-10-18T00:24:17.625719416Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"PASS\n"}
{"Time":"2026-10-18T00:24:17.643344955Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"ok \tforgejo.org/services/auth/source/oauth2\t0.682s\n"}
{"Time":"2026-10-18T00:24:17.643422025Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Elapsed":0.683}

View file

@ -0,0 +1,149 @@
{
"returncode": 0,
"seconds": 12.2,
"workspace": "/tmp/custodian-forgejo-wire-mrr1scz2",
"argv": [
"bwrap",
"--unshare-pid",
"--die-with-parent",
"--new-session",
"--unshare-net",
"--ro-bind",
"/usr",
"/usr",
"--ro-bind",
"/lib",
"/lib",
"--ro-bind",
"/lib64",
"/lib64",
"--symlink",
"usr/bin",
"/bin",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--bind",
"/tmp/custodian-forgejo-successor-attempt2",
"/work",
"--ro-bind",
"/home/worsch/go/pkg/mod/cache/download",
"/cached",
"--ro-bind",
"/etc/ssl/certs",
"/etc/ssl/certs",
"--ro-bind",
"/etc/resolv.conf",
"/etc/resolv.conf",
"--chdir",
"/work/source",
"--clearenv",
"--dir",
"/run",
"--ro-bind",
"/tmp/custodian-forgejo-successor-attempt2/descriptor-fixtures",
"/run/forgejo-oidc",
"--bind",
"/tmp/custodian-forgejo-successor-attempt2/descriptor-fixtures",
"/run/writable-input",
"--setenv",
"PATH",
"/work/go/bin:/usr/bin:/bin",
"--setenv",
"HOME",
"/work/home",
"--setenv",
"GOPATH",
"/work/gopath",
"--setenv",
"GOTOOLCHAIN",
"local",
"--setenv",
"GOPROXY",
"off",
"--setenv",
"GOSUMDB",
"off",
"--setenv",
"GOVCS",
"*:off",
"--setenv",
"GOMODCACHE",
"/work/modules",
"--setenv",
"GOCACHE",
"/work/gocache",
"--setenv",
"GOMAXPROCS",
"4",
"--setenv",
"CGO_ENABLED",
"1",
"--setenv",
"GIT_CONFIG_NOSYSTEM",
"1",
"--setenv",
"GIT_CONFIG_GLOBAL",
"/work/home/test.gitconfig",
"--setenv",
"GIT_TERMINAL_PROMPT",
"0",
"--ro-bind",
"/tmp/custodian-forgejo-wire-mrr1scz2/oauth2",
"/work/source/services/auth/source/oauth2",
"--ro-bind",
"/tmp/custodian-keycape-wire-6z6gfafi/identity.json",
"/work/keycape-wire-fixture.json",
"--setenv",
"CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE",
"/work/keycape-wire-fixture.json",
"--",
"go",
"test",
"-p",
"1",
"-json",
"-tags",
"sqlite sqlite_unlock_notify",
"./services/auth/source/oauth2",
"-run",
"TestAccessEngine|TestVerifiedApplicationIdentity|TestRequired|TestCurrent",
"-count=1"
],
"actual_issuer_source": "d803e9282a47b49daf930fb905312fa5104c0ace",
"fixture_sha256": "771d365c7c80d731fd2f5cc8999ca7aa5bb6fa0f93269463b84e0f70b3bbd4e2",
"consumer_source_pins": {
"access_engine.go": "sha256:d5f07f9491ac2212410e1fa8c0248d68ba3a723e7ca99e363627c5292d187aa8",
"access_engine_assurance.go": "sha256:42de751b1e9a243301d566260954813b770558ecb449639acaeab307fe788642",
"access_engine_assurance_test.go": "sha256:44e7459f6c1106a264093c19d61d01a8365f6ad22682906552d832ba39d61dd3",
"access_engine_azp_test.go": "sha256:5f94f43ade9a79b6b7ef529c80115a8c32acfece425dc8ed3f24e6ad839fc0ce",
"access_engine_callback_test.go": "sha256:e2fcbfcc2f1077996c947c5c6fd5150aaaa11ba0e77e05f07055a355978398be",
"access_engine_test.go": "sha256:99edd6cfe3e834d73e0447a7915f52cc4ab7b82644669c5ae61963f850b447e8",
"assert_interface_test.go": "sha256:a0db85e38b7ea61e21b0291e55c8b451c89a877bd3db229e35dbb4418458f54f",
"init.go": "sha256:98a8030ed005be67b237d54c3b197a629f8c289e3d74c8edfcf4d740831f87d1",
"jwtsigningkey.go": "sha256:0c6e8ac131fd41ad299073ca748dd95e5fd9c044219c4d7f36d50c4ffcd5b266",
"jwtsigningkey_test.go": "sha256:3e414a541479741773e48de84be7d5a3b794bcc7289627fbd2e8996832628321",
"keycape_wire_test.go": "sha256:d81f6492365e30ea6e3469e14e7e3bfd7d7a8a014e6d898b8d91e1f4a695fd43",
"providers.go": "sha256:7df0051f19932a68d16a33a5d41898e06e9612f839195e27c86802eeebb2e3e9",
"providers_base.go": "sha256:643dbc0561ec7aa7a975978ff2c21d256a5ab619b125e8077d2395281f628542",
"providers_custom.go": "sha256:265a526d209d86c24cbcfdde4c2d73957aaeaccfd329438c11ce99c5951ebb39",
"providers_openid.go": "sha256:5dd9b906cce434c774968d57fcc790cb678147345fea4d2e58477ec6eed70bcf",
"providers_simple.go": "sha256:53927b6bfc621dd1b68a074b6763abe5b27795d5a50ca6f0555f3e7a04fa1613",
"required_claim_values.go": "sha256:29f16d07464bbe12e3f65616b6c1eb60561d04cd8ff89ecbfb56f93dbeaf1cda",
"required_claim_values_test.go": "sha256:54a8bd97dc51c524a9adf0c6aefb9a19fa152d234b3bb929bf1a90932662d3d0",
"source.go": "sha256:44e99883c2ec479427b3f72c73353fe33936eed2e5c962b2fa40803576aa5642",
"source_authenticate.go": "sha256:c6551f00ef4349ccd6afdbb2cba847067528485ff621c3e507b9aab588bb96b5",
"source_callout.go": "sha256:6abba69df97afc62467f0328eaa5a6383cfb4900202a081dec4b84a21b37349c",
"source_name.go": "sha256:712943826e01f718ab4ca717df6c5f2171535cb2229dbf8460f542d757ef8d7f",
"source_register.go": "sha256:5ad9ccf213881734dc7fe7619cbe6c47cb6a4afdbbfc3e674ab4493857ebbf91",
"store.go": "sha256:35b244081569215384de07f8cdc1e83b5545a2e673ca1ac5a2a6ee686cb917a3",
"token.go": "sha256:c0a8868f904bb31842202b4e635a76403902adff9e638d5cb581e7e2d4954933",
"urlmapping.go": "sha256:f2132408d4a447e766e67495b1ca7b8cc2b47d4eb56b0c44b50ba01fe41ca83e"
},
"fixture_values_published": false,
"synthetic_authentication": true,
"real_credentials": false
}

View file

@ -0,0 +1,280 @@
{"Time":"2026-10-18T00:13:47.047791726Z","Action":"start","Package":"forgejo.org/services/auth/source/oauth2"}
{"Time":"2026-10-18T00:13:47.129556173Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals"}
{"Time":"2026-10-18T00:13:47.12961437Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals\n"}
{"Time":"2026-10-18T00:13:47.129684407Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at"}
{"Time":"2026-10-18T00:13:47.129692099Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/missing-at\n"}
{"Time":"2026-10-18T00:13:47.131694794Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/missing-at (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.131742693Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Elapsed":0}
{"Time":"2026-10-18T00:13:47.131754028Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at"}
{"Time":"2026-10-18T00:13:47.131759844Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/fractional-at\n"}
{"Time":"2026-10-18T00:13:47.13199542Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/fractional-at (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.132014563Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Elapsed":0}
{"Time":"2026-10-18T00:13:47.132021561Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa"}
{"Time":"2026-10-18T00:13:47.132026809Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa\n"}
{"Time":"2026-10-18T00:13:47.132293377Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.13230821Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Elapsed":0}
{"Time":"2026-10-18T00:13:47.132315036Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source"}
{"Time":"2026-10-18T00:13:47.132320717Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/wrong-source\n"}
{"Time":"2026-10-18T00:13:47.13262247Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/wrong-source (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.132637475Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Elapsed":0}
{"Time":"2026-10-18T00:13:47.132643985Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level"}
{"Time":"2026-10-18T00:13:47.132667295Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/wrong-level\n"}
{"Time":"2026-10-18T00:13:47.132920066Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/wrong-level (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.132935396Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Elapsed":0}
{"Time":"2026-10-18T00:13:47.132941933Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods"}
{"Time":"2026-10-18T00:13:47.132950274Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods\n"}
{"Time":"2026-10-18T00:13:47.1331919Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.133207149Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Elapsed":0}
{"Time":"2026-10-18T00:13:47.133213794Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication"}
{"Time":"2026-10-18T00:13:47.133218943Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication\n"}
{"Time":"2026-10-18T00:13:47.133455853Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.133471083Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Elapsed":0}
{"Time":"2026-10-18T00:13:47.133479992Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at"}
{"Time":"2026-10-18T00:13:47.133485412Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/string-at\n"}
{"Time":"2026-10-18T00:13:47.133732521Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/string-at (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.133747399Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Elapsed":0}
{"Time":"2026-10-18T00:13:47.133753955Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa"}
{"Time":"2026-10-18T00:13:47.133759338Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa\n"}
{"Time":"2026-10-18T00:13:47.134027321Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.134042461Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Elapsed":0}
{"Time":"2026-10-18T00:13:47.134061226Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods"}
{"Time":"2026-10-18T00:13:47.134066979Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/object-methods\n"}
{"Time":"2026-10-18T00:13:47.134319219Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/object-methods (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.13433499Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Elapsed":0}
{"Time":"2026-10-18T00:13:47.134341573Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods"}
{"Time":"2026-10-18T00:13:47.134346776Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/empty-methods\n"}
{"Time":"2026-10-18T00:13:47.134592577Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/empty-methods (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.134607617Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Elapsed":0}
{"Time":"2026-10-18T00:13:47.134614398Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods"}
{"Time":"2026-10-18T00:13:47.134622739Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods\n"}
{"Time":"2026-10-18T00:13:47.134897243Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.134924763Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Elapsed":0}
{"Time":"2026-10-18T00:13:47.134934168Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field"}
{"Time":"2026-10-18T00:13:47.134939759Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field\n"}
{"Time":"2026-10-18T00:13:47.135300386Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.135342487Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Elapsed":0}
{"Time":"2026-10-18T00:13:47.135365211Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication"}
{"Time":"2026-10-18T00:13:47.135376311Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/future-authentication\n"}
{"Time":"2026-10-18T00:13:47.135570806Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/future-authentication (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.135601285Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Elapsed":0}
{"Time":"2026-10-18T00:13:47.136076139Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.136112659Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.136121505Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds"}
{"Time":"2026-10-18T00:13:47.13612669Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Output":"=== RUN TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds\n"}
{"Time":"2026-10-18T00:13:47.136563428Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Output":"--- PASS: TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.136588414Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Elapsed":0}
{"Time":"2026-10-18T00:13:47.136597432Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact"}
{"Time":"2026-10-18T00:13:47.13660332Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Output":"=== RUN TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact\n"}
{"Time":"2026-10-18T00:13:47.136938103Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Output":"--- PASS: TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.136966517Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Elapsed":0}
{"Time":"2026-10-18T00:13:47.136986571Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient"}
{"Time":"2026-10-18T00:13:47.136998221Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient\n"}
{"Time":"2026-10-18T00:13:47.137005823Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number"}
{"Time":"2026-10-18T00:13:47.137011378Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/number\n"}
{"Time":"2026-10-18T00:13:47.137307382Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/number (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.137332422Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Elapsed":0}
{"Time":"2026-10-18T00:13:47.137340051Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array"}
{"Time":"2026-10-18T00:13:47.137363189Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/array\n"}
{"Time":"2026-10-18T00:13:47.137580992Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/array (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.137595537Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Elapsed":0}
{"Time":"2026-10-18T00:13:47.137601461Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty"}
{"Time":"2026-10-18T00:13:47.137605988Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty\n"}
{"Time":"2026-10-18T00:13:47.137904891Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.137930059Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Elapsed":0}
{"Time":"2026-10-18T00:13:47.137938877Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client"}
{"Time":"2026-10-18T00:13:47.137945126Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client\n"}
{"Time":"2026-10-18T00:13:47.138201676Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.138219025Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Elapsed":0}
{"Time":"2026-10-18T00:13:47.138226879Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.138232723Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Elapsed":0}
{"Time":"2026-10-18T00:13:47.138238061Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient"}
{"Time":"2026-10-18T00:13:47.138242678Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Output":"=== RUN TestAccessEngineAuthorizedPartyAcceptsAdmittedClient\n"}
{"Time":"2026-10-18T00:13:47.138773571Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Output":"--- PASS: TestAccessEngineAuthorizedPartyAcceptsAdmittedClient (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.138861813Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Elapsed":0}
{"Time":"2026-10-18T00:13:47.138873337Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision"}
{"Time":"2026-10-18T00:13:47.138932455Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision\n"}
{"Time":"2026-10-18T00:13:47.13895461Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins"}
{"Time":"2026-10-18T00:13:47.138960399Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins\n"}
{"Time":"2026-10-18T00:13:47.156351306Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins (0.02s)\n"}
{"Time":"2026-10-18T00:13:47.156397222Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Elapsed":0.02}
{"Time":"2026-10-18T00:13:47.156405906Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners"}
{"Time":"2026-10-18T00:13:47.156410306Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners\n"}
{"Time":"2026-10-18T00:13:47.165626757Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.165674341Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.165685865Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers"}
{"Time":"2026-10-18T00:13:47.165696929Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers\n"}
{"Time":"2026-10-18T00:13:47.173632485Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.173682666Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.173693018Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision (0.03s)\n"}
{"Time":"2026-10-18T00:13:47.173699276Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Elapsed":0.03}
{"Time":"2026-10-18T00:13:47.173705507Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP"}
{"Time":"2026-10-18T00:13:47.173710529Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP\n"}
{"Time":"2026-10-18T00:13:47.173733839Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny"}
{"Time":"2026-10-18T00:13:47.173739078Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny\n"}
{"Time":"2026-10-18T00:13:47.18093918Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.180988351Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.180997783Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned"}
{"Time":"2026-10-18T00:13:47.181002832Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned\n"}
{"Time":"2026-10-18T00:13:47.187229059Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.187299817Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.187569905Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key"}
{"Time":"2026-10-18T00:13:47.187590384Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key\n"}
{"Time":"2026-10-18T00:13:47.194682985Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.194730983Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.194740352Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin"}
{"Time":"2026-10-18T00:13:47.19474588Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin\n"}
{"Time":"2026-10-18T00:13:47.201875476Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.201922825Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.20193187Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding"}
{"Time":"2026-10-18T00:13:47.201937271Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding\n"}
{"Time":"2026-10-18T00:13:47.209215594Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.209268472Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.209279464Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired"}
{"Time":"2026-10-18T00:13:47.209286795Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired\n"}
{"Time":"2026-10-18T00:13:47.216216889Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.216267115Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.216278459Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP (0.04s)\n"}
{"Time":"2026-10-18T00:13:47.216285357Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Elapsed":0.04}
{"Time":"2026-10-18T00:13:47.21629176Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP"}
{"Time":"2026-10-18T00:13:47.216297188Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP\n"}
{"Time":"2026-10-18T00:13:47.216306485Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token"}
{"Time":"2026-10-18T00:13:47.216311733Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token\n"}
{"Time":"2026-10-18T00:13:47.217762617Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.217801058Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Elapsed":0}
{"Time":"2026-10-18T00:13:47.217809399Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user"}
{"Time":"2026-10-18T00:13:47.217813835Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user\n"}
{"Time":"2026-10-18T00:13:47.219387424Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.219434358Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Elapsed":0}
{"Time":"2026-10-18T00:13:47.219454774Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject"}
{"Time":"2026-10-18T00:13:47.21946004Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject\n"}
{"Time":"2026-10-18T00:13:47.220640121Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.220691311Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Elapsed":0}
{"Time":"2026-10-18T00:13:47.220701492Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups"}
{"Time":"2026-10-18T00:13:47.220707561Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups\n"}
{"Time":"2026-10-18T00:13:47.221725482Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.221758169Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Elapsed":0}
{"Time":"2026-10-18T00:13:47.221765428Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission"}
{"Time":"2026-10-18T00:13:47.221771055Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission\n"}
{"Time":"2026-10-18T00:13:47.222708641Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.222732618Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Elapsed":0}
{"Time":"2026-10-18T00:13:47.222739625Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token"}
{"Time":"2026-10-18T00:13:47.222744557Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token\n"}
{"Time":"2026-10-18T00:13:47.223901191Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.22394478Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Elapsed":0}
{"Time":"2026-10-18T00:13:47.223954023Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source"}
{"Time":"2026-10-18T00:13:47.223974077Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source\n"}
{"Time":"2026-10-18T00:13:47.22477728Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.224805026Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Elapsed":0}
{"Time":"2026-10-18T00:13:47.224812393Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider"}
{"Time":"2026-10-18T00:13:47.224817451Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider\n"}
{"Time":"2026-10-18T00:13:47.225621438Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.225643891Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Elapsed":0}
{"Time":"2026-10-18T00:13:47.225657877Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience"}
{"Time":"2026-10-18T00:13:47.225677345Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience\n"}
{"Time":"2026-10-18T00:13:47.226654391Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.226694437Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Elapsed":0}
{"Time":"2026-10-18T00:13:47.226702967Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity"}
{"Time":"2026-10-18T00:13:47.22670863Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity\n"}
{"Time":"2026-10-18T00:13:47.227947597Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.22799271Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Elapsed":0}
{"Time":"2026-10-18T00:13:47.228003711Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.228013486Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.228036426Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE"}
{"Time":"2026-10-18T00:13:47.228046237Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE\n"}
{"Time":"2026-10-18T00:13:47.22848189Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat"}
{"Time":"2026-10-18T00:13:47.228501277Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-iat\n"}
{"Time":"2026-10-18T00:13:47.22872963Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-iat (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.228743985Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Elapsed":0}
{"Time":"2026-10-18T00:13:47.228750478Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant"}
{"Time":"2026-10-18T00:13:47.228755212Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-tenant\n"}
{"Time":"2026-10-18T00:13:47.228999787Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-tenant (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.229015432Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Elapsed":0}
{"Time":"2026-10-18T00:13:47.229023809Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance"}
{"Time":"2026-10-18T00:13:47.229029066Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-assurance\n"}
{"Time":"2026-10-18T00:13:47.229326229Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-assurance (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.229347059Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Elapsed":0}
{"Time":"2026-10-18T00:13:47.22935604Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer"}
{"Time":"2026-10-18T00:13:47.229360837Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/issuer\n"}
{"Time":"2026-10-18T00:13:47.229729435Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/issuer (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.229769697Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Elapsed":0}
{"Time":"2026-10-18T00:13:47.229782015Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience"}
{"Time":"2026-10-18T00:13:47.229787317Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/audience\n"}
{"Time":"2026-10-18T00:13:47.230110738Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/audience (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.230138412Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Elapsed":0}
{"Time":"2026-10-18T00:13:47.230149359Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal"}
{"Time":"2026-10-18T00:13:47.230157448Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-principal\n"}
{"Time":"2026-10-18T00:13:47.230432871Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-principal (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.230458624Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Elapsed":0}
{"Time":"2026-10-18T00:13:47.230465225Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp"}
{"Time":"2026-10-18T00:13:47.230470058Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp\n"}
{"Time":"2026-10-18T00:13:47.230746392Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.230767546Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Elapsed":0}
{"Time":"2026-10-18T00:13:47.23077742Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject"}
{"Time":"2026-10-18T00:13:47.230821361Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/empty-subject\n"}
{"Time":"2026-10-18T00:13:47.231118407Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/empty-subject (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.231135892Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Elapsed":0}
{"Time":"2026-10-18T00:13:47.231150608Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired"}
{"Time":"2026-10-18T00:13:47.231155306Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/expired\n"}
{"Time":"2026-10-18T00:13:47.231549134Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/expired (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.231573472Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Elapsed":0}
{"Time":"2026-10-18T00:13:47.23159891Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued"}
{"Time":"2026-10-18T00:13:47.231603986Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/future-issued\n"}
{"Time":"2026-10-18T00:13:47.231911429Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/future-issued (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.231924658Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Elapsed":0}
{"Time":"2026-10-18T00:13:47.23199685Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued"}
{"Time":"2026-10-18T00:13:47.232007148Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/old-issued\n"}
{"Time":"2026-10-18T00:13:47.232361823Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/old-issued (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.232374321Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Elapsed":0}
{"Time":"2026-10-18T00:13:47.232381454Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp"}
{"Time":"2026-10-18T00:13:47.23238562Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-exp\n"}
{"Time":"2026-10-18T00:13:47.23271428Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-exp (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.232727256Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Elapsed":0}
{"Time":"2026-10-18T00:13:47.232734524Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key"}
{"Time":"2026-10-18T00:13:47.232738681Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/wrong-key\n"}
{"Time":"2026-10-18T00:13:47.233078983Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/wrong-key (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.233091571Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Elapsed":0}
{"Time":"2026-10-18T00:13:47.233098668Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key"}
{"Time":"2026-10-18T00:13:47.233102824Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/unknown-key\n"}
{"Time":"2026-10-18T00:13:47.23332895Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/unknown-key (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.233356615Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Elapsed":0}
{"Time":"2026-10-18T00:13:47.233364884Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type"}
{"Time":"2026-10-18T00:13:47.233369383Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/wrong-type\n"}
{"Time":"2026-10-18T00:13:47.233554291Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/wrong-type (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.233575473Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Elapsed":0}
{"Time":"2026-10-18T00:13:47.233583002Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion"}
{"Time":"2026-10-18T00:13:47.233597285Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion\n"}
{"Time":"2026-10-18T00:13:47.23383529Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.233861504Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Elapsed":0}
{"Time":"2026-10-18T00:13:47.233869493Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none"}
{"Time":"2026-10-18T00:13:47.233873361Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/none\n"}
{"Time":"2026-10-18T00:13:47.23406881Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/none (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.234081173Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Elapsed":0}
{"Time":"2026-10-18T00:13:47.234088161Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.234092264Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.234207045Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer"}
{"Time":"2026-10-18T00:13:47.234216639Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Output":"=== RUN TestAccessEngineActualKeyCapeIssuer\n"}
{"Time":"2026-10-18T00:13:47.234789288Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Output":"--- PASS: TestAccessEngineActualKeyCapeIssuer (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.234823779Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Elapsed":0}
{"Time":"2026-10-18T00:13:47.234894971Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation"}
{"Time":"2026-10-18T00:13:47.234915945Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Output":"=== RUN TestRequiredClaimExactAnyOfAndNoMutation\n"}
{"Time":"2026-10-18T00:13:47.235061222Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Output":"--- PASS: TestRequiredClaimExactAnyOfAndNoMutation (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.235070888Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Elapsed":0}
{"Time":"2026-10-18T00:13:47.235197788Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation"}
{"Time":"2026-10-18T00:13:47.235220457Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Output":"=== RUN TestRequiredClaimConfigurationRefusalsAndLegacyIsolation\n"}
{"Time":"2026-10-18T00:13:47.235232243Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Output":"--- PASS: TestRequiredClaimConfigurationRefusalsAndLegacyIsolation (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.235243938Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Elapsed":0}
{"Time":"2026-10-18T00:13:47.235384498Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable"}
{"Time":"2026-10-18T00:13:47.235399953Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Output":"=== RUN TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable\n"}
{"Time":"2026-10-18T00:13:47.2416553Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Output":"--- PASS: TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable (0.01s)\n"}
{"Time":"2026-10-18T00:13:47.241705761Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Elapsed":0.01}
{"Time":"2026-10-18T00:13:47.241717591Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval"}
{"Time":"2026-10-18T00:13:47.241722605Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Output":"=== RUN TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval\n"}
{"Time":"2026-10-18T00:13:47.241852241Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Output":"--- PASS: TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.24186904Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Elapsed":0}
{"Time":"2026-10-18T00:13:47.241874937Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse"}
{"Time":"2026-10-18T00:13:47.24187922Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Output":"=== RUN TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse\n"}
{"Time":"2026-10-18T00:13:47.241886939Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Output":"--- PASS: TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse (0.00s)\n"}
{"Time":"2026-10-18T00:13:47.241911241Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Elapsed":0}
{"Time":"2026-10-18T00:13:47.24202098Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"PASS\n"}
{"Time":"2026-10-18T00:13:47.249310175Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"ok \tforgejo.org/services/auth/source/oauth2\t0.201s\n"}
{"Time":"2026-10-18T00:13:47.249379842Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Elapsed":0.202}

View file

@ -0,0 +1,9 @@
{"Time":"2026-10-17T23:35:20.479544589Z","Action":"start","Package":"forgejo.org/services/auth/source/oauth2"}
{"Time":"2026-10-17T23:35:20.570890583Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer"}
{"Time":"2026-10-17T23:35:20.570934488Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Output":"=== RUN TestAccessEngineActualKeyCapeIssuer\n"}
{"Time":"2026-10-17T23:35:20.573011097Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Output":" keycape_wire_test.go:33: actual KeyCape token rejected by consumer current authenticated application access refused\n"}
{"Time":"2026-10-17T23:35:20.573074335Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Output":"--- FAIL: TestAccessEngineActualKeyCapeIssuer (0.00s)\n"}
{"Time":"2026-10-17T23:35:20.573085633Z","Action":"fail","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualKeyCapeIssuer","Elapsed":0}
{"Time":"2026-10-17T23:35:20.573094615Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"FAIL\n"}
{"Time":"2026-10-17T23:35:20.578146562Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"FAIL\tforgejo.org/services/auth/source/oauth2\t0.098s\n"}
{"Time":"2026-10-17T23:35:20.578206382Z","Action":"fail","Package":"forgejo.org/services/auth/source/oauth2","Elapsed":0.099}

View file

@ -0,0 +1,224 @@
// Copyright 2026 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package oauth2
import (
"context"
"crypto"
"crypto/x509"
"encoding/json"
"encoding/pem"
"errors"
"io"
"os"
"path/filepath"
"strings"
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/markbates/goth"
"github.com/netkingdom/access-engine/pkg/api"
"github.com/netkingdom/access-engine/pkg/decisionpep"
)
var errApplicationDecision = errors.New("current authenticated application access refused")
// AccessEngineAdmission contains owner-admitted public trust, with only a file
// reference to the private PDP caller token. It is not persisted OAuth source
// configuration and cannot be replaced by token claims or provider discovery.
type AccessEngineAdmission struct {
SourceName string `json:"source_name"`
Issuer string `json:"issuer"`
Audience string `json:"audience"`
TokenType string `json:"token_type"`
Algorithms []string `json:"algorithms"`
IdentityKeys map[string]string `json:"identity_keys"`
TenantClaim string `json:"tenant_claim"`
PrincipalTypeClaim string `json:"principal_type_claim"`
AssuranceClaim string `json:"assurance_claim"`
TenantSourceClaim string `json:"tenant_source_claim"`
MaxAuthenticationAge string `json:"max_authentication_age"`
MaxIdentityAge string `json:"max_identity_age"`
Decision decisionpep.Admission `json:"decision"`
}
// VerifiedApplicationIdentity is derived only by VerifyApplicationIdentity from
// independently admitted JOSE keys. RawData and UserInfo never supply these
// fields. This snapshot is an identity fact, never an authorization verdict.
type VerifiedApplicationIdentity struct {
Issuer string
Subject string
Tenant string
PrincipalType api.SubjectType
Assurance string
TenantSource string
AssuranceData map[string]any
AuthenticatedAt time.Time
NotAfter time.Time
}
func loadAccessEngineAdmission(path string) (AccessEngineAdmission, error) {
var a AccessEngineAdmission
if !filepath.IsAbs(path) {
return a, errApplicationDecision
}
f, e := os.Open(path)
if e != nil {
return a, errApplicationDecision
}
defer f.Close()
stat, e := f.Stat()
if e != nil || !stat.Mode().IsRegular() || stat.Mode().Perm()&0022 != 0 {
return a, errApplicationDecision
}
raw, e := io.ReadAll(io.LimitReader(f, 1<<20+1))
if e != nil || len(raw) > 1<<20 {
return a, errApplicationDecision
}
d := json.NewDecoder(strings.NewReader(string(raw)))
d.DisallowUnknownFields()
if d.Decode(&a) != nil {
return a, errApplicationDecision
}
if _, e = d.Token(); e != io.EOF {
return a, errApplicationDecision
}
return a, nil
}
// VerifyApplicationIdentity validates the ID token independently of Goth's
// decode/claim checks and of the UserInfo merge. Keys and accepted algorithm,
// issuer, audience and type are admitted separately; none come from the JWT URL.
func VerifyApplicationIdentity(raw string, a AccessEngineAdmission, now time.Time) (VerifiedApplicationIdentity, error) {
var out VerifiedApplicationIdentity
age, e := time.ParseDuration(a.MaxIdentityAge)
authAge, authErr := time.ParseDuration(a.MaxAuthenticationAge)
if e != nil || authErr != nil || authAge <= 0 || age <= 0 || a.TenantSourceClaim == "" || a.Issuer == "" || a.Audience == "" || a.TokenType == "" || len(a.Algorithms) == 0 || len(a.IdentityKeys) == 0 || a.TenantClaim == "" || a.PrincipalTypeClaim == "" || a.AssuranceClaim == "" {
return out, errApplicationDecision
}
for _, alg := range a.Algorithms {
if alg != "RS256" && alg != "RS384" && alg != "RS512" && alg != "ES256" && alg != "ES384" && alg != "ES512" && alg != "EdDSA" {
return out, errApplicationDecision
}
}
claims := jwt.MapClaims{}
token, e := jwt.ParseWithClaims(raw, claims, func(t *jwt.Token) (any, error) {
if typ, ok := t.Header["typ"].(string); !ok || typ != a.TokenType {
return nil, errApplicationDecision
}
kid, ok := t.Header["kid"].(string)
if !ok || kid == "" {
return nil, errApplicationDecision
}
text, ok := a.IdentityKeys[kid]
if !ok {
return nil, errApplicationDecision
}
block, rest := pem.Decode([]byte(text))
if block == nil || block.Type != "PUBLIC KEY" || len(strings.TrimSpace(string(rest))) != 0 {
return nil, errApplicationDecision
}
key, e := x509.ParsePKIXPublicKey(block.Bytes)
if e != nil {
return nil, errApplicationDecision
}
var pub crypto.PublicKey = key
return pub, nil
}, jwt.WithValidMethods(a.Algorithms), jwt.WithIssuer(a.Issuer), jwt.WithAudience(a.Audience), jwt.WithExpirationRequired(), jwt.WithIssuedAt(), jwt.WithJSONNumber(), jwt.WithTimeFunc(func() time.Time { return now }))
if e != nil || token == nil || !token.Valid {
return out, errApplicationDecision
}
subject, e := claims.GetSubject()
if e != nil || subject == "" {
return out, errApplicationDecision
}
issued, e := claims.GetIssuedAt()
if e != nil || issued == nil || issued.Time.After(now) || now.Sub(issued.Time) > age {
return out, errApplicationDecision
}
end, e := claims.GetExpirationTime()
if e != nil || end == nil || !now.Before(end.Time) {
return out, errApplicationDecision
}
aud, e := claims.GetAudience()
if e != nil {
return out, errApplicationDecision
}
if authorizedParty, present := claims["azp"]; present {
if azp, ok := authorizedParty.(string); !ok || azp != a.Audience {
return out, errApplicationDecision
}
} else if len(aud) > 1 {
return out, errApplicationDecision
}
value := func(name string) (string, bool) { v, ok := claims[name].(string); return v, ok && validClaimLiteral(v) }
tenant, ok := value(a.TenantClaim)
if !ok {
return out, errApplicationDecision
}
principal, ok := value(a.PrincipalTypeClaim)
if !ok {
return out, errApplicationDecision
}
tenantSource, ok := value(a.TenantSourceClaim)
if !ok || (tenantSource != "directory" && tenantSource != "registration" && tenantSource != "default") {
return out, errApplicationDecision
}
assurance, assuranceData, authenticatedAt, authenticationEnd, err := verifiedKeyCapeAssurance(claims[a.AssuranceClaim], issued.Time, now, authAge)
if err != nil {
return out, errApplicationDecision
}
validUntil := end.Time
for _, bound := range []time.Time{issued.Time.Add(age), authenticationEnd} {
if bound.Before(validUntil) {
validUntil = bound
}
}
if !now.Before(validUntil) {
return out, errApplicationDecision
}
return VerifiedApplicationIdentity{Issuer: a.Issuer, Subject: subject, Tenant: tenant, PrincipalType: api.SubjectType(principal), Assurance: assurance, TenantSource: tenantSource, AssuranceData: assuranceData, AuthenticatedAt: authenticatedAt, NotAfter: validUntil}, nil
}
func (source *Source) authorizeAccessEngine(ctx context.Context, user goth.User) error {
// The guarded target extension cannot silently fall back to a local group
// decision when admission, keys, facts, PDP or caller authentication is absent.
if source.Provider != "openidConnect" || ValidateRequiredClaimValues(source.RequiredClaimName, source.RequiredClaimValue, source.RequiredClaimValues) != nil {
return errApplicationDecision
}
a, e := loadAccessEngineAdmission(os.Getenv("FORGEJO_ACCESS_ENGINE_ADMISSION_FILE"))
if e != nil || source.authSource == nil || a.SourceName != source.authSource.Name || a.Audience != source.ClientID {
return errApplicationDecision
}
identity, e := VerifyApplicationIdentity(user.IDToken, a, time.Now().UTC())
if e != nil {
return errApplicationDecision
}
// RequireCurrentUserInfoClaim has refused missing/malformed current groups
// before Goth can merge. The validated ID subject must still match that join.
sub, ok := user.RawData["sub"].(string)
if !ok || sub != identity.Subject || user.UserID != identity.Subject {
return errApplicationDecision
}
groups, ok := strictClaimValues(user.RawData[source.RequiredClaimName])
if !ok {
return errApplicationDecision
}
client, e := decisionpep.New(a.Decision)
if e != nil {
return errApplicationDecision
}
request := api.CheckRequest{Tenant: identity.Tenant,
Subject: api.SubjectRef{ID: identity.Subject, Type: identity.PrincipalType, Tenant: identity.Tenant,
Attributes: map[string]any{"issuer": identity.Issuer, "assurance": identity.Assurance, "current_userinfo_groups": groups}},
Action: "application.access", Resource: api.ResourceRef{ID: "application:forgejo", Type: "application", System: "forgejo", Tenant: identity.Tenant},
Context: map[string]any{"identity_issuer": identity.Issuer, "identity_subject": identity.Subject, "identity_tenant": identity.Tenant, "identity_principal_type": string(identity.PrincipalType), "identity_assurance": identity.Assurance, "identity_assurance_claim": identity.AssuranceData, "identity_authenticated_at": identity.AuthenticatedAt.UTC().Format(time.RFC3339Nano), "identity_tenant_source": identity.TenantSource, "identity_not_after": identity.NotAfter.UTC().Format(time.RFC3339Nano), "current_userinfo_groups": groups, "required_groups_any_of": source.RequiredClaimValues, "source_name": a.SourceName, "source_id": source.authSource.ID}}
if _, e = client.Check(ctx, request); e != nil {
return errApplicationDecision
}
if !time.Now().UTC().Before(identity.NotAfter) {
return errApplicationDecision
}
return nil
}

View file

@ -0,0 +1,54 @@
package oauth2
import (
"encoding/json"
"time"
)
// Validate the actual IAM v0.3 object only after issuer JOSE verification. These
// are identity facts, not an access verdict: aal1/service facts still reach the
// PDP, which owns the application's assurance and principal policy. Preserve the
// full object and its integer timestamp in the signed decision request.
func verifiedKeyCapeAssurance(raw any, issued, now time.Time, maxAge time.Duration) (string, map[string]any, time.Time, time.Time, error) {
refuse := func() (string, map[string]any, time.Time, time.Time, error) {
return "", nil, time.Time{}, time.Time{}, errApplicationDecision
}
claim, ok := raw.(map[string]any)
if !ok || len(claim) != 5 {
return refuse()
}
level, ok := claim["level"].(string)
if !ok || (level != "aal1" && level != "aal2" && level != "service") {
return refuse()
}
mfa, ok := claim["mfa"].(bool)
if !ok || mfa != (level == "aal2") || claim["source"] != "key-cape" {
return refuse()
}
methods, ok := claim["methods"].([]any)
if !ok || len(methods) == 0 {
return refuse()
}
seen := map[string]bool{}
for _, method := range methods {
value, ok := method.(string)
if !ok || !validClaimLiteral(value) || seen[value] {
return refuse()
}
seen[value] = true
}
number, ok := claim["at"].(json.Number)
if !ok {
return refuse()
}
seconds, err := number.Int64()
if err != nil || seconds <= 0 || seconds > issued.Unix() || seconds > now.Unix() {
return refuse()
}
authenticated := time.Unix(seconds, 0).UTC()
end := authenticated.Add(maxAge)
if maxAge <= 0 || !now.Before(end) {
return refuse()
}
return level, claim, authenticated, end, nil
}

View file

@ -0,0 +1,75 @@
package oauth2
import (
"encoding/json"
"testing"
"time"
)
func TestAccessEngineKeyCapeAssuranceRefusals(t *testing.T) {
cases := map[string]func(map[string]any, time.Time){
"stale-authentication": func(c map[string]any, now time.Time) { c["at"] = now.Add(-10 * time.Minute).Unix() },
"future-authentication": func(c map[string]any, now time.Time) { c["at"] = now.Add(time.Minute).Unix() },
"missing-at": func(c map[string]any, _ time.Time) { delete(c, "at") },
"string-at": func(c map[string]any, _ time.Time) { c["at"] = "recent" },
"fractional-at": func(c map[string]any, now time.Time) { c["at"] = float64(now.Unix()) - 1.5 },
"integer-mfa": func(c map[string]any, _ time.Time) { c["mfa"] = 1 },
"inconsistent-mfa": func(c map[string]any, _ time.Time) { c["mfa"] = false },
"wrong-source": func(c map[string]any, _ time.Time) { c["source"] = "userinfo" },
"wrong-level": func(c map[string]any, _ time.Time) { c["level"] = "verified" },
"object-methods": func(c map[string]any, _ time.Time) { c["methods"] = map[string]any{"pwd": true} },
"empty-methods": func(c map[string]any, _ time.Time) { c["methods"] = []string{} },
"mixed-methods": func(c map[string]any, _ time.Time) { c["methods"] = []any{"pwd", 1} },
"duplicate-methods": func(c map[string]any, _ time.Time) { c["methods"] = []string{"pwd", "pwd"} },
"unknown-object-field": func(c map[string]any, _ time.Time) { c["verified"] = true },
}
for name, mutate := range cases {
t.Run(name, func(t *testing.T) {
admission, key, claims, now := identityFixture(t)
mutate(claims["assurance"].(map[string]any), now)
if _, err := VerifyApplicationIdentity(signedIdentity(t, key, claims, nil), admission, now); err == nil {
t.Fatal("malformed or stale issuer assurance accepted")
}
})
}
for _, source := range []string{"", "assumed"} {
admission, key, claims, now := identityFixture(t)
claims["tenant_source"] = source
if _, err := VerifyApplicationIdentity(signedIdentity(t, key, claims, nil), admission, now); err == nil {
t.Fatal("missing or unknown tenant provenance accepted")
}
}
}
func TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds(t *testing.T) {
admission, key, claims, now := identityFixture(t)
admission.MaxAuthenticationAge = "5s"
claims["assurance"].(map[string]any)["at"] = now.Add(-3 * time.Second).Unix()
identity, err := VerifyApplicationIdentity(signedIdentity(t, key, claims, nil), admission, now)
if err != nil {
t.Fatal(err)
}
if !identity.NotAfter.Equal(now.Add(2*time.Second)) || !identity.AuthenticatedAt.Equal(now.Add(-3*time.Second)) || identity.TenantSource != "directory" {
t.Fatal("snapshot overstated authentication freshness or tenant provenance")
}
if _, ok := identity.AssuranceData["at"].(json.Number); !ok || identity.AssuranceData["mfa"] != true || identity.AssuranceData["source"] != "key-cape" {
t.Fatal("source assurance object lost its actual wire types")
}
admission.MaxIdentityAge = "2s"
identity, err = VerifyApplicationIdentity(signedIdentity(t, key, claims, nil), admission, now)
if err != nil || !identity.NotAfter.Equal(now.Add(time.Second)) {
t.Fatal("snapshot overstated token-age validity", err)
}
}
func TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact(t *testing.T) {
admission, key, claims, now := identityFixture(t)
claim := claims["assurance"].(map[string]any)
claim["level"] = "aal1"
claim["mfa"] = false
claim["methods"] = []string{"pwd"}
identity, err := VerifyApplicationIdentity(signedIdentity(t, key, claims, nil), admission, now)
if err != nil || identity.Assurance != "aal1" || identity.AssuranceData["mfa"] != false {
t.Fatal("identity parser substituted an application authorization policy", err)
}
}

View file

@ -0,0 +1,194 @@
package oauth2
import (
"crypto/ed25519"
"crypto/rand"
"encoding/base64"
"encoding/json"
"encoding/pem"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"reflect"
"strings"
"sync/atomic"
"testing"
"time"
authmodel "forgejo.org/models/auth"
"github.com/golang-jwt/jwt/v5"
"github.com/markbates/goth"
"github.com/markbates/goth/gothic"
"github.com/netkingdom/access-engine/pkg/api"
"github.com/netkingdom/access-engine/pkg/decisionpep"
"github.com/netkingdom/access-engine/testsupport/signfixture"
)
// This fixture substitutes only Goth's completed authentication result. The
// actual Source.Callback, JOSE verifier, HTTPS PEP client and producer signature
// implementation execute. Actual issuer login and native admission are separate.
func callbackFixture(t *testing.T, group, mode string) (*Source, *goth.User, *atomic.Int64) {
return callbackFixtureWithIdentity(t, group, mode, nil, "")
}
func callbackFixtureWithIdentity(t *testing.T, group, mode string, suppliedAdmission *AccessEngineAdmission, suppliedToken string) (*Source, *goth.User, *atomic.Int64) {
t.Helper()
admission, identityKey, claims, _ := identityFixture(t)
identityToken := signedIdentity(t, identityKey, claims, nil)
if suppliedAdmission != nil {
admission, identityToken = *suppliedAdmission, suppliedToken
}
verified, err := VerifyApplicationIdentity(identityToken, admission, time.Now().UTC())
if err != nil {
t.Fatal("callback fixture identity invalid")
}
pub, key, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
t.Fatal(err)
}
calls := new(atomic.Int64)
server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
calls.Add(1)
if r.URL.Path != "/v1/check" || r.Method != http.MethodPost || r.Header.Get("Authorization") != "Bearer synthetic-caller" || r.Header.Get("Access-Engine-JSON-Profile") != decisionpep.JSONProfile {
t.Error("incorrect authenticated PDP request")
w.WriteHeader(403)
return
}
var request api.CheckRequest
decoder := json.NewDecoder(r.Body)
decoder.UseNumber()
if err := decoder.Decode(&request); err != nil {
t.Error(err)
w.WriteHeader(400)
return
}
c := request.Context
if request.Subject.ID != "user:synthetic" || request.Subject.Tenant != "tenant:synthetic" || request.Subject.Type != "human" || request.Action != "application.access" || request.Resource.ID != "application:forgejo" || c["identity_issuer"] != admission.Issuer || c["identity_assurance"] != "aal2" || c["identity_tenant"] != "tenant:synthetic" || c["source_id"] != json.Number("17") || !reflect.DeepEqual(c["identity_assurance_claim"], verified.AssuranceData) || c["identity_authenticated_at"] != verified.AuthenticatedAt.UTC().Format(time.RFC3339Nano) || c["identity_tenant_source"] != verified.TenantSource {
t.Error("PDP request did not use authenticated identity and source")
w.WriteHeader(400)
return
}
now := time.Now().UTC()
envelope := api.DecisionEnvelope{ID: "synthetic-decision", RequestID: request.ID, Effect: api.DecisionEffectAllow, MatchedPolicyVersion: "v1", Subject: request.Subject, Resource: request.Resource, Binding: api.NewDecisionBindingFor(request, request), Provenance: api.DecisionProvenance{Evaluator: "flex-auth/local", Mode: "standalone/" + decisionpep.JSONProfile, PolicyPackage: "forgejo.application-access", PolicyVersion: "v1", PolicyPackageDigest: "sha256:" + strings.Repeat("1", 64), RegistrySnapshotDigest: "sha256:" + strings.Repeat("2", 64), Caller: &api.CallerProvenance{Mode: "enforce", Principal: "system:serviceaccount:synthetic:forgejo", Audience: "access-engine", NotAfter: now.Add(time.Minute).Format(time.RFC3339Nano)}}}
api.CompleteDecision(&envelope, request, api.DecisionCompletion{AllowTTL: "10s", Now: now})
switch mode {
case "deny":
envelope.Effect = api.DecisionEffectDeny
case "wrong-binding":
envelope.Binding.Subject.ID = "other"
case "wrong-pin":
envelope.Provenance.PolicyPackageDigest = "sha256:" + strings.Repeat("3", 64)
case "expired":
envelope.Lifetime.ExpiresAt = now.Add(-time.Hour).Format(time.RFC3339Nano)
}
if mode != "unsigned" {
signingKey := key
if mode == "wrong-key" {
_, signingKey, err = ed25519.GenerateKey(rand.Reader)
if err != nil {
t.Error(err)
return
}
}
if err := signfixture.Sign(&envelope, signingKey, "synthetic-pdp"); err != nil {
t.Error(err)
return
}
}
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(envelope); err != nil {
t.Error(err)
}
}))
t.Cleanup(server.Close)
dir := t.TempDir()
ca := filepath.Join(dir, "ca.pem")
token := filepath.Join(dir, "caller")
config := filepath.Join(dir, "admission.json")
if err := os.WriteFile(ca, pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: server.Certificate().Raw}), 0600); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(token, []byte("synthetic-caller"), 0600); err != nil {
t.Fatal(err)
}
admission.SourceName = "synthetic-source"
admission.Decision = decisionpep.Admission{Endpoint: server.URL + "/v1/check", CAFile: ca, TokenFile: token, Keys: map[string]string{"synthetic-pdp": base64.RawURLEncoding.EncodeToString(pub)}, Evaluator: "flex-auth/local", PolicyPackage: "forgejo.application-access", PolicyVersion: "v1", PolicyDigest: "sha256:" + strings.Repeat("1", 64), RegistryDigest: "sha256:" + strings.Repeat("2", 64), CallerPrincipal: "system:serviceaccount:synthetic:forgejo", CallerAudience: "access-engine", MaxTTL: "30s", MaxClockSkew: "2s"}
raw, err := json.Marshal(admission)
if err != nil {
t.Fatal(err)
}
if err = os.WriteFile(config, raw, 0600); err != nil {
t.Fatal(err)
}
t.Setenv("FORGEJO_ACCESS_ENGINE_ADMISSION_FILE", config)
source := &Source{Provider: "openidConnect", ClientID: admission.Audience, RequiredClaimName: "groups", RequiredClaimValues: []string{"forge-admins", "forge-coulomb-owners", "forge-coulomb-readers"}}
source.authSource = &authmodel.Source{ID: 17, Name: admission.SourceName}
user := &goth.User{UserID: "user:synthetic", IDToken: identityToken, RawData: map[string]any{"sub": "user:synthetic", "groups": []string{group}}}
previous := gothic.CompleteUserAuth
gothic.CompleteUserAuth = func(http.ResponseWriter, *http.Request) (goth.User, error) { return *user, nil }
t.Cleanup(func() { gothic.CompleteUserAuth = previous })
return source, user, calls
}
func TestAccessEngineActualCallbackAllowsAuthenticatedDecision(t *testing.T) {
for _, group := range []string{"forge-admins", "forge-coulomb-owners", "forge-coulomb-readers"} {
t.Run(group, func(t *testing.T) {
source, user, calls := callbackFixture(t, group, "allow")
// Mutable UserInfo cannot supply identity assurance, issuer or tenant.
user.RawData["acr"] = "aal1"
user.RawData["assurance"] = map[string]any{"level": "aal1", "source": "attacker"}
user.RawData["tenant_source"] = "attacker"
user.RawData["tenant"] = "tenant:attacker"
user.RawData["iss"] = "https://attacker.invalid"
got, err := source.Callback(httptest.NewRequest(http.MethodGet, "https://forgejo.invalid/callback", nil), httptest.NewRecorder(), "")
if err != nil || got.UserID != user.UserID || calls.Load() != 1 {
t.Fatalf("callback result: err=%v requests=%d", err, calls.Load())
}
})
}
}
func TestAccessEngineActualCallbackRefusesUnverifiedPDP(t *testing.T) {
for _, mode := range []string{"deny", "unsigned", "wrong-key", "wrong-pin", "wrong-binding", "expired"} {
t.Run(mode, func(t *testing.T) {
source, _, calls := callbackFixture(t, "forge-admins", mode)
got, err := source.Callback(httptest.NewRequest(http.MethodGet, "https://forgejo.invalid/callback", nil), httptest.NewRecorder(), "")
if err == nil || got.UserID != "" || got.IDToken != "" || calls.Load() != 1 {
t.Fatalf("unverified decision escaped callback: requests=%d err=%v", calls.Load(), err)
}
})
}
}
func TestAccessEngineActualCallbackChecksIdentityBeforePDP(t *testing.T) {
cases := map[string]func(*Source, *goth.User){
"missing-token": func(_ *Source, u *goth.User) { u.IDToken = "" },
"mismatched-user": func(_ *Source, u *goth.User) { u.UserID = "other" },
"mismatched-subject": func(_ *Source, u *goth.User) { u.RawData["sub"] = "other" },
"missing-groups": func(_ *Source, u *goth.User) { delete(u.RawData, "groups") },
"wrong-source": func(s *Source, _ *goth.User) { s.authSource.Name = "other" },
"wrong-provider": func(s *Source, _ *goth.User) { s.Provider = "other" },
"wrong-audience": func(s *Source, _ *goth.User) { s.ClientID = "other" },
"missing-admission": func(_ *Source, _ *goth.User) { t.Setenv("FORGEJO_ACCESS_ENGINE_ADMISSION_FILE", "") },
"expired-token": func(_ *Source, u *goth.User) {
_, key, claims, now := identityFixture(t)
claims["exp"] = now.Add(-time.Hour).Unix()
u.IDToken = signedIdentity(t, key, claims, nil)
},
"untrusted-identity": func(_ *Source, u *goth.User) {
token := jwt.NewWithClaims(jwt.SigningMethodNone, jwt.MapClaims{"sub": "user:synthetic"})
u.IDToken, _ = token.SignedString(jwt.UnsafeAllowNoneSignatureType)
},
}
for name, mutate := range cases {
t.Run(name, func(t *testing.T) {
source, user, calls := callbackFixture(t, "forge-admins", "allow")
mutate(source, user)
got, err := source.Callback(httptest.NewRequest(http.MethodGet, "https://forgejo.invalid/callback", nil), httptest.NewRecorder(), "")
if err == nil || got.UserID != "" || calls.Load() != 0 {
t.Fatalf("unverified identity reached PDP: requests=%d err=%v", calls.Load(), err)
}
})
}
}

View file

@ -0,0 +1,100 @@
package oauth2
import (
"crypto/ed25519"
"crypto/rand"
"crypto/x509"
"encoding/pem"
"testing"
"time"
"github.com/golang-jwt/jwt/v5"
)
func identityFixture(t *testing.T) (AccessEngineAdmission, ed25519.PrivateKey, jwt.MapClaims, time.Time) {
t.Helper()
pub, key, e := ed25519.GenerateKey(rand.Reader)
if e != nil {
t.Fatal(e)
}
der, e := x509.MarshalPKIXPublicKey(pub)
if e != nil {
t.Fatal(e)
}
now := time.Now().UTC().Truncate(time.Second)
a := AccessEngineAdmission{Issuer: "https://issuer.invalid", Audience: "forgejo", TokenType: "JWT", Algorithms: []string{"EdDSA"}, IdentityKeys: map[string]string{"synthetic": string(pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: der}))}, TenantClaim: "tenant", PrincipalTypeClaim: "principal_type", AssuranceClaim: "assurance", TenantSourceClaim: "tenant_source", MaxAuthenticationAge: "5m", MaxIdentityAge: "5m"}
c := jwt.MapClaims{"iss": a.Issuer, "aud": a.Audience, "sub": "user:synthetic", "iat": now.Add(-time.Second).Unix(), "exp": now.Add(time.Minute).Unix(), "tenant": "tenant:synthetic", "principal_type": "human", "tenant_source": "directory", "assurance": map[string]any{"level": "aal2", "mfa": true, "source": "key-cape", "methods": []string{"pwd", "otp"}, "at": now.Add(-time.Second).Unix()}}
return a, key, c, now
}
func signedIdentity(t *testing.T, key ed25519.PrivateKey, c jwt.MapClaims, mutate func(*jwt.Token)) string {
t.Helper()
token := jwt.NewWithClaims(jwt.SigningMethodEdDSA, c)
token.Header["kid"] = "synthetic"
token.Header["typ"] = "JWT"
if mutate != nil {
mutate(token)
}
raw, e := token.SignedString(key)
if e != nil {
t.Fatal(e)
}
return raw
}
func TestVerifiedApplicationIdentityActualJOSE(t *testing.T) {
a, key, c, now := identityFixture(t)
raw := signedIdentity(t, key, c, nil)
got, e := VerifyApplicationIdentity(raw, a, now)
if e != nil {
t.Fatal(e)
}
if got.Subject != "user:synthetic" || got.Tenant != "tenant:synthetic" || got.Assurance != "aal2" || got.Issuer != a.Issuer || string(got.PrincipalType) != "human" {
t.Fatal("identity did not come from verified token")
}
cases := map[string]func(jwt.MapClaims){"issuer": func(c jwt.MapClaims) { c["iss"] = "https://other.invalid" }, "audience": func(c jwt.MapClaims) { c["aud"] = "other" }, "expired": func(c jwt.MapClaims) { c["exp"] = now.Add(-time.Nanosecond).Unix() }, "future-issued": func(c jwt.MapClaims) { c["iat"] = now.Add(time.Minute).Unix() }, "old-issued": func(c jwt.MapClaims) { c["iat"] = now.Add(-10 * time.Minute).Unix() }, "no-exp": func(c jwt.MapClaims) { delete(c, "exp") }, "no-iat": func(c jwt.MapClaims) { delete(c, "iat") }, "no-tenant": func(c jwt.MapClaims) { delete(c, "tenant") }, "no-principal": func(c jwt.MapClaims) { delete(c, "principal_type") }, "no-assurance": func(c jwt.MapClaims) { delete(c, "assurance") }, "multi-audience-no-azp": func(c jwt.MapClaims) { c["aud"] = []string{"forgejo", "other"} }, "empty-subject": func(c jwt.MapClaims) { c["sub"] = "" }}
for name, change := range cases {
t.Run(name, func(t *testing.T) {
copy := jwt.MapClaims{}
for k, v := range c {
copy[k] = v
}
change(copy)
if _, e := VerifyApplicationIdentity(signedIdentity(t, key, copy, nil), a, now); e == nil {
t.Fatal("unverified identity accepted")
}
})
}
t.Run("wrong-key", func(t *testing.T) {
_, other, _ := ed25519.GenerateKey(rand.Reader)
if _, e := VerifyApplicationIdentity(signedIdentity(t, other, c, nil), a, now); e == nil {
t.Fatal("wrong key accepted")
}
})
t.Run("unknown-key", func(t *testing.T) {
if _, e := VerifyApplicationIdentity(signedIdentity(t, key, c, func(t *jwt.Token) { t.Header["kid"] = "other" }), a, now); e == nil {
t.Fatal("unknown key accepted")
}
})
t.Run("wrong-type", func(t *testing.T) {
if _, e := VerifyApplicationIdentity(signedIdentity(t, key, c, func(t *jwt.Token) { t.Header["typ"] = "at+jwt" }), a, now); e == nil {
t.Fatal("access token accepted as ID token")
}
})
t.Run("algorithm-confusion", func(t *testing.T) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
token.Header["kid"] = "synthetic"
token.Header["typ"] = "JWT"
raw, _ := token.SignedString([]byte(a.IdentityKeys["synthetic"]))
if _, e := VerifyApplicationIdentity(raw, a, now); e == nil {
t.Fatal("algorithm confusion accepted")
}
})
t.Run("none", func(t *testing.T) {
token := jwt.NewWithClaims(jwt.SigningMethodNone, c)
token.Header["kid"] = "synthetic"
token.Header["typ"] = "JWT"
raw, _ := token.SignedString(jwt.UnsafeAllowNoneSignatureType)
if _, e := VerifyApplicationIdentity(raw, a, now); e == nil {
t.Fatal("unsigned identity accepted")
}
})
}

View file

@ -0,0 +1,163 @@
{
"returncode": 0,
"seconds": 50.98,
"argv": [
"bwrap",
"--unshare-pid",
"--die-with-parent",
"--new-session",
"--unshare-net",
"--ro-bind",
"/usr",
"/usr",
"--ro-bind",
"/lib",
"/lib",
"--ro-bind",
"/lib64",
"/lib64",
"--symlink",
"usr/bin",
"/bin",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--bind",
"/tmp/custodian-forgejo-successor-r3",
"/work",
"--ro-bind",
"/home/worsch/go/pkg/mod/cache/download",
"/cached",
"--ro-bind",
"/etc/ssl/certs",
"/etc/ssl/certs",
"--ro-bind",
"/etc/resolv.conf",
"/etc/resolv.conf",
"--chdir",
"/work/source",
"--clearenv",
"--ro-bind",
"/tmp/custodian-forgejo-successor-attempt2/modules",
"/work/modules",
"--bind",
"/tmp/custodian-forgejo-successor-attempt2/gocache",
"/work/gocache",
"--dir",
"/run",
"--ro-bind",
"/tmp/custodian-forgejo-successor-r3/descriptor-fixtures",
"/run/forgejo-oidc",
"--bind",
"/tmp/custodian-forgejo-successor-r3/descriptor-fixtures",
"/run/writable-input",
"--setenv",
"PATH",
"/work/go/bin:/usr/bin:/bin",
"--setenv",
"HOME",
"/work/home",
"--setenv",
"GOPATH",
"/work/gopath",
"--setenv",
"GOTOOLCHAIN",
"local",
"--setenv",
"GOPROXY",
"off",
"--setenv",
"GOSUMDB",
"off",
"--setenv",
"GOVCS",
"*:off",
"--setenv",
"GOMODCACHE",
"/work/modules",
"--setenv",
"GOCACHE",
"/work/gocache",
"--setenv",
"GOMAXPROCS",
"4",
"--setenv",
"CGO_ENABLED",
"1",
"--setenv",
"GIT_CONFIG_NOSYSTEM",
"1",
"--setenv",
"GIT_CONFIG_GLOBAL",
"/work/home/test.gitconfig",
"--setenv",
"GIT_TERMINAL_PROMPT",
"0",
"--",
"go",
"test",
"-p",
"1",
"-json",
"-tags",
"sqlite sqlite_unlock_notify",
"./services/auth/source/oauth2",
"./cmd",
"./models/auth",
"./models/db",
"-run",
"TestAccessEngine|TestVerifiedApplicationIdentity|TestRequired|TestCurrent|TestPrivateSecret|TestSourceOperation|TestSensitiveSQL",
"-count=1"
],
"workspace": "/tmp/custodian-forgejo-successor-r3",
"module_hashes": {
"go.mod": "sha256:130138c4c3ecc29fa0d7f1e2eef0589ddf3b06071f3cc0448aa7b2326847653a",
"go.sum": "sha256:19c305c7e68de9d3f1bc0dda2de09c5d38597f1ee7fa411c7b36b92467ae1eaf"
},
"composed_source_pins": {
"cmd/admin_auth_oauth.go": "sha256:d718d817c46f6393488a9c5a894b7535640cd0ec1a1ae3f72f8411a2bbec3b38",
"cmd/admin_auth_oauth_secret_linux.go": "sha256:6741961f1df67c1afbf34c796e549425f0e04a0d0678c6eedb05f66d4754c64b",
"cmd/admin_auth_oauth_secret_linux_test.go": "sha256:b28c2369dfab9bf2ca48e707e01b4394a36c8be5490cfe5bb658017bb626c4b2",
"cmd/admin_auth_oauth_secret_other.go": "sha256:54056c989a4757e73db0252130e7c16bf16f5ec8eaaca2468f019ba2ef5c532d",
"go.mod": "sha256:130138c4c3ecc29fa0d7f1e2eef0589ddf3b06071f3cc0448aa7b2326847653a",
"go.sum": "sha256:19c305c7e68de9d3f1bc0dda2de09c5d38597f1ee7fa411c7b36b92467ae1eaf",
"models/auth/source_operation.go": "sha256:ef1b07ef6cf454015d00cde8588835f5118d829da91eb0303d37184859345a31",
"models/auth/source_operation_internal_test.go": "sha256:af0f424d3a1fd2b29793b64baa1fa07284fee7ea0b7721c503db4efac0d871cb",
"models/auth/source_operation_process_test.go": "sha256:40d33b11a01cb659f0bf6f8b545c4d79910e8c082a789060bcbc9cadeee965bd",
"models/auth/source_operation_test.go": "sha256:77d311bca42f48faf3fbdc15c53582e3d8a6d9108a72ed7bb6172e5b88951428",
"models/db/context.go": "sha256:d4c4acfcb8987071aecf5cd957b3821c8d2619a2696398d37c2970f2527686f7",
"models/db/engine.go": "sha256:43683804d0c5bc6ead1dba0344c69dd196825cf3d5eb502af8d932a7b8207b96",
"models/db/sensitive_sql.go": "sha256:06a298d0d6e628e6920384d4ddeef449e40c090841ebaa3f6d175725a45ae584",
"models/db/sensitive_sql_logging_test.go": "sha256:d924b35d30686473caf29601cf51cc363ba68158cb4ef0981c9e2fc7b03c04b7",
"models/db/sensitive_sql_test.go": "sha256:de6353c955047c3311747e4777b9f9b2195e9efb19160b971dd758dfc94cf31b",
"routers/web/admin/auths.go": "sha256:3498229e06fb9ff52396bcb5e68c0cc2d2ad24e6494533d8717d7c833f3e2923",
"routers/web/auth/oauth.go": "sha256:58bff778e0dc17a521706289bf45c3e0d76a759a0874f76c379b3d1ddb419b17",
"services/auth/source/oauth2/access_engine.go": "sha256:d5f07f9491ac2212410e1fa8c0248d68ba3a723e7ca99e363627c5292d187aa8",
"services/auth/source/oauth2/access_engine_assurance.go": "sha256:42de751b1e9a243301d566260954813b770558ecb449639acaeab307fe788642",
"services/auth/source/oauth2/access_engine_assurance_test.go": "sha256:44e7459f6c1106a264093c19d61d01a8365f6ad22682906552d832ba39d61dd3",
"services/auth/source/oauth2/access_engine_azp_test.go": "sha256:5f94f43ade9a79b6b7ef529c80115a8c32acfece425dc8ed3f24e6ad839fc0ce",
"services/auth/source/oauth2/access_engine_callback_test.go": "sha256:5cea36b630c895a9473dc876b7128526ddef65d9395b2fddc56343e162452472",
"services/auth/source/oauth2/access_engine_test.go": "sha256:99edd6cfe3e834d73e0447a7915f52cc4ab7b82644669c5ae61963f850b447e8",
"services/auth/source/oauth2/providers_openid.go": "sha256:5dd9b906cce434c774968d57fcc790cb678147345fea4d2e58477ec6eed70bcf",
"services/auth/source/oauth2/required_claim_values.go": "sha256:29f16d07464bbe12e3f65616b6c1eb60561d04cd8ff89ecbfb56f93dbeaf1cda",
"services/auth/source/oauth2/required_claim_values_test.go": "sha256:54a8bd97dc51c524a9adf0c6aefb9a19fa152d234b3bb929bf1a90932662d3d0",
"services/auth/source/oauth2/source.go": "sha256:44e99883c2ec479427b3f72c73353fe33936eed2e5c962b2fa40803576aa5642",
"services/auth/source/oauth2/source_callout.go": "sha256:6abba69df97afc62467f0328eaa5a6383cfb4900202a081dec4b84a21b37349c",
"third_party/access-engine-pep/LICENSE": "sha256:ff413f361a3b3bf44cf50f110fbcc4837064d57eefbcef89df2b43997c6262b6",
"third_party/access-engine-pep/go.mod": "sha256:fea700810e47c1ba5638b86a168f8531c083a6e1222ca80bd2a8947b2ea6f2c3",
"third_party/access-engine-pep/internal/sign/sign.go": "sha256:0df9515922e90775ebbfac798361dcafb20da8a4213796b44e246b8a92046cde",
"third_party/access-engine-pep/pkg/api/canonical.go": "sha256:a122a2e8cd524333b13c5939c7a3685e41efbe47497a64e0c7297c92b7f10d19",
"third_party/access-engine-pep/pkg/api/caring.go": "sha256:1907156f0f889e7b9e9c14970cf7a86a20d00478a496efaf92c7231f27fec5e3",
"third_party/access-engine-pep/pkg/api/resource_manifest.go": "sha256:f0fa4080287d389ed48c2b1d6af96cc62e57ef72c902333f677f964420be133f",
"third_party/access-engine-pep/pkg/decisionpep/client.go": "sha256:0d57f6ddaca5c3f81ce426c0e8b14ba14ea5962096d3be5909aa456eef19eeba",
"third_party/access-engine-pep/pkg/decisionpep/client_test.go": "sha256:1a6be3485f580f95a1f1406fb76e525f2c4bf02fe04a424cfe0095bb728e3f62",
"third_party/access-engine-pep/producer-source.json": "sha256:c1d83e3d79f9860ffaa61ec19a6b3415e914d3058b11b07cdd05a7d1182cdceb",
"third_party/access-engine-pep/testsupport/signfixture/sign.go": "sha256:fe4aa86f444dc20145aefbaca35b24f046264b2c5c8b4e3b057a4496b77a4d29"
},
"network": "disabled",
"pid_namespace": "private",
"real_credentials": false
}

View file

@ -0,0 +1,432 @@
{"Time":"2026-10-18T00:15:43.574746912Z","Action":"start","Package":"forgejo.org/services/auth/source/oauth2"}
{"Time":"2026-10-18T00:15:43.663502082Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals"}
{"Time":"2026-10-18T00:15:43.663558773Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals\n"}
{"Time":"2026-10-18T00:15:43.663601479Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source"}
{"Time":"2026-10-18T00:15:43.663607737Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/wrong-source\n"}
{"Time":"2026-10-18T00:15:43.665615986Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/wrong-source (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.665636338Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-source","Elapsed":0}
{"Time":"2026-10-18T00:15:43.665647357Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level"}
{"Time":"2026-10-18T00:15:43.665653913Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/wrong-level\n"}
{"Time":"2026-10-18T00:15:43.66589526Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/wrong-level (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.665914024Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/wrong-level","Elapsed":0}
{"Time":"2026-10-18T00:15:43.665921978Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods"}
{"Time":"2026-10-18T00:15:43.665933276Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods\n"}
{"Time":"2026-10-18T00:15:43.6661897Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.666207121Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/mixed-methods","Elapsed":0}
{"Time":"2026-10-18T00:15:43.666214894Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field"}
{"Time":"2026-10-18T00:15:43.666221035Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field\n"}
{"Time":"2026-10-18T00:15:43.666581466Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.666614469Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/unknown-object-field","Elapsed":0}
{"Time":"2026-10-18T00:15:43.666626588Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication"}
{"Time":"2026-10-18T00:15:43.666652161Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/future-authentication\n"}
{"Time":"2026-10-18T00:15:43.666819329Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/future-authentication (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.666845037Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/future-authentication","Elapsed":0}
{"Time":"2026-10-18T00:15:43.666855371Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at"}
{"Time":"2026-10-18T00:15:43.666864893Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/missing-at\n"}
{"Time":"2026-10-18T00:15:43.667091091Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/missing-at (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.667108765Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/missing-at","Elapsed":0}
{"Time":"2026-10-18T00:15:43.667116448Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at"}
{"Time":"2026-10-18T00:15:43.667122426Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/string-at\n"}
{"Time":"2026-10-18T00:15:43.667376541Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/string-at (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.667393133Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/string-at","Elapsed":0}
{"Time":"2026-10-18T00:15:43.667400608Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa"}
{"Time":"2026-10-18T00:15:43.667406487Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa\n"}
{"Time":"2026-10-18T00:15:43.667644462Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.667661991Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/integer-mfa","Elapsed":0}
{"Time":"2026-10-18T00:15:43.667669683Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa"}
{"Time":"2026-10-18T00:15:43.667675869Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa\n"}
{"Time":"2026-10-18T00:15:43.667975954Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.66801012Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/inconsistent-mfa","Elapsed":0}
{"Time":"2026-10-18T00:15:43.668018732Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods"}
{"Time":"2026-10-18T00:15:43.668024827Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/object-methods\n"}
{"Time":"2026-10-18T00:15:43.668251377Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/object-methods (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.668266444Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/object-methods","Elapsed":0}
{"Time":"2026-10-18T00:15:43.668273225Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods"}
{"Time":"2026-10-18T00:15:43.668278473Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/empty-methods\n"}
{"Time":"2026-10-18T00:15:43.668519964Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/empty-methods (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.668534635Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/empty-methods","Elapsed":0}
{"Time":"2026-10-18T00:15:43.668543743Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods"}
{"Time":"2026-10-18T00:15:43.668552336Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods\n"}
{"Time":"2026-10-18T00:15:43.668821086Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.668839608Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/duplicate-methods","Elapsed":0}
{"Time":"2026-10-18T00:15:43.668847417Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication"}
{"Time":"2026-10-18T00:15:43.668855217Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication\n"}
{"Time":"2026-10-18T00:15:43.669108448Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.669123408Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/stale-authentication","Elapsed":0}
{"Time":"2026-10-18T00:15:43.669130522Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at"}
{"Time":"2026-10-18T00:15:43.669135752Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Output":"=== RUN TestAccessEngineKeyCapeAssuranceRefusals/fractional-at\n"}
{"Time":"2026-10-18T00:15:43.669406089Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals/fractional-at (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.669421437Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals/fractional-at","Elapsed":0}
{"Time":"2026-10-18T00:15:43.669878314Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Output":"--- PASS: TestAccessEngineKeyCapeAssuranceRefusals (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.669894383Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeAssuranceRefusals","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.669905086Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds"}
{"Time":"2026-10-18T00:15:43.669912688Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Output":"=== RUN TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds\n"}
{"Time":"2026-10-18T00:15:43.67033098Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Output":"--- PASS: TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.670438204Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeIdentityFactsAndFreshnessBounds","Elapsed":0}
{"Time":"2026-10-18T00:15:43.670449268Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact"}
{"Time":"2026-10-18T00:15:43.670455066Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Output":"=== RUN TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact\n"}
{"Time":"2026-10-18T00:15:43.670770312Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Output":"--- PASS: TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.670799014Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineKeyCapeLowerAssuranceIsAnIdentityFact","Elapsed":0}
{"Time":"2026-10-18T00:15:43.670808518Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient"}
{"Time":"2026-10-18T00:15:43.670815398Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient\n"}
{"Time":"2026-10-18T00:15:43.670822909Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty"}
{"Time":"2026-10-18T00:15:43.670829041Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty\n"}
{"Time":"2026-10-18T00:15:43.671050565Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.671073505Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/empty","Elapsed":0}
{"Time":"2026-10-18T00:15:43.671081395Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client"}
{"Time":"2026-10-18T00:15:43.671104569Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client\n"}
{"Time":"2026-10-18T00:15:43.671357179Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.671373229Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/other-client","Elapsed":0}
{"Time":"2026-10-18T00:15:43.671380723Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number"}
{"Time":"2026-10-18T00:15:43.671386692Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/number\n"}
{"Time":"2026-10-18T00:15:43.671641204Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/number (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.671657282Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/number","Elapsed":0}
{"Time":"2026-10-18T00:15:43.671663846Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array"}
{"Time":"2026-10-18T00:15:43.67166923Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Output":"=== RUN TestAccessEngineAuthorizedPartyRefusesAnotherClient/array\n"}
{"Time":"2026-10-18T00:15:43.671937105Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient/array (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.671957836Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient/array","Elapsed":0}
{"Time":"2026-10-18T00:15:43.672087774Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Output":"--- PASS: TestAccessEngineAuthorizedPartyRefusesAnotherClient (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.672099208Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyRefusesAnotherClient","Elapsed":0}
{"Time":"2026-10-18T00:15:43.672105755Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient"}
{"Time":"2026-10-18T00:15:43.672111183Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Output":"=== RUN TestAccessEngineAuthorizedPartyAcceptsAdmittedClient\n"}
{"Time":"2026-10-18T00:15:43.67242786Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Output":"--- PASS: TestAccessEngineAuthorizedPartyAcceptsAdmittedClient (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.672451765Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineAuthorizedPartyAcceptsAdmittedClient","Elapsed":0}
{"Time":"2026-10-18T00:15:43.672459564Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision"}
{"Time":"2026-10-18T00:15:43.672480403Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision\n"}
{"Time":"2026-10-18T00:15:43.672490575Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins"}
{"Time":"2026-10-18T00:15:43.672495931Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins\n"}
{"Time":"2026-10-18T00:15:43.686861682Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.686917634Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-admins","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.686930231Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners"}
{"Time":"2026-10-18T00:15:43.686937283Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners\n"}
{"Time":"2026-10-18T00:15:43.693908491Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.693966165Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-owners","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.693997022Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers"}
{"Time":"2026-10-18T00:15:43.694005516Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Output":"=== RUN TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers\n"}
{"Time":"2026-10-18T00:15:43.700179137Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.700232889Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision/forge-coulomb-readers","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.700247362Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Output":"--- PASS: TestAccessEngineActualCallbackAllowsAuthenticatedDecision (0.03s)\n"}
{"Time":"2026-10-18T00:15:43.700256208Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackAllowsAuthenticatedDecision","Elapsed":0.03}
{"Time":"2026-10-18T00:15:43.700269274Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP"}
{"Time":"2026-10-18T00:15:43.700276776Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP\n"}
{"Time":"2026-10-18T00:15:43.700300338Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny"}
{"Time":"2026-10-18T00:15:43.700307137Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny\n"}
{"Time":"2026-10-18T00:15:43.708082578Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.708127376Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/deny","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.708136492Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned"}
{"Time":"2026-10-18T00:15:43.708143111Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned\n"}
{"Time":"2026-10-18T00:15:43.714997518Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.715034336Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/unsigned","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.715042956Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key"}
{"Time":"2026-10-18T00:15:43.715046807Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key\n"}
{"Time":"2026-10-18T00:15:43.721829179Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.721879955Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-key","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.721889964Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin"}
{"Time":"2026-10-18T00:15:43.721896114Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin\n"}
{"Time":"2026-10-18T00:15:43.728950492Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.728998887Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-pin","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.72900859Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding"}
{"Time":"2026-10-18T00:15:43.729014343Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding\n"}
{"Time":"2026-10-18T00:15:43.735938579Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.735983927Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/wrong-binding","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.735997904Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired"}
{"Time":"2026-10-18T00:15:43.736004766Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Output":"=== RUN TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired\n"}
{"Time":"2026-10-18T00:15:43.743488993Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.743535143Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP/expired","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.74354674Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Output":"--- PASS: TestAccessEngineActualCallbackRefusesUnverifiedPDP (0.04s)\n"}
{"Time":"2026-10-18T00:15:43.743553872Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackRefusesUnverifiedPDP","Elapsed":0.04}
{"Time":"2026-10-18T00:15:43.743560356Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP"}
{"Time":"2026-10-18T00:15:43.743567272Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP\n"}
{"Time":"2026-10-18T00:15:43.74357344Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token"}
{"Time":"2026-10-18T00:15:43.743578913Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token\n"}
{"Time":"2026-10-18T00:15:43.744633562Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.744662696Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-token","Elapsed":0}
{"Time":"2026-10-18T00:15:43.744670244Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user"}
{"Time":"2026-10-18T00:15:43.744675068Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user\n"}
{"Time":"2026-10-18T00:15:43.745808366Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.745854038Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-user","Elapsed":0}
{"Time":"2026-10-18T00:15:43.745877871Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject"}
{"Time":"2026-10-18T00:15:43.745885003Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject\n"}
{"Time":"2026-10-18T00:15:43.747057624Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.74710373Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/mismatched-subject","Elapsed":0}
{"Time":"2026-10-18T00:15:43.74711364Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source"}
{"Time":"2026-10-18T00:15:43.747119744Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source\n"}
{"Time":"2026-10-18T00:15:43.748497365Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.748546842Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-source","Elapsed":0}
{"Time":"2026-10-18T00:15:43.748557176Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider"}
{"Time":"2026-10-18T00:15:43.748563344Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider\n"}
{"Time":"2026-10-18T00:15:43.749738517Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.749775055Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-provider","Elapsed":0}
{"Time":"2026-10-18T00:15:43.749782873Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience"}
{"Time":"2026-10-18T00:15:43.749787607Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience\n"}
{"Time":"2026-10-18T00:15:43.751188013Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.751233982Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/wrong-audience","Elapsed":0}
{"Time":"2026-10-18T00:15:43.751469143Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission"}
{"Time":"2026-10-18T00:15:43.751491308Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission\n"}
{"Time":"2026-10-18T00:15:43.752751863Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.752778518Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-admission","Elapsed":0}
{"Time":"2026-10-18T00:15:43.752785849Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token"}
{"Time":"2026-10-18T00:15:43.752790592Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token\n"}
{"Time":"2026-10-18T00:15:43.75394837Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.753998776Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/expired-token","Elapsed":0}
{"Time":"2026-10-18T00:15:43.754008371Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups"}
{"Time":"2026-10-18T00:15:43.754014692Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups\n"}
{"Time":"2026-10-18T00:15:43.75540131Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.755443763Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/missing-groups","Elapsed":0}
{"Time":"2026-10-18T00:15:43.755464043Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity"}
{"Time":"2026-10-18T00:15:43.75547894Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Output":"=== RUN TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity\n"}
{"Time":"2026-10-18T00:15:43.756459556Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.756495111Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP/untrusted-identity","Elapsed":0}
{"Time":"2026-10-18T00:15:43.756504381Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Output":"--- PASS: TestAccessEngineActualCallbackChecksIdentityBeforePDP (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.756516013Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestAccessEngineActualCallbackChecksIdentityBeforePDP","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.756540874Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE"}
{"Time":"2026-10-18T00:15:43.756549855Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE\n"}
{"Time":"2026-10-18T00:15:43.756865558Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer"}
{"Time":"2026-10-18T00:15:43.756888281Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/issuer\n"}
{"Time":"2026-10-18T00:15:43.757166175Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/issuer (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.757183461Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/issuer","Elapsed":0}
{"Time":"2026-10-18T00:15:43.757190801Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience"}
{"Time":"2026-10-18T00:15:43.757196473Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/audience\n"}
{"Time":"2026-10-18T00:15:43.757460714Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/audience (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.757476296Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/audience","Elapsed":0}
{"Time":"2026-10-18T00:15:43.757482563Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired"}
{"Time":"2026-10-18T00:15:43.757487378Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/expired\n"}
{"Time":"2026-10-18T00:15:43.757789979Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/expired (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.757827301Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/expired","Elapsed":0}
{"Time":"2026-10-18T00:15:43.757834173Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat"}
{"Time":"2026-10-18T00:15:43.757839466Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-iat\n"}
{"Time":"2026-10-18T00:15:43.758044536Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-iat (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.758063382Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-iat","Elapsed":0}
{"Time":"2026-10-18T00:15:43.758072363Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant"}
{"Time":"2026-10-18T00:15:43.758077548Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-tenant\n"}
{"Time":"2026-10-18T00:15:43.758425109Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-tenant (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.758449708Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-tenant","Elapsed":0}
{"Time":"2026-10-18T00:15:43.758460421Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal"}
{"Time":"2026-10-18T00:15:43.758467012Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-principal\n"}
{"Time":"2026-10-18T00:15:43.758798694Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-principal (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.758812409Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-principal","Elapsed":0}
{"Time":"2026-10-18T00:15:43.758817711Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance"}
{"Time":"2026-10-18T00:15:43.75882176Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-assurance\n"}
{"Time":"2026-10-18T00:15:43.759075532Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-assurance (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.75908914Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-assurance","Elapsed":0}
{"Time":"2026-10-18T00:15:43.759094469Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp"}
{"Time":"2026-10-18T00:15:43.759098445Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp\n"}
{"Time":"2026-10-18T00:15:43.75936596Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.75937926Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/multi-audience-no-azp","Elapsed":0}
{"Time":"2026-10-18T00:15:43.759385104Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued"}
{"Time":"2026-10-18T00:15:43.75938908Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/future-issued\n"}
{"Time":"2026-10-18T00:15:43.759630138Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/future-issued (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.759641807Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/future-issued","Elapsed":0}
{"Time":"2026-10-18T00:15:43.759660842Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued"}
{"Time":"2026-10-18T00:15:43.75966829Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/old-issued\n"}
{"Time":"2026-10-18T00:15:43.7599331Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/old-issued (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.759945625Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/old-issued","Elapsed":0}
{"Time":"2026-10-18T00:15:43.759952758Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp"}
{"Time":"2026-10-18T00:15:43.759956806Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/no-exp\n"}
{"Time":"2026-10-18T00:15:43.760238316Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/no-exp (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.760252843Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/no-exp","Elapsed":0}
{"Time":"2026-10-18T00:15:43.760260029Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject"}
{"Time":"2026-10-18T00:15:43.760266386Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/empty-subject\n"}
{"Time":"2026-10-18T00:15:43.760524911Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/empty-subject (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.760554397Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/empty-subject","Elapsed":0}
{"Time":"2026-10-18T00:15:43.760580448Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key"}
{"Time":"2026-10-18T00:15:43.760588013Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/wrong-key\n"}
{"Time":"2026-10-18T00:15:43.76089845Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/wrong-key (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.760916025Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-key","Elapsed":0}
{"Time":"2026-10-18T00:15:43.760922436Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key"}
{"Time":"2026-10-18T00:15:43.760927305Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/unknown-key\n"}
{"Time":"2026-10-18T00:15:43.76110452Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/unknown-key (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.761136036Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/unknown-key","Elapsed":0}
{"Time":"2026-10-18T00:15:43.761143322Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type"}
{"Time":"2026-10-18T00:15:43.76115004Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/wrong-type\n"}
{"Time":"2026-10-18T00:15:43.761296808Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/wrong-type (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.761319216Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/wrong-type","Elapsed":0}
{"Time":"2026-10-18T00:15:43.761402884Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion"}
{"Time":"2026-10-18T00:15:43.761419386Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion\n"}
{"Time":"2026-10-18T00:15:43.76153744Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.761562355Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/algorithm-confusion","Elapsed":0}
{"Time":"2026-10-18T00:15:43.761574879Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none"}
{"Time":"2026-10-18T00:15:43.76158478Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Output":"=== RUN TestVerifiedApplicationIdentityActualJOSE/none\n"}
{"Time":"2026-10-18T00:15:43.761750267Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE/none (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.761768166Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE/none","Elapsed":0}
{"Time":"2026-10-18T00:15:43.761775705Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Output":"--- PASS: TestVerifiedApplicationIdentityActualJOSE (0.01s)\n"}
{"Time":"2026-10-18T00:15:43.761782287Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestVerifiedApplicationIdentityActualJOSE","Elapsed":0.01}
{"Time":"2026-10-18T00:15:43.761893856Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation"}
{"Time":"2026-10-18T00:15:43.761907553Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Output":"=== RUN TestRequiredClaimExactAnyOfAndNoMutation\n"}
{"Time":"2026-10-18T00:15:43.762048661Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Output":"--- PASS: TestRequiredClaimExactAnyOfAndNoMutation (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.762077453Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimExactAnyOfAndNoMutation","Elapsed":0}
{"Time":"2026-10-18T00:15:43.762118698Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation"}
{"Time":"2026-10-18T00:15:43.76213272Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Output":"=== RUN TestRequiredClaimConfigurationRefusalsAndLegacyIsolation\n"}
{"Time":"2026-10-18T00:15:43.762153811Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Output":"--- PASS: TestRequiredClaimConfigurationRefusalsAndLegacyIsolation (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.762219637Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestRequiredClaimConfigurationRefusalsAndLegacyIsolation","Elapsed":0}
{"Time":"2026-10-18T00:15:43.762242974Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable"}
{"Time":"2026-10-18T00:15:43.762259358Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Output":"=== RUN TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable\n"}
{"Time":"2026-10-18T00:15:43.766075105Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Output":"--- PASS: TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.766130967Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardRejectsMissingMalformedAndUnavailable","Elapsed":0}
{"Time":"2026-10-18T00:15:43.766145665Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval"}
{"Time":"2026-10-18T00:15:43.766152735Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Output":"=== RUN TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval\n"}
{"Time":"2026-10-18T00:15:43.766163528Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Output":"--- PASS: TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.766184304Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoEmptyArrayOverwritesAndGroupRemoval","Elapsed":0}
{"Time":"2026-10-18T00:15:43.766289166Z","Action":"run","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse"}
{"Time":"2026-10-18T00:15:43.766302682Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Output":"=== RUN TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse\n"}
{"Time":"2026-10-18T00:15:43.766313296Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Output":"--- PASS: TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse (0.00s)\n"}
{"Time":"2026-10-18T00:15:43.766320113Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Test":"TestCurrentUserInfoGuardIsOptInAndRedirectsRefuse","Elapsed":0}
{"Time":"2026-10-18T00:15:43.766440845Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"PASS\n"}
{"Time":"2026-10-18T00:15:43.772654532Z","Action":"output","Package":"forgejo.org/services/auth/source/oauth2","Output":"ok \tforgejo.org/services/auth/source/oauth2\t0.197s\n"}
{"Time":"2026-10-18T00:15:43.772706543Z","Action":"pass","Package":"forgejo.org/services/auth/source/oauth2","Elapsed":0.198}
{"Time":"2026-10-18T00:16:03.440342138Z","Action":"start","Package":"forgejo.org/cmd"}
{"Time":"2026-10-18T00:16:03.646190141Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...s/storage/storage.go:157:initAttachments() [I] Initialising Attachment storage with type: local\n"}
{"Time":"2026-10-18T00:16:03.646282126Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata3921882286/attachments\n"}
{"Time":"2026-10-18T00:16:03.646293091Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...s/storage/storage.go:147:initAvatars() [I] Initialising Avatar storage with type: local\n"}
{"Time":"2026-10-18T00:16:03.646298411Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata3921882286/avatars\n"}
{"Time":"2026-10-18T00:16:03.646303208Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...s/storage/storage.go:173:initRepoAvatars() [I] Initialising Repository Avatar storage with type: local\n"}
{"Time":"2026-10-18T00:16:03.646308663Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata3921882286/repo-avatars\n"}
{"Time":"2026-10-18T00:16:03.646315444Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...s/storage/storage.go:179:initRepoArchives() [I] Initialising Repository Archive storage with type: local\n"}
{"Time":"2026-10-18T00:16:03.646321847Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata3921882286/repo-archive\n"}
{"Time":"2026-10-18T00:16:03.646337915Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...s/storage/storage.go:189:initPackages() [I] Initialising Packages storage with type: local\n"}
{"Time":"2026-10-18T00:16:03.646345535Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata3921882286/packages\n"}
{"Time":"2026-10-18T00:16:03.646351982Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...s/storage/storage.go:200:initActions() [I] Initialising Actions storage with type: local\n"}
{"Time":"2026-10-18T00:16:03.646358998Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata3921882286/actions_log\n"}
{"Time":"2026-10-18T00:16:03.646378421Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...s/storage/storage.go:204:initActions() [I] Initialising ActionsArtifacts storage with type: local\n"}
{"Time":"2026-10-18T00:16:03.646394345Z","Action":"output","Package":"forgejo.org/cmd","Output":"2026/10/18 00:16:03 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/go-build2892200762/b1034/data/actions_artifacts\n"}
{"Time":"2026-10-18T00:16:03.788117665Z","Action":"run","Package":"forgejo.org/cmd","Test":"TestPrivateSecretMetadata"}
{"Time":"2026-10-18T00:16:03.788180443Z","Action":"output","Package":"forgejo.org/cmd","Test":"TestPrivateSecretMetadata","Output":"=== RUN TestPrivateSecretMetadata\n"}
{"Time":"2026-10-18T00:16:03.788200623Z","Action":"output","Package":"forgejo.org/cmd","Test":"TestPrivateSecretMetadata","Output":"--- PASS: TestPrivateSecretMetadata (0.00s)\n"}
{"Time":"2026-10-18T00:16:03.788213275Z","Action":"pass","Package":"forgejo.org/cmd","Test":"TestPrivateSecretMetadata","Elapsed":0}
{"Time":"2026-10-18T00:16:03.788225718Z","Action":"run","Package":"forgejo.org/cmd","Test":"TestPrivateSecretOpenedFileReplacement"}
{"Time":"2026-10-18T00:16:03.788231625Z","Action":"output","Package":"forgejo.org/cmd","Test":"TestPrivateSecretOpenedFileReplacement","Output":"=== RUN TestPrivateSecretOpenedFileReplacement\n"}
{"Time":"2026-10-18T00:16:03.788270254Z","Action":"output","Package":"forgejo.org/cmd","Test":"TestPrivateSecretOpenedFileReplacement","Output":"--- PASS: TestPrivateSecretOpenedFileReplacement (0.00s)\n"}
{"Time":"2026-10-18T00:16:03.788298803Z","Action":"pass","Package":"forgejo.org/cmd","Test":"TestPrivateSecretOpenedFileReplacement","Elapsed":0}
{"Time":"2026-10-18T00:16:03.788747818Z","Action":"output","Package":"forgejo.org/cmd","Output":"PASS\n"}
{"Time":"2026-10-18T00:16:03.81110796Z","Action":"output","Package":"forgejo.org/cmd","Output":"ok \tforgejo.org/cmd\t0.371s\n"}
{"Time":"2026-10-18T00:16:03.811162677Z","Action":"pass","Package":"forgejo.org/cmd","Elapsed":0.371}
{"Time":"2026-10-18T00:16:07.646758443Z","Action":"start","Package":"forgejo.org/models/auth"}
{"Time":"2026-10-18T00:16:07.791793795Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...s/storage/storage.go:157:initAttachments() [I] Initialising Attachment storage with type: local\n"}
{"Time":"2026-10-18T00:16:07.791886032Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2283251498/attachments\n"}
{"Time":"2026-10-18T00:16:07.791901939Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...s/storage/storage.go:147:initAvatars() [I] Initialising Avatar storage with type: local\n"}
{"Time":"2026-10-18T00:16:07.791913445Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2283251498/avatars\n"}
{"Time":"2026-10-18T00:16:07.791924067Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...s/storage/storage.go:173:initRepoAvatars() [I] Initialising Repository Avatar storage with type: local\n"}
{"Time":"2026-10-18T00:16:07.791936538Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2283251498/repo-avatars\n"}
{"Time":"2026-10-18T00:16:07.791946881Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...s/storage/storage.go:179:initRepoArchives() [I] Initialising Repository Archive storage with type: local\n"}
{"Time":"2026-10-18T00:16:07.79195652Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2283251498/repo-archive\n"}
{"Time":"2026-10-18T00:16:07.791965645Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...s/storage/storage.go:189:initPackages() [I] Initialising Packages storage with type: local\n"}
{"Time":"2026-10-18T00:16:07.791978856Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2283251498/packages\n"}
{"Time":"2026-10-18T00:16:07.791989036Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...s/storage/storage.go:200:initActions() [I] Initialising Actions storage with type: local\n"}
{"Time":"2026-10-18T00:16:07.791998982Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2283251498/actions_log\n"}
{"Time":"2026-10-18T00:16:07.79200845Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...s/storage/storage.go:204:initActions() [I] Initialising ActionsArtifacts storage with type: local\n"}
{"Time":"2026-10-18T00:16:07.792021841Z","Action":"output","Package":"forgejo.org/models/auth","Output":"2026/10/18 00:16:07 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/go-build2892200762/b1314/data/actions_artifacts\n"}
{"Time":"2026-10-18T00:16:07.887790393Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationDatabaseWriterExclusion"}
{"Time":"2026-10-18T00:16:07.887848591Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationDatabaseWriterExclusion","Output":"=== RUN TestSourceOperationDatabaseWriterExclusion\n"}
{"Time":"2026-10-18T00:16:07.988905121Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationDatabaseWriterExclusion","Output":"--- PASS: TestSourceOperationDatabaseWriterExclusion (0.10s)\n"}
{"Time":"2026-10-18T00:16:07.988948143Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationDatabaseWriterExclusion","Elapsed":0.1}
{"Time":"2026-10-18T00:16:07.988958449Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesActualXORMArgumentLogging"}
{"Time":"2026-10-18T00:16:07.988962733Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesActualXORMArgumentLogging","Output":"=== RUN TestSourceOperationRefusesActualXORMArgumentLogging\n"}
{"Time":"2026-10-18T00:16:07.98915366Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesActualXORMArgumentLogging","Output":"[xorm] [info] 2026/10/18 00:16:07.989063 [SQL] BEGIN TRANSACTION [] - 47.034µs\n"}
{"Time":"2026-10-18T00:16:07.989170143Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesActualXORMArgumentLogging","Output":"[xorm] [info] 2026/10/18 00:16:07.989116 [SQL] ROLLBACK [] - 13.445µs\n"}
{"Time":"2026-10-18T00:16:07.989177727Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesActualXORMArgumentLogging","Output":"--- PASS: TestSourceOperationRefusesActualXORMArgumentLogging (0.00s)\n"}
{"Time":"2026-10-18T00:16:07.989182641Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesActualXORMArgumentLogging","Elapsed":0}
{"Time":"2026-10-18T00:16:07.990168605Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationProcessRecovery"}
{"Time":"2026-10-18T00:16:07.990181311Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationProcessRecovery","Output":"=== RUN TestSourceOperationProcessRecovery\n"}
{"Time":"2026-10-18T00:16:09.750143033Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationProcessRecovery","Output":"--- PASS: TestSourceOperationProcessRecovery (1.76s)\n"}
{"Time":"2026-10-18T00:16:09.750188822Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationProcessRecovery","Elapsed":1.76}
{"Time":"2026-10-18T00:16:09.750201663Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationCreateAndInverse"}
{"Time":"2026-10-18T00:16:09.750207587Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationCreateAndInverse","Output":"=== RUN TestSourceOperationCreateAndInverse\n"}
{"Time":"2026-10-18T00:16:09.773066493Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationCreateAndInverse","Output":"--- PASS: TestSourceOperationCreateAndInverse (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.773118297Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationCreateAndInverse","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.773127711Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRestoresExactRawPreexisting"}
{"Time":"2026-10-18T00:16:09.773132193Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRestoresExactRawPreexisting","Output":"=== RUN TestSourceOperationRestoresExactRawPreexisting\n"}
{"Time":"2026-10-18T00:16:09.792689764Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRestoresExactRawPreexisting","Output":"--- PASS: TestSourceOperationRestoresExactRawPreexisting (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.792745508Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRestoresExactRawPreexisting","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.792780901Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationUnchangedNeverDeletesPreexisting"}
{"Time":"2026-10-18T00:16:09.792789179Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationUnchangedNeverDeletesPreexisting","Output":"=== RUN TestSourceOperationUnchangedNeverDeletesPreexisting\n"}
{"Time":"2026-10-18T00:16:09.812408416Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationUnchangedNeverDeletesPreexisting","Output":"--- PASS: TestSourceOperationUnchangedNeverDeletesPreexisting (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.812453421Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationUnchangedNeverDeletesPreexisting","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.812461916Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses"}
{"Time":"2026-10-18T00:16:09.812466749Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses","Output":"=== RUN TestSourceOperationPrivateDriftRefuses\n"}
{"Time":"2026-10-18T00:16:09.812666349Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses/before-apply"}
{"Time":"2026-10-18T00:16:09.81270065Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses/before-apply","Output":"=== RUN TestSourceOperationPrivateDriftRefuses/before-apply\n"}
{"Time":"2026-10-18T00:16:09.828603572Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses/before-apply","Output":"--- PASS: TestSourceOperationPrivateDriftRefuses/before-apply (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.828651309Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses/before-apply","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.82865956Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses/before-inverse"}
{"Time":"2026-10-18T00:16:09.828664204Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses/before-inverse","Output":"=== RUN TestSourceOperationPrivateDriftRefuses/before-inverse\n"}
{"Time":"2026-10-18T00:16:09.848138125Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses/before-inverse","Output":"--- PASS: TestSourceOperationPrivateDriftRefuses/before-inverse (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.848202977Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses/before-inverse","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.848212274Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses","Output":"--- PASS: TestSourceOperationPrivateDriftRefuses (0.04s)\n"}
{"Time":"2026-10-18T00:16:09.848217612Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPrivateDriftRefuses","Elapsed":0.04}
{"Time":"2026-10-18T00:16:09.848226052Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationStockCRUDDriftRefuses"}
{"Time":"2026-10-18T00:16:09.848231003Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationStockCRUDDriftRefuses","Output":"=== RUN TestSourceOperationStockCRUDDriftRefuses\n"}
{"Time":"2026-10-18T00:16:09.868145825Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationStockCRUDDriftRefuses","Output":"--- PASS: TestSourceOperationStockCRUDDriftRefuses (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.868200605Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationStockCRUDDriftRefuses","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.868212499Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion"}
{"Time":"2026-10-18T00:16:09.868219Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion","Output":"=== RUN TestSourceOperationLinkedSourceRefusesDeletion\n"}
{"Time":"2026-10-18T00:16:09.868238883Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion/user"}
{"Time":"2026-10-18T00:16:09.868242553Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion/user","Output":"=== RUN TestSourceOperationLinkedSourceRefusesDeletion/user\n"}
{"Time":"2026-10-18T00:16:09.885068632Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion/user","Output":"--- PASS: TestSourceOperationLinkedSourceRefusesDeletion/user (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.885109741Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion/user","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.88512003Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion/external"}
{"Time":"2026-10-18T00:16:09.885125287Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion/external","Output":"=== RUN TestSourceOperationLinkedSourceRefusesDeletion/external\n"}
{"Time":"2026-10-18T00:16:09.901962868Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion/external","Output":"--- PASS: TestSourceOperationLinkedSourceRefusesDeletion/external (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.902024303Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion/external","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.902037658Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion","Output":"--- PASS: TestSourceOperationLinkedSourceRefusesDeletion (0.03s)\n"}
{"Time":"2026-10-18T00:16:09.902045457Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationLinkedSourceRefusesDeletion","Elapsed":0.03}
{"Time":"2026-10-18T00:16:09.90206002Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPreparedCancellationAndIDReuse"}
{"Time":"2026-10-18T00:16:09.902072681Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPreparedCancellationAndIDReuse","Output":"=== RUN TestSourceOperationPreparedCancellationAndIDReuse\n"}
{"Time":"2026-10-18T00:16:09.920990725Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPreparedCancellationAndIDReuse","Output":"--- PASS: TestSourceOperationPreparedCancellationAndIDReuse (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.921036425Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationPreparedCancellationAndIDReuse","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.921048093Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRejectsUnsafeRuntime"}
{"Time":"2026-10-18T00:16:09.921056885Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRejectsUnsafeRuntime","Output":"=== RUN TestSourceOperationRejectsUnsafeRuntime\n"}
{"Time":"2026-10-18T00:16:09.937535281Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRejectsUnsafeRuntime","Output":"--- PASS: TestSourceOperationRejectsUnsafeRuntime (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.937580061Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRejectsUnsafeRuntime","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.937597401Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesSharedManagedSource"}
{"Time":"2026-10-18T00:16:09.937602216Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesSharedManagedSource","Output":"=== RUN TestSourceOperationRefusesSharedManagedSource\n"}
{"Time":"2026-10-18T00:16:09.953721111Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesSharedManagedSource","Output":"--- PASS: TestSourceOperationRefusesSharedManagedSource (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.953803285Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRefusesSharedManagedSource","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.953813501Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationBoundsPrivateJournalCustody"}
{"Time":"2026-10-18T00:16:09.953818957Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationBoundsPrivateJournalCustody","Output":"=== RUN TestSourceOperationBoundsPrivateJournalCustody\n"}
{"Time":"2026-10-18T00:16:09.969487139Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationBoundsPrivateJournalCustody","Output":"--- PASS: TestSourceOperationBoundsPrivateJournalCustody (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.969533605Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationBoundsPrivateJournalCustody","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.969542712Z","Action":"run","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRequiresExactPostState"}
{"Time":"2026-10-18T00:16:09.969548186Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRequiresExactPostState","Output":"=== RUN TestSourceOperationRequiresExactPostState\n"}
{"Time":"2026-10-18T00:16:09.988705955Z","Action":"output","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRequiresExactPostState","Output":"--- PASS: TestSourceOperationRequiresExactPostState (0.02s)\n"}
{"Time":"2026-10-18T00:16:09.988752348Z","Action":"pass","Package":"forgejo.org/models/auth","Test":"TestSourceOperationRequiresExactPostState","Elapsed":0.02}
{"Time":"2026-10-18T00:16:09.989169316Z","Action":"output","Package":"forgejo.org/models/auth","Output":"PASS\n"}
{"Time":"2026-10-18T00:16:10.01551221Z","Action":"output","Package":"forgejo.org/models/auth","Output":"ok \tforgejo.org/models/auth\t2.369s\n"}
{"Time":"2026-10-18T00:16:10.015557332Z","Action":"pass","Package":"forgejo.org/models/auth","Elapsed":2.3689999999999998}
{"Time":"2026-10-18T00:16:31.880928791Z","Action":"start","Package":"forgejo.org/models/db"}
{"Time":"2026-10-18T00:16:32.249398731Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...s/storage/storage.go:157:initAttachments() [I] Initialising Attachment storage with type: local\n"}
{"Time":"2026-10-18T00:16:32.249570041Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2863400786/attachments\n"}
{"Time":"2026-10-18T00:16:32.249587498Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...s/storage/storage.go:147:initAvatars() [I] Initialising Avatar storage with type: local\n"}
{"Time":"2026-10-18T00:16:32.249601809Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2863400786/avatars\n"}
{"Time":"2026-10-18T00:16:32.249611069Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...s/storage/storage.go:173:initRepoAvatars() [I] Initialising Repository Avatar storage with type: local\n"}
{"Time":"2026-10-18T00:16:32.249619753Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2863400786/repo-avatars\n"}
{"Time":"2026-10-18T00:16:32.249628951Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...s/storage/storage.go:179:initRepoArchives() [I] Initialising Repository Archive storage with type: local\n"}
{"Time":"2026-10-18T00:16:32.249637265Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2863400786/repo-archive\n"}
{"Time":"2026-10-18T00:16:32.249661295Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...s/storage/storage.go:189:initPackages() [I] Initialising Packages storage with type: local\n"}
{"Time":"2026-10-18T00:16:32.249668347Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2863400786/packages\n"}
{"Time":"2026-10-18T00:16:32.249741747Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...s/storage/storage.go:200:initActions() [I] Initialising Actions storage with type: local\n"}
{"Time":"2026-10-18T00:16:32.24975833Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/appdata2863400786/actions_log\n"}
{"Time":"2026-10-18T00:16:32.249765183Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...s/storage/storage.go:204:initActions() [I] Initialising ActionsArtifacts storage with type: local\n"}
{"Time":"2026-10-18T00:16:32.249774228Z","Action":"output","Package":"forgejo.org/models/db","Output":"2026/10/18 00:16:32 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at /tmp/go-build2892200762/b1335/data/actions_artifacts\n"}
{"Time":"2026-10-18T00:16:32.434709746Z","Action":"run","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine"}
{"Time":"2026-10-18T00:16:32.434778421Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine","Output":"=== RUN TestSensitiveSQLLoggingChecksUnderlyingEngine\n"}
{"Time":"2026-10-18T00:16:32.434817601Z","Action":"run","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine/engine"}
{"Time":"2026-10-18T00:16:32.434825581Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine/engine","Output":"=== RUN TestSensitiveSQLLoggingChecksUnderlyingEngine/engine\n"}
{"Time":"2026-10-18T00:16:32.434913175Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine/engine","Output":"--- PASS: TestSensitiveSQLLoggingChecksUnderlyingEngine/engine (0.00s)\n"}
{"Time":"2026-10-18T00:16:32.43494029Z","Action":"pass","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine/engine","Elapsed":0}
{"Time":"2026-10-18T00:16:32.434960471Z","Action":"run","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine/session"}
{"Time":"2026-10-18T00:16:32.43497048Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine/session","Output":"=== RUN TestSensitiveSQLLoggingChecksUnderlyingEngine/session\n"}
{"Time":"2026-10-18T00:16:32.435015187Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine/session","Output":"--- PASS: TestSensitiveSQLLoggingChecksUnderlyingEngine/session (0.00s)\n"}
{"Time":"2026-10-18T00:16:32.435030426Z","Action":"pass","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine/session","Elapsed":0}
{"Time":"2026-10-18T00:16:32.435045999Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine","Output":"--- PASS: TestSensitiveSQLLoggingChecksUnderlyingEngine (0.00s)\n"}
{"Time":"2026-10-18T00:16:32.435057045Z","Action":"pass","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLLoggingChecksUnderlyingEngine","Elapsed":0}
{"Time":"2026-10-18T00:16:32.435356721Z","Action":"run","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLHooks"}
{"Time":"2026-10-18T00:16:32.43538637Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLHooks","Output":"=== RUN TestSensitiveSQLHooks\n"}
{"Time":"2026-10-18T00:16:32.441406542Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLHooks","Output":"--- PASS: TestSensitiveSQLHooks (0.01s)\n"}
{"Time":"2026-10-18T00:16:32.44153327Z","Action":"pass","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLHooks","Elapsed":0.01}
{"Time":"2026-10-18T00:16:32.441551746Z","Action":"run","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLActualContextPropagation"}
{"Time":"2026-10-18T00:16:32.441557112Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLActualContextPropagation","Output":"=== RUN TestSensitiveSQLActualContextPropagation\n"}
{"Time":"2026-10-18T00:16:32.447687295Z","Action":"output","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLActualContextPropagation","Output":"--- PASS: TestSensitiveSQLActualContextPropagation (0.01s)\n"}
{"Time":"2026-10-18T00:16:32.447730424Z","Action":"pass","Package":"forgejo.org/models/db","Test":"TestSensitiveSQLActualContextPropagation","Elapsed":0.01}
{"Time":"2026-10-18T00:16:32.448526539Z","Action":"output","Package":"forgejo.org/models/db","Output":"PASS\n"}
{"Time":"2026-10-18T00:16:32.492991898Z","Action":"output","Package":"forgejo.org/models/db","Output":"ok \tforgejo.org/models/db\t0.611s\n"}
{"Time":"2026-10-18T00:16:32.493097562Z","Action":"pass","Package":"forgejo.org/models/db","Elapsed":0.612}

View file

@ -0,0 +1,131 @@
package oauth2
import (
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"sync/atomic"
"testing"
"time"
"github.com/markbates/goth"
"github.com/markbates/goth/gothic"
"github.com/markbates/goth/providers/openidConnect"
)
func TestAccessEngineActualKeyCapeIssuer(t *testing.T) {
raw, err := os.ReadFile(os.Getenv("CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE"))
if err != nil {
t.Fatal("actual issuer fixture unavailable")
}
var fixture struct {
Token string `json:"id_token"`
Key string `json:"public_key_pem"`
Kid string `json:"kid"`
Issuer string `json:"issuer"`
Audience string `json:"audience"`
}
if json.Unmarshal(raw, &fixture) != nil {
t.Fatal("actual issuer fixture malformed")
}
admission, _, _, _ := identityFixture(t)
admission.Issuer = fixture.Issuer
admission.Audience = fixture.Audience
admission.AssuranceClaim = "assurance"
admission.Algorithms = []string{"RS256"}
admission.IdentityKeys = map[string]string{fixture.Kid: fixture.Key}
identity, err := VerifyApplicationIdentity(fixture.Token, admission, time.Now().UTC())
if err != nil {
t.Fatal("actual KeyCape token rejected by consumer", err)
}
if identity.Subject != "user:synthetic" || identity.Tenant != "tenant:synthetic" || identity.Assurance != "aal2" {
t.Fatal("actual issuer identity snapshot mismatch")
}
if identity.TenantSource != "directory" || identity.AssuranceData["source"] != "key-cape" || identity.AssuranceData["mfa"] != true || identity.AuthenticatedAt.IsZero() {
t.Fatal("actual issuer assurance or tenant provenance lost")
}
for _, mode := range []string{"allow", "deny"} {
t.Run(mode, func(t *testing.T) {
source, user, calls := callbackFixtureWithIdentity(t, "forge-admins", mode, &admission, fixture.Token)
user.RawData["assurance"] = map[string]any{"level": "aal1", "source": "attacker"}
user.RawData["tenant_source"] = "attacker"
got, err := source.Callback(httptest.NewRequest(http.MethodGet, "https://forgejo.invalid/callback", nil), httptest.NewRecorder(), "")
if calls.Load() != 1 || (mode == "allow" && (err != nil || got.UserID != user.UserID)) || (mode == "deny" && (err == nil || got.UserID != "" || got.IDToken != "")) {
t.Fatalf("actual issuer callback failed decision enforcement: mode=%s requests=%d err=%v", mode, calls.Load(), err)
}
})
}
}
// The real provider creation/discovery, response guard and Goth FetchUser run.
// Only the browser's completed authorization-code session is synthetic. The ID
// token is unchanged output of the actual KeyCape handler fixture.
func TestAccessEngineActualKeyCapeProviderUserInfo(t *testing.T) {
var fixture struct {
Token string `json:"id_token"`
Key string `json:"public_key_pem"`
Kid string `json:"kid"`
Issuer string `json:"issuer"`
Audience string `json:"audience"`
}
raw, err := os.ReadFile(os.Getenv("CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE"))
if err != nil || json.Unmarshal(raw, &fixture) != nil {
t.Fatal("actual issuer fixture unavailable")
}
for _, mode := range []string{"allow", "missing-groups", "missing-subject", "wrong-subject", "malformed-groups"} {
t.Run(mode, func(t *testing.T) {
admission, _, _, _ := identityFixture(t)
admission.Issuer, admission.Audience = fixture.Issuer, fixture.Audience
admission.Algorithms = []string{"RS256"}
admission.IdentityKeys = map[string]string{fixture.Kid: fixture.Key}
source, _, calls := callbackFixtureWithIdentity(t, "forge-admins", "allow", &admission, fixture.Token)
var server *httptest.Server
lookups := new(atomic.Int64)
server = httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
if r.URL.Path == "/discovery" {
_ = json.NewEncoder(w).Encode(map[string]any{"issuer": fixture.Issuer,
"authorization_endpoint": server.URL + "/authorize", "token_endpoint": server.URL + "/token", "userinfo_endpoint": server.URL + "/userinfo"})
return
}
if r.URL.Path != "/userinfo" || r.Header.Get("Authorization") != "Bearer synthetic-userinfo" {
w.WriteHeader(http.StatusForbidden)
return
}
lookups.Add(1)
claims := map[string]any{"sub": "user:synthetic", "groups": []string{"forge-admins"},
"assurance": map[string]any{"level": "aal1", "source": "attacker"}, "tenant_source": "attacker"}
switch mode {
case "missing-groups":
delete(claims, "groups")
case "missing-subject":
delete(claims, "sub")
case "wrong-subject":
claims["sub"] = "other"
case "malformed-groups":
claims["groups"] = map[string]any{"forge-admins": true}
}
_ = json.NewEncoder(w).Encode(claims)
}))
t.Cleanup(server.Close)
previous := http.DefaultClient
http.DefaultClient = server.Client()
t.Cleanup(func() { http.DefaultClient = previous })
source.OpenIDConnectAutoDiscoveryURL = server.URL + "/discovery"
provider, err := (&OpenIDProvider{}).CreateGothProvider("synthetic-source", "https://forgejo.invalid/callback", source)
if err != nil {
t.Fatal("real provider creation refused")
}
// Exercise the actual provider's subject join, current group guard and
// UserInfo merge before the real application callback verifies JOSE/PDP.
gothic.CompleteUserAuth = func(http.ResponseWriter, *http.Request) (goth.User, error) {
return provider.FetchUser(&openidConnect.Session{IDToken: fixture.Token, AccessToken: "synthetic-userinfo", ExpiresAt: time.Now().Add(time.Minute)})
}
got, err := source.Callback(httptest.NewRequest(http.MethodGet, "https://forgejo.invalid/callback", nil), httptest.NewRecorder(), "")
if lookups.Load() != 1 || (mode == "allow" && (err != nil || got.UserID != "user:synthetic" || calls.Load() != 1)) || (mode != "allow" && (err == nil || got.UserID != "" || calls.Load() != 0)) {
t.Fatalf("actual provider/callback boundary failed: mode=%s lookups=%d PDP=%d", mode, lookups.Load(), calls.Load())
}
})
}
}

View file

@ -0,0 +1,69 @@
{
"role": "coordinator technical source review",
"independent_owner_assent": false,
"issuer_source": "git:d803e9282a47b49daf930fb905312fa5104c0ace",
"producer_source": "git:ca0cb75729a63c9288b7333382d0fa3eb1e8c9a3",
"consumer_patch_sha256": "sha256:15cb7f13b1b1d1095cc344176ca337f705333a436a70ae803fcfd3d7f802ccf4",
"owner_source_commit": "git:3fb031a47ff5379358fd8cc230b40961b3b5d3a8",
"checks": [
{
"claim": "Actual issuer format, not a modified token fixture",
"evidence": [
"issuer_fixture_test.go",
"issuer-fixture-result-attempt5.json",
"consumer-after-attempt3.json"
]
},
{
"claim": "Admitted JOSE keys/issuer/audience/type, authentication freshness and provenance preserved",
"evidence": [
"consumer-source/access_engine.go",
"consumer-source/access_engine_assurance.go",
"consumer-source/access_engine_assurance_test.go"
]
},
{
"claim": "Original current UserInfo subject join remains enforced by the actual pinned Goth library",
"evidence": [
"consumer_wire_after_test.go",
"consumer-after-attempt3.json",
"actual-issuer-test-summary.json"
]
},
{
"claim": "Producer canonical/signature/client implementation is unchanged in the consumer slice",
"evidence": [
"producer-slice-parity.json"
]
},
{
"claim": "Complete composition replay and package results, including private SQL/session contexts",
"evidence": [
"composed-patch-verification.json",
"consumer-test-attempt1.json",
"selected-package-test-summary.json"
]
},
{
"claim": "Release recipe retains network/PID isolation and changes only patch selection and CLI flag verification",
"evidence": [
"release-source/tools/forgejo-release-build.py",
"owner-integration/source-application.json"
]
}
],
"historical_failures_preserved": [
"consumer-before.json",
"consumer-before.jsonl"
],
"remaining_existing_owner_work": {
"RAPPS-WP-0016-T07": "Chart/private mount admission and custody route acceptance",
"RAPPS-WP-0016-T08": "Current operation/inverse sessions; release-wide writer exclusion; durable private evidence/retention; PostgreSQL/native proof",
"RAPPS-WP-0016-T09": "Ongoing HTTP/API/Git/SSH protected paths and full native admission",
"NK-WP-0048-T39": "Exact complete release candidate acceptance",
"CUST-WP-0080-T04": "All sixteen native gates and all 116 SEC-DSM requirement entries remain in scope"
},
"native_admission": false,
"native_gates_closed": 0,
"authentication_fixture": "synthetic; no real browser, authenticator or credential acceptance"
}

View file

@ -0,0 +1,64 @@
"""Freeze all consumer paths against official source, then replay the patch."""
from pathlib import Path
import difflib
import hashlib
import json
import subprocess
import tarfile
import tempfile
HERE = Path(__file__).resolve().parent
BASE = HERE.parents[1] / 'netkingdom-target-2026-10-17/apps-access-engine-integration-r2'
ARCHIVE = Path('/tmp/custodian-forgejo-successor/forgejo-v11.0.3.tar.gz')
SOURCE = Path('/tmp/custodian-forgejo-successor-attempt2/source')
digest = lambda value: hashlib.sha256(value).hexdigest()
prior = json.loads((BASE / 'composed-source-inventory.json').read_text())
assert digest(ARCHIVE.read_bytes()) == prior['archive_sha256']
before, after = {}, {}
with tarfile.open(ARCHIVE) as tar:
for row in prior['files']:
name = row['path']
data = (SOURCE / name).read_bytes()
assert digest(data) == row['after_sha256'], name
after[name] = data
if row['before_sha256']:
before[name] = tar.extractfile('forgejo/' + name).read()
assert digest(before[name]) == row['before_sha256'], name
for path in sorted((HERE / 'consumer-source').glob('*.go')):
after['services/auth/source/oauth2/' + path.name] = path.read_bytes()
patch = ''.join(''.join(difflib.unified_diff(
before.get(name, b'').decode().splitlines(True), data.decode().splitlines(True),
fromfile='a/' + name if name in before else '/dev/null', tofile='b/' + name))
for name, data in sorted(after.items())).encode()
target = HERE / 'composed-forgejo-source.patch'
assert not target.exists()
target.write_bytes(patch)
manifest = dict(prior, status='source candidate with actual KeyCape assurance interoperability',
patch_sha256=digest(patch), issuer_source_commit='git:d803e9282a47b49daf930fb905312fa5104c0ace',
files=[dict(path=name, before_sha256=digest(before[name]) if name in before else None,
after_sha256=digest(data)) for name, data in sorted(after.items())])
manifest['open_gates'] = [
'Complete release rebuild and artifact verification with this exact patch.',
'Current authenticated operation/inverse sessions and release-wide writer exclusion.',
'Ongoing HTTP/API/Git/SSH authorization; native issuer/factor/custody acceptance.',
'Owner source/package/type admission; no operational authority granted by source tests.']
# Keep earlier limitations as historical evidence in the preceding immutable packet.
manifest.pop('known_open', None)
manifest.pop('known_gaps', None)
manifest.pop('known_open_work', None)
manifest['preceding_packet_tests'] = manifest.pop('tests')
manifest['actual_issuer_callback_tests'] = {'receipt': 'consumer-after-attempt2.json',
'passed_including_subtests': 71, 'skipped': 0, 'synthetic_authentication': True}
(HERE / 'composed-source-inventory.json').write_text(json.dumps(manifest, indent=2) + '\n')
work = Path(tempfile.mkdtemp(prefix='custodian-forgejo-replay-r3-'))
with tarfile.open(ARCHIVE) as tar:
tar.extractall(work, filter='data')
run = subprocess.run(['patch', '--fuzz=0', '-p1'], input=patch, cwd=work / 'forgejo', capture_output=True)
assert run.returncode == 0, 'patch replay refused; trial retained'
for name, data in after.items():
assert (work / 'forgejo' / name).read_bytes() == data, name
(HERE / 'composed-patch-verification.json').write_text(json.dumps(dict(
paths_verified=len(after), patch_sha256='sha256:' + digest(patch),
official_archive_sha256='sha256:' + prior['archive_sha256'], workspace=str(work),
fuzz=0, all_postimages_exact=True, native_changes=False), indent=2) + '\n')
print(json.dumps(dict(paths_verified=len(after), all_postimages_exact=True)))

View file

@ -0,0 +1,8 @@
{"Time":"2026-10-18T00:11:38.889231746Z","Action":"start","Package":"keycape/internal/server/oidc"}
{"Time":"2026-10-18T00:11:38.896073928Z","Action":"run","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture"}
{"Time":"2026-10-18T00:11:38.896118257Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"=== RUN TestCustodianForgejoIssuerFixture\n"}
{"Time":"2026-10-18T00:11:38.95533258Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"--- PASS: TestCustodianForgejoIssuerFixture (0.06s)\n"}
{"Time":"2026-10-18T00:11:38.955395196Z","Action":"pass","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Elapsed":0.06}
{"Time":"2026-10-18T00:11:38.955408027Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"PASS\n"}
{"Time":"2026-10-18T00:11:38.956724003Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"ok \tkeycape/internal/server/oidc\t0.067s\n"}
{"Time":"2026-10-18T00:11:38.956783075Z","Action":"pass","Package":"keycape/internal/server/oidc","Elapsed":0.068}

View file

@ -0,0 +1,8 @@
{"Time":"2026-10-18T00:13:28.644704987Z","Action":"start","Package":"keycape/internal/server/oidc"}
{"Time":"2026-10-18T00:13:28.649307407Z","Action":"run","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture"}
{"Time":"2026-10-18T00:13:28.649392251Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"=== RUN TestCustodianForgejoIssuerFixture\n"}
{"Time":"2026-10-18T00:13:28.781915301Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"--- PASS: TestCustodianForgejoIssuerFixture (0.13s)\n"}
{"Time":"2026-10-18T00:13:28.78200156Z","Action":"pass","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Elapsed":0.13}
{"Time":"2026-10-18T00:13:28.782130345Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"PASS\n"}
{"Time":"2026-10-18T00:13:28.783700245Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"ok \tkeycape/internal/server/oidc\t0.138s\n"}
{"Time":"2026-10-18T00:13:28.783731228Z","Action":"pass","Package":"keycape/internal/server/oidc","Elapsed":0.139}

View file

@ -0,0 +1,8 @@
{"Time":"2026-10-18T00:14:16.585308004Z","Action":"start","Package":"keycape/internal/server/oidc"}
{"Time":"2026-10-18T00:14:16.591080723Z","Action":"run","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture"}
{"Time":"2026-10-18T00:14:16.591155043Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"=== RUN TestCustodianForgejoIssuerFixture\n"}
{"Time":"2026-10-18T00:14:16.6497699Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"--- PASS: TestCustodianForgejoIssuerFixture (0.06s)\n"}
{"Time":"2026-10-18T00:14:16.649827854Z","Action":"pass","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Elapsed":0.06}
{"Time":"2026-10-18T00:14:16.649926755Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"PASS\n"}
{"Time":"2026-10-18T00:14:16.651240053Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"ok \tkeycape/internal/server/oidc\t0.065s\n"}
{"Time":"2026-10-18T00:14:16.651268015Z","Action":"pass","Package":"keycape/internal/server/oidc","Elapsed":0.066}

View file

@ -0,0 +1,8 @@
{"Time":"2026-10-18T00:23:37.657005968Z","Action":"start","Package":"keycape/internal/server/oidc"}
{"Time":"2026-10-18T00:23:37.683814198Z","Action":"run","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture"}
{"Time":"2026-10-18T00:23:37.683985725Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"=== RUN TestCustodianForgejoIssuerFixture\n"}
{"Time":"2026-10-18T00:23:38.374234818Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"--- PASS: TestCustodianForgejoIssuerFixture (0.69s)\n"}
{"Time":"2026-10-18T00:23:38.374318597Z","Action":"pass","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Elapsed":0.69}
{"Time":"2026-10-18T00:23:38.374448463Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"PASS\n"}
{"Time":"2026-10-18T00:23:38.377334073Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"ok \tkeycape/internal/server/oidc\t0.719s\n"}
{"Time":"2026-10-18T00:23:38.377405598Z","Action":"pass","Package":"keycape/internal/server/oidc","Elapsed":0.72}

View file

@ -0,0 +1,91 @@
{
"returncode": 0,
"seconds": 1.42,
"source_commit": "d803e9282a47b49daf930fb905312fa5104c0ace",
"source_token_go_sha256": "sha256:8422cc9dbd39c88dfe835b43f6262cb120bc0d2e5b08898a151167b7555368d3",
"workspace": "/tmp/custodian-keycape-wire-rw523gzp",
"argv": [
"bwrap",
"--unshare-net",
"--unshare-pid",
"--die-with-parent",
"--new-session",
"--ro-bind",
"/usr",
"/usr",
"--ro-bind",
"/lib",
"/lib",
"--ro-bind",
"/lib64",
"/lib64",
"--symlink",
"usr/bin",
"/bin",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--bind",
"/tmp/custodian-keycape-wire-rw523gzp",
"/work",
"--ro-bind",
"/home/worsch/go/pkg/mod",
"/modules",
"--ro-bind",
"/home/worsch/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.26.7.linux-amd64",
"/toolchain",
"--chdir",
"/work/src",
"--clearenv",
"--bind",
"/tmp/custodian-keycape-wire-rsi4f6hj/gocache",
"/work/gocache",
"--setenv",
"PATH",
"/toolchain/bin:/usr/bin:/bin",
"--setenv",
"HOME",
"/work/home",
"--setenv",
"GOTOOLCHAIN",
"local",
"--setenv",
"GOPROXY",
"off",
"--setenv",
"GOSUMDB",
"off",
"--setenv",
"GOMODCACHE",
"/modules",
"--setenv",
"GOCACHE",
"/work/gocache",
"--setenv",
"GOMAXPROCS",
"4",
"--setenv",
"CGO_ENABLED",
"0",
"--setenv",
"CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE",
"/work/identity.json",
"--",
"go",
"test",
"-p",
"4",
"-json",
"./internal/server/oidc",
"-run",
"^TestCustodianForgejoIssuerFixture$",
"-count=1"
],
"synthetic_authentication": true,
"real_credentials": false,
"fixture_values_published": false,
"fixture_sha256": "18daf5c6856f34efbdf1029688feea380979f1ca4f6c23e8ca3e78fe913f70cf"
}

View file

@ -0,0 +1,91 @@
{
"returncode": 0,
"seconds": 0.67,
"source_commit": "d803e9282a47b49daf930fb905312fa5104c0ace",
"source_token_go_sha256": "sha256:8422cc9dbd39c88dfe835b43f6262cb120bc0d2e5b08898a151167b7555368d3",
"workspace": "/tmp/custodian-keycape-wire-6z6gfafi",
"argv": [
"bwrap",
"--unshare-net",
"--unshare-pid",
"--die-with-parent",
"--new-session",
"--ro-bind",
"/usr",
"/usr",
"--ro-bind",
"/lib",
"/lib",
"--ro-bind",
"/lib64",
"/lib64",
"--symlink",
"usr/bin",
"/bin",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--bind",
"/tmp/custodian-keycape-wire-6z6gfafi",
"/work",
"--ro-bind",
"/home/worsch/go/pkg/mod",
"/modules",
"--ro-bind",
"/home/worsch/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.26.7.linux-amd64",
"/toolchain",
"--chdir",
"/work/src",
"--clearenv",
"--bind",
"/tmp/custodian-keycape-wire-rsi4f6hj/gocache",
"/work/gocache",
"--setenv",
"PATH",
"/toolchain/bin:/usr/bin:/bin",
"--setenv",
"HOME",
"/work/home",
"--setenv",
"GOTOOLCHAIN",
"local",
"--setenv",
"GOPROXY",
"off",
"--setenv",
"GOSUMDB",
"off",
"--setenv",
"GOMODCACHE",
"/modules",
"--setenv",
"GOCACHE",
"/work/gocache",
"--setenv",
"GOMAXPROCS",
"4",
"--setenv",
"CGO_ENABLED",
"0",
"--setenv",
"CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE",
"/work/identity.json",
"--",
"go",
"test",
"-p",
"4",
"-json",
"./internal/server/oidc",
"-run",
"^TestCustodianForgejoIssuerFixture$",
"-count=1"
],
"synthetic_authentication": true,
"real_credentials": false,
"fixture_values_published": false,
"fixture_sha256": "771d365c7c80d731fd2f5cc8999ca7aa5bb6fa0f93269463b84e0f70b3bbd4e2"
}

View file

@ -0,0 +1,91 @@
{
"returncode": 0,
"seconds": 0.62,
"source_commit": "d803e9282a47b49daf930fb905312fa5104c0ace",
"source_token_go_sha256": "sha256:8422cc9dbd39c88dfe835b43f6262cb120bc0d2e5b08898a151167b7555368d3",
"workspace": "/tmp/custodian-keycape-wire-jum8uowp",
"argv": [
"bwrap",
"--unshare-net",
"--unshare-pid",
"--die-with-parent",
"--new-session",
"--ro-bind",
"/usr",
"/usr",
"--ro-bind",
"/lib",
"/lib",
"--ro-bind",
"/lib64",
"/lib64",
"--symlink",
"usr/bin",
"/bin",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--bind",
"/tmp/custodian-keycape-wire-jum8uowp",
"/work",
"--ro-bind",
"/home/worsch/go/pkg/mod",
"/modules",
"--ro-bind",
"/home/worsch/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.26.7.linux-amd64",
"/toolchain",
"--chdir",
"/work/src",
"--clearenv",
"--bind",
"/tmp/custodian-keycape-wire-rsi4f6hj/gocache",
"/work/gocache",
"--setenv",
"PATH",
"/toolchain/bin:/usr/bin:/bin",
"--setenv",
"HOME",
"/work/home",
"--setenv",
"GOTOOLCHAIN",
"local",
"--setenv",
"GOPROXY",
"off",
"--setenv",
"GOSUMDB",
"off",
"--setenv",
"GOMODCACHE",
"/modules",
"--setenv",
"GOCACHE",
"/work/gocache",
"--setenv",
"GOMAXPROCS",
"4",
"--setenv",
"CGO_ENABLED",
"0",
"--setenv",
"CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE",
"/work/identity.json",
"--",
"go",
"test",
"-p",
"4",
"-json",
"./internal/server/oidc",
"-run",
"^TestCustodianForgejoIssuerFixture$",
"-count=1"
],
"synthetic_authentication": true,
"real_credentials": false,
"fixture_values_published": false,
"fixture_sha256": "a9465766c6edebf8e6ce77e2bcaef9d1bfa081c6472c731f95c0b9caaf684522"
}

View file

@ -0,0 +1,91 @@
{
"returncode": 0,
"seconds": 4.55,
"source_commit": "d803e9282a47b49daf930fb905312fa5104c0ace",
"source_token_go_sha256": "sha256:8422cc9dbd39c88dfe835b43f6262cb120bc0d2e5b08898a151167b7555368d3",
"workspace": "/tmp/custodian-keycape-wire-gvebji6u",
"argv": [
"bwrap",
"--unshare-net",
"--unshare-pid",
"--die-with-parent",
"--new-session",
"--ro-bind",
"/usr",
"/usr",
"--ro-bind",
"/lib",
"/lib",
"--ro-bind",
"/lib64",
"/lib64",
"--symlink",
"usr/bin",
"/bin",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--bind",
"/tmp/custodian-keycape-wire-gvebji6u",
"/work",
"--ro-bind",
"/home/worsch/go/pkg/mod",
"/modules",
"--ro-bind",
"/home/worsch/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.26.7.linux-amd64",
"/toolchain",
"--chdir",
"/work/src",
"--clearenv",
"--bind",
"/tmp/custodian-keycape-wire-rsi4f6hj/gocache",
"/work/gocache",
"--setenv",
"PATH",
"/toolchain/bin:/usr/bin:/bin",
"--setenv",
"HOME",
"/work/home",
"--setenv",
"GOTOOLCHAIN",
"local",
"--setenv",
"GOPROXY",
"off",
"--setenv",
"GOSUMDB",
"off",
"--setenv",
"GOMODCACHE",
"/modules",
"--setenv",
"GOCACHE",
"/work/gocache",
"--setenv",
"GOMAXPROCS",
"4",
"--setenv",
"CGO_ENABLED",
"0",
"--setenv",
"CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE",
"/work/identity.json",
"--",
"go",
"test",
"-p",
"4",
"-json",
"./internal/server/oidc",
"-run",
"^TestCustodianForgejoIssuerFixture$",
"-count=1"
],
"synthetic_authentication": true,
"real_credentials": false,
"fixture_values_published": false,
"fixture_sha256": "de14985f3087c72695ff013c7a6f2fd3f73e0709eff5939388d9bd0c21303b9b"
}

View file

@ -0,0 +1,8 @@
{"Time":"2026-10-17T23:32:27.288197295Z","Action":"start","Package":"keycape/internal/server/oidc"}
{"Time":"2026-10-17T23:32:27.291985303Z","Action":"run","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture"}
{"Time":"2026-10-17T23:32:27.292031832Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"=== RUN TestCustodianForgejoIssuerFixture\n"}
{"Time":"2026-10-17T23:32:27.325188741Z","Action":"output","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Output":"--- PASS: TestCustodianForgejoIssuerFixture (0.03s)\n"}
{"Time":"2026-10-17T23:32:27.325257687Z","Action":"pass","Package":"keycape/internal/server/oidc","Test":"TestCustodianForgejoIssuerFixture","Elapsed":0.03}
{"Time":"2026-10-17T23:32:27.325273161Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"PASS\n"}
{"Time":"2026-10-17T23:32:27.326859189Z","Action":"output","Package":"keycape/internal/server/oidc","Output":"ok \tkeycape/internal/server/oidc\t0.038s\n"}
{"Time":"2026-10-17T23:32:27.326892625Z","Action":"pass","Package":"keycape/internal/server/oidc","Elapsed":0.039}

View file

@ -0,0 +1,49 @@
"""Apply the tested build candidate, preserving every unrelated owner file."""
from pathlib import Path
import hashlib
import json
import re
import subprocess
HERE = Path(__file__).resolve().parent
ROOT = Path('/home/worsch/railiance-apps')
cfg = json.loads((HERE / 'source-manifest.json').read_text())
sha = lambda data: hashlib.sha256(data).hexdigest()
def git(*args):
return subprocess.check_output(['git', '-C', str(ROOT), *args], text=True).strip()
assert git('rev-parse', 'HEAD') == cfg['base_revision']
assert git('ls-remote', 'origin', 'refs/heads/main').split()[0] == cfg['base_revision']
assert set(git('diff', '--name-only', 'HEAD').splitlines()) <= {'.custodian-brief.md', 'WORK-RECORDS.md'}
tracked = git('ls-files').splitlines()
protected = {name: sha((ROOT / name).read_bytes()) for name in tracked
if (ROOT / name).is_file() and name not in {row['path'] for row in cfg['files']}}
index = git('ls-files', '--stage', '--', '.custodian-brief.md', 'WORK-RECORDS.md')
plan = 'workplans/RAPPS-WP-0016-forgejo-netkingdom-login.md'
before = re.findall(r'```task\n.*?```', (ROOT / plan).read_text(), re.S)
assert len(before) == 9
for row in cfg['files']:
current = ROOT / row['path']
if row['before_sha256'] is None:
assert not current.exists(), row['path']
else:
assert sha(current.read_bytes()) == row['before_sha256'], row['path']
assert sha(Path(row['source']).read_bytes()) == row['sha256'], row['path']
for row in cfg['files']:
target = ROOT / row['path']
target.parent.mkdir(parents=True, exist_ok=True)
target.write_bytes(Path(row['source']).read_bytes())
after = re.findall(r'```task\n.*?```', (ROOT / plan).read_text(), re.S)
assert before[:8] == after[:8]
assert before[8].replace('status: todo', 'status: progress') == after[8]
assert all(sha((ROOT / name).read_bytes()) == value for name, value in protected.items())
assert git('ls-files', '--stage', '--', '.custodian-brief.md', 'WORK-RECORDS.md') == index
receipt = dict(owner=cfg['owner'], base_revision='git:' + cfg['base_revision'],
files=cfg['files'], preserved_other_tracked_files=len(protected),
original_task_uuids_preserved=9, status_change='T09 todo -> progress',
native_actions=False, independent_owner_review=False, operational_admission=False)
(HERE / 'source-application.json').write_text(json.dumps(receipt, indent=2) + '\n')
publication = dict(owner=cfg['owner'], base_revision=cfg['base_revision'],
message='Compose Forgejo private-input and authenticated decision build candidate',
files=[dict(path=row['path'], sha256=row['sha256']) for row in cfg['files']])
(HERE / 'publication-inputs.json').write_text(json.dumps(publication, indent=2) + '\n')
print(json.dumps(dict(status='source_applied', files=len(cfg['files']), native_actions=False)))

View file

@ -0,0 +1,404 @@
{
"repo_slug": "railiance-apps",
"repo_path": "/home/worsch/railiance-apps",
"source_revision": "3fb031a47ff5379358fd8cc230b40961b3b5d3a8",
"source_revision_reason": null,
"issues": [
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager warning: .repo-classification.yaml: category is project but slug is not prj-*; not every category:project is a prj- repo",
"file_path": ".repo-classification.yaml",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager missing: README.md: README.md is required for flavor project",
"file_path": "README.md",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager warning: workplans/: repository uses more than one workplan prefix: ['RAILIANCE-WP', 'RAPPS-WP']",
"file_path": "workplans/",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-1: task id 'RAILIANCE-WP-0004-I01' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-1",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-2: task id 'RAILIANCE-WP-0004-I02' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-2",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-3: task id 'RAILIANCE-WP-0004-I03' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-3",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-4: task id 'RAILIANCE-WP-0004-I04' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-4",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-5: task id 'RAILIANCE-WP-0004-I05' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-5",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-6: task id 'RAILIANCE-WP-0004-I06' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-6",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-7: task id 'RAILIANCE-WP-0004-I07' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-7",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-31",
"message": "[workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md] id 'RAILIANCE-WP-0004-I01' matches no kind in the canon work-record type registry \u2014 unregistered species become sidetracks needing manual reintegration (work-record-types_v0.1)",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-31",
"message": "[workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md] id 'RAILIANCE-WP-0004-I02' matches no kind in the canon work-record type registry \u2014 unregistered species become sidetracks needing manual reintegration (work-record-types_v0.1)",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-31",
"message": "[workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md] id 'RAILIANCE-WP-0004-I03' matches no kind in the canon work-record type registry \u2014 unregistered species become sidetracks needing manual reintegration (work-record-types_v0.1)",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-31",
"message": "[workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md] id 'RAILIANCE-WP-0004-I04' matches no kind in the canon work-record type registry \u2014 unregistered species become sidetracks needing manual reintegration (work-record-types_v0.1)",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-31",
"message": "[workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md] id 'RAILIANCE-WP-0004-I05' matches no kind in the canon work-record type registry \u2014 unregistered species become sidetracks needing manual reintegration (work-record-types_v0.1)",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-31",
"message": "[workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md] id 'RAILIANCE-WP-0004-I06' matches no kind in the canon work-record type registry \u2014 unregistered species become sidetracks needing manual reintegration (work-record-types_v0.1)",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-31",
"message": "[workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md] id 'RAILIANCE-WP-0004-I07' matches no kind in the canon work-record type registry \u2014 unregistered species become sidetracks needing manual reintegration (work-record-types_v0.1)",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-33",
"message": "WORK-RECORDS.md is missing or stale \u2014 regenerate via fix-consistency (CUST-WP-0061-T04 generated work-record index)",
"file_path": "WORK-RECORDS.md",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": true
},
{
"severity": "WARN",
"check_id": "C-39",
"message": "Wait task 'RAPPS-WP-0015-T04' in workplan 'RAPPS-WP-0015' has neither depends_on, needs_human: true, blocked_on: message-from:\u2026 nor wait_until \u2014 unqualified wait",
"file_path": "workplans/RAPPS-WP-0015-coulomb-personal-content-release.md#RAPPS-WP-0015-T04",
"db_id": "",
"file_value": "wait",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-20",
"message": "Workplan dependency target 'KEY-WP-0038' is not linked to State Hub",
"file_path": "workplans/RAPPS-WP-0016-forgejo-netkingdom-login.md",
"db_id": "",
"file_value": "KEY-WP-0038",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-39",
"message": "Human wait task 'RAPPS-WP-0016-T04' in workplan 'RAPPS-WP-0016' has needs_human: true without decision_id \u2014 unrouted human gate",
"file_path": "workplans/RAPPS-WP-0016-forgejo-netkingdom-login.md#RAPPS-WP-0016-T04",
"db_id": "",
"file_value": "needs_human: true",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-10",
"message": "Task status drift 'RAPPS-WP-0016-T09': file='progress' db='todo' (file wins)",
"file_path": "workplans/RAPPS-WP-0016-forgejo-netkingdom-login.md#RAPPS-WP-0016-T09",
"db_id": "d3804638-c73d-5b9f-a456-4262f62f9e6b",
"file_value": "progress",
"db_value": "todo",
"fixable": true
},
{
"severity": "WARN",
"check_id": "C-22",
"message": "Task description drift 'RAPPS-WP-0016-T09': file content differs from DB (file wins)",
"file_path": "workplans/RAPPS-WP-0016-forgejo-netkingdom-login.md#RAPPS-WP-0016-T09",
"db_id": "d3804638-c73d-5b9f-a456-4262f62f9e6b",
"file_value": "Use the producer-owned decision format/canonical bytes and independently admitted\nsigner/policy/request pins. Forgejo mu",
"db_value": "Use the producer-owned decision format/canonical bytes and independently admitted\nsigner/policy/request pins. Forgejo mu",
"fixable": true
},
{
"severity": "WARN",
"check_id": "C-20",
"message": "Workplan dependency target 'RPF-WP-0058' is not linked to State Hub",
"file_path": "workplans/RAPPS-WP-0017-reuse-private-reader-release.md",
"db_id": "",
"file_value": "RPF-WP-0058",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-20",
"message": "Workplan dependency target 'REUSE-WP-0025' is not linked to State Hub",
"file_path": "workplans/RAPPS-WP-0017-reuse-private-reader-release.md",
"db_id": "",
"file_value": "REUSE-WP-0025",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0006@retired-20260826' (id=1960b22b\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "1960b22b-82ae-4b67-9fff-397bd38bdd65",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0005@retired-20260826' (id=685f1c18\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "685f1c18-33c0-400d-a2b1-e1dae0f27c3e",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0009@retired-20260826' (id=21c3fcdc\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "21c3fcdc-f014-4858-8028-0ac3038212b7",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0011@retired-20260826' (id=98cf42ae\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "98cf42ae-9b64-4736-97e1-bae325ded1f9",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0008@retired-20260826' (id=41b9deea\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "41b9deea-a935-4372-8916-b3981336f597",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0018@retired-20260826' (id=1b9af4e8\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "1b9af4e8-7579-5141-837b-c736b85204a0",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0007@retired-20260826' (id=7da18dd8\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "7da18dd8-76b9-4a70-b9d7-de541afc65c0",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0010@retired-20260826' (id=a4f301bb\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "a4f301bb-3f49-450a-8dbd-5cf6a16b8e0f",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-28",
"message": "2 unread inbox message(s) older than 3 day(s): the-custodian:23172cb2, the-custodian:51e9eace",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-28",
"message": "2 unread message(s) lack thread_id for supersession tracking: the-custodian:23172cb2, the-custodian:51e9eace",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RAIL-AP-WP-0001' uses prefix 'RAIL-AP-WP' but repo canonical prefix is 'RAPPS-WP' \u2014 new plans must conform",
"file_path": "workplans/archived/260605-RAIL-AP-WP-0001-gitea-container-registry.md",
"db_id": "",
"file_value": "RAIL-AP-WP-0001",
"db_value": "RAPPS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RAILIANCE-WP-0002' uses prefix 'RAILIANCE-WP' but repo canonical prefix is 'RAPPS-WP' \u2014 new plans must conform",
"file_path": "workplans/archived/260702-railiance-apps-WP-0002-vergabe-teilnahme-on-railiance01.md",
"db_id": "",
"file_value": "RAILIANCE-WP-0002",
"db_value": "RAPPS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RAILIANCE-WP-0004' uses prefix 'RAILIANCE-WP' but repo canonical prefix is 'RAPPS-WP' \u2014 new plans must conform",
"file_path": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md",
"db_id": "",
"file_value": "RAILIANCE-WP-0004",
"db_value": "RAPPS-WP",
"fixable": false
}
],
"fixes_applied": [
"bindings: synced 20/20",
"C-17 cleared: pushed 1 backlogged commit(s)",
"C-33 fixed: regenerated WORK-RECORDS.md",
"C-10 fixed: task d3804638\u2026 status \u2192 'progress'",
"C-22 fixed: task d3804638\u2026 description updated",
"brief: .custodian-brief.md updated",
"push: pushed"
],
"summary": {
"fail": 0,
"automation_error": 0,
"warn": 30,
"info": 8
},
"result": "warn"
}

View file

@ -0,0 +1 @@
WARN: git commit failed for writeback: Generated-only commits rejected: staged

View file

@ -0,0 +1,172 @@
{
"ok": true,
"status": "applied",
"repo_slug": "railiance-apps",
"commit": "3fb031a47ff5379358fd8cc230b40961b3b5d3a8",
"requests": 2,
"elapsed_ms": 6389.6,
"git": {
"upstream": "origin/main",
"behind": 0,
"ahead": 0
},
"identifiers": {
"schema": "repo-manager.identifier-assignment.v1",
"ok": true,
"executed": true,
"repo": "railiance-apps",
"namespace": "helixforge",
"assignments": [],
"historical_invalid_identifiers": [
{
"kind": "task",
"id": "RAILIANCE-WP-0004-I01",
"source": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-1"
},
{
"kind": "task",
"id": "RAILIANCE-WP-0004-I02",
"source": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-2"
},
{
"kind": "task",
"id": "RAILIANCE-WP-0004-I03",
"source": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-3"
},
{
"kind": "task",
"id": "RAILIANCE-WP-0004-I04",
"source": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-4"
},
{
"kind": "task",
"id": "RAILIANCE-WP-0004-I05",
"source": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-5"
},
{
"kind": "task",
"id": "RAILIANCE-WP-0004-I06",
"source": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-6"
},
{
"kind": "task",
"id": "RAILIANCE-WP-0004-I07",
"source": "workplans/archived/260702-railiance-apps-WP-0004-app-deployment-improvements.md#task-block-7"
}
],
"historical_identity_collisions": [],
"files_changed": []
},
"receipt": {
"schema": "state-hub.repository-projection-reconcile.v1",
"instance_role": "primary",
"instance_label": "railiance01",
"expected_commit": "3fb031a47ff5379358fd8cc230b40961b3b5d3a8",
"derived_commit": "3fb031a47ff5379358fd8cc230b40961b3b5d3a8",
"outcome": {
"schema": "state-hub.projection-reset.v1",
"repo_slug": "railiance-apps",
"commit": "3fb031a47ff5379358fd8cc230b40961b3b5d3a8",
"status": "applied",
"counts": {
"created": 0,
"updated": 20,
"retired": 0,
"refused": 0,
"released": 0,
"created_tasks": 0,
"updated_tasks": 0,
"cancelled_tasks": 0,
"created_edges": 0,
"removed_edges": 0,
"unresolved_edges": 0,
"external_edges": 5
},
"created": [],
"updated": [
"RAIL-AP-WP-0001",
"RAILIANCE-WP-0002",
"RAILIANCE-WP-0004",
"RAPPS-WP-0001",
"RAPPS-WP-0002",
"RAPPS-WP-0003",
"RAPPS-WP-0004",
"RAPPS-WP-0005",
"RAPPS-WP-0006",
"RAPPS-WP-0007",
"RAPPS-WP-0008",
"RAPPS-WP-0009",
"RAPPS-WP-0010",
"RAPPS-WP-0011",
"RAPPS-WP-0012",
"RAPPS-WP-0013",
"RAPPS-WP-0014",
"RAPPS-WP-0015",
"RAPPS-WP-0016",
"RAPPS-WP-0017"
],
"retired": [],
"released": [],
"created_tasks": [],
"updated_tasks": [],
"cancelled_tasks": [],
"created_edges": [],
"removed_edges": [],
"unresolved_edges": [],
"external_edges": [
{
"workplan": "RAPPS-WP-0016",
"from": "RAPPS-WP-0016-T02",
"target": "RAPPS-WP-0016-T01",
"relationship_type": "starts_after",
"from_workplan_id": "f6b1d6f6-0abb-5774-87b9-bf3cfb640a3b",
"from_task_id": "13cd3aec-c87d-5d3f-a421-39d8ff131edd",
"to_workplan_id": null,
"to_task_id": "98004ed0-83e6-5f6e-9b18-15b8b2aec2e7"
},
{
"workplan": "RAPPS-WP-0016",
"from": "RAPPS-WP-0016-T02",
"target": "KEY-WP-0038-T02",
"relationship_type": "starts_after",
"from_workplan_id": "f6b1d6f6-0abb-5774-87b9-bf3cfb640a3b",
"from_task_id": "13cd3aec-c87d-5d3f-a421-39d8ff131edd",
"to_workplan_id": null,
"to_task_id": "ddcfb482-8f33-5c81-9ce8-84be8fa5dc30"
},
{
"workplan": "RAPPS-WP-0016",
"from": "RAPPS-WP-0016-T04",
"target": "RAPPS-WP-0016-T03",
"relationship_type": "starts_after",
"from_workplan_id": "f6b1d6f6-0abb-5774-87b9-bf3cfb640a3b",
"from_task_id": "32c54737-c40f-5fde-9b91-163f8dcb0068",
"to_workplan_id": null,
"to_task_id": "81f072aa-c316-511e-a2cd-21dd1b1d0a00"
},
{
"workplan": "RAPPS-WP-0016",
"from": "RAPPS-WP-0016-T05",
"target": "RAPPS-WP-0016-T02",
"relationship_type": "starts_after",
"from_workplan_id": "f6b1d6f6-0abb-5774-87b9-bf3cfb640a3b",
"from_task_id": "728786c9-f1f9-5983-a6a4-dea21faf67f5",
"to_workplan_id": null,
"to_task_id": "13cd3aec-c87d-5d3f-a421-39d8ff131edd"
},
{
"workplan": "RAPPS-WP-0016",
"from": "RAPPS-WP-0016-T03",
"target": "RAPPS-WP-0016-T02",
"relationship_type": "starts_after",
"from_workplan_id": "f6b1d6f6-0abb-5774-87b9-bf3cfb640a3b",
"from_task_id": "81f072aa-c316-511e-a2cd-21dd1b1d0a00",
"to_workplan_id": null,
"to_task_id": "13cd3aec-c87d-5d3f-a421-39d8ff131edd"
}
],
"refused": [],
"notes": []
}
}
}

View file

@ -0,0 +1,29 @@
{
"exit_code": 0,
"commit": "3fb031a47ff5379358fd8cc230b40961b3b5d3a8",
"base": "c29408ae6747158a639dc876e6d7492680675658",
"files": [
{
"path": "tools/forgejo-release-build.py",
"sha256": "bd5b15ff2ca1e5694903aed3cd47c4fd1fb8baa43c49dd291029a9c9739cc96c"
},
{
"path": "build/forgejo/inputs.lock.json",
"sha256": "acf9859d1b1009d1afe0844f2068f9b95cfadb176591edce0ec42084604e4d65"
},
{
"path": "build/forgejo/README.md",
"sha256": "6250821cc41d10b92e6d91dde1f2b59b53a9d47d78ada3a597c9d039549c0da4"
},
{
"path": "build/forgejo/forgejo-security-extension.patch",
"sha256": "15cb7f13b1b1d1095cc344176ca337f705333a436a70ae803fcfd3d7f802ccf4"
},
{
"path": "workplans/RAPPS-WP-0016-forgejo-netkingdom-login.md",
"sha256": "95b48b308d5154f87355b2c230dc9990241aeeb37c2094e164952150ed2fd258"
}
],
"stdout": "[main 3fb031a] Compose Forgejo private-input and authenticated decision build candidate\n 5 files changed, 4756 insertions(+), 12 deletions(-)\n create mode 100644 build/forgejo/forgejo-security-extension.patch\n",
"stderr": ""
}

View file

@ -0,0 +1,27 @@
{
"owner": "railiance-apps",
"base_revision": "c29408ae6747158a639dc876e6d7492680675658",
"message": "Compose Forgejo private-input and authenticated decision build candidate",
"files": [
{
"path": "tools/forgejo-release-build.py",
"sha256": "bd5b15ff2ca1e5694903aed3cd47c4fd1fb8baa43c49dd291029a9c9739cc96c"
},
{
"path": "build/forgejo/inputs.lock.json",
"sha256": "acf9859d1b1009d1afe0844f2068f9b95cfadb176591edce0ec42084604e4d65"
},
{
"path": "build/forgejo/README.md",
"sha256": "6250821cc41d10b92e6d91dde1f2b59b53a9d47d78ada3a597c9d039549c0da4"
},
{
"path": "build/forgejo/forgejo-security-extension.patch",
"sha256": "15cb7f13b1b1d1095cc344176ca337f705333a436a70ae803fcfd3d7f802ccf4"
},
{
"path": "workplans/RAPPS-WP-0016-forgejo-netkingdom-login.md",
"sha256": "95b48b308d5154f87355b2c230dc9990241aeeb37c2094e164952150ed2fd258"
}
]
}

View file

@ -0,0 +1,42 @@
{
"owner": "railiance-apps",
"base_revision": "git:c29408ae6747158a639dc876e6d7492680675658",
"files": [
{
"path": "tools/forgejo-release-build.py",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/release-source/tools/forgejo-release-build.py",
"before_sha256": "7e28d9bd5adefaece96eb1d31a23e128ec8f448958e45d22467bf7acf476a9ba",
"sha256": "bd5b15ff2ca1e5694903aed3cd47c4fd1fb8baa43c49dd291029a9c9739cc96c"
},
{
"path": "build/forgejo/inputs.lock.json",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/release-source/build/forgejo/inputs.lock.json",
"before_sha256": "29f329b204a2a5f72084b50d59e8445486ff4799450097c6f3908c74e87a233a",
"sha256": "acf9859d1b1009d1afe0844f2068f9b95cfadb176591edce0ec42084604e4d65"
},
{
"path": "build/forgejo/README.md",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/release-source/build/forgejo/README.md",
"before_sha256": "c3d37b8e62a99c351b8630a31f875fb8f4afbf54ec2488460066c88148f76fa8",
"sha256": "6250821cc41d10b92e6d91dde1f2b59b53a9d47d78ada3a597c9d039549c0da4"
},
{
"path": "build/forgejo/forgejo-security-extension.patch",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/release-source/build/forgejo/forgejo-security-extension.patch",
"before_sha256": null,
"sha256": "15cb7f13b1b1d1095cc344176ca337f705333a436a70ae803fcfd3d7f802ccf4"
},
{
"path": "workplans/RAPPS-WP-0016-forgejo-netkingdom-login.md",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/owner-integration/workplan.md",
"before_sha256": "0ac8db087247bf980339ef8661a26eeb817af82391e3e85038be773fe3c6fb3a",
"sha256": "95b48b308d5154f87355b2c230dc9990241aeeb37c2094e164952150ed2fd258"
}
],
"preserved_other_tracked_files": 223,
"original_task_uuids_preserved": 9,
"status_change": "T09 todo -> progress",
"native_actions": false,
"independent_owner_review": false,
"operational_admission": false
}

View file

@ -0,0 +1,38 @@
{
"owner": "railiance-apps",
"base_revision": "c29408ae6747158a639dc876e6d7492680675658",
"files": [
{
"path": "tools/forgejo-release-build.py",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/release-source/tools/forgejo-release-build.py",
"before_sha256": "7e28d9bd5adefaece96eb1d31a23e128ec8f448958e45d22467bf7acf476a9ba",
"sha256": "bd5b15ff2ca1e5694903aed3cd47c4fd1fb8baa43c49dd291029a9c9739cc96c"
},
{
"path": "build/forgejo/inputs.lock.json",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/release-source/build/forgejo/inputs.lock.json",
"before_sha256": "29f329b204a2a5f72084b50d59e8445486ff4799450097c6f3908c74e87a233a",
"sha256": "acf9859d1b1009d1afe0844f2068f9b95cfadb176591edce0ec42084604e4d65"
},
{
"path": "build/forgejo/README.md",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/release-source/build/forgejo/README.md",
"before_sha256": "c3d37b8e62a99c351b8630a31f875fb8f4afbf54ec2488460066c88148f76fa8",
"sha256": "6250821cc41d10b92e6d91dde1f2b59b53a9d47d78ada3a597c9d039549c0da4"
},
{
"path": "build/forgejo/forgejo-security-extension.patch",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/release-source/build/forgejo/forgejo-security-extension.patch",
"before_sha256": null,
"sha256": "15cb7f13b1b1d1095cc344176ca337f705333a436a70ae803fcfd3d7f802ccf4"
},
{
"path": "workplans/RAPPS-WP-0016-forgejo-netkingdom-login.md",
"source": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-18/forgejo-keycape-claims-r1/owner-integration/workplan.md",
"before_sha256": "0ac8db087247bf980339ef8661a26eeb817af82391e3e85038be773fe3c6fb3a",
"sha256": "95b48b308d5154f87355b2c230dc9990241aeeb37c2094e164952150ed2fd258"
}
],
"native_actions": false,
"independent_owner_review": false
}

View file

@ -0,0 +1,91 @@
[
{
"repo": "railiance-apps",
"workplan_id": "f6b1d6f6-0abb-5774-87b9-bf3cfb640a3b",
"tasks": [
{
"id": "RAPPS-WP-0016-T01",
"uuid": "98004ed0-83e6-5f6e-9b18-15b8b2aec2e7",
"status": "done"
},
{
"id": "RAPPS-WP-0016-T02",
"uuid": "13cd3aec-c87d-5d3f-a421-39d8ff131edd",
"status": "wait"
},
{
"id": "RAPPS-WP-0016-T03",
"uuid": "81f072aa-c316-511e-a2cd-21dd1b1d0a00",
"status": "wait"
},
{
"id": "RAPPS-WP-0016-T04",
"uuid": "32c54737-c40f-5fde-9b91-163f8dcb0068",
"status": "wait"
},
{
"id": "RAPPS-WP-0016-T05",
"uuid": "728786c9-f1f9-5983-a6a4-dea21faf67f5",
"status": "wait"
},
{
"id": "RAPPS-WP-0016-T06",
"uuid": "08ab8921-7801-5309-b84b-bc2a3ceea1e4",
"status": "done"
},
{
"id": "RAPPS-WP-0016-T07",
"uuid": "786d6584-6db1-5a10-9324-d7b94db0df94",
"status": "progress"
},
{
"id": "RAPPS-WP-0016-T08",
"uuid": "4ab8a5e7-ab32-5ee2-aaf2-6da246d1b0c8",
"status": "progress"
},
{
"id": "RAPPS-WP-0016-T09",
"uuid": "d3804638-c73d-5b9f-a456-4262f62f9e6b",
"status": "progress"
}
],
"all_uuid_status_bindings_exact": true
},
{
"repo": "the-custodian",
"workplan_id": "dfadb19b-445e-59c6-bcd6-48e87b912c52",
"tasks": [
{
"id": "CUST-WP-0080-T01",
"uuid": "c770f7e1-25eb-53ec-9a37-1f7794077ff8",
"status": "done"
},
{
"id": "CUST-WP-0080-T02",
"uuid": "5973026f-8ca9-5882-99fe-65a54bc250ac",
"status": "done"
},
{
"id": "CUST-WP-0080-T03",
"uuid": "87637402-02f1-57c1-8fbc-4141598af8e3",
"status": "progress"
},
{
"id": "CUST-WP-0080-T04",
"uuid": "82378b0f-7004-5c2f-9683-b356a1227576",
"status": "todo"
},
{
"id": "CUST-WP-0080-T05",
"uuid": "ed8b909a-23bf-5e5f-b600-e477fbae136b",
"status": "progress"
},
{
"id": "CUST-WP-0080-T06",
"uuid": "6aca534c-5c7a-556f-b6b6-406433670c29",
"status": "progress"
}
],
"all_uuid_status_bindings_exact": true
}
]

View file

@ -0,0 +1,263 @@
---
id: RAPPS-WP-0016
type: workplan
title: "Forgejo sign-in through NetKingdom, before the forge closes"
domain: infotech
repo: railiance-apps
status: active
flavor: implementation
owner: claude-code
topic_slug: railiance
created: "2026-10-08"
updated: "2026-10-18"
depends_on:
- KEY-WP-0038
related_repos:
- prj-forgejo-org-refactor
- key-cape
- railiance-platform
state_hub_workstream_id: "f6b1d6f6-0abb-5774-87b9-bf3cfb640a3b"
---
# RAPPS-WP-0016 - Forgejo sign-in through NetKingdom, before the forge closes
## Why
`forgejo.coulomb.social` is closing: private by default, no anonymous access
(prj-forgejo-org-refactor ORGREF-WP-0002, decision
`decisions/forge-visibility-policy.md`). The founder's condition is that sign-in
runs through NetKingdom first. railiance-apps owns the Forgejo Helm release
(`docs/forgejo-on-railiance01.md`: S5 Helm release, ingress, operator Makefile),
so the Forgejo side lands here. This plan is ORGREF-WP-0002-T05. The NetKingdom
side is key-cape `KEY-WP-0038`.
## Boundaries
- **Founder guardrail:** tighten gradually; never lock anyone out; never risk
assets; never reach a state that is hard to repair. Every step keeps the
current sign-in path working until the new one is proven.
- **No visibility change** in this plan. Repositories, packages and
`REQUIRE_SIGNIN_VIEW` are ORGREF-WP-0002-T08.
- **Configuration in git.** The authentication source is declared in
`helm/forgejo-values.yaml` (`gitea.oauth`), with its secret drawn from an
ExternalSecret over OpenBao. No click-ops, and no secret value in git.
- Open registration is already disabled (`service.DISABLE_REGISTRATION: true`).
This plan keeps it that way.
## Tasks
```task
id: RAPPS-WP-0016-T01
status: done
priority: high
state_hub_task_id: "98004ed0-83e6-5f6e-9b18-15b8b2aec2e7"
```
### T01 — Make the local administrator a sealed break-glass
Before anything about sign-in changes: confirm the local administrator account
works, keep its credential only in OpenBao, and document recovery (who, how,
where it is logged) in `docs/forgejo-on-railiance01.md`. Verify one break-glass
sign-in and record it without the credential.
Acceptance: a recorded break-glass sign-in, with the recovery path written down.
This is the "never lock ourselves out" floor for every later step.
Done 2026-10-17: founder sealed `forgejo_admin` into OpenBao
`platform/workloads/forgejo/break-glass-admin` (version 1) and verified a local
sign-in (HTTP 200, site admin): `docs/evidence/2026-10-17-forgejo-breakglass-signin.json`.
Recovery path: `docs/forgejo-on-railiance01.md` § Break-glass administrator.
```task
id: RAPPS-WP-0016-T02
status: wait
depends_on: [RAPPS-WP-0016-T01, KEY-WP-0038-T02]
blocking_reason: "Break-glass done (T01); needs the NetKingdom client registered with its secret in custody (KEY-WP-0038-T02)."
priority: high
state_hub_task_id: "13cd3aec-c87d-5d3f-a421-39d8ff131edd"
```
### T02 — Add the NetKingdom authentication source
- an ExternalSecret delivering the `forgejo` client secret from OpenBao to a
Secret in the `forgejo` namespace. Custody path is
`platform/workloads/keycape/forgejo`, field `CLIENT_SECRET`, read by ESO through
Kubernetes-auth role `external-secrets-keycape-forgejo-forgejo`, which carries
only policy `workload-kv-read-keycape-forgejo-forgejo` (net-kingdom 074b3a0;
replaces the earlier `platform/workloads/forgejo/netkingdom-oidc-client` proposal). The
SA/SecretStore/ExternalSecret shape follows the NK-WP-0048
`deliver-consumer-secret` receipt contract
(`docs/evidence/nk48-t16-owner-review/owner-review-railiance-apps.json`)
- `gitea.oauth`: name `netkingdom` (must match the redirect URI registered in
key-cape), provider `openidConnect`, auto-discovery from
`https://kc.coulomb.social/.well-known/openid-configuration`, scopes
`openid profile email groups`, group-claim name `groups`
- `oauth2_client` settings: no automatic account creation for unknown subjects;
account linking to existing local accounts by username after a successful
local sign-in (so the founder and agent accounts keep their history)
- Helm upgrade with the previous revision noted for rollback
Local password sign-in stays enabled.
Acceptance: the "Sign in with netkingdom" option appears. Local sign-in still
works. Rollback is one `helm rollback` to the noted revision.
```task
id: RAPPS-WP-0016-T03
status: wait
depends_on: [RAPPS-WP-0016-T02]
blocking_reason: "Linking and team mapping follow a working authentication source."
priority: high
state_hub_task_id: "81f072aa-c316-511e-a2cd-21dd1b1d0a00"
```
### T03 — Link accounts and map groups to teams
- The founder links their account through NetKingdom (MFA), then signs in again
through NetKingdom only and sees the same repositories, organisations and
admin rights.
- Map NetKingdom groups (names agreed in KEY-WP-0038-T01) to organisation teams:
owners and readers at least. Create the read-only teams that
ORGREF-WP-0002-T06 consumers will use.
- Apply KEY-WP-0038-T03's decision on agents and services: NetKingdom sign-in, or
scoped tokens bound to service identities.
Acceptance: founder and one agent work through NetKingdom; group-to-team mapping
verified by adding and removing one test membership; break-glass still works.
```task
id: RAPPS-WP-0016-T04
status: wait
depends_on: [RAPPS-WP-0016-T03]
needs_human: true
blocking_reason: "Restricting local password sign-in is a founder decision once NetKingdom sign-in is proven."
priority: medium
state_hub_task_id: "32c54737-c40f-5fde-9b91-163f8dcb0068"
```
### T04 — Decide on local password sign-in
Once NetKingdom sign-in has been used for a while without problems, the founder
decides whether local password sign-in is turned off for everyone except
break-glass. This is not required to close the forge; it is the next tightening
step, taken separately.
```task
id: RAPPS-WP-0016-T05
status: wait
depends_on: [RAPPS-WP-0016-T02]
blocking_reason: "Waits for net-kingdom's answer to the Apps 1.3 needs-change record (the-custodian docs/changes/netkingdom-target-2026-10-17/nk48-1.3-owner-review/owner-review-railiance-apps.json: RAPPS-1.3-C1..C3) and the re-frozen 1.3 candidate."
priority: medium
state_hub_task_id: "728786c9-f1f9-5983-a6a4-dea21faf67f5"
```
### T05 — Apps owner seams for NK-WP-0048 consumer steps
Implement the real Apps capabilities behind the `deliver-consumer-secret` and
`hand-over` adapters, as owner-run paths (option C): `owner_apply` /
`owner_remove` emitting `netkingdom.consumer-secret-delivery.v1` receipts from the
T02 objects; a consumer verifier that observes Forgejo sign-in and the T03
positive/negative group probes; and a committed-evidence hand-over receipt store.
See the owner-review record for the contract.
Acceptance: receipts produced from the live T02/T03 run validate against the
adapters' checks with no value-bearing keys.
## Also in scope: stale node credential
The k3s `registries.yaml` on railiance01 still holds a login for the frozen Gitea
host `92.205.130.254` (ORGREF-WP-0002-T02). Coordinate its removal with the node
owner when ORGREF-WP-0002-T06 adds the forge registry login, in the same change.
## T06 — Package the reviewed consumer source through the Apps build path
```task
id: RAPPS-WP-0016-T06
status: done
priority: high
state_hub_task_id: "08ab8921-7801-5309-b84b-bc2a3ceea1e4"
```
Completed 2026-10-18, source build tooling only. The existing Apps Makefile now
has explicit prepare, public-dependency acquisition, offline build, artifact
verification and local OCI export targets for the pinned official Forgejo11.0.3
source plus reviewed multi-value claim patch. Source/toolchains/locks/compiler
inputs/base image are fixed. Third-party application source stays in a new /tmp
workspace; Apps holds the release input lock, patch and build recipe.
The original build profile produced identical frontend assets, bindata sources
and complete static executable in two workspaces, and identical local OCI
archives in two no-cache exports. Independent review then found host process
argv visibility through /proc (APPSBUILD-R1-F01). The revised recipe adds a
private PID namespace; exact source and synthetic canary regression are separately
reviewed. The original full builds are historical r1-profile evidence; no full
r2 build is claimed. Original packet/review and failure history remain in
Custodian apps-forgejo-release-build-r1 and apps-release-independent-review-r1;
the correction is apps-forgejo-release-build-r2. This is coordinator source
integration after independent technical review, not formal owner assent or image
admission. Helm values, deployed image, local sign-in and visibility are unchanged.
NK-WP-0048-T39 remains progress for the full release acceptance scope.
## T07 — Keep the client secret out of process arguments
```task
id: RAPPS-WP-0016-T07
status: progress
priority: high
state_hub_task_id: "786d6584-6db1-5a10-9324-d7b94db0df94"
```
Implement and independently review a real Forgejo add/update --secret-file path
and the actual chart helper/mount adaptation. Preserve the existing CLIENT_SECRET
key and custody route; use no agent-value argument or environment fallback. Test
bounded stable nofollow file reads, exact existing minted-secret encoding,
mutual exclusion/update preservation, fixed errors and actual Helm rendering.
Private mount identity/reader set and new package/type revisions need explicit
owner/runtime admission. The in-progress isolated candidate is Custodian
forgejo-private-input-r1; source completion is distinct from T02 native delivery.
## T08 — Provide a transactional application-source inverse and durable recovery
```task
id: RAPPS-WP-0016-T08
status: progress
priority: high
state_hub_task_id: "4ab8a5e7-ab32-5ee2-aaf2-6da246d1b0c8"
```
Implement actual owner database primitives that record operation intent/outcome
in the same durable database, compare complete raw persisted before/post/current
source state privately, and serialize conflicting application writers at the DB
boundary. Never emit stored credential/config bytes or delete/detach linked users
or a preexisting/shared source. SQLite and PostgreSQL transaction semantics must
be tested against the real app packages; unsupported backends refuse.
T05 and NK-WP-0048-T34 additionally require actual authenticated execution and
fresh inverse sessions, admitted evidence/recovery and exclusion of every release
writer, including Helm/runtime writers. The candidate DB primitive alone does
not establish those facilities. Helm rollback/omission does not remove persisted
OAuth sources: verify the exact app-state inverse before any image downgrade.
If links prevent removal, retain the extended image and reconcile. The earlier
T02 single-Helm-rollback statement is not sufficient recovery for this extension;
its historical text is retained and corrected here.
## T09 — Enforce authenticated Access Engine decisions in the application path
```task
id: RAPPS-WP-0016-T09
status: todo
priority: high
state_hub_task_id: "d3804638-c73d-5b9f-a456-4262f62f9e6b"
```
Use the producer-owned decision format/canonical bytes and independently admitted
signer/policy/request pins. Forgejo must verify the caller's issuer/tenant and
assurance facts, obtain and authenticate the exact Access Engine resource/action
decision, and refuse missing, stale, wrong-pin, unavailable or malformed replies.
Keep the original three-group any-of access set as policy input; its local
compatibility gate is not a substitute PDP or an architecture exception. An
issuer allowed/denied claim cannot manufacture authorization. Source integration
needs real provider/callback/session wiring and meaningful producer-consumer
positive/adverse tests before re-freezing the case and package. Existing break-
glass/local account and linking behavior remain within the declared owner scope.

View file

@ -0,0 +1,283 @@
---
id: RAPPS-WP-0016
type: workplan
title: "Forgejo sign-in through NetKingdom, before the forge closes"
domain: infotech
repo: railiance-apps
status: active
flavor: implementation
owner: claude-code
topic_slug: railiance
created: "2026-10-08"
updated: "2026-10-18"
depends_on:
- KEY-WP-0038
related_repos:
- prj-forgejo-org-refactor
- key-cape
- railiance-platform
state_hub_workstream_id: "f6b1d6f6-0abb-5774-87b9-bf3cfb640a3b"
---
# RAPPS-WP-0016 - Forgejo sign-in through NetKingdom, before the forge closes
## Why
`forgejo.coulomb.social` is closing: private by default, no anonymous access
(prj-forgejo-org-refactor ORGREF-WP-0002, decision
`decisions/forge-visibility-policy.md`). The founder's condition is that sign-in
runs through NetKingdom first. railiance-apps owns the Forgejo Helm release
(`docs/forgejo-on-railiance01.md`: S5 Helm release, ingress, operator Makefile),
so the Forgejo side lands here. This plan is ORGREF-WP-0002-T05. The NetKingdom
side is key-cape `KEY-WP-0038`.
## Boundaries
- **Founder guardrail:** tighten gradually; never lock anyone out; never risk
assets; never reach a state that is hard to repair. Every step keeps the
current sign-in path working until the new one is proven.
- **No visibility change** in this plan. Repositories, packages and
`REQUIRE_SIGNIN_VIEW` are ORGREF-WP-0002-T08.
- **Configuration in git.** The authentication source is declared in
`helm/forgejo-values.yaml` (`gitea.oauth`), with its secret drawn from an
ExternalSecret over OpenBao. No click-ops, and no secret value in git.
- Open registration is already disabled (`service.DISABLE_REGISTRATION: true`).
This plan keeps it that way.
## Tasks
```task
id: RAPPS-WP-0016-T01
status: done
priority: high
state_hub_task_id: "98004ed0-83e6-5f6e-9b18-15b8b2aec2e7"
```
### T01 — Make the local administrator a sealed break-glass
Before anything about sign-in changes: confirm the local administrator account
works, keep its credential only in OpenBao, and document recovery (who, how,
where it is logged) in `docs/forgejo-on-railiance01.md`. Verify one break-glass
sign-in and record it without the credential.
Acceptance: a recorded break-glass sign-in, with the recovery path written down.
This is the "never lock ourselves out" floor for every later step.
Done 2026-10-17: founder sealed `forgejo_admin` into OpenBao
`platform/workloads/forgejo/break-glass-admin` (version 1) and verified a local
sign-in (HTTP 200, site admin): `docs/evidence/2026-10-17-forgejo-breakglass-signin.json`.
Recovery path: `docs/forgejo-on-railiance01.md` § Break-glass administrator.
```task
id: RAPPS-WP-0016-T02
status: wait
depends_on: [RAPPS-WP-0016-T01, KEY-WP-0038-T02]
blocking_reason: "Break-glass done (T01); needs the NetKingdom client registered with its secret in custody (KEY-WP-0038-T02)."
priority: high
state_hub_task_id: "13cd3aec-c87d-5d3f-a421-39d8ff131edd"
```
### T02 — Add the NetKingdom authentication source
- an ExternalSecret delivering the `forgejo` client secret from OpenBao to a
Secret in the `forgejo` namespace. Custody path is
`platform/workloads/keycape/forgejo`, field `CLIENT_SECRET`, read by ESO through
Kubernetes-auth role `external-secrets-keycape-forgejo-forgejo`, which carries
only policy `workload-kv-read-keycape-forgejo-forgejo` (net-kingdom 074b3a0;
replaces the earlier `platform/workloads/forgejo/netkingdom-oidc-client` proposal). The
SA/SecretStore/ExternalSecret shape follows the NK-WP-0048
`deliver-consumer-secret` receipt contract
(`docs/evidence/nk48-t16-owner-review/owner-review-railiance-apps.json`)
- `gitea.oauth`: name `netkingdom` (must match the redirect URI registered in
key-cape), provider `openidConnect`, auto-discovery from
`https://kc.coulomb.social/.well-known/openid-configuration`, scopes
`openid profile email groups`, group-claim name `groups`
- `oauth2_client` settings: no automatic account creation for unknown subjects;
account linking to existing local accounts by username after a successful
local sign-in (so the founder and agent accounts keep their history)
- Helm upgrade with the previous revision noted for rollback
Local password sign-in stays enabled.
Acceptance: the "Sign in with netkingdom" option appears. Local sign-in still
works. Rollback is one `helm rollback` to the noted revision.
```task
id: RAPPS-WP-0016-T03
status: wait
depends_on: [RAPPS-WP-0016-T02]
blocking_reason: "Linking and team mapping follow a working authentication source."
priority: high
state_hub_task_id: "81f072aa-c316-511e-a2cd-21dd1b1d0a00"
```
### T03 — Link accounts and map groups to teams
- The founder links their account through NetKingdom (MFA), then signs in again
through NetKingdom only and sees the same repositories, organisations and
admin rights.
- Map NetKingdom groups (names agreed in KEY-WP-0038-T01) to organisation teams:
owners and readers at least. Create the read-only teams that
ORGREF-WP-0002-T06 consumers will use.
- Apply KEY-WP-0038-T03's decision on agents and services: NetKingdom sign-in, or
scoped tokens bound to service identities.
Acceptance: founder and one agent work through NetKingdom; group-to-team mapping
verified by adding and removing one test membership; break-glass still works.
```task
id: RAPPS-WP-0016-T04
status: wait
depends_on: [RAPPS-WP-0016-T03]
needs_human: true
blocking_reason: "Restricting local password sign-in is a founder decision once NetKingdom sign-in is proven."
priority: medium
state_hub_task_id: "32c54737-c40f-5fde-9b91-163f8dcb0068"
```
### T04 — Decide on local password sign-in
Once NetKingdom sign-in has been used for a while without problems, the founder
decides whether local password sign-in is turned off for everyone except
break-glass. This is not required to close the forge; it is the next tightening
step, taken separately.
```task
id: RAPPS-WP-0016-T05
status: wait
depends_on: [RAPPS-WP-0016-T02]
blocking_reason: "Waits for net-kingdom's answer to the Apps 1.3 needs-change record (the-custodian docs/changes/netkingdom-target-2026-10-17/nk48-1.3-owner-review/owner-review-railiance-apps.json: RAPPS-1.3-C1..C3) and the re-frozen 1.3 candidate."
priority: medium
state_hub_task_id: "728786c9-f1f9-5983-a6a4-dea21faf67f5"
```
### T05 — Apps owner seams for NK-WP-0048 consumer steps
Implement the real Apps capabilities behind the `deliver-consumer-secret` and
`hand-over` adapters, as owner-run paths (option C): `owner_apply` /
`owner_remove` emitting `netkingdom.consumer-secret-delivery.v1` receipts from the
T02 objects; a consumer verifier that observes Forgejo sign-in and the T03
positive/negative group probes; and a committed-evidence hand-over receipt store.
See the owner-review record for the contract.
Acceptance: receipts produced from the live T02/T03 run validate against the
adapters' checks with no value-bearing keys.
## Also in scope: stale node credential
The k3s `registries.yaml` on railiance01 still holds a login for the frozen Gitea
host `92.205.130.254` (ORGREF-WP-0002-T02). Coordinate its removal with the node
owner when ORGREF-WP-0002-T06 adds the forge registry login, in the same change.
## T06 — Package the reviewed consumer source through the Apps build path
```task
id: RAPPS-WP-0016-T06
status: done
priority: high
state_hub_task_id: "08ab8921-7801-5309-b84b-bc2a3ceea1e4"
```
Completed 2026-10-18, source build tooling only. The existing Apps Makefile now
has explicit prepare, public-dependency acquisition, offline build, artifact
verification and local OCI export targets for the pinned official Forgejo11.0.3
source plus reviewed multi-value claim patch. Source/toolchains/locks/compiler
inputs/base image are fixed. Third-party application source stays in a new /tmp
workspace; Apps holds the release input lock, patch and build recipe.
The original build profile produced identical frontend assets, bindata sources
and complete static executable in two workspaces, and identical local OCI
archives in two no-cache exports. Independent review then found host process
argv visibility through /proc (APPSBUILD-R1-F01). The revised recipe adds a
private PID namespace; exact source and synthetic canary regression are separately
reviewed. The original full builds are historical r1-profile evidence; no full
r2 build is claimed. Original packet/review and failure history remain in
Custodian apps-forgejo-release-build-r1 and apps-release-independent-review-r1;
the correction is apps-forgejo-release-build-r2. This is coordinator source
integration after independent technical review, not formal owner assent or image
admission. Helm values, deployed image, local sign-in and visibility are unchanged.
NK-WP-0048-T39 remains progress for the full release acceptance scope.
## T07 — Keep the client secret out of process arguments
```task
id: RAPPS-WP-0016-T07
status: progress
priority: high
state_hub_task_id: "786d6584-6db1-5a10-9324-d7b94db0df94"
```
Implement and independently review a real Forgejo add/update --secret-file path
and the actual chart helper/mount adaptation. Preserve the existing CLIENT_SECRET
key and custody route; use no agent-value argument or environment fallback. Test
bounded stable nofollow file reads, exact existing minted-secret encoding,
mutual exclusion/update preservation, fixed errors and actual Helm rendering.
Private mount identity/reader set and new package/type revisions need explicit
owner/runtime admission. The in-progress isolated candidate is Custodian
forgejo-private-input-r1; source completion is distinct from T02 native delivery.
## T08 — Provide a transactional application-source inverse and durable recovery
```task
id: RAPPS-WP-0016-T08
status: progress
priority: high
state_hub_task_id: "4ab8a5e7-ab32-5ee2-aaf2-6da246d1b0c8"
```
Implement actual owner database primitives that record operation intent/outcome
in the same durable database, compare complete raw persisted before/post/current
source state privately, and serialize conflicting application writers at the DB
boundary. Never emit stored credential/config bytes or delete/detach linked users
or a preexisting/shared source. SQLite and PostgreSQL transaction semantics must
be tested against the real app packages; unsupported backends refuse.
T05 and NK-WP-0048-T34 additionally require actual authenticated execution and
fresh inverse sessions, admitted evidence/recovery and exclusion of every release
writer, including Helm/runtime writers. The candidate DB primitive alone does
not establish those facilities. Helm rollback/omission does not remove persisted
OAuth sources: verify the exact app-state inverse before any image downgrade.
If links prevent removal, retain the extended image and reconcile. The earlier
T02 single-Helm-rollback statement is not sufficient recovery for this extension;
its historical text is retained and corrected here.
## T09 — Enforce authenticated Access Engine decisions in the application path
```task
id: RAPPS-WP-0016-T09
status: progress
priority: high
state_hub_task_id: "d3804638-c73d-5b9f-a456-4262f62f9e6b"
```
Use the producer-owned decision format/canonical bytes and independently admitted
signer/policy/request pins. Forgejo must verify the caller's issuer/tenant and
assurance facts, obtain and authenticate the exact Access Engine resource/action
decision, and refuse missing, stale, wrong-pin, unavailable or malformed replies.
Keep the original three-group any-of access set as policy input; its local
compatibility gate is not a substitute PDP or an architecture exception. An
issuer allowed/denied claim cannot manufacture authorization. Source integration
needs real provider/callback/session wiring and meaningful producer-consumer
positive/adverse tests before re-freezing the case and package. Existing break-
glass/local account and linking behavior remain within the declared owner scope.
2026-10-18 source continuation for T07/T08/T09: the digest-bound build
candidate now composes all 37 paths, including private secret-file input, actual
source-state transactions/private SQL hooks, the producer-owned Access Engine
Check client from ca0cb757 and guarded OIDC callback enforcement. The parser uses
the actual KeyCape typed assurance/authentication-time/provenance contract; its
actual issuer fixture/callback suite passes 71 test/subtest results, and selected
composed packages pass 93 with no skips. The previous incompatible-string-claim
rejection is retained. All patch postimages independently replay from the pinned
official archive. Complete release build/verification is tracked in Custodian
forgejo-keycape-claims-r1; earlier release outputs do not prove this revision.
This is coordinator source integration of a tested build candidate; independent
owner review and formal operational admission remain open. T07's chart/private
mount admission, T08's fresh authenticated operation/inverse and release-wide
writer exclusion, T09's ongoing HTTP/API/Git/SSH paths, private evidence/retention,
PostgreSQL/native proof and actual issuer/factor/custody acceptance remain open.
No trust, deployed image, Helm values, source DB, user/link state or local sign-in
is changed by this build-source update. The preserved legacy patch is historical;
the input lock now explicitly selects forgejo-security-extension.patch.

View file

@ -0,0 +1,205 @@
// Copyright 2026 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package oauth2
import (
"context"
"crypto"
"crypto/x509"
"encoding/json"
"encoding/pem"
"errors"
"io"
"os"
"path/filepath"
"strings"
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/markbates/goth"
"github.com/netkingdom/access-engine/pkg/api"
"github.com/netkingdom/access-engine/pkg/decisionpep"
)
var errApplicationDecision = errors.New("current authenticated application access refused")
// AccessEngineAdmission contains owner-admitted public trust, with only a file
// reference to the private PDP caller token. It is not persisted OAuth source
// configuration and cannot be replaced by token claims or provider discovery.
type AccessEngineAdmission struct {
SourceName string `json:"source_name"`
Issuer string `json:"issuer"`
Audience string `json:"audience"`
TokenType string `json:"token_type"`
Algorithms []string `json:"algorithms"`
IdentityKeys map[string]string `json:"identity_keys"`
TenantClaim string `json:"tenant_claim"`
PrincipalTypeClaim string `json:"principal_type_claim"`
AssuranceClaim string `json:"assurance_claim"`
MaxIdentityAge string `json:"max_identity_age"`
Decision decisionpep.Admission `json:"decision"`
}
// VerifiedApplicationIdentity is derived only by VerifyApplicationIdentity from
// independently admitted JOSE keys. RawData and UserInfo never supply these
// fields. This snapshot is an identity fact, never an authorization verdict.
type VerifiedApplicationIdentity struct {
Issuer string
Subject string
Tenant string
PrincipalType api.SubjectType
Assurance string
NotAfter time.Time
}
func loadAccessEngineAdmission(path string) (AccessEngineAdmission, error) {
var a AccessEngineAdmission
if !filepath.IsAbs(path) {
return a, errApplicationDecision
}
f, e := os.Open(path)
if e != nil {
return a, errApplicationDecision
}
defer f.Close()
stat, e := f.Stat()
if e != nil || !stat.Mode().IsRegular() || stat.Mode().Perm()&0022 != 0 {
return a, errApplicationDecision
}
raw, e := io.ReadAll(io.LimitReader(f, 1<<20+1))
if e != nil || len(raw) > 1<<20 {
return a, errApplicationDecision
}
d := json.NewDecoder(strings.NewReader(string(raw)))
d.DisallowUnknownFields()
if d.Decode(&a) != nil {
return a, errApplicationDecision
}
if _, e = d.Token(); e != io.EOF {
return a, errApplicationDecision
}
return a, nil
}
// VerifyApplicationIdentity validates the ID token independently of Goth's
// decode/claim checks and of the UserInfo merge. Keys and accepted algorithm,
// issuer, audience and type are admitted separately; none come from the JWT URL.
func VerifyApplicationIdentity(raw string, a AccessEngineAdmission, now time.Time) (VerifiedApplicationIdentity, error) {
var out VerifiedApplicationIdentity
age, e := time.ParseDuration(a.MaxIdentityAge)
if e != nil || age <= 0 || a.Issuer == "" || a.Audience == "" || a.TokenType == "" || len(a.Algorithms) == 0 || len(a.IdentityKeys) == 0 || a.TenantClaim == "" || a.PrincipalTypeClaim == "" || a.AssuranceClaim == "" {
return out, errApplicationDecision
}
for _, alg := range a.Algorithms {
if alg != "RS256" && alg != "RS384" && alg != "RS512" && alg != "ES256" && alg != "ES384" && alg != "ES512" && alg != "EdDSA" {
return out, errApplicationDecision
}
}
claims := jwt.MapClaims{}
token, e := jwt.ParseWithClaims(raw, claims, func(t *jwt.Token) (any, error) {
if typ, ok := t.Header["typ"].(string); !ok || typ != a.TokenType {
return nil, errApplicationDecision
}
kid, ok := t.Header["kid"].(string)
if !ok || kid == "" {
return nil, errApplicationDecision
}
text, ok := a.IdentityKeys[kid]
if !ok {
return nil, errApplicationDecision
}
block, rest := pem.Decode([]byte(text))
if block == nil || block.Type != "PUBLIC KEY" || len(strings.TrimSpace(string(rest))) != 0 {
return nil, errApplicationDecision
}
key, e := x509.ParsePKIXPublicKey(block.Bytes)
if e != nil {
return nil, errApplicationDecision
}
var pub crypto.PublicKey = key
return pub, nil
}, jwt.WithValidMethods(a.Algorithms), jwt.WithIssuer(a.Issuer), jwt.WithAudience(a.Audience), jwt.WithExpirationRequired(), jwt.WithIssuedAt(), jwt.WithJSONNumber(), jwt.WithTimeFunc(func() time.Time { return now }))
if e != nil || token == nil || !token.Valid {
return out, errApplicationDecision
}
subject, e := claims.GetSubject()
if e != nil || subject == "" {
return out, errApplicationDecision
}
issued, e := claims.GetIssuedAt()
if e != nil || issued == nil || issued.Time.After(now) || now.Sub(issued.Time) > age {
return out, errApplicationDecision
}
end, e := claims.GetExpirationTime()
if e != nil || end == nil || !now.Before(end.Time) {
return out, errApplicationDecision
}
aud, e := claims.GetAudience()
if e != nil {
return out, errApplicationDecision
}
if authorizedParty, present := claims["azp"]; present {
if azp, ok := authorizedParty.(string); !ok || azp != a.Audience {
return out, errApplicationDecision
}
} else if len(aud) > 1 {
return out, errApplicationDecision
}
value := func(name string) (string, bool) { v, ok := claims[name].(string); return v, ok && validClaimLiteral(v) }
tenant, ok := value(a.TenantClaim)
if !ok {
return out, errApplicationDecision
}
principal, ok := value(a.PrincipalTypeClaim)
if !ok {
return out, errApplicationDecision
}
assurance, ok := value(a.AssuranceClaim)
if !ok {
return out, errApplicationDecision
}
return VerifiedApplicationIdentity{Issuer: a.Issuer, Subject: subject, Tenant: tenant, PrincipalType: api.SubjectType(principal), Assurance: assurance, NotAfter: end.Time}, nil
}
func (source *Source) authorizeAccessEngine(ctx context.Context, user goth.User) error {
// The guarded target extension cannot silently fall back to a local group
// decision when admission, keys, facts, PDP or caller authentication is absent.
if source.Provider != "openidConnect" || ValidateRequiredClaimValues(source.RequiredClaimName, source.RequiredClaimValue, source.RequiredClaimValues) != nil {
return errApplicationDecision
}
a, e := loadAccessEngineAdmission(os.Getenv("FORGEJO_ACCESS_ENGINE_ADMISSION_FILE"))
if e != nil || source.authSource == nil || a.SourceName != source.authSource.Name || a.Audience != source.ClientID {
return errApplicationDecision
}
identity, e := VerifyApplicationIdentity(user.IDToken, a, time.Now().UTC())
if e != nil {
return errApplicationDecision
}
// RequireCurrentUserInfoClaim has refused missing/malformed current groups
// before Goth can merge. The validated ID subject must still match that join.
sub, ok := user.RawData["sub"].(string)
if !ok || sub != identity.Subject || user.UserID != identity.Subject {
return errApplicationDecision
}
groups, ok := strictClaimValues(user.RawData[source.RequiredClaimName])
if !ok {
return errApplicationDecision
}
client, e := decisionpep.New(a.Decision)
if e != nil {
return errApplicationDecision
}
request := api.CheckRequest{Tenant: identity.Tenant,
Subject: api.SubjectRef{ID: identity.Subject, Type: identity.PrincipalType, Tenant: identity.Tenant,
Attributes: map[string]any{"issuer": identity.Issuer, "assurance": identity.Assurance, "current_userinfo_groups": groups}},
Action: "application.access", Resource: api.ResourceRef{ID: "application:forgejo", Type: "application", System: "forgejo", Tenant: identity.Tenant},
Context: map[string]any{"identity_issuer": identity.Issuer, "identity_subject": identity.Subject, "identity_tenant": identity.Tenant, "identity_principal_type": string(identity.PrincipalType), "identity_assurance": identity.Assurance, "identity_not_after": identity.NotAfter.UTC().Format(time.RFC3339Nano), "current_userinfo_groups": groups, "required_groups_any_of": source.RequiredClaimValues, "source_name": a.SourceName, "source_id": source.authSource.ID}}
if _, e = client.Check(ctx, request); e != nil {
return errApplicationDecision
}
if !time.Now().UTC().Before(identity.NotAfter) {
return errApplicationDecision
}
return nil
}

View file

@ -0,0 +1,180 @@
package oauth2
import (
"crypto/ed25519"
"crypto/rand"
"encoding/base64"
"encoding/json"
"encoding/pem"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"strings"
"sync/atomic"
"testing"
"time"
authmodel "forgejo.org/models/auth"
"github.com/golang-jwt/jwt/v5"
"github.com/markbates/goth"
"github.com/markbates/goth/gothic"
"github.com/netkingdom/access-engine/pkg/api"
"github.com/netkingdom/access-engine/pkg/decisionpep"
"github.com/netkingdom/access-engine/testsupport/signfixture"
)
// This fixture substitutes only Goth's completed authentication result. The
// actual Source.Callback, JOSE verifier, HTTPS PEP client and producer signature
// implementation execute. Actual issuer login and native admission are separate.
func callbackFixture(t *testing.T, group, mode string) (*Source, *goth.User, *atomic.Int64) {
t.Helper()
admission, identityKey, claims, _ := identityFixture(t)
identityToken := signedIdentity(t, identityKey, claims, nil)
pub, key, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
t.Fatal(err)
}
calls := new(atomic.Int64)
server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
calls.Add(1)
if r.URL.Path != "/v1/check" || r.Method != http.MethodPost || r.Header.Get("Authorization") != "Bearer synthetic-caller" || r.Header.Get("Access-Engine-JSON-Profile") != decisionpep.JSONProfile {
t.Error("incorrect authenticated PDP request")
w.WriteHeader(403)
return
}
var request api.CheckRequest
decoder := json.NewDecoder(r.Body)
decoder.UseNumber()
if err := decoder.Decode(&request); err != nil {
t.Error(err)
w.WriteHeader(400)
return
}
c := request.Context
if request.Subject.ID != "user:synthetic" || request.Subject.Tenant != "tenant:synthetic" || request.Subject.Type != "human" || request.Action != "application.access" || request.Resource.ID != "application:forgejo" || c["identity_issuer"] != "https://issuer.invalid" || c["identity_assurance"] != "aal2" || c["identity_tenant"] != "tenant:synthetic" || c["source_id"] != json.Number("17") {
t.Error("PDP request did not use authenticated identity and source")
w.WriteHeader(400)
return
}
now := time.Now().UTC()
envelope := api.DecisionEnvelope{ID: "synthetic-decision", RequestID: request.ID, Effect: api.DecisionEffectAllow, MatchedPolicyVersion: "v1", Subject: request.Subject, Resource: request.Resource, Binding: api.NewDecisionBindingFor(request, request), Provenance: api.DecisionProvenance{Evaluator: "flex-auth/local", Mode: "standalone/" + decisionpep.JSONProfile, PolicyPackage: "forgejo.application-access", PolicyVersion: "v1", PolicyPackageDigest: "sha256:" + strings.Repeat("1", 64), RegistrySnapshotDigest: "sha256:" + strings.Repeat("2", 64), Caller: &api.CallerProvenance{Mode: "enforce", Principal: "system:serviceaccount:synthetic:forgejo", Audience: "access-engine", NotAfter: now.Add(time.Minute).Format(time.RFC3339Nano)}}}
api.CompleteDecision(&envelope, request, api.DecisionCompletion{AllowTTL: "10s", Now: now})
switch mode {
case "deny":
envelope.Effect = api.DecisionEffectDeny
case "wrong-binding":
envelope.Binding.Subject.ID = "other"
case "wrong-pin":
envelope.Provenance.PolicyPackageDigest = "sha256:" + strings.Repeat("3", 64)
case "expired":
envelope.Lifetime.ExpiresAt = now.Add(-time.Hour).Format(time.RFC3339Nano)
}
if mode != "unsigned" {
signingKey := key
if mode == "wrong-key" {
_, signingKey, err = ed25519.GenerateKey(rand.Reader)
if err != nil {
t.Error(err)
return
}
}
if err := signfixture.Sign(&envelope, signingKey, "synthetic-pdp"); err != nil {
t.Error(err)
return
}
}
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(envelope); err != nil {
t.Error(err)
}
}))
t.Cleanup(server.Close)
dir := t.TempDir()
ca := filepath.Join(dir, "ca.pem")
token := filepath.Join(dir, "caller")
config := filepath.Join(dir, "admission.json")
if err := os.WriteFile(ca, pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: server.Certificate().Raw}), 0600); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(token, []byte("synthetic-caller"), 0600); err != nil {
t.Fatal(err)
}
admission.SourceName = "synthetic-source"
admission.Decision = decisionpep.Admission{Endpoint: server.URL + "/v1/check", CAFile: ca, TokenFile: token, Keys: map[string]string{"synthetic-pdp": base64.RawURLEncoding.EncodeToString(pub)}, Evaluator: "flex-auth/local", PolicyPackage: "forgejo.application-access", PolicyVersion: "v1", PolicyDigest: "sha256:" + strings.Repeat("1", 64), RegistryDigest: "sha256:" + strings.Repeat("2", 64), CallerPrincipal: "system:serviceaccount:synthetic:forgejo", CallerAudience: "access-engine", MaxTTL: "30s", MaxClockSkew: "2s"}
raw, err := json.Marshal(admission)
if err != nil {
t.Fatal(err)
}
if err = os.WriteFile(config, raw, 0600); err != nil {
t.Fatal(err)
}
t.Setenv("FORGEJO_ACCESS_ENGINE_ADMISSION_FILE", config)
source := &Source{Provider: "openidConnect", ClientID: admission.Audience, RequiredClaimName: "groups", RequiredClaimValues: []string{"forge-admins", "forge-coulomb-owners", "forge-coulomb-readers"}}
source.authSource = &authmodel.Source{ID: 17, Name: admission.SourceName}
user := &goth.User{UserID: "user:synthetic", IDToken: identityToken, RawData: map[string]any{"sub": "user:synthetic", "groups": []string{group}}}
previous := gothic.CompleteUserAuth
gothic.CompleteUserAuth = func(http.ResponseWriter, *http.Request) (goth.User, error) { return *user, nil }
t.Cleanup(func() { gothic.CompleteUserAuth = previous })
return source, user, calls
}
func TestAccessEngineActualCallbackAllowsAuthenticatedDecision(t *testing.T) {
for _, group := range []string{"forge-admins", "forge-coulomb-owners", "forge-coulomb-readers"} {
t.Run(group, func(t *testing.T) {
source, user, calls := callbackFixture(t, group, "allow")
// Mutable UserInfo cannot supply identity assurance, issuer or tenant.
user.RawData["acr"] = "aal1"
user.RawData["tenant"] = "tenant:attacker"
user.RawData["iss"] = "https://attacker.invalid"
got, err := source.Callback(httptest.NewRequest(http.MethodGet, "https://forgejo.invalid/callback", nil), httptest.NewRecorder(), "")
if err != nil || got.UserID != user.UserID || calls.Load() != 1 {
t.Fatalf("callback result: err=%v requests=%d", err, calls.Load())
}
})
}
}
func TestAccessEngineActualCallbackRefusesUnverifiedPDP(t *testing.T) {
for _, mode := range []string{"deny", "unsigned", "wrong-key", "wrong-pin", "wrong-binding", "expired"} {
t.Run(mode, func(t *testing.T) {
source, _, calls := callbackFixture(t, "forge-admins", mode)
got, err := source.Callback(httptest.NewRequest(http.MethodGet, "https://forgejo.invalid/callback", nil), httptest.NewRecorder(), "")
if err == nil || got.UserID != "" || got.IDToken != "" || calls.Load() != 1 {
t.Fatalf("unverified decision escaped callback: requests=%d err=%v", calls.Load(), err)
}
})
}
}
func TestAccessEngineActualCallbackChecksIdentityBeforePDP(t *testing.T) {
cases := map[string]func(*Source, *goth.User){
"missing-token": func(_ *Source, u *goth.User) { u.IDToken = "" },
"mismatched-user": func(_ *Source, u *goth.User) { u.UserID = "other" },
"mismatched-subject": func(_ *Source, u *goth.User) { u.RawData["sub"] = "other" },
"missing-groups": func(_ *Source, u *goth.User) { delete(u.RawData, "groups") },
"wrong-source": func(s *Source, _ *goth.User) { s.authSource.Name = "other" },
"wrong-provider": func(s *Source, _ *goth.User) { s.Provider = "other" },
"wrong-audience": func(s *Source, _ *goth.User) { s.ClientID = "other" },
"missing-admission": func(_ *Source, _ *goth.User) { t.Setenv("FORGEJO_ACCESS_ENGINE_ADMISSION_FILE", "") },
"expired-token": func(_ *Source, u *goth.User) {
_, key, claims, now := identityFixture(t)
claims["exp"] = now.Add(-time.Hour).Unix()
u.IDToken = signedIdentity(t, key, claims, nil)
},
"untrusted-identity": func(_ *Source, u *goth.User) {
token := jwt.NewWithClaims(jwt.SigningMethodNone, jwt.MapClaims{"sub": "user:synthetic"})
u.IDToken, _ = token.SignedString(jwt.UnsafeAllowNoneSignatureType)
},
}
for name, mutate := range cases {
t.Run(name, func(t *testing.T) {
source, user, calls := callbackFixture(t, "forge-admins", "allow")
mutate(source, user)
got, err := source.Callback(httptest.NewRequest(http.MethodGet, "https://forgejo.invalid/callback", nil), httptest.NewRecorder(), "")
if err == nil || got.UserID != "" || calls.Load() != 0 {
t.Fatalf("unverified identity reached PDP: requests=%d err=%v", calls.Load(), err)
}
})
}
}

View file

@ -0,0 +1,100 @@
package oauth2
import (
"crypto/ed25519"
"crypto/rand"
"crypto/x509"
"encoding/pem"
"testing"
"time"
"github.com/golang-jwt/jwt/v5"
)
func identityFixture(t *testing.T) (AccessEngineAdmission, ed25519.PrivateKey, jwt.MapClaims, time.Time) {
t.Helper()
pub, key, e := ed25519.GenerateKey(rand.Reader)
if e != nil {
t.Fatal(e)
}
der, e := x509.MarshalPKIXPublicKey(pub)
if e != nil {
t.Fatal(e)
}
now := time.Now().UTC().Truncate(time.Second)
a := AccessEngineAdmission{Issuer: "https://issuer.invalid", Audience: "forgejo", TokenType: "JWT", Algorithms: []string{"EdDSA"}, IdentityKeys: map[string]string{"synthetic": string(pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: der}))}, TenantClaim: "tenant", PrincipalTypeClaim: "principal_type", AssuranceClaim: "acr", MaxIdentityAge: "5m"}
c := jwt.MapClaims{"iss": a.Issuer, "aud": a.Audience, "sub": "user:synthetic", "iat": now.Add(-time.Second).Unix(), "exp": now.Add(time.Minute).Unix(), "tenant": "tenant:synthetic", "principal_type": "human", "acr": "aal2"}
return a, key, c, now
}
func signedIdentity(t *testing.T, key ed25519.PrivateKey, c jwt.MapClaims, mutate func(*jwt.Token)) string {
t.Helper()
token := jwt.NewWithClaims(jwt.SigningMethodEdDSA, c)
token.Header["kid"] = "synthetic"
token.Header["typ"] = "JWT"
if mutate != nil {
mutate(token)
}
raw, e := token.SignedString(key)
if e != nil {
t.Fatal(e)
}
return raw
}
func TestVerifiedApplicationIdentityActualJOSE(t *testing.T) {
a, key, c, now := identityFixture(t)
raw := signedIdentity(t, key, c, nil)
got, e := VerifyApplicationIdentity(raw, a, now)
if e != nil {
t.Fatal(e)
}
if got.Subject != "user:synthetic" || got.Tenant != "tenant:synthetic" || got.Assurance != "aal2" || got.Issuer != a.Issuer || string(got.PrincipalType) != "human" {
t.Fatal("identity did not come from verified token")
}
cases := map[string]func(jwt.MapClaims){"issuer": func(c jwt.MapClaims) { c["iss"] = "https://other.invalid" }, "audience": func(c jwt.MapClaims) { c["aud"] = "other" }, "expired": func(c jwt.MapClaims) { c["exp"] = now.Add(-time.Nanosecond).Unix() }, "future-issued": func(c jwt.MapClaims) { c["iat"] = now.Add(time.Minute).Unix() }, "old-issued": func(c jwt.MapClaims) { c["iat"] = now.Add(-10 * time.Minute).Unix() }, "no-exp": func(c jwt.MapClaims) { delete(c, "exp") }, "no-iat": func(c jwt.MapClaims) { delete(c, "iat") }, "no-tenant": func(c jwt.MapClaims) { delete(c, "tenant") }, "no-principal": func(c jwt.MapClaims) { delete(c, "principal_type") }, "no-assurance": func(c jwt.MapClaims) { delete(c, "acr") }, "multi-audience-no-azp": func(c jwt.MapClaims) { c["aud"] = []string{"forgejo", "other"} }, "empty-subject": func(c jwt.MapClaims) { c["sub"] = "" }}
for name, change := range cases {
t.Run(name, func(t *testing.T) {
copy := jwt.MapClaims{}
for k, v := range c {
copy[k] = v
}
change(copy)
if _, e := VerifyApplicationIdentity(signedIdentity(t, key, copy, nil), a, now); e == nil {
t.Fatal("unverified identity accepted")
}
})
}
t.Run("wrong-key", func(t *testing.T) {
_, other, _ := ed25519.GenerateKey(rand.Reader)
if _, e := VerifyApplicationIdentity(signedIdentity(t, other, c, nil), a, now); e == nil {
t.Fatal("wrong key accepted")
}
})
t.Run("unknown-key", func(t *testing.T) {
if _, e := VerifyApplicationIdentity(signedIdentity(t, key, c, func(t *jwt.Token) { t.Header["kid"] = "other" }), a, now); e == nil {
t.Fatal("unknown key accepted")
}
})
t.Run("wrong-type", func(t *testing.T) {
if _, e := VerifyApplicationIdentity(signedIdentity(t, key, c, func(t *jwt.Token) { t.Header["typ"] = "at+jwt" }), a, now); e == nil {
t.Fatal("access token accepted as ID token")
}
})
t.Run("algorithm-confusion", func(t *testing.T) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
token.Header["kid"] = "synthetic"
token.Header["typ"] = "JWT"
raw, _ := token.SignedString([]byte(a.IdentityKeys["synthetic"]))
if _, e := VerifyApplicationIdentity(raw, a, now); e == nil {
t.Fatal("algorithm confusion accepted")
}
})
t.Run("none", func(t *testing.T) {
token := jwt.NewWithClaims(jwt.SigningMethodNone, c)
token.Header["kid"] = "synthetic"
token.Header["typ"] = "JWT"
raw, _ := token.SignedString(jwt.UnsafeAllowNoneSignatureType)
if _, e := VerifyApplicationIdentity(raw, a, now); e == nil {
t.Fatal("unsigned identity accepted")
}
})
}

View file

@ -0,0 +1,33 @@
"""Reconstruct this frozen consumer directly from verified public archives."""
from pathlib import Path
import argparse
import hashlib
import json
import subprocess
import tarfile
HERE = Path(__file__).resolve().parent
parser = argparse.ArgumentParser()
parser.add_argument('--inputs', type=Path, required=True)
parser.add_argument('--workspace', type=Path, required=True)
args = parser.parse_args()
work = args.workspace.resolve()
assert work.is_relative_to('/tmp') and not work.exists()
manifest = json.loads((HERE / 'composed-source-inventory.json').read_text())
patch = (HERE / 'composed-forgejo-source.patch').read_bytes()
assert hashlib.sha256(patch).hexdigest() == manifest['patch_sha256']
archives = [('forgejo-v11.0.3.tar.gz', manifest['archive_sha256']),
('go1.24.3.tar.gz', '3333f6ea53afa971e9078895eaa4ac7204a8c6b5c68c10e6bc9a33e8e391bdd8')]
for name, digest in archives:
assert hashlib.sha256((args.inputs / name).read_bytes()).hexdigest() == digest
work.mkdir()
for name, _ in archives:
with tarfile.open(args.inputs / name) as tar:
tar.extractall(work, filter='data')
(work / 'forgejo').rename(work / 'source')
run = subprocess.run(['patch', '--fuzz=0', '-p1'], input=patch, cwd=work / 'source', capture_output=True)
assert run.returncode == 0, 'Pinned composite patch refused; workspace retained'
for row in manifest['files']:
assert hashlib.sha256((work / 'source' / row['path']).read_bytes()).hexdigest() == row['after_sha256'], row['path']
(work / 'home').mkdir()
print(json.dumps({'status': 'prepared', 'workspace': str(work), 'paths_verified': len(manifest['files']), 'native_changes': False}))

View file

@ -1,5 +1,6 @@
"""Generate a private synthetic identity through the committed actual issuer."""
from pathlib import Path
import argparse
import hashlib
import io
import json
@ -10,6 +11,11 @@ import tempfile
import time
HERE = Path(__file__).resolve().parent
parser = argparse.ArgumentParser()
parser.add_argument('--attempt', type=int, default=1)
parser.add_argument('--cache-from', type=Path)
args = parser.parse_args()
suffix = '' if args.attempt == 1 else '-attempt' + str(args.attempt)
OWNER = Path('/home/worsch/key-cape')
WORK = Path(tempfile.mkdtemp(prefix='custodian-keycape-wire-'))
revision = subprocess.check_output(['git', '-C', str(OWNER), 'rev-parse', 'HEAD'], text=True).strip()
@ -25,22 +31,27 @@ argv += ['--symlink', 'usr/bin', '/bin', '--proc', '/proc', '--dev', '/dev', '--
'--bind', str(WORK), '/work', '--ro-bind', '/home/worsch/go/pkg/mod', '/modules',
'--ro-bind', '/home/worsch/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.26.7.linux-amd64', '/toolchain',
'--chdir', '/work/src', '--clearenv']
if args.cache_from:
cache = args.cache_from.resolve()
assert cache.is_relative_to('/tmp') and cache.is_dir()
argv += ['--bind', str(cache), '/work/gocache']
for key, value in {'PATH': '/toolchain/bin:/usr/bin:/bin', 'HOME': '/work/home', 'GOTOOLCHAIN': 'local',
'GOPROXY': 'off', 'GOSUMDB': 'off', 'GOMODCACHE': '/modules', 'GOCACHE': '/work/gocache',
'GOMAXPROCS': '4', 'CGO_ENABLED': '0',
'CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE': '/work/identity.json'}.items():
argv += ['--setenv', key, value]
argv += ['--', 'go', 'test', '-p', '4', '-json', './internal/server/oidc', '-run', '^TestCustodianForgejoIssuerFixture$', '-count=1']
assert not (HERE / 'issuer-fixture-result.json').exists()
receipt_path = HERE / ('issuer-fixture-result' + suffix + '.json')
assert not receipt_path.exists()
started = time.monotonic()
with (HERE / 'issuer-fixture.jsonl').open('xb') as log:
with (HERE / ('issuer-fixture' + suffix + '.jsonl')).open('xb') as log:
result = subprocess.run(argv, stdout=log, stderr=subprocess.STDOUT, timeout=300)
receipt = {'returncode': result.returncode, 'seconds': round(time.monotonic() - started, 2),
'source_commit': revision, 'source_token_go_sha256': hashlib.sha256((WORK / 'src/internal/server/oidc/token.go').read_bytes()).hexdigest(),
'source_commit': revision, 'source_token_go_sha256': 'sha256:' + hashlib.sha256((WORK / 'src/internal/server/oidc/token.go').read_bytes()).hexdigest(),
'workspace': str(WORK), 'argv': argv, 'synthetic_authentication': True, 'real_credentials': False,
'fixture_values_published': False}
if result.returncode == 0:
receipt['fixture_sha256'] = hashlib.sha256((WORK / 'identity.json').read_bytes()).hexdigest()
(HERE / 'issuer-fixture-result.json').write_text(json.dumps(receipt, indent=2) + '\n')
receipt_path.write_text(json.dumps(receipt, indent=2) + '\n')
print(json.dumps({'returncode': result.returncode, 'source_commit': revision, 'fixture_values_published': False}))
raise SystemExit(result.returncode)

View file

@ -0,0 +1,17 @@
{
"source_commit": "git:ca0cb75729a63c9288b7333382d0fa3eb1e8c9a3",
"paths": [
"third_party/access-engine-pep/LICENSE",
"third_party/access-engine-pep/go.mod",
"third_party/access-engine-pep/internal/sign/sign.go",
"third_party/access-engine-pep/pkg/api/canonical.go",
"third_party/access-engine-pep/pkg/api/caring.go",
"third_party/access-engine-pep/pkg/api/resource_manifest.go",
"third_party/access-engine-pep/pkg/decisionpep/client.go",
"third_party/access-engine-pep/pkg/decisionpep/client_test.go",
"third_party/access-engine-pep/producer-source.json",
"third_party/access-engine-pep/testsupport/signfixture/sign.go"
],
"all_exact": true,
"native_admission": false
}

View file

@ -0,0 +1,57 @@
{
"argv": [
"bwrap",
"--unshare-net",
"--unshare-pid",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--dir",
"/app",
"--ro-bind",
"/tmp/custodian-forgejo-release-r3/source/gitea",
"/app/forgejo",
"--bind",
"/tmp/custodian-forgejo-release-r3/embedded-extracted",
"/results",
"--chdir",
"/tmp",
"--clearenv",
"--setenv",
"PATH",
"/nonexistent",
"--setenv",
"HOME",
"/tmp/home",
"--setenv",
"USER",
"builder",
"--setenv",
"USERNAME",
"builder",
"--setenv",
"GITEA_WORK_DIR",
"/tmp/work",
"--setenv",
"GITEA_CUSTOM",
"/tmp/custom",
"--setenv",
"GITEA_APP_INI",
"/tmp/absent-app.ini",
"--setenv",
"TZ",
"UTC",
"--setenv",
"LC_ALL",
"C",
"--",
"/app/forgejo",
"--version"
],
"phase": "binary-version",
"returncode": 0,
"seconds": 0.14
}

View file

@ -0,0 +1,7 @@
{
"binary_sha256": "52f1e111ab17b9c8f2841b0815075df5812b066be45326abe50d140d8a231c34",
"frontend_built": true,
"image_deployment_selected": false,
"source_locks_preserved": true,
"tags": "bindata timetzdata sqlite sqlite_unlock_notify"
}

View file

@ -0,0 +1,708 @@
[
{
"operation": [
"migrate"
],
"returncode": 0,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused-debug-logging",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/CLIENT_SECRET"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"synthetic-oauth",
"--provider",
"github",
"--key",
"synthetic-public-id",
"--secret-file",
"/run/forgejo-oidc/CLIENT_SECRET",
"--group-claim-name",
"groups",
"--admin-group",
"unchanged-admin",
"--scopes",
"read:user,user:email"
],
"returncode": 0,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--icon-url",
"https://synthetic.invalid/icon"
],
"returncode": 0,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--secret-file",
"/run/forgejo-oidc/replacement"
],
"returncode": 0,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"synthetic-guarded"
],
"returncode": 0,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--secret-file",
"/run/forgejo-oidc/good"
],
"returncode": 0,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/newline"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/newline"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/short"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/short"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/long"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/long"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/badbyte"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/badbyte"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/world"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/world"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/writable"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/writable"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/executable"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/executable"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/empty"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/empty"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/symlink"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/symlink"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/fifo"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/fifo"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/directory"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/directory"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/missing"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/missing"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/badparent/value"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/badparent/value"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/parentlink/value"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/parentlink/value"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"relative"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"relative"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
""
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
""
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/forgejo-oidc/../forgejo-oidc/good"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/forgejo-oidc/../forgejo-oidc/good"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--provider",
"github",
"--secret-file",
"/run/writable-input/good"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--name",
"refused",
"--secret-file",
"/run/writable-input/good"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"add-oauth",
"--name",
"refused",
"--secret",
"",
"--secret-file",
"/run/forgejo-oidc/good"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--secret",
"",
"--secret-file",
"/run/forgejo-oidc/good"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--required-claim-values",
""
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--secret-file",
"/run/forgejo-oidc/replacement"
],
"returncode": 1,
"stdout_stderr_secret_absent": true
},
{
"operation": [
"admin",
"auth",
"update-oauth",
"--id",
"1",
"--secret",
"synthetic-legacy-literal"
],
"returncode": 0,
"stdout_stderr_secret_absent": true
}
]

View file

@ -0,0 +1,8 @@
{
"receipt": "cli-results.json",
"subprocesses": 48,
"private_file_values_absent_from_argv_environment_stdout_stderr": true,
"legacy_public_synthetic_literal_in_argv_intentional": true,
"scope": "The original values_never_in_argv_env_output field applies to the two private-file fixture values; legacy explicit --secret compatibility is tested separately.",
"real_credentials": false
}

View file

@ -0,0 +1,13 @@
{
"passed": true,
"subprocesses": 48,
"real_backend_cli_and_sqlite": true,
"network": "disabled by bwrap",
"secret_inputs": "synthetic only",
"values_never_in_argv_env_output": true,
"actual_browser_login": false,
"actual_readonly_file_bind": true,
"replacement_preserves_other_config": true,
"unsafe_SQL_logging_refused": true,
"actual_error_and_slow_hooks_no_leak": true
}

View file

@ -0,0 +1,24 @@
{
"argv": [
"docker",
"buildx",
"build",
"--output",
"type=oci,dest=/tmp/custodian-forgejo-release-r3/image.oci.tar,rewrite-timestamp=true",
"--no-cache",
"--platform",
"linux/amd64",
"--pull=false",
"--network=none",
"--provenance=false",
"--sbom=false",
"--metadata-file",
"/tmp/custodian-forgejo-release-r3/image-build-metadata.json",
"--build-arg",
"SOURCE_DATE_EPOCH=1752120742",
"/tmp/custodian-forgejo-release-r3/container-context"
],
"phase": "container-build",
"returncode": 0,
"seconds": 38.9
}

View file

@ -0,0 +1,40 @@
#0 building with "default" instance using docker driver
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 465B done
#1 DONE 0.1s
#2 [internal] load metadata for code.forgejo.org/forgejo/forgejo@sha256:41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b
#2 DONE 0.4s
#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.1s
#4 [internal] load build context
#4 ...
#5 [1/2] FROM code.forgejo.org/forgejo/forgejo@sha256:41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b
#5 resolve code.forgejo.org/forgejo/forgejo@sha256:41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b 0.0s done
#5 CACHED
#4 [internal] load build context
#4 transferring context: 111.05MB 1.5s done
#4 DONE 1.6s
#6 [2/2] COPY --chown=0:0 --chmod=755 gitea /app/gitea/gitea
#6 DONE 1.1s
#7 exporting to oci image format
#7 exporting layers
#7 exporting layers 10.6s done
#7 rewriting layers with source-date-epoch 1752120742 (2025-07-10 04:12:22 +0000 UTC)
#7 rewriting layers with source-date-epoch 1752120742 (2025-07-10 04:12:22 +0000 UTC) 8.2s done
#7 exporting manifest sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822 0.0s done
#7 exporting config sha256:f72e76f0ed5c0bd75d0727d1fc28a731a2bcdc90cfe15df534098444d81385c5 0.0s done
#7 sending tarball
#7 sending tarball 10.0s done
#7 DONE 28.9s
#8 resolving provenance for metadata file
#8 DONE 0.0s

View file

@ -0,0 +1,13 @@
{
"two_fresh_no_cache_OCI_exports_exact": true,
"compared_fields": {
"image_manifest_digest": "sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822",
"config_digest": "sha256:f72e76f0ed5c0bd75d0727d1fc28a731a2bcdc90cfe15df534098444d81385c5",
"oci_index_sha256": "dc86ae233589dec919932834ecf990e1d07a16db4d240c2772ea5fa08a940671",
"archive_sha256": "7307e1d9a26aa6284270dac8b751a71ae02338be090511d192e14865c5e485d9"
},
"same_verified_binary": true,
"second_source_build_claimed": false,
"registry_publication": false,
"native_admission": false
}

View file

@ -0,0 +1,17 @@
{
"all_base_layers_and_rootless_runtime_config_preserved": true,
"all_oci_blob_digests_verified": true,
"archive_sha256": "7307e1d9a26aa6284270dac8b751a71ae02338be090511d192e14865c5e485d9",
"artifact_path": "/tmp/custodian-forgejo-release-r3/image.oci.tar",
"config_digest": "sha256:f72e76f0ed5c0bd75d0727d1fc28a731a2bcdc90cfe15df534098444d81385c5",
"container_epoch": 1752120742,
"deployment_tag": null,
"final_layer_binary_exact": true,
"host_or_secret_mounts": false,
"image_manifest_digest": "sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822",
"local_runtime_image_loaded": false,
"oci_index_sha256": "dc86ae233589dec919932834ecf990e1d07a16db4d240c2772ea5fa08a940671",
"privileged_containers": false,
"registry_publication": false,
"source_epoch": 1752105237
}

View file

@ -0,0 +1,16 @@
{
"argv": [
"make",
"GOFLAGS=-trimpath -buildvcs=false -p=4",
"RELEASE_VERSION=11.0.3+cust80.15cb7f13",
"FORGEJO_VERSION=11.0.3+cust80.15cb7f13",
"FORGEJO_VERSION_API=11.0.3+cust80.15cb7f13",
"TAGS=bindata timetzdata sqlite sqlite_unlock_notify",
"go-check",
"generate-backend",
"static-executable"
],
"phase": "embedded-and-static-backend",
"returncode": 0,
"seconds": 348.13
}

View file

@ -0,0 +1,9 @@
Running go generate...
generating bindata for migration
generating bindata for options
generating bindata for public
generating bindata for templates
CGO_CFLAGS="-O2 -g -DSQLITE_MAX_VARIABLE_NUMBER=32766" /tmp/custodian-forgejo-release-r3/go/bin/go build -trimpath -buildvcs=false -p=4 -tags 'netgo osusergo bindata timetzdata sqlite sqlite_unlock_notify' -ldflags '-linkmode external -extldflags "-static" -s -w -X "main.ReleaseVersion=11.0.3+cust80.15cb7f13" -X "main.MakeVersion=GNU Make 4.3" -X "main.Version=11.0.3+cust80.15cb7f13" -X "main.Tags=bindata timetzdata sqlite sqlite_unlock_notify" -X "main.ForgejoVersion=11.0.3+cust80.15cb7f13"' -o gitea
# forgejo.org
/usr/bin/ld: /tmp/go-link-3872557335/000012.o: in function `unixDlOpen':
/_/github.com/mattn/go-sqlite3@v1.14.28/sqlite3-binding.c:45328:(.text+0x7a2d): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

View file

@ -0,0 +1,62 @@
{
"argv": [
"bwrap",
"--unshare-net",
"--unshare-pid",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--dir",
"/app",
"--ro-bind",
"/tmp/custodian-forgejo-release-r3/source/gitea",
"/app/forgejo",
"--bind",
"/tmp/custodian-forgejo-release-r3/embedded-extracted",
"/results",
"--chdir",
"/tmp",
"--clearenv",
"--setenv",
"PATH",
"/nonexistent",
"--setenv",
"HOME",
"/tmp/home",
"--setenv",
"USER",
"builder",
"--setenv",
"USERNAME",
"builder",
"--setenv",
"GITEA_WORK_DIR",
"/tmp/work",
"--setenv",
"GITEA_CUSTOM",
"/tmp/custom",
"--setenv",
"GITEA_APP_INI",
"/tmp/absent-app.ini",
"--setenv",
"TZ",
"UTC",
"--setenv",
"LC_ALL",
"C",
"--",
"/app/forgejo",
"embedded",
"extract",
"--include-vendored",
"--destination",
"/results",
"**"
],
"phase": "embedded-extract",
"returncode": 0,
"seconds": 0.81
}

View file

@ -0,0 +1,11 @@
{
"scope": "Public generated/embedded asset SHA-256 identifiers only",
"assets_verified_against_both_actual_source_and_extracted_binary": 2234,
"runtime_original_manifest_sha256": "sha256:74a0ec278ab99ac86ee434d7620229dc4a70146efd51876a1e4738d2c9f4ffdb",
"published_manifest_sha256": "sha256:ca09d0b2ed436ad6d3473da35d0d1081bdd8c3311825f4684993b33e6b426736",
"original_byte_exact_reconstructed": true,
"reconstruction": "Remove the sha256: value prefix and serialize with json.dumps(indent=2, sort_keys=True) plus one newline.",
"runtime_verification_receipt_preserved": true,
"scanner_rules_or_allowlists_changed": false,
"credential_values_transformed": false
}

View file

@ -0,0 +1,13 @@
{
"argv": [
"make",
"GOFLAGS=-trimpath -buildvcs=false -p=4",
"RELEASE_VERSION=11.0.3+cust80.15cb7f13",
"FORGEJO_VERSION=11.0.3+cust80.15cb7f13",
"FORGEJO_VERSION_API=11.0.3+cust80.15cb7f13",
"frontend"
],
"phase": "frontend",
"returncode": 0,
"seconds": 91.73
}

View file

@ -0,0 +1,55 @@
{
"buildx.build.provenance": {
"builder": {
"id": ""
},
"buildType": "https://mobyproject.org/buildkit@v1",
"materials": [
{
"uri": "pkg:docker/code.forgejo.org/forgejo/forgejo?digest=sha256:41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b\u0026platform=linux%2Famd64",
"digest": {
"sha256": "41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b"
}
}
],
"invocation": {
"configSource": {
"entryPoint": "Dockerfile"
},
"parameters": {
"frontend": "dockerfile.v0",
"args": {
"build-arg:SOURCE_DATE_EPOCH": "1752120742",
"force-network-mode": "none",
"no-cache": ""
},
"locals": [
{
"name": "context"
},
{
"name": "dockerfile"
}
]
},
"environment": {
"platform": "linux/amd64"
}
}
},
"buildx.build.ref": "default/default/owivw1kzw5uqoc3futrdsrg8z",
"containerimage.config.digest": "sha256:f72e76f0ed5c0bd75d0727d1fc28a731a2bcdc90cfe15df534098444d81385c5",
"containerimage.descriptor": {
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"digest": "sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822",
"size": 2841,
"annotations": {
"org.opencontainers.image.created": "2025-07-10T04:12:22Z"
},
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
"containerimage.digest": "sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822"
}

View file

@ -0,0 +1,60 @@
{
"argv": [
"bwrap",
"--unshare-net",
"--unshare-pid",
"--proc",
"/proc",
"--dev",
"/dev",
"--tmpfs",
"/tmp",
"--dir",
"/app",
"--ro-bind",
"/tmp/custodian-forgejo-release-r3/source/gitea",
"/app/forgejo",
"--bind",
"/tmp/custodian-forgejo-release-r3/embedded-extracted",
"/results",
"--chdir",
"/tmp",
"--clearenv",
"--setenv",
"PATH",
"/nonexistent",
"--setenv",
"HOME",
"/tmp/home",
"--setenv",
"USER",
"builder",
"--setenv",
"USERNAME",
"builder",
"--setenv",
"GITEA_WORK_DIR",
"/tmp/work",
"--setenv",
"GITEA_CUSTOM",
"/tmp/custom",
"--setenv",
"GITEA_APP_INI",
"/tmp/absent-app.ini",
"--setenv",
"TZ",
"UTC",
"--setenv",
"LC_ALL",
"C",
"--",
"/app/forgejo",
"admin",
"auth",
"add-oauth",
"--help"
],
"phase": "new-cli-help",
"returncode": 0,
"seconds": 0.13
}

View file

@ -0,0 +1,13 @@
{
"argv": [
"npm",
"ci",
"--offline",
"--ignore-scripts",
"--no-audit",
"--no-fund"
],
"phase": "npm-offline-ci",
"returncode": 0,
"seconds": 51.5
}

View file

@ -0,0 +1,12 @@
{
"argv": [
"npm",
"ci",
"--ignore-scripts",
"--no-audit",
"--no-fund"
],
"phase": "npm-public-acquire",
"returncode": 0,
"seconds": 54.62
}

View file

@ -0,0 +1,5 @@
{
"lock_sha256": "acf9859d1b1009d1afe0844f2068f9b95cfadb176591edce0ec42084604e4d65",
"module_cache": "/tmp/custodian-forgejo-successor-attempt2/modules",
"public_archives_verified": true
}

View file

@ -0,0 +1,6 @@
{
"source": "https://nodejs.org/dist/v22.15.0/SHASUMS256.txt",
"archive_sha256": "sha256:dafe2e8f82cb97de1bd10db9e2ec4c07bbf53389b0799b1e095a918951e78fd4",
"official_checksum_exact": true,
"archive": "node-v22.15.0-linux-x64.tar.xz"
}

View file

@ -0,0 +1,24 @@
{
"argv": [
"docker",
"buildx",
"build",
"--output",
"type=oci,dest=/tmp/custodian-forgejo-release-r3-oci-replay/image.oci.tar,rewrite-timestamp=true",
"--no-cache",
"--platform",
"linux/amd64",
"--pull=false",
"--network=none",
"--provenance=false",
"--sbom=false",
"--metadata-file",
"/tmp/custodian-forgejo-release-r3-oci-replay/image-build-metadata.json",
"--build-arg",
"SOURCE_DATE_EPOCH=1752120742",
"/tmp/custodian-forgejo-release-r3-oci-replay/container-context"
],
"phase": "container-build",
"returncode": 0,
"seconds": 35.51
}

View file

@ -0,0 +1,37 @@
#0 building with "default" instance using docker driver
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 465B done
#1 DONE 0.1s
#2 [internal] load metadata for code.forgejo.org/forgejo/forgejo@sha256:41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b
#2 DONE 0.0s
#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.1s
#4 [1/2] FROM code.forgejo.org/forgejo/forgejo@sha256:41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b
#4 resolve code.forgejo.org/forgejo/forgejo@sha256:41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b 0.1s done
#4 CACHED
#5 [internal] load build context
#5 transferring context: 111.05MB 1.9s done
#5 DONE 2.0s
#6 [2/2] COPY --chown=0:0 --chmod=755 gitea /app/gitea/gitea
#6 DONE 1.4s
#7 exporting to oci image format
#7 exporting layers
#7 exporting layers 7.1s done
#7 rewriting layers with source-date-epoch 1752120742 (2025-07-10 04:12:22 +0000 UTC)
#7 rewriting layers with source-date-epoch 1752120742 (2025-07-10 04:12:22 +0000 UTC) 10.2s done
#7 exporting manifest sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822 done
#7 exporting config sha256:f72e76f0ed5c0bd75d0727d1fc28a731a2bcdc90cfe15df534098444d81385c5 done
#7 sending tarball
#7 sending tarball 13.6s done
#7 DONE 30.9s
#8 resolving provenance for metadata file
#8 DONE 0.0s

View file

@ -0,0 +1,17 @@
{
"all_base_layers_and_rootless_runtime_config_preserved": true,
"all_oci_blob_digests_verified": true,
"archive_sha256": "7307e1d9a26aa6284270dac8b751a71ae02338be090511d192e14865c5e485d9",
"artifact_path": "/tmp/custodian-forgejo-release-r3-oci-replay/image.oci.tar",
"config_digest": "sha256:f72e76f0ed5c0bd75d0727d1fc28a731a2bcdc90cfe15df534098444d81385c5",
"container_epoch": 1752120742,
"deployment_tag": null,
"final_layer_binary_exact": true,
"host_or_secret_mounts": false,
"image_manifest_digest": "sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822",
"local_runtime_image_loaded": false,
"oci_index_sha256": "dc86ae233589dec919932834ecf990e1d07a16db4d240c2772ea5fa08a940671",
"privileged_containers": false,
"registry_publication": false,
"source_epoch": 1752105237
}

View file

@ -0,0 +1,55 @@
{
"buildx.build.provenance": {
"builder": {
"id": ""
},
"buildType": "https://mobyproject.org/buildkit@v1",
"materials": [
{
"uri": "pkg:docker/code.forgejo.org/forgejo/forgejo?digest=sha256:41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b\u0026platform=linux%2Famd64",
"digest": {
"sha256": "41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b"
}
}
],
"invocation": {
"configSource": {
"entryPoint": "Dockerfile"
},
"parameters": {
"frontend": "dockerfile.v0",
"args": {
"build-arg:SOURCE_DATE_EPOCH": "1752120742",
"force-network-mode": "none",
"no-cache": ""
},
"locals": [
{
"name": "context"
},
{
"name": "dockerfile"
}
]
},
"environment": {
"platform": "linux/amd64"
}
}
},
"buildx.build.ref": "default/default/t6qvjjr5lscdf1bsfjtmnd2co",
"containerimage.config.digest": "sha256:f72e76f0ed5c0bd75d0727d1fc28a731a2bcdc90cfe15df534098444d81385c5",
"containerimage.descriptor": {
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"digest": "sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822",
"size": 2841,
"annotations": {
"org.opencontainers.image.created": "2025-07-10T04:12:22Z"
},
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
"containerimage.digest": "sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822"
}

View file

@ -0,0 +1,13 @@
{
"all_public_options_templates_exact": true,
"architecture_approval": false,
"binary_sha256": "52f1e111ab17b9c8f2841b0815075df5812b066be45326abe50d140d8a231c34",
"embedded_file_manifest_sha256": "74a0ec278ab99ac86ee434d7620229dc4a70146efd51876a1e4738d2c9f4ffdb",
"embedded_files": 2234,
"native_admission": false,
"network": "bwrap --unshare-net",
"new_cli_flag_present": true,
"no_dynamic_interpreter": true,
"no_source_assets_libraries_or_host_config_mounted": true,
"source_locks_preserved": true
}

View file

@ -0,0 +1,10 @@
{
"argv": [
"go",
"mod",
"verify"
],
"phase": "verify-go-modules",
"returncode": 0,
"seconds": 11.65
}

View file

@ -0,0 +1,113 @@
# Forgejo release preparation (build only)
The Apps Makefile targets package the digest-bound 37-path Forgejo 11.0.3
source candidate in `forgejo-security-extension.patch`. It combines the original
three-group any-of gate, private secret-file input, private source-operation DB
primitives and the producer-owned Access Engine client in the OIDC callback.
Coordinator source tests and complete release checks are recorded separately;
independent owner review and operational admission of this revision remain open. They never deploy, push, change default values or choose
an operational image. Third-party application source is expanded only into a new
`/tmp` workspace; this repository retains a release input lock and exact reviewed
patch, not a second source-code tree. Upstream source ownership and publication
remain separate owner work.
Supply explicit public input archives/cache paths to `make forgejo-release-prepare`:
`FORGEJO_SOURCE_ARCHIVE`, `FORGEJO_GO_ARCHIVE`, `FORGEJO_NODE_ARCHIVE`,
`FORGEJO_BUILD_GOMODCACHE`, optionally `FORGEJO_BUILD_GOCACHE_SEED` and
`FORGEJO_BUILD_NPM_CACHE_SEED`. Every archive, patch, source output, dependency
lock and selected host compiler tool is digest-bound by `inputs.lock.json`.
Go's official checksums and Node's official SHASUMS must be independently checked
when acquiring those public archives. The source archive is official Forgejo
v11.0.3; archive PAX commit b81aa4d0807cc1e2d6a2fbafd0b75c46cc0ae237.
The workspace must not exist. Existing trials are preserved, never restarted
because an observer timed out. The recipe's `process.json` records the exact
active child PID, phase and command, then completion; logs and receipts stay in
the workspace. Do not run two phases against the same workspace concurrently.
`make forgejo-release-acquire-npm` explicitly acquires only public registry
packages, with fresh HOME/config paths, integrity-bound lockfile and lifecycle
scripts disabled. With the cache ready, `make forgejo-release-build` reruns
`npm ci --offline --ignore-scripts`, Go module verification, upstream frontend
compilation and upstream generation/static backend targets inside a network
namespace without connectivity. It uses the exact Go/Node distributions, local
compiler inputs, `bindata timetzdata sqlite sqlite_unlock_notify` plus upstream
static target's `netgo osusergo`, explicit Make GOFLAGS for trimpath/buildvcs and
fixed file/directory timestamps. Build tags retain the upstream rootless build
profile. `make forgejo-release-verify` compares every embedded public/options/
template file to actual generated source bytes, checks the extension CLI and
checks the ELF has no dynamic interpreter. These are local artifact checks,
not application login, DB, native rollout or architecture acceptance.
For a **local container build** only, first acquire the locked public amd64
base with an empty Docker client config and the explicit local socket. Then
`make forgejo-release-container` uses that exact digest as a build input and a
minimal context containing only the verified executable and generated Dockerfile.
It directly exports a local OCI archive with `rewrite-timestamp=true`, no-cache,
no image load or push. SOURCE_DATE_EPOCH alone does not fix COPY parent-directory
timestamps. The image epoch is max(source epoch,ceil immutable base created
instant), so the original base layers remain exact while new metadata is stable.
The recipe verifies every OCI blob, original base layer prefix, rootless runtime
configuration, provenance labels and exact final executable. Two no-cache exports
must reproduce the frozen output image and archive digests before claiming
reproducibility. The actual local proof receipts are in the accompanying source
proposal packet, not an admission of the resulting artifact.
There is no deployment tag, registry publication, RUN directive, privileged
container or Docker host/secret mount. Public base acquisition and a standard
local Docker/buildx daemon supporting OCI export/layer timestamp rewriting are
explicit prerequisites. An unavailable feature is a retained blocker; do not
switch to a privileged builder or claim a successful image from a backend-only
binary. Existing contexts/output archives refuse overwrite. Reconcile an actual
failed export explicitly, retaining original metadata/logs/artifacts; observation
timeouts never justify another build. Older prototype load/save behavior and
its config-versus-manifest-ID issue are retained in the source trial history,
not shipped as a production continuation.
The static host toolchain is pinned for this Linux amd64 review estate. Broader
cross-host reproducibility or a different architecture/compiler/libc is a new
input revision, not an implicit fallback. The glibc static-linker's optional
SQLite `dlopen` diagnostic is retained; no SQLite-extension runtime compatibility
or production platform admission is inferred from ELF inspection or asset checks.
An accepted owner image/source/backend, authenticated access-engine decision,
private secret-input boundary, type/case/descriptor re-freeze, current operation/
inverse sessions, durable journal and application/Helm writer exclusion are
separate gates. Helm omission/rollback does not remove persisted OAuth source.
The existing case gate is compatibility code, not a single-PDP exception.
## KeyCape identity and callback admission
The callback independently verifies the ID token against owner-admitted public
keys, algorithms, issuer, audience and token type. Public trust is loaded from
`FORGEJO_ACCESS_ENGINE_ADMISSION_FILE`; only an absolute private file reference
is used for the PDP caller token. No admission file or operational keys are
supplied by this build. New fields `tenant_source_claim` and
`max_authentication_age` are mandatory. The KeyCape v0.3 profile uses
`assurance_claim: assurance` and `tenant_source_claim: tenant_source`. Maximum
identity age and maximum authentication age are separate positive durations
chosen by the owner, not implicit defaults.
The signed assurance object preserves `level`, `methods`, boolean `mfa`,
`source: key-cape` and integer `at`. Its authentication time must not follow
issuance or the current time, and must satisfy the admitted authentication-age
bound. Identity validity ends at the earliest token expiration, issued-at age
bound or authentication-age bound. Directory, registration and default tenant
provenance remain distinct in the request. Mutable UserInfo cannot replace
these authenticated facts. Current UserInfo subject and the Goth subject must
match the independently verified token; the three required group alternatives
remain policy input.
The parser also represents valid lower-assurance facts. Application policy
continues to decide authorization. The Check client and unchanged canonical
signature bytes are a generated source slice of Access Engine ca0cb757; Forgejo
adds no policy evaluator. Exact caller/policy/registry/signer/request/lifetime
pins, an authenticated HTTPS connection and a current ALLOW are required.
Synthetic callback fixtures test ALLOW, DENY and adverse cases, including an ID
token serialized by the actual pinned KeyCape handler. Those fixtures do not
prove an actual browser, factor, custody or native rollout.
The current integration covers this guarded OIDC callback. Ongoing application
HTTP/API/Git/SSH paths, current operation/inverse sessions, durable private
evidence and retention, PostgreSQL/native proof and exclusion of all release
writers remain open in RAPPS-WP-0016-T08/T09 and NK-WP-0048-T43. An old image
approval or source test result cannot admit this candidate.

View file

@ -0,0 +1,186 @@
{
"schema": "railiance-apps.forgejo-release-inputs.v1",
"forgejo_version": "11.0.3",
"source_archive_sha256": "1ddd8c926ca07d40436897971458ace7dcf1d3496a0813ab9e0d869edef2365c",
"source_commit": "b81aa4d0807cc1e2d6a2fbafd0b75c46cc0ae237",
"patch_sha256": "15cb7f13b1b1d1095cc344176ca337f705333a436a70ae803fcfd3d7f802ccf4",
"go_archive_sha256": "3333f6ea53afa971e9078895eaa4ac7204a8c6b5c68c10e6bc9a33e8e391bdd8",
"go_version": "1.24.3",
"node_archive_sha256": "dafe2e8f82cb97de1bd10db9e2ec4c07bbf53389b0799b1e095a918951e78fd4",
"node_version": "22.15.0",
"source_date_epoch": 1752105237,
"release_version": "11.0.3+cust80.15cb7f13",
"tags": "bindata timetzdata sqlite sqlite_unlock_notify",
"runtime_base": "code.forgejo.org/forgejo/forgejo@sha256:41649dff5311664097d29b4d80620403f0b27e7c0eee0b8af79b132a37f3807b",
"runtime_index_digest": "sha256:691657c7e64af7730a2e885e6d022cf16ae60724931c5392bd61838afadcaeba",
"platform": "linux/amd64",
"reviewed_outputs": [
{
"path": "cmd/admin_auth_oauth.go",
"sha256": "d718d817c46f6393488a9c5a894b7535640cd0ec1a1ae3f72f8411a2bbec3b38"
},
{
"path": "cmd/admin_auth_oauth_secret_linux.go",
"sha256": "6741961f1df67c1afbf34c796e549425f0e04a0d0678c6eedb05f66d4754c64b"
},
{
"path": "cmd/admin_auth_oauth_secret_linux_test.go",
"sha256": "b28c2369dfab9bf2ca48e707e01b4394a36c8be5490cfe5bb658017bb626c4b2"
},
{
"path": "cmd/admin_auth_oauth_secret_other.go",
"sha256": "54056c989a4757e73db0252130e7c16bf16f5ec8eaaca2468f019ba2ef5c532d"
},
{
"path": "go.mod",
"sha256": "130138c4c3ecc29fa0d7f1e2eef0589ddf3b06071f3cc0448aa7b2326847653a"
},
{
"path": "models/auth/source_operation.go",
"sha256": "ef1b07ef6cf454015d00cde8588835f5118d829da91eb0303d37184859345a31"
},
{
"path": "models/auth/source_operation_internal_test.go",
"sha256": "af0f424d3a1fd2b29793b64baa1fa07284fee7ea0b7721c503db4efac0d871cb"
},
{
"path": "models/auth/source_operation_process_test.go",
"sha256": "40d33b11a01cb659f0bf6f8b545c4d79910e8c082a789060bcbc9cadeee965bd"
},
{
"path": "models/auth/source_operation_test.go",
"sha256": "77d311bca42f48faf3fbdc15c53582e3d8a6d9108a72ed7bb6172e5b88951428"
},
{
"path": "models/db/context.go",
"sha256": "d4c4acfcb8987071aecf5cd957b3821c8d2619a2696398d37c2970f2527686f7"
},
{
"path": "models/db/engine.go",
"sha256": "43683804d0c5bc6ead1dba0344c69dd196825cf3d5eb502af8d932a7b8207b96"
},
{
"path": "models/db/sensitive_sql.go",
"sha256": "06a298d0d6e628e6920384d4ddeef449e40c090841ebaa3f6d175725a45ae584"
},
{
"path": "models/db/sensitive_sql_logging_test.go",
"sha256": "d924b35d30686473caf29601cf51cc363ba68158cb4ef0981c9e2fc7b03c04b7"
},
{
"path": "models/db/sensitive_sql_test.go",
"sha256": "de6353c955047c3311747e4777b9f9b2195e9efb19160b971dd758dfc94cf31b"
},
{
"path": "routers/web/admin/auths.go",
"sha256": "3498229e06fb9ff52396bcb5e68c0cc2d2ad24e6494533d8717d7c833f3e2923"
},
{
"path": "routers/web/auth/oauth.go",
"sha256": "58bff778e0dc17a521706289bf45c3e0d76a759a0874f76c379b3d1ddb419b17"
},
{
"path": "services/auth/source/oauth2/access_engine.go",
"sha256": "d5f07f9491ac2212410e1fa8c0248d68ba3a723e7ca99e363627c5292d187aa8"
},
{
"path": "services/auth/source/oauth2/access_engine_assurance.go",
"sha256": "42de751b1e9a243301d566260954813b770558ecb449639acaeab307fe788642"
},
{
"path": "services/auth/source/oauth2/access_engine_assurance_test.go",
"sha256": "44e7459f6c1106a264093c19d61d01a8365f6ad22682906552d832ba39d61dd3"
},
{
"path": "services/auth/source/oauth2/access_engine_azp_test.go",
"sha256": "5f94f43ade9a79b6b7ef529c80115a8c32acfece425dc8ed3f24e6ad839fc0ce"
},
{
"path": "services/auth/source/oauth2/access_engine_callback_test.go",
"sha256": "5cea36b630c895a9473dc876b7128526ddef65d9395b2fddc56343e162452472"
},
{
"path": "services/auth/source/oauth2/access_engine_test.go",
"sha256": "99edd6cfe3e834d73e0447a7915f52cc4ab7b82644669c5ae61963f850b447e8"
},
{
"path": "services/auth/source/oauth2/providers_openid.go",
"sha256": "5dd9b906cce434c774968d57fcc790cb678147345fea4d2e58477ec6eed70bcf"
},
{
"path": "services/auth/source/oauth2/required_claim_values.go",
"sha256": "29f16d07464bbe12e3f65616b6c1eb60561d04cd8ff89ecbfb56f93dbeaf1cda"
},
{
"path": "services/auth/source/oauth2/required_claim_values_test.go",
"sha256": "54a8bd97dc51c524a9adf0c6aefb9a19fa152d234b3bb929bf1a90932662d3d0"
},
{
"path": "services/auth/source/oauth2/source.go",
"sha256": "44e99883c2ec479427b3f72c73353fe33936eed2e5c962b2fa40803576aa5642"
},
{
"path": "services/auth/source/oauth2/source_callout.go",
"sha256": "6abba69df97afc62467f0328eaa5a6383cfb4900202a081dec4b84a21b37349c"
},
{
"path": "third_party/access-engine-pep/LICENSE",
"sha256": "ff413f361a3b3bf44cf50f110fbcc4837064d57eefbcef89df2b43997c6262b6"
},
{
"path": "third_party/access-engine-pep/go.mod",
"sha256": "fea700810e47c1ba5638b86a168f8531c083a6e1222ca80bd2a8947b2ea6f2c3"
},
{
"path": "third_party/access-engine-pep/internal/sign/sign.go",
"sha256": "0df9515922e90775ebbfac798361dcafb20da8a4213796b44e246b8a92046cde"
},
{
"path": "third_party/access-engine-pep/pkg/api/canonical.go",
"sha256": "a122a2e8cd524333b13c5939c7a3685e41efbe47497a64e0c7297c92b7f10d19"
},
{
"path": "third_party/access-engine-pep/pkg/api/caring.go",
"sha256": "1907156f0f889e7b9e9c14970cf7a86a20d00478a496efaf92c7231f27fec5e3"
},
{
"path": "third_party/access-engine-pep/pkg/api/resource_manifest.go",
"sha256": "f0fa4080287d389ed48c2b1d6af96cc62e57ef72c902333f677f964420be133f"
},
{
"path": "third_party/access-engine-pep/pkg/decisionpep/client.go",
"sha256": "0d57f6ddaca5c3f81ce426c0e8b14ba14ea5962096d3be5909aa456eef19eeba"
},
{
"path": "third_party/access-engine-pep/pkg/decisionpep/client_test.go",
"sha256": "1a6be3485f580f95a1f1406fb76e525f2c4bf02fe04a424cfe0095bb728e3f62"
},
{
"path": "third_party/access-engine-pep/producer-source.json",
"sha256": "c1d83e3d79f9860ffaa61ec19a6b3415e914d3058b11b07cdd05a7d1182cdceb"
},
{
"path": "third_party/access-engine-pep/testsupport/signfixture/sign.go",
"sha256": "fe4aa86f444dc20145aefbaca35b24f046264b2c5c8b4e3b057a4496b77a4d29"
}
],
"lockfiles": {
"go.mod": "130138c4c3ecc29fa0d7f1e2eef0589ddf3b06071f3cc0448aa7b2326847653a",
"go.sum": "19c305c7e68de9d3f1bc0dda2de09c5d38597f1ee7fa411c7b36b92467ae1eaf",
"package.json": "ab5c54ec7077501b50acf3ab5f1fff4f63a51abe99e720b8ecdc6cc6c78f39fc",
"package-lock.json": "fdd5c2f891311be7c01b1907b418c243ca1f0f951fd4b4ee5b5e931c43493657"
},
"host_tools": {
"/usr/bin/make": "d78b8f1d099fbcfb6f2f49ab87223b9b68fb3956642f92d6ec6de812e8afa965",
"/usr/bin/gcc": "1b99826121ae6682a634e5efe09bd3e3df58ce58e0b28f849114ab5b89139c26",
"/usr/bin/ld": "e46a122cc3a29feba3b1d0fc2a274b6e46538be016ebe381370c0801bb98b0b8",
"/usr/bin/ar": "534681ac11c18868cfc4fdf98770aa0ba8973eedc90c231e94e6ba96e1a04f27",
"/usr/bin/bwrap": "e318903862396f96de3df57264e0158682b952fd3fb53ac23d876413e7b30f71",
"/usr/lib/x86_64-linux-gnu/libc.a": "a40c7eae7581f977b65eddb81cbc799213a695749e039d966db55bdee4ac9621",
"/usr/lib/x86_64-linux-gnu/libm.a": "420cd3c406f6f8c12deb3d1291146e9c091ee015a7c39eaf2237f01e80d6f0ae"
},
"runtime_base_config_sha256": "bc5a3df111729582faadebd01d126ba769e2b65d0c62f306f6bc79f4e562452b",
"patch_file": "forgejo-security-extension.patch",
"candidate_review_status": "coordinator tested; independent owner review pending",
"producer_source_commit": "ca0cb75729a63c9288b7333382d0fa3eb1e8c9a3"
}

View file

@ -0,0 +1,240 @@
#!/usr/bin/env python3
"""Build-only public Forgejo owner recipe; no deployment or publication code."""
import argparse
import hashlib
import json
import os
from pathlib import Path
import shutil
import subprocess
import tarfile
import time
import math
import datetime
OWNER=Path(__file__).resolve().parents[1]
INPUTS=OWNER/'build/forgejo'
LOCK=json.loads((INPUTS/'inputs.lock.json').read_text())
def digest(path):
h=hashlib.sha256()
with Path(path).open('rb') as f:
for block in iter(lambda:f.read(1024*1024),b''):h.update(block)
return h.hexdigest()
def save(path,data):
Path(path).write_text(json.dumps(data,indent=2,sort_keys=True)+'\n')
def check(path,expected):
if digest(path)!=expected:raise ValueError('frozen public input digest differs: '+str(path))
def base_env(work):
return {'PATH':str(work/'node-v22.15.0-linux-x64/bin')+':'+str(work/'go/bin')+':/usr/bin:/bin',
'HOME':str(work/'home'),'GOTOOLCHAIN':'local','GOPROXY':'off','GOSUMDB':'off','GOVCS':'*:off',
'GOPATH':str(work/'gopath'),'GOMODCACHE':json.loads((work/'prepared.json').read_text())['module_cache'],
'GOCACHE':str(work/'gocache'),'CGO_ENABLED':'1','GOMAXPROCS':'4',
'GOFLAGS':'-trimpath -buildvcs=false -p=4','SOURCE_DATE_EPOCH':str(LOCK['source_date_epoch']),
'TZ':'UTC','LC_ALL':'C','NODE_OPTIONS':'--max-old-space-size=4096',
'GIT_CONFIG_NOSYSTEM':'1','GIT_CONFIG_GLOBAL':'/dev/null','GIT_TERMINAL_PROMPT':'0',
'NPM_CONFIG_USERCONFIG':str(work/'empty.npmrc'),'NPM_CONFIG_GLOBALCONFIG':str(work/'empty-global.npmrc'),
'NPM_CONFIG_CACHE':str(work/'npm-cache'),'NPM_CONFIG_REGISTRY':'https://registry.npmjs.org',
'NPM_CONFIG_OFFLINE':'true','NPM_CONFIG_AUDIT':'false','NPM_CONFIG_FUND':'false',
'NPM_CONFIG_UPDATE_NOTIFIER':'false','PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD':'1'}
def sandbox(work,env):
cache=Path(env['GOMODCACHE'])
return ['bwrap','--unshare-net','--unshare-pid','--ro-bind','/usr','/usr','--ro-bind','/lib','/lib',
'--ro-bind','/lib64','/lib64','--symlink','usr/bin','/bin','--proc','/proc','--dev','/dev',
'--tmpfs','/tmp','--bind',str(work),str(work),'--ro-bind',str(cache),str(cache),
'--chdir',str(work/'source'),'--','env','-i']+[k+'='+v for k,v in env.items()]
def run(work,name,args,env=None,offline=False,cwd=None):
actual=sandbox(work,env)+args if offline else args
start=time.time()
with (work/(name+'.log')).open('w') as out:
proc=subprocess.Popen(actual,cwd=cwd or work,env={"PATH":"/usr/bin:/bin","HOME":str(work/"home")} if offline else env,stdout=out,stderr=subprocess.STDOUT)
save(work/'process.json',{'phase':name,'pid':proc.pid,'driver_pid':os.getpid(),'argv':args,'state':'running'})
code=proc.wait()
result={'phase':name,'argv':args,'returncode':code,'seconds':round(time.time()-start,2)}
save(work/(name+'-result.json'),result);save(work/'process.json',dict(result,state='complete',pid=None,driver_pid=None))
print(json.dumps(result),flush=True)
if code:raise RuntimeError('phase failed; retained log: '+str(work/(name+'.log')))
return result
def checked_inputs(work):
for n,h in LOCK['host_tools'].items():check(n,h)
for n,h in LOCK['lockfiles'].items():check(work/'source'/n,h)
for x in LOCK['reviewed_outputs']:check(work/'source'/x['path'],x['sha256'])
def prepare(a,work):
if work.exists():raise ValueError('workspace must be new; existing trial is never restarted or overwritten')
for n,key in [('source_archive','source_archive_sha256'),('go_archive','go_archive_sha256'),('node_archive','node_archive_sha256')]:
if not getattr(a,n):raise ValueError('explicit '+n+' required')
check(getattr(a,n),LOCK[key])
if not a.module_cache:raise ValueError('explicit public module cache required')
cache=Path(a.module_cache).resolve();assert cache.is_dir()
check(INPUTS/LOCK['patch_file'],LOCK['patch_sha256'])
for n,h in LOCK['host_tools'].items():check(n,h)
work.mkdir(parents=True);(work/'home').mkdir()
with tarfile.open(a.source_archive) as t:
# The official archive is digest-bound before any member is extracted.
parent=work/'unpacked';parent.mkdir();t.extractall(parent,filter='data')
folders=list(parent.iterdir());assert len(folders)==1 and folders[0].is_dir();folders[0].rename(work/'source');parent.rmdir()
for n in ['go_archive','node_archive']:
with tarfile.open(getattr(a,n)) as t:t.extractall(work,filter='data')
for n in ['empty.npmrc','empty-global.npmrc']:(work/n).write_text('')
if a.go_cache_seed:shutil.copytree(Path(a.go_cache_seed).resolve(),work/'gocache')
if a.npm_cache_seed:shutil.copytree(Path(a.npm_cache_seed).resolve(),work/'npm-cache')
subprocess.run(['/usr/bin/git','apply','--check',str(INPUTS/LOCK['patch_file'])],cwd=work/'source',check=True,env={'PATH':'/usr/bin:/bin','HOME':str(work/'home'),'GIT_CONFIG_NOSYSTEM':'1','GIT_CONFIG_GLOBAL':'/dev/null'})
subprocess.run(['/usr/bin/git','apply',str(INPUTS/LOCK['patch_file'])],cwd=work/'source',check=True,env={'PATH':'/usr/bin:/bin','HOME':str(work/'home'),'GIT_CONFIG_NOSYSTEM':'1','GIT_CONFIG_GLOBAL':'/dev/null'})
save(work/'prepared.json',{'module_cache':str(cache),'lock_sha256':digest(INPUTS/'inputs.lock.json'),'public_archives_verified':True})
checked_inputs(work)
packages=json.loads((work/'source/package-lock.json').read_text())['packages']
for name,package in packages.items():
if not name:continue
if not package.get('resolved','').startswith('https://registry.npmjs.org/') or not package.get('integrity','').startswith('sha512-'):
raise ValueError('non-public/non-integrity-bound npm package: '+name)
print(json.dumps({'prepared':True,'lockfile_npm_packages':len(packages)-1}))
def normalize(folder):
epoch=LOCK['source_date_epoch']
for root,dirs,files in os.walk(folder):
dirs[:]=[x for x in dirs if x not in ('node_modules','.git')]
for n in files:
p=Path(root)/n
if not p.is_symlink():os.utime(p,(epoch,epoch))
os.utime(root,(epoch,epoch))
def build(work):
checked_inputs(work);env=base_env(work)
run(work,'verify-go-modules',['go','mod','verify'],env,True)
run(work,'npm-offline-ci',['npm','ci','--offline','--ignore-scripts','--no-audit','--no-fund'],env,True)
normalize(work/'source')
version=['GOFLAGS=-trimpath -buildvcs=false -p=4','RELEASE_VERSION='+LOCK['release_version'],'FORGEJO_VERSION='+LOCK['release_version'],'FORGEJO_VERSION_API='+LOCK['release_version']]
run(work,'frontend',['make']+version+['frontend'],env,True)
for n in ['public','options','templates','modules/migration/schemas']:normalize(work/'source'/n)
run(work,'embedded-and-static-backend',['make']+version+['TAGS='+LOCK['tags'],'go-check','generate-backend','static-executable'],env,True)
checked_inputs(work)
save(work/'build.json',{'binary_sha256':digest(work/'source/gitea'),'source_locks_preserved':True,'frontend_built':True,'tags':LOCK['tags'],'image_deployment_selected':False})
def verify(work):
checked_inputs(work);binary=work/'source/gitea'
target=work/'embedded-extracted'
if target.exists():raise ValueError('retain prior verification; extraction target already exists')
target.mkdir()
# No source, asset tree, host /usr, libraries, configuration or HOME is
# exposed to the executable. A filesystem fallback cannot pass this proof.
bare=['bwrap','--unshare-net','--unshare-pid','--proc','/proc','--dev','/dev',
'--tmpfs','/tmp','--dir','/app','--ro-bind',str(binary),'/app/forgejo',
'--bind',str(target),'/results','--chdir','/tmp','--clearenv']
for k,v in {'PATH':'/nonexistent','HOME':'/tmp/home','USER':'builder','USERNAME':'builder',
'GITEA_WORK_DIR':'/tmp/work','GITEA_CUSTOM':'/tmp/custom',
'GITEA_APP_INI':'/tmp/absent-app.ini','TZ':'UTC','LC_ALL':'C'}.items():
bare+=['--setenv',k,v]
bare+=['--','/app/forgejo']
outer={'PATH':'/usr/bin:/bin','HOME':str(work/'home')}
run(work,'binary-version',bare+['--version'],outer)
run(work,'new-cli-help',bare+['admin','auth','add-oauth','--help'],outer)
assert '--required-claim-values' in (work/'new-cli-help.log').read_text()
assert '--secret-file' in (work/'new-cli-help.log').read_text()
run(work,'embedded-extract',bare+['embedded','extract','--include-vendored','--destination','/results','**'],outer)
records={}
for folder in ['public','options','templates']:
for f in sorted((work/'source'/folder).rglob('*')):
if not f.is_file():continue
n=str(f.relative_to(work/'source'));q=target/n
if not q.is_file() or digest(f)!=digest(q):raise ValueError('embedded asset missing/different: '+n)
records[n]=digest(f)
assert 'public/assets/js/index.js' in records and 'public/assets/css/index.css' in records
assert 'public/assets/licenses.txt' in records
save(work/'embedded-files.json',records)
readelf=subprocess.run(['/usr/bin/readelf','-l',str(binary)],capture_output=True,text=True,check=True,env={'PATH':'/usr/bin:/bin'})
assert 'INTERP' not in readelf.stdout
save(work/'verification.json',{'binary_sha256':digest(binary),'embedded_files':len(records),
'embedded_file_manifest_sha256':digest(work/'embedded-files.json'),'all_public_options_templates_exact':True,
'no_source_assets_libraries_or_host_config_mounted':True,
'no_dynamic_interpreter':True,'new_cli_flag_present':True,'network':'bwrap --unshare-net',
'source_locks_preserved':True,'architecture_approval':False,'native_admission':False})
print((work/'verification.json').read_text())
def container(work):
verified=json.loads((work/'verification.json').read_text());check(work/'source/gitea',verified['binary_sha256'])
context=work/'container-context'
if context.exists():raise ValueError('container trial already exists; retain evidence before an explicit revised trial')
archive_path=work/'image.oci.tar'
if archive_path.exists():raise ValueError('retain existing OCI artifact; never overwrite it')
base_bytes=(INPUTS/'runtime-base-config.json').read_bytes()
assert hashlib.sha256(base_bytes).hexdigest()==LOCK['runtime_base_config_sha256']
original=json.loads(base_bytes)
epoch=max(LOCK['source_date_epoch'],math.ceil(datetime.datetime.fromisoformat(original['created'].replace('Z','+00:00')).timestamp()))
context.mkdir();shutil.copyfile(work/'source/gitea',context/'gitea')
os.utime(context/'gitea',(LOCK['source_date_epoch'],)*2)
(context/'Dockerfile').write_text('FROM '+LOCK['runtime_base']+'\nARG SOURCE_DATE_EPOCH\nLABEL org.opencontainers.image.version="'+LOCK['release_version']+'" org.opencontainers.image.revision="'+LOCK['source_commit']+'" org.railiance.source.patch.sha256="'+LOCK['patch_sha256']+'"\nCOPY --chown=0:0 --chmod=755 gitea /app/gitea/gitea\n')
os.utime(context/'Dockerfile',(LOCK['source_date_epoch'],)*2)
config=work/'docker-config';config.mkdir(exist_ok=True)
env={'PATH':'/usr/bin:/bin','HOME':str(work/'home'),'DOCKER_CONFIG':str(config),'DOCKER_HOST':'unix:///var/run/docker.sock'}
# SOURCE_DATE_EPOCH alone does not normalise COPY parent-directory mtimes.
# OCI output permits layer rewriting without the Docker-store unpack conflict.
# The epoch never predates the immutable base, preserving its exact layer prefix.
run(work,'container-build',['docker','buildx','build','--output','type=oci,dest='+str(archive_path)+',rewrite-timestamp=true',
'--no-cache','--platform',LOCK['platform'],'--pull=false','--network=none','--provenance=false','--sbom=false',
'--metadata-file',str(work/'image-build-metadata.json'),'--build-arg','SOURCE_DATE_EPOCH='+str(epoch),str(context)],env)
metadata=json.loads((work/'image-build-metadata.json').read_text())
with tarfile.open(archive_path) as archive:
index_bytes=archive.extractfile('index.json').read();index=json.loads(index_bytes)
assert len(index['manifests'])==1
descriptor=index['manifests'][0]
assert descriptor['platform']=={'architecture':'amd64','os':'linux'}
assert descriptor['digest']==metadata['containerimage.digest']
def blob(d):
value=archive.extractfile('blobs/sha256/'+d.split(':')[1]).read()
assert 'sha256:'+hashlib.sha256(value).hexdigest()==d
return value
manifest=json.loads(blob(descriptor['digest']))
config_digest=manifest['config']['digest'];config=json.loads(blob(config_digest))
assert config_digest==metadata['containerimage.config.digest']
for layer in manifest['layers']:blob(layer['digest'])
assert config['rootfs']['diff_ids'][:-1]==original['rootfs']['diff_ids']
assert config['architecture']=='amd64' and config['os']=='linux'
for key in ['User','Entrypoint','Cmd','Env','WorkingDir','Volumes']:
assert config['config'].get(key)==original['config'].get(key),key
labels=dict(original['config'].get('Labels',{}))
labels.update({'org.opencontainers.image.version':LOCK['release_version'],
'org.opencontainers.image.revision':LOCK['source_commit'],'org.railiance.source.patch.sha256':LOCK['patch_sha256']})
assert config['config'].get('Labels')==labels
assert config['config']['User']=='1000:1000'
expected_created=datetime.datetime.fromtimestamp(epoch,datetime.timezone.utc).isoformat(timespec='seconds').replace('+00:00','Z')
assert config['created']==expected_created
found=False
last='blobs/sha256/'+manifest['layers'][-1]['digest'].split(':')[1]
with tarfile.open(fileobj=archive.extractfile(last),mode='r|*') as layer:
for member in layer:
name=member.name.lstrip('./');assert name in ('app','app/gitea','app/gitea/gitea')
if name=='app/gitea/gitea':
h=hashlib.sha256();stream=layer.extractfile(member)
for block in iter(lambda:stream.read(1024*1024),b''):h.update(block)
assert h.hexdigest()==verified['binary_sha256'];found=True
assert found
save(work/'container-result.json',{'image_manifest_digest':descriptor['digest'],'config_digest':config_digest,
'oci_index_sha256':hashlib.sha256(index_bytes).hexdigest(),'archive_sha256':digest(archive_path),
'artifact_path':str(archive_path),'source_epoch':LOCK['source_date_epoch'],'container_epoch':epoch,
'all_base_layers_and_rootless_runtime_config_preserved':True,'all_oci_blob_digests_verified':True,
'final_layer_binary_exact':True,'registry_publication':False,'deployment_tag':None,
'host_or_secret_mounts':False,'privileged_containers':False,'local_runtime_image_loaded':False})
print((work/'container-result.json').read_text())
def main():
parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('phase',choices=['prepare','acquire-npm','build','verify','container'])
parser.add_argument('--workspace',required=True)
for n in ['source-archive','go-archive','node-archive','module-cache','go-cache-seed','npm-cache-seed']:parser.add_argument('--'+n)
a=parser.parse_args();work=Path(a.workspace).resolve()
if not str(work).startswith('/tmp/'):raise ValueError('isolated build workspace must be under /tmp')
if a.phase=='prepare':return prepare(a,work)
assert json.loads((work/'prepared.json').read_text())['lock_sha256']==digest(INPUTS/'inputs.lock.json')
if a.phase=='acquire-npm':
checked_inputs(work);env=base_env(work);env['NPM_CONFIG_OFFLINE']='false'
return run(work,'npm-public-acquire',['npm','ci','--ignore-scripts','--no-audit','--no-fund'],env,cwd=work/'source')
{'build':build,'verify':verify,'container':container}[a.phase](work)
if __name__=='__main__':main()

View file

@ -0,0 +1,22 @@
{
"source_owner_commit": "git:3fb031a47ff5379358fd8cc230b40961b3b5d3a8",
"full_frontend_static_build_passed": true,
"embedded_assets_exact": 2234,
"binary_sha256": "sha256:52f1e111ab17b9c8f2841b0815075df5812b066be45326abe50d140d8a231c34",
"actual_CLI_checks": 48,
"OCI": {
"two_fresh_no_cache_OCI_exports_exact": true,
"compared_fields": {
"image_manifest_digest": "sha256:fc93a924b6e5f80a1dbf2a371dfd2e09fab10baa1cbca189bf61602009438822",
"config_digest": "sha256:f72e76f0ed5c0bd75d0727d1fc28a731a2bcdc90cfe15df534098444d81385c5",
"oci_index_sha256": "dc86ae233589dec919932834ecf990e1d07a16db4d240c2772ea5fa08a940671",
"archive_sha256": "7307e1d9a26aa6284270dac8b751a71ae02338be090511d192e14865c5e485d9"
},
"same_verified_binary": true,
"second_source_build_claimed": false,
"registry_publication": false,
"native_admission": false
},
"native_gates_closed": 0,
"independent_owner_assent": false
}

View file

@ -0,0 +1,81 @@
"""Run public dependency preparation or isolated actual consumer package tests."""
from pathlib import Path
import argparse
import hashlib
import json
import subprocess
import time
HERE = Path(__file__).resolve().parent
WORK = Path('/tmp/custodian-forgejo-successor-r3')
parser = argparse.ArgumentParser()
parser.add_argument('action', choices=['test', 'build'])
parser.add_argument('--attempt', type=int, default=1)
parser.add_argument('--workspace', type=Path, default=WORK)
parser.add_argument('--module-cache', type=Path, required=True)
parser.add_argument('--go-cache', type=Path, required=True)
args = parser.parse_args()
WORK = args.workspace.resolve()
assert WORK.is_relative_to('/tmp') and WORK.is_dir()
for cache in [args.module_cache, args.go_cache]:
assert cache.resolve().is_relative_to('/tmp') and cache.is_dir()
stem = f'consumer-{args.action}-attempt{args.attempt}'
assert not (HERE / (stem + '.json')).exists()
argv = ['bwrap', '--unshare-pid', '--die-with-parent', '--new-session']
if args.action in ['test', 'build']:
argv += ['--unshare-net']
for name in ['/usr', '/lib', '/lib64']:
argv += ['--ro-bind', name, name]
argv += ['--symlink', 'usr/bin', '/bin', '--proc', '/proc', '--dev', '/dev',
'--tmpfs', '/tmp', '--bind', str(WORK), '/work',
'--ro-bind', '/home/worsch/go/pkg/mod/cache/download', '/cached',
'--ro-bind', '/etc/ssl/certs', '/etc/ssl/certs',
'--ro-bind', '/etc/resolv.conf', '/etc/resolv.conf', '--chdir', '/work/source', '--clearenv']
argv += ['--ro-bind', str(args.module_cache.resolve()), '/work/modules',
'--bind', str(args.go_cache.resolve()), '/work/gocache']
if args.action == 'test':
fixtures = WORK / 'descriptor-fixtures'
fixtures.mkdir(exist_ok=True)
for name, value in [('race', 'A' * 64), ('race-replacement', 'B' * 64)]:
file = fixtures / name
if file.exists():
file.chmod(0o600)
file.write_text(value)
file.chmod(0o400)
argv += ['--dir', '/run', '--ro-bind', str(fixtures), '/run/forgejo-oidc',
'--bind', str(fixtures), '/run/writable-input']
env = {'PATH': '/work/go/bin:/usr/bin:/bin', 'HOME': '/work/home', 'GOPATH': '/work/gopath',
'GOTOOLCHAIN': 'local', 'GOPROXY': 'off' if args.action in ['test', 'build'] else 'file:///cached,https://proxy.golang.org',
'GOSUMDB': 'off' if args.action in ['test', 'build'] else 'sum.golang.org', 'GOVCS': '*:off',
'GOMODCACHE': '/work/modules', 'GOCACHE': '/work/gocache', 'GOMAXPROCS': '4',
'CGO_ENABLED': '1', 'GIT_CONFIG_NOSYSTEM': '1', 'GIT_CONFIG_GLOBAL': '/work/home/test.gitconfig', 'GIT_TERMINAL_PROMPT': '0'}
for key, value in env.items():
argv += ['--setenv', key, value]
command = ['go', 'mod', args.action] if args.action != 'test' else ['go', 'test', '-p', '1', '-json', '-tags', 'sqlite sqlite_unlock_notify',
'./services/auth/source/oauth2', './cmd', './models/auth', './models/db', '-run',
'TestAccessEngine|TestVerifiedApplicationIdentity|TestRequired|TestCurrent|TestPrivateSecret|TestSourceOperation|TestSensitiveSQL', '-count=1']
if args.action == 'build':
command = ['go', 'build', '-p', '4', '-tags', 'sqlite sqlite_unlock_notify', '-o', '/work/forgejo', '.']
argv += ['--'] + command
if (HERE / 'composed-source-inventory.json').exists():
manifest = json.loads((HERE / 'composed-source-inventory.json').read_text())
for row in manifest['files']:
assert hashlib.sha256((WORK / 'source' / row['path']).read_bytes()).hexdigest() == row['after_sha256'], row['path']
selected = {row['path'] for row in manifest['files']}
else:
selected = {row['path'] for row in json.loads((HERE / 'consumer-reconstruction.json').read_text())['paths']}
selected.update(str(item.relative_to(WORK / 'source')) for item in (WORK / 'source/third_party/access-engine-pep').rglob('*') if item.is_file())
selected.update(['go.mod', 'go.sum'])
source_pins = {name: 'sha256:' + hashlib.sha256((WORK / 'source' / name).read_bytes()).hexdigest() for name in sorted(selected)}
started = time.monotonic()
with (HERE / (stem + '.log')).open('xb') as log:
run = subprocess.run(argv, stdout=log, stderr=subprocess.STDOUT, timeout=900)
pins = {name: 'sha256:' + hashlib.sha256((WORK / 'source' / name).read_bytes()).hexdigest() for name in ['go.mod', 'go.sum']}
result = {'returncode': run.returncode, 'seconds': round(time.monotonic() - started, 2),
'argv': argv, 'workspace': str(WORK), 'module_hashes': pins,
'composed_source_pins': source_pins,
'network': 'disabled' if args.action in ['test', 'build'] else 'public module download only', 'pid_namespace': 'private', 'real_credentials': False}
(HERE / (stem + '.json')).write_text(json.dumps(result, indent=2) + '\n')
print(json.dumps({'action': args.action, 'returncode': run.returncode, 'seconds': result['seconds']}))
raise SystemExit(run.returncode)

View file

@ -1,5 +1,6 @@
"""Check the actual issued token in a separate copy of the consumer package."""
from pathlib import Path
import argparse
import hashlib
import json
import shutil
@ -8,13 +9,23 @@ import tempfile
import time
HERE = Path(__file__).resolve().parent
parser = argparse.ArgumentParser()
parser.add_argument('--phase', choices=['before', 'after'], default='before')
parser.add_argument('--issuer-result', type=Path)
parser.add_argument('--attempt', type=int, default=1)
args = parser.parse_args()
suffix = '' if args.attempt == 1 else '-attempt' + str(args.attempt)
ROOT = HERE.parents[3]
BASE = ROOT / 'docs/changes/netkingdom-target-2026-10-17/apps-access-engine-integration-r2'
WORK = Path(tempfile.mkdtemp(prefix='custodian-forgejo-wire-'))
original = Path('/tmp/custodian-forgejo-successor-attempt2/source/services/auth/source/oauth2')
shutil.copytree(original, WORK / 'oauth2')
shutil.copyfile(HERE / 'consumer_wire_test.go', WORK / 'oauth2/keycape_wire_test.go')
issued = json.loads((HERE / 'issuer-fixture-result.json').read_text())
wire_test = 'consumer_wire_test.go' if args.phase == 'before' else 'consumer_wire_after_test.go'
shutil.copyfile(HERE / wire_test, WORK / 'oauth2/keycape_wire_test.go')
if args.phase == 'after':
for item in (HERE / 'consumer-source').glob('*.go'):
shutil.copyfile(item, WORK / 'oauth2' / item.name)
issued = json.loads((args.issuer_result or HERE / 'issuer-fixture-result.json').read_text())
assert issued['returncode'] == 0
fixture = Path(issued['workspace']) / 'identity.json'
assert hashlib.sha256(fixture.read_bytes()).hexdigest() == issued['fixture_sha256']
@ -23,15 +34,18 @@ argv = prior['argv'][:prior['argv'].index('--')]
argv += ['--ro-bind', str(WORK / 'oauth2'), '/work/source/services/auth/source/oauth2',
'--ro-bind', str(fixture), '/work/keycape-wire-fixture.json',
'--setenv', 'CUSTODIAN_SYNTHETIC_IDENTITY_FIXTURE', '/work/keycape-wire-fixture.json']
selector = '^TestAccessEngineActualKeyCapeIssuer$' if args.phase == 'before' else 'TestAccessEngine|TestVerifiedApplicationIdentity|TestRequired|TestCurrent'
argv += ['--', 'go', 'test', '-p', '1', '-json', '-tags', 'sqlite sqlite_unlock_notify',
'./services/auth/source/oauth2', '-run', '^TestAccessEngineActualKeyCapeIssuer$', '-count=1']
assert not (HERE / 'consumer-before.json').exists()
'./services/auth/source/oauth2', '-run', selector, '-count=1']
result_path = HERE / ('consumer-' + args.phase + suffix + '.json')
assert not result_path.exists()
started = time.monotonic()
with (HERE / 'consumer-before.jsonl').open('xb') as log:
with (HERE / ('consumer-' + args.phase + suffix + '.jsonl')).open('xb') as log:
run = subprocess.run(argv, stdout=log, stderr=subprocess.STDOUT, timeout=180)
(HERE / 'consumer-before.json').write_text(json.dumps({'returncode': run.returncode,
result_path.write_text(json.dumps({'returncode': run.returncode,
'seconds': round(time.monotonic() - started, 2), 'workspace': str(WORK), 'argv': argv,
'actual_issuer_source': issued['source_commit'], 'fixture_sha256': issued['fixture_sha256'],
'consumer_source_pins': {item.name: 'sha256:' + hashlib.sha256(item.read_bytes()).hexdigest() for item in sorted((WORK / 'oauth2').glob('*.go'))},
'fixture_values_published': False, 'synthetic_authentication': True, 'real_credentials': False}, indent=2) + '\n')
print(json.dumps({'returncode': run.returncode, 'actual_issuer_source': issued['source_commit'], 'fixture_values_published': False}))
raise SystemExit(run.returncode)

View file

@ -0,0 +1,8 @@
{
"passed_including_subtests": 93,
"skipped": 0,
"failed": 0,
"receipt": "consumer-test-attempt1.json",
"complete_terminal_receipt_checked": true,
"native_gates_closed": 0
}

View file

@ -0,0 +1,107 @@
import pathlib,subprocess,json,sqlite3,os,shlex,time
import argparse,shutil
parser=argparse.ArgumentParser(description='Actual static-release CLI against a new synthetic SQLite workspace')
parser.add_argument('--workspace',type=pathlib.Path,required=True)
parser.add_argument('--binary',type=pathlib.Path,required=True)
args=parser.parse_args()
w=args.workspace.resolve()
assert w.is_relative_to('/tmp') and not w.exists()
w.mkdir();(w/'home').mkdir()
shutil.copyfile(args.binary,w/'forgejo');(w/'forgejo').chmod(0o755)
fixtures=w/'fixtures'; fixtures.mkdir(exist_ok=True)
A='AbCdEf012345678-'*4;B='ZyXwVu_987654321'*4 # synthetic exact64
assert len(A)==64 and len(B)==64
for name,data,mode in [('good',A,0o400),('replacement',B,0o440),('newline',A+'\n',0o400),('short',A[:-1],0o400),('long',A+'A',0o400),('badbyte',A[:-1]+'=',0o400),('world',A,0o444),('writable',A,0o600),('executable',A,0o500),('empty','',0o400),('CLIENT_SECRET','',0o400)]:
p=fixtures/name
if p.exists():p.chmod(0o600)
p.write_text(data);p.chmod(mode)
for name in ['symlink']:
p=fixtures/name
if not p.exists():p.symlink_to('good')
if not (fixtures/'fifo').exists():os.mkfifo(fixtures/'fifo',0o400)
(fixtures/'directory').mkdir(exist_ok=True)
(fixtures/'badparent').mkdir(exist_ok=True);(fixtures/'badparent').chmod(0o777)
if (fixtures/'badparent/value').exists():(fixtures/'badparent/value').chmod(0o600)
(fixtures/'badparent/value').write_text(A);(fixtures/'badparent/value').chmod(0o400)
if not (fixtures/'parentlink').exists():(fixtures/'parentlink').symlink_to('directory',target_is_directory=True)
(w/'runtime').mkdir(exist_ok=True)
dbfile=w/'runtime/test.db'
if dbfile.exists():dbfile.unlink() # isolated synthetic test database only
ini=w/'runtime/app.ini';ini.write_text(f'''APP_NAME = synthetic-private-input-test
RUN_USER = worsch
WORK_PATH = {w}/runtime
[security]
INSTALL_LOCK = true
SECRET_KEY = SYNTHETIC-TEST-KEY
[database]
DB_TYPE = sqlite3
SLOW_QUERY_THRESHOLD = 1ns
PATH = {w}/runtime/test.db
[server]
APP_DATA_PATH = {w}/runtime/data
OFFLINE_MODE = true
[repository]
ROOT = {w}/runtime/repos
[log]
MODE = console
LEVEL = Error
''')
env={'PATH':'/usr/bin:/bin','HOME':str(w/'home'),'GIT_CONFIG_NOSYSTEM':'1','GIT_CONFIG_GLOBAL':str(w/'home/test.gitconfig'),'GIT_TERMINAL_PROMPT':'0','USER':'worsch','GITEA_WORK_DIR':str(w/'runtime')}
base=['bwrap','--unshare-pid','--unshare-net','--ro-bind','/usr','/usr','--ro-bind','/lib','/lib','--ro-bind','/lib64','/lib64','--symlink','usr/bin','/bin','--proc','/proc','--dev','/dev','--tmpfs','/tmp','--bind',str(w),str(w),'--dir','/run','--ro-bind',str(fixtures),'/run/forgejo-oidc','--ro-bind',str(fixtures/'good'),'/run/forgejo-oidc/CLIENT_SECRET','--bind',str(fixtures),'/run/writable-input','--chdir',str(w/'runtime'),'--','env','-i']+[k+'='+v for k,v in env.items()]+[str(w/'forgejo'),'--config',str(ini)]
results=[]
def run(args,ok=True,reason=None):
p=subprocess.run(base+args,capture_output=True,text=True,timeout=60); output=p.stdout+p.stderr
assert A not in output and B not in output, 'synthetic input leaked in output'
assert all(A not in arg and B not in arg for arg in base+args), 'synthetic input in argv'
assert all(A not in v and B not in v for v in env.values()), 'synthetic input in env'
results.append({'operation':args,'returncode':p.returncode,'stdout_stderr_secret_absent':True})
(w/'cli-attempts.json').write_text(json.dumps(results,indent=2))
if (p.returncode==0)!=ok:raise AssertionError('CLI unexpected status: '+repr(args)+'\n'+output[-5000:])
if reason:assert reason in output,output[-2000:]
return p
run(['migrate'])
clean_ini=ini.read_text()
ini.write_text(clean_ini.replace('DB_TYPE = sqlite3', 'DB_TYPE = sqlite3\nLOG_SQL = true'))
run(['admin','auth','add-oauth','--name','refused-debug-logging','--provider','github','--secret-file','/run/forgejo-oidc/CLIENT_SECRET'],False,'OAuth configuration requires SQL logging disabled')
ini.write_text(clean_ini)
def rows():
with sqlite3.connect(w/'runtime/test.db') as db:return db.execute('select id,name,cfg from login_source order by id').fetchall()
def cfg():return json.loads(rows()[0][2])
run(['admin','auth','add-oauth','--name','synthetic-oauth','--provider','github','--key','synthetic-public-id','--secret-file','/run/forgejo-oidc/CLIENT_SECRET','--group-claim-name','groups','--admin-group','unchanged-admin','--scopes','read:user,user:email'])
assert len(rows())==1 and cfg()['ClientSecret']==A
id=str(rows()[0][0]); before=cfg()
run(['admin','auth','update-oauth','--id',id,'--icon-url','https://synthetic.invalid/icon'])
assert cfg()['ClientSecret']==A
preserved=cfg()
run(['admin','auth','update-oauth','--id',id,'--secret-file','/run/forgejo-oidc/replacement'])
after=cfg();assert after['ClientSecret']==B
assert {k:v for k,v in after.items() if k!='ClientSecret'}=={k:v for k,v in preserved.items() if k!='ClientSecret'},'secret replacement changed unrelated config'
# Guarded inactive source exercises actual update omission and strict list semantics
# without discovery/network or claiming a browser login.
with sqlite3.connect(w/'runtime/test.db') as db:
guarded=after|{'Provider':'openidConnect','OpenIDConnectAutoDiscoveryURL':'https://synthetic.invalid/.well-known/openid-configuration','RequiredClaimName':'groups','RequiredClaimValues':['forge-admins','forge-coulomb-owners','forge-coulomb-readers']}
db.execute('update login_source set is_active=0,cfg=? where id=?',(json.dumps(guarded),id))
run(['admin','auth','update-oauth','--id',id,'--name','synthetic-guarded'])
assert cfg()['RequiredClaimValues']==guarded['RequiredClaimValues'] and cfg()['ClientSecret']==B
run(['admin','auth','update-oauth','--id',id,'--secret-file','/run/forgejo-oidc/good'])
assert cfg()['ClientSecret']==A and cfg()['RequiredClaimValues']==guarded['RequiredClaimValues']
for path in ['/run/forgejo-oidc/'+n for n in ['newline','short','long','badbyte','world','writable','executable','empty','symlink','fifo','directory','missing','badparent/value','parentlink/value']]+['relative','','/run/forgejo-oidc/../forgejo-oidc/good','/run/writable-input/good']:
before=rows()
for cmd in [['admin','auth','add-oauth','--name','refused','--provider','github'],['admin','auth','update-oauth','--id',id,'--name','refused']]:
run(cmd+['--secret-file',path],False,'secret-file input refused')
assert rows()==before,'failure changed DB'
for action in [['add-oauth','--name','refused'],['update-oauth','--id',id]]:
before=rows();run(['admin','auth']+action+['--secret','','--secret-file','/run/forgejo-oidc/good'],False,'mutually exclusive');assert rows()==before
# Failure to clear/ambiguously replace gate keeps stored application bytes unchanged.
before=rows();run(['admin','auth','update-oauth','--id',id,'--required-claim-values',''],False);assert rows()==before
# Actual XORM error hook under a failing SQLite trigger must not disclose cfg.
before=rows()
with sqlite3.connect(w/'runtime/test.db') as database:
database.execute("create trigger synthetic_private_error before update on login_source begin select raise(abort, 'synthetic-db-failure'); end")
run(['admin','auth','update-oauth','--id',id,'--secret-file','/run/forgejo-oidc/replacement'],False,'OAuth source update failed')
assert rows()==before
with sqlite3.connect(w/'runtime/test.db') as database:database.execute('drop trigger synthetic_private_error')
# Legacy explicit secret remains supported; synthetic legacy string is not private input.
run(['admin','auth','update-oauth','--id',id,'--secret','synthetic-legacy-literal'])
assert cfg()['ClientSecret']=='synthetic-legacy-literal' and cfg()['RequiredClaimValues']==guarded['RequiredClaimValues']
(w/'cli-results.json').write_text(json.dumps({'passed':True,'subprocesses':len(results),'real_backend_cli_and_sqlite':True,'network':'disabled by bwrap','secret_inputs':'synthetic only','values_never_in_argv_env_output':True,'actual_browser_login':False,'actual_readonly_file_bind':True,'replacement_preserves_other_config':True,'unsafe_SQL_logging_refused':True,'actual_error_and_slow_hooks_no_leak':True},indent=2));print('CLI integrations passed:',len(results))

View file

@ -1331,11 +1331,25 @@ retained. The original browser packet requires human browser sign-in with client
MFA; agent/service access and their scoped tokens remain a separate owner route.
Actual KeyCape source `d803e928` emits `assurance` as an object with level, methods,
MFA, source and authentication time. The candidate's string-claim fixture does
not implement that wire contract. `forgejo-keycape-claims-r1` now exercises the
actual issuer handler with synthetic authentication and a test key. Its consumer
regression drives the required parser/freshness/provenance correction; a passing
synthetic callback is not an actual issuer or factor acceptance receipt. Full
MFA, source and authentication time. `forgejo-keycape-claims-r1` reproduces the
preceding string parser's rejection through the actual issuer handler using
synthetic authentication and a test key. The correction preserves the typed
object and tenant provenance, validates authentication time and limits identity
validity by the earliest authentication-age, token-age or expiration boundary.
All 77 actual-issuer/provider/callback test and subtest results pass, including
actual provider discovery/FetchUser/UserInfo subject joining, authenticated
ALLOW/DENY and spoofed UserInfo; the complete selected composed package suite
passes 93 results with no skips. The new 37-path patch reconstructs exactly from
the official archive. Apps `3fb031a4` publishes the five-file build-source
integration with all nine task UUIDs preserved and T09 in progress. Independent
owner review and operational admission remain open. The fresh complete frontend
and static release build passes. All 2,234 embedded assets are exact, the binary
needs no dynamic interpreter, and all 48 actual release CLI/SQLite checks pass.
Two fresh no-cache local OCI exports of that binary reproduce the same complete
archive, image manifest, config and index, with every base layer and rootless
runtime setting preserved. This is one source build and two local exports;
registry publication and operational admission are still pending.
A passing synthetic callback is not an actual issuer or factor acceptance receipt. Full
resource/operation/inverse coverage, source/package re-freeze, custody and native
admission remain existing owner work. All sixteen native gates remain open.

View file

@ -98,15 +98,31 @@ reconstruct exactly from the pinned official archive. Source and proof inventory
`docs/changes/netkingdom-target-2026-10-17/apps-access-engine-integration-r2/`.
Actual issuer-source inspection found a further mandatory interoperability gap:
KeyCape emits a structured `assurance` object; the candidate expects a string.
The actual TokenHandler fixture in `forgejo-keycape-claims-r1` supplies the next
producer-consumer regression. Implement that source shape, actual authentication
time freshness and retained provenance before native acceptance. Existing T43 /
KeyCape emits a structured `assurance` object; the preceding candidate expected a
string. The actual TokenHandler fixture reproduced the rejection. The corrected
consumer preserves the signed object and tenant provenance, validates its actual
authentication time, and bounds identity validity by authentication age, token
age and expiry. All 77 actual-issuer/provider/callback test and subtest results
pass, including real discovery/FetchUser/UserInfo joining, signed ALLOW/DENY and
UserInfo spoof refusal; all 93 selected composed
package results pass without skips. The new 37-path patch replays exactly against
the official source archive. The fresh complete frontend/static release build
passes; all 2,234 embedded assets match and all 48 actual release CLI/SQLite
checks pass. Evidence is in `forgejo-keycape-claims-r1`; these are synthetic
authentication/source and local artifact proofs.
Two fresh no-cache local OCI exports from that verified binary have identical
manifest/config/index/archive digests, preserving all base layers and rootless
runtime configuration. No second source build or operational admission is claimed.
Apps `3fb031a4` publishes the five-file build-source integration at the primary
hub, preserves all nine task UUIDs and starts existing RAPPS16-T09. Independent
owner review and operational admission of that revision remain open.
Existing T43 /
RAPPS16-T09 also retain ongoing HTTP/API/Git/SSH and operation/inverse coverage;
T41/T42 retain full release integration, exclusion and private journal custody.
The full completion audit now enumerates all sixteen gates, thirteen named gaps
and 116 SEC-DSM ledger entries under `cust80-completion-r1`. No native gate or
coordinator task is closed by these source results; the full user goal is active.
`cust80-completion-r2` retains that full scope and records this source progress.
2026-10-18 resumed application review: completed the interrupted seventeen-file
release-build evidence checkpoint as `8951d324`, preserving the staged brief and