oatpp-authkit/test
Uwe Schuster 52449e4159 #15: RedactedFieldRepository — null credentials on historical rows
Adds a decorator that sits below TemporalRepository and redacts
configured fields whenever it sees a save with valid_until != SENTINEL
(i.e., a historical row being closed by the temporal close-then-update
flow). The live row keeps its values intact.

Per Option B from the issue thread: by default the user-repo factory
redacts both passwordHash and tlsCertDn. Empty redaction list passes
everything through unchanged, so non-user temporal stacks compose the
decorator without surprise behaviour.

Files:
- repo/RedactedFieldRepository.hpp — new decorator. Schema contribution
  is empty (purely a save-time transform). Field-name matching uses
  oatpp's reflective property dispatcher and matches against the C++
  identifier name (first DTO_FIELD argument).
- repo/ConcreteUserRepository.hpp — makeUserRepository now wraps the
  concrete repo in RedactedFieldRepository<UserDto>{"passwordHash",
  "tlsCertDn"} before passing to TemporalRepository. Optional second
  argument lets consumers override the redaction list.
- test/test_redacted_field_repository.cpp — five tests cover live-row
  pass-through, historical-row redaction (both fields), partial
  redaction list, empty list, and null-valid_until treated as live.
- README.md — adds RedactedFieldRepository to the header inventory.

14 of 14 tests pass. Bumped 0.12.0 → 0.13.0.

Closes #15

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 20:52:02 +02:00
..
CMakeLists.txt #15: RedactedFieldRepository — null credentials on historical rows 2026-05-06 20:52:02 +02:00
test_audit_log_repository.cpp #13: TemporalRepository save — stable-live + historical-copy semantics 2026-04-30 00:10:03 +02:00
test_body_size_limit.cpp #4: BodySizeLimitInterceptor — fail-closed on missing/malformed Content-Length 2026-04-25 21:36:50 +02:00
test_json_serialization.cpp #6: route ad-hoc JSON through ObjectMapper (Option A — DI everywhere, all-in-one) 2026-04-25 21:56:05 +02:00
test_negotiation.cpp #2: Browser-friendly 401/403 — content-negotiate JSON vs HTML/redirect 2026-04-25 13:23:08 +02:00
test_queryable.cpp #9: Optional IQueryable<T> capability + in-house query AST 2026-04-29 12:55:29 +02:00
test_redacted_field_repository.cpp #15: RedactedFieldRepository — null credentials on historical rows 2026-05-06 20:52:02 +02:00
test_repository_decorators.cpp #13: TemporalRepository save — stable-live + historical-copy semantics 2026-04-30 00:10:03 +02:00
test_repository_interface.cpp #10: TemporalFieldTraits<T> — decouple decorator from canonical column names 2026-04-29 14:23:40 +02:00
test_role_template_schema.cpp #14 PR 1: relocate role_templates module + Atlas migration docs 2026-05-06 12:36:18 +02:00
test_schema_contract.cpp #14 PR 0: replace imperative migration kit with declarative SchemaContract 2026-05-06 12:14:51 +02:00
test_security_headers.cpp #3: SecurityHeadersInterceptor — strict baseline + CspOverride ctor (Option B) 2026-04-25 21:54:58 +02:00
test_temporal_field_traits.cpp #13: TemporalRepository save — stable-live + historical-copy semantics 2026-04-30 00:10:03 +02:00
test_user_permission_schema.cpp #14 PRs 2 & 3: relocate user_property_permissions + user_group_permissions 2026-05-06 12:39:52 +02:00
test_user_schema.cpp #14 PR 4: relocate users with temporal shape (Option B) 2026-05-06 12:57:59 +02:00