v0.5.0
v0.5.0 — Testing Pyramid + Security Hardening
Major release: three production security bug-fixes, a new OAuth feature, and a
comprehensive test-pyramid overhaul. 93 commits since v0.4.6.
🔒 Security fixes
AccessControlServicegranted disabled BE users vault access. Any user with a non-zerobe_users.disableflag is now denied at the vault layer regardless of session state.AccessControlServiceaccepted stale group IDs from sessions. SessionuserGroupsUIDentries are now filtered against the livebe_groupstable before being intersected with a secret'sallowedGroups. Deleted-group UIDs can no longer grant access.verifyHashChain()missed delete+patch-successor attacks. An attacker who deletes audit row N and patches row N+1'sprevious_hashwould previously go undetected. The verifier now detects UID gaps; results exposemissingUids(capped at 1000) +missingUidCount.
✨ Features
- OAuth refresh-token fallback —
OAuthTokenManager::fetchTokenWithFallback()falls back toclient_credentialsonHTTP 400/401 + invalid_grant/invalid_token. Outages (5xx / 429 /invalid_client) re-throw so real failures are not masked. Both events are audit-logged. vault:migrate-field --uid-field=''is rejected up-front with a clear error instead of crashing mid-batch.
🧪 Testing pyramid
| Metric | Before | After |
|---|---|---|
| Unit tests | 1 298 | 1 705 |
| Unit assertions | 3 045 | 6 949 |
| Fuzz test files | 1 | 10 (1 514 methods) |
| Functional test files | 12 | 24 |
| E2E specs | 8 | 14 + pathway audit |
| Coverage driver | PCOV | Xdebug (branch + path) |
| Mutation MSI | N/A | 72.35 % baseline |
| PHPUnit notices | 70 | 0 |
Infection mutation testing is now wired end-to-end with a documented ratchet
plan toward 85 / 95 MSI by Q4 — see
Documentation/Developer/mutation-baseline.md.
🛠️ Tooling
- Dev dependencies consolidated: 14 direct
require-deventries reduced to 4 via the newnetresearch/typo3-ci-workflowsmeta-package. Addsphpstan-deprecation-rules,saschaegerer/phpstan-typo3,nikic/php-fuzzer,overtrue/phplint, anddg/bypass-finalsas side benefits. - CI pipeline: all 16 reusable workflows pinned to commit SHAs, concurrency block for PRs, on-demand mutation testing via the
run-mutationPR label. - PHPStan: strict-rules + deprecation-rules + phpunit + saschaegerer/phpstan-typo3 extensions (auto-registered via
phpstan/extension-installer). runTests.shhardened: dual SIGINT/SIGTERM/EXIT trap, collision-resistant container suffix, Alpine 3.8 → 3.20.- Test infrastructure:
AbstractVaultFunctionalTestCase+ 3 traits +SecretFixtureBuilderdeduplicate ~441 LOC of boilerplate; architecture-check script enforces the project base on new unit tests.
📦 Assets
nr-vault-0.5.0.tar.gz/.zip— release archives*.sbom.cdx.json/.spdx.json— CycloneDX + SPDX SBOMschecksums.txt— SHA-256 digests for every asset*.bundle— cosign keyless signature bundles (verify withcosign verify-blob --bundle …)
Full changelog: v0.4.6...v0.5.0