Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1139 commits
Select commit Hold shift + click to select a range
3b1e504
fix: accept string targets in policy workbench selector
vitormattos Apr 14, 2026
8e1f563
fix: allow system create save for immutable policy defaults
vitormattos Apr 14, 2026
73be5f3
test: cover system create save with immutable override
vitormattos Apr 14, 2026
87c6f82
fix: detect immutable override state in rule editor
vitormattos Apr 15, 2026
2c6e997
fix: disable immutable override switch in policy modal
vitormattos Apr 15, 2026
d6bd22f
test: grant request-sign permission in preferences e2e
vitormattos Apr 15, 2026
a1e2fc1
chore: require psr http client for psalm
vitormattos Apr 15, 2026
8fc4fe0
chore: lock psr http client dependencies
vitormattos Apr 15, 2026
fe10367
fix: hide immutable override toggle in policy editor
vitormattos Apr 15, 2026
a643014
test: cover hidden immutable override toggle
vitormattos Apr 15, 2026
2d4bfdb
feat: add autosave feedback and undo in preferences
vitormattos Apr 15, 2026
1e280d4
test: cover autosave undo in preferences
vitormattos Apr 15, 2026
3680ea2
refactor: simplify preferences autosave ui
vitormattos Apr 15, 2026
1ea8fa5
test: cover simplified preferences autosave behavior
vitormattos Apr 15, 2026
601ca4e
fix: prevent autosave feedback layout shift
vitormattos Apr 15, 2026
cf4bbe5
test: stub loading icon in preferences spec
vitormattos Apr 15, 2026
aa05f4e
fix: clear undo snapshot after undoing preference change
vitormattos Apr 15, 2026
ba6078b
test: assert undo arrow hidden after undoing preference
vitormattos Apr 15, 2026
dae67dd
fix: show reset button when user has a saved preference on page load
vitormattos Apr 15, 2026
1f401e8
test: cover reset button visibility on page load and undo label logic
vitormattos Apr 15, 2026
1288c59
fix: anchor undo button inside editor shell instead of floating toolbar
vitormattos Apr 15, 2026
512315b
fix: move undo button above editor shell with visible text label
vitormattos Apr 15, 2026
78e4648
test: verify reset button shows for add_footer on page load
vitormattos Apr 15, 2026
711c94a
fix: make preferences action reset-only without transient undo state
vitormattos Apr 15, 2026
f774028
fix: allow hiding footer template reset button via prop
vitormattos Apr 15, 2026
9cb3ea0
test: update preferences specs for reset-only behavior
vitormattos Apr 15, 2026
9caa975
test: cover hidden template reset button option
vitormattos Apr 15, 2026
85cc08b
fix(signature-footer): fall back to system default when inherited tem…
vitormattos Apr 16, 2026
f1187e4
test(signature-footer): update resolveEditorProps tests to expect cor…
vitormattos Apr 16, 2026
22d101e
fix(preferences): show template reset button when inherited template …
vitormattos Apr 16, 2026
eb16199
fix(signature-footer): save concrete template value instead of empty …
vitormattos Apr 16, 2026
b907f50
test(signature-footer): expect concrete inherited template value afte…
vitormattos Apr 16, 2026
4d397e8
style(signature-footer): remove redundant comment in resolveEditorProps
vitormattos Apr 16, 2026
6dcb0fe
style(signature-footer): remove redundant comments in SignatureFooter…
vitormattos Apr 16, 2026
c44194c
fix: align footer policy reset behavior
vitormattos Apr 17, 2026
f3a2184
fix: restore footer template policy sync and default state
vitormattos Apr 17, 2026
4196a5a
feat: restrict policy workbench group targets to manageable scope
vitormattos Apr 18, 2026
4943050
test(playwright): avoid selecting already-persisted group in menu vis…
vitormattos Apr 27, 2026
42b966a
feat(policy): migrate identification_documents to canonical policy stack
vitormattos Apr 27, 2026
3c2bf3f
refactor(policy): extract identification_documents value normalizer
vitormattos Apr 27, 2026
aaf13ff
test(policy): add identification_documents normalizer coverage
vitormattos Apr 27, 2026
02bf00c
refactor(policy): use shared normalizer in identification policy prov…
vitormattos Apr 27, 2026
7130f12
refactor(policy): use shared normalizer in id docs policy service
vitormattos Apr 27, 2026
31b060a
refactor(policy): reuse identification_documents normalizer in settin…
vitormattos Apr 27, 2026
96904ec
fix(policy-ui): align identification_documents parser strictness
vitormattos Apr 27, 2026
0a8d8ab
test(integration): add identification_documents policy feature coverage
vitormattos Apr 27, 2026
2379dcf
style(cs): normalize EOF newline in identification policy provider
vitormattos Apr 27, 2026
b503190
style(cs): normalize EOF newline in identification policy value
vitormattos Apr 27, 2026
5019f06
style(cs): reorder imports in id docs policy service test
vitormattos Apr 27, 2026
f075cff
fix(types): use string key for identification documents options
vitormattos Apr 27, 2026
cfae67f
test(e2e): stabilize policy settings menu visibility scenario
vitormattos Apr 27, 2026
b41e849
fix(settings): load effective policies for policy menu visibility
vitormattos Apr 27, 2026
7a643fa
style(frontend): normalize newline in identification documents rule e…
vitormattos Apr 27, 2026
6b29440
test(playwright): force English locale for E2E runtime
vitormattos Apr 27, 2026
0565357
test(provisioning): add helper to enforce user language
vitormattos Apr 27, 2026
05fa7eb
test(e2e): make policy menu visibility assertions English-only
vitormattos Apr 27, 2026
57475b9
test(settings): mock policies fetch on mount
vitormattos Apr 27, 2026
8af2d1d
feat(policy): add collect_metadata definition provider
vitormattos Apr 27, 2026
fef7f77
feat(policy): register collect_metadata in provider catalog
vitormattos Apr 27, 2026
686c0e1
test(policy): cover collect_metadata provider behavior
vitormattos Apr 27, 2026
bf70048
refactor(policy): resolve collect_metadata via PolicyService in sign …
vitormattos Apr 27, 2026
7cb408f
refactor(policy): resolve collect_metadata via PolicyService in signa…
vitormattos Apr 27, 2026
bab539a
style(cs): normalize EOF newline in collect metadata policy
vitormattos Apr 27, 2026
260320a
refactor(settings): read and persist collect metadata via policies store
vitormattos Apr 27, 2026
331cac4
test(settings): cover collect metadata policies store flow
vitormattos Apr 27, 2026
cc04206
test(integration): add collect_metadata policy layer coverage
vitormattos Apr 27, 2026
ff3c708
feat(policy): migrate signature_text settings to policy layer
vitormattos Apr 27, 2026
ae4f7ca
fix(cs): remove duplicate import in SignatureTextService
vitormattos Apr 27, 2026
5b4cde4
fix(api): use correct PolicyService method names
vitormattos Apr 27, 2026
0fdd502
test(policy): add CollectMetadata and SignatureText policies to mock
vitormattos Apr 27, 2026
53a8a7a
feat(policy): make SignatureTextService policy-only
vitormattos Apr 27, 2026
2f621e0
test(signature-text): adapt service tests to policy-only flow
vitormattos Apr 27, 2026
1609d8f
test(jsign): inject policy mock in signature text dependency
vitormattos Apr 27, 2026
1b72001
feat(migration): include pending policy settings in unified migration
vitormattos Apr 27, 2026
602b5f7
test(migration): cover unified policy migration gaps
vitormattos Apr 27, 2026
ad8c323
refactor(policy): resolve identification_documents via PolicyService
vitormattos Apr 27, 2026
ec0efb9
test(policy): adapt account/admin tests for identification_documents …
vitormattos Apr 27, 2026
cae2d5f
refactor(policy): encapsulate identification_documents resolution
vitormattos Apr 27, 2026
c469384
refactor(policy): use signature policy dimensions in background service
vitormattos Apr 27, 2026
f805627
refactor(frontend): route migrated settings through policy store
vitormattos Apr 27, 2026
2e1ef77
feat(policy-workbench): add collect_metadata and user id-doc scopes
vitormattos Apr 27, 2026
77761cc
fix(psalm): use resolved policy getter in sign file service
vitormattos Apr 27, 2026
7362f6a
test(types): fix allowed groups mock call tuple typing
vitormattos Apr 27, 2026
49bd792
test(types): fix validation mock call tuple typing
vitormattos Apr 27, 2026
845407e
test(policy): route collect_metadata unit assertions through PolicySe…
vitormattos Apr 27, 2026
808247b
refactor(policy): require PolicyService for collect metadata runtime
vitormattos Apr 27, 2026
80ab722
fix(policy): treat empty allowed values as unconstrained
vitormattos Apr 28, 2026
6aa5f3b
test(policy): validate empty allowed values business rule
vitormattos Apr 28, 2026
209a3d9
test(policy): use data providers in PolicySpec validation tests
vitormattos Apr 28, 2026
1e59366
feat(stage20): consolidate signature_text family into unified policy …
vitormattos Apr 28, 2026
1ef2746
refactor(SignatureStamp): integrate policy-based signature_text consu…
vitormattos Apr 28, 2026
e236cd8
fix: remove duplicate normalizePolicyKey method in SignatureTextPolicy
vitormattos Apr 28, 2026
d610a33
refactor(signature-text): complete migration to 100% policy-first, re…
vitormattos Apr 28, 2026
743ef08
refactor: move useSignatureTextPolicy to signature-text feature folder
vitormattos Apr 28, 2026
ca2a8f8
fix: resolve all 16 CI/CD test failures in PR #7518
vitormattos Apr 28, 2026
1e9ebd1
fix: Correct TypeScript types and PHP formatting for signature_text p…
vitormattos Apr 28, 2026
40b771b
fix: resolve remaining CI failures for signature text policy
vitormattos Apr 28, 2026
d2c0791
fix: stabilize policy migration and runtime for signature_text
vitormattos Apr 28, 2026
54ef7d2
fix: avoid render mode scope leakage in SignatureStamp defaults
vitormattos Apr 28, 2026
ac5cc98
refactor: centralize signature text UI defaults
vitormattos Apr 28, 2026
c2378b2
refactor: simplify signature text policy composable
vitormattos Apr 28, 2026
d29623e
Fix signature text policy key registry mapping
vitormattos Apr 28, 2026
892fbd0
refactor(behat): rewrite signature_text_policy.feature using standard…
vitormattos Apr 28, 2026
01f8957
fix: finalize policy-driven settings and preference sync
vitormattos Apr 28, 2026
5e1d5cd
fix: resolve static and type-check regressions
vitormattos Apr 28, 2026
ecbab78
docs: regenerate openapi artifacts
vitormattos Apr 28, 2026
9efed20
fix(openapi): align admin certificate response schema
vitormattos Apr 28, 2026
ca16981
feat(policy): migrate approval groups setting for id docs
vitormattos Apr 28, 2026
ff6ab69
refactor: delegate approval checks to id docs policy service
vitormattos Apr 28, 2026
33c6c12
refactor: resolve docmdp config through policy service
vitormattos Apr 28, 2026
1925885
refactor: use id docs policy service in account settings
vitormattos Apr 28, 2026
230f7d3
refactor: centralize id docs status through policy service
vitormattos Apr 28, 2026
1de54cc
feat: add approval group policy helpers to id docs service
vitormattos Apr 28, 2026
7908cb8
test: include approval_group in workbench summaries
vitormattos Apr 28, 2026
9059f62
feat: register approval_group policy definition
vitormattos Apr 28, 2026
6817d21
refactor: remove duplicated migrated settings sections
vitormattos Apr 28, 2026
fd1af93
test: use policy service for approval group setup
vitormattos Apr 28, 2026
8fcf747
test: reset certificate engine cache between tests
vitormattos Apr 28, 2026
9940e19
test: update validate helper deps for id docs policy service
vitormattos Apr 28, 2026
60cef0e
test: cover policy-backed docmdp config service
vitormattos Apr 28, 2026
64b2c09
test: adapt account settings provider to id docs policy
vitormattos Apr 28, 2026
ce72b54
test: adapt settings loader tests to id docs policy service
vitormattos Apr 28, 2026
d394e63
test: cover approval-group resolution in id docs service
vitormattos Apr 28, 2026
5e20669
test: return concrete resolved policy in admin settings test
vitormattos Apr 28, 2026
642eb1a
test: add e2e coverage for migrated policy preferences
vitormattos Apr 28, 2026
e2a2247
test: add approval groups rule editor spec
vitormattos Apr 28, 2026
4bf376d
feat: add approval groups rule editor
vitormattos Apr 28, 2026
532871c
feat: add approval groups policy value model
vitormattos Apr 28, 2026
0fef4a6
feat: add approval groups policy real definition
vitormattos Apr 28, 2026
e74ceaa
fix: cs
vitormattos Apr 28, 2026
7aa8e25
refactor: centralize LibresignAccountCapabilitySettings type
vitormattos Apr 29, 2026
bde0319
fix: read signature dimensions from capabilities without fallback
vitormattos Apr 29, 2026
718e938
test(e2e): stabilize sign-flow specs
vitormattos Apr 29, 2026
c416131
test(e2e): restore request access cleanup
vitormattos Apr 29, 2026
66e6c28
test(e2e): relax migrated policy test timeout
vitormattos Apr 29, 2026
b4b00c2
test(e2e): remove migrated prefs timeout workaround
vitormattos Apr 29, 2026
c134cff
test(e2e): replace networkidle wait with targeted DOM wait
vitormattos Apr 29, 2026
4e618db
refactor(policy): remove footer legacy appconfig fallback
vitormattos Apr 29, 2026
95f920d
refactor(settings): save signature text through policy endpoint
vitormattos Apr 29, 2026
ab91469
feat: migrate policy settings and footer workflow
vitormattos Apr 30, 2026
f58574a
feat: update lib/Capabilities.php
vitormattos Apr 30, 2026
376b75f
feat: update lib/Handler/CertificateEngine/AEngineHandler.php
vitormattos Apr 30, 2026
2e35d02
feat: update lib/Migration/Version18001Date20260320000000.php
vitormattos Apr 30, 2026
927299e
feat: update lib/Service/Crl/CrlRevocationChecker.php
vitormattos Apr 30, 2026
ca4c3f4
feat: update lib/Service/Envelope/EnvelopeService.php
vitormattos Apr 30, 2026
4443812
feat: update lib/Service/EnvelopeService.php
vitormattos Apr 30, 2026
2a226af
feat: update lib/Service/Policy/Provider/PolicyProviders.php
vitormattos Apr 30, 2026
74a3b21
feat: update lib/Service/ReminderService.php
vitormattos Apr 30, 2026
ddc2273
feat: update lib/Settings/Admin.php
vitormattos Apr 30, 2026
a2faa4a
test: remove playwright/e2e/policy-preferences-migrated-settings.spec.ts
vitormattos Apr 30, 2026
b4dc5a9
test: remove src/tests/views/Settings/Confetti.spec.ts
vitormattos Apr 30, 2026
e7b15ad
test: remove src/tests/views/Settings/CrlValidation.spec.ts
vitormattos Apr 30, 2026
72e9ec2
test: remove src/tests/views/Settings/DefaultUserFolder.spec.ts
vitormattos Apr 30, 2026
e882f9b
test: remove src/tests/views/Settings/Envelope.spec.ts
vitormattos Apr 30, 2026
0e901ba
test: remove src/tests/views/Settings/ExpirationRules.spec.ts
vitormattos Apr 30, 2026
88e700f
test: remove src/tests/views/Settings/LegalInformation.spec.ts
vitormattos Apr 30, 2026
8145339
test: remove src/tests/views/Settings/Reminders.spec.ts
vitormattos Apr 30, 2026
499763f
test: update src/tests/views/Settings/Settings.spec.ts
vitormattos Apr 30, 2026
7ff2b92
test: remove src/tests/views/Settings/SignatureHashAlgorithm.spec.ts
vitormattos Apr 30, 2026
0b81f23
refactor: remove src/views/Settings/Confetti.vue
vitormattos Apr 30, 2026
98e761c
refactor: remove src/views/Settings/CrlValidation.vue
vitormattos Apr 30, 2026
b9ca1fd
refactor: remove src/views/Settings/DefaultUserFolder.vue
vitormattos Apr 30, 2026
8808c24
refactor: remove src/views/Settings/Envelope.vue
vitormattos Apr 30, 2026
dfb226a
refactor: remove src/views/Settings/ExpirationRules.vue
vitormattos Apr 30, 2026
5128f06
refactor: remove src/views/Settings/LegalInformation.vue
vitormattos Apr 30, 2026
93b6323
feat: update src/views/Settings/PolicyWorkbench/settings/realDefiniti…
vitormattos Apr 30, 2026
780c8bd
refactor: remove src/views/Settings/Reminders.vue
vitormattos Apr 30, 2026
2d25b24
feat: update src/views/Settings/Settings.vue
vitormattos Apr 30, 2026
af06931
refactor: remove src/views/Settings/SignatureHashAlgorithm.vue
vitormattos Apr 30, 2026
5beda07
test: update tests/php/Unit/CapabilitiesTest.php
vitormattos Apr 30, 2026
e980a09
test: update tests/php/Unit/Migration/Version18001Date20260320000000T…
vitormattos Apr 30, 2026
52c982f
test: update tests/php/Unit/Service/Crl/CrlRevocationCheckerTest.php
vitormattos Apr 30, 2026
15ac49d
test: update tests/php/Unit/Service/EnvelopeServiceTest.php
vitormattos Apr 30, 2026
baceb2d
test: update tests/php/Unit/Service/ReminderServiceTest.php
vitormattos Apr 30, 2026
e336e26
feat: add lib/Service/Policy/Provider/Confetti/ConfettiPolicy.php
vitormattos Apr 30, 2026
4e56496
feat: add lib/Service/Policy/Provider/CrlValidation/CrlValidationPoli…
vitormattos Apr 30, 2026
69f8051
feat: add lib/Service/Policy/Provider/DefaultUserFolder/DefaultUserFo…
vitormattos Apr 30, 2026
2e95c74
feat: add lib/Service/Policy/Provider/Envelope/EnvelopePolicy.php
vitormattos Apr 30, 2026
7960d6b
feat: add lib/Service/Policy/Provider/ExpirationRules/ExpirationRules…
vitormattos Apr 30, 2026
c7657e2
feat: add lib/Service/Policy/Provider/LegalInformation/LegalInformati…
vitormattos Apr 30, 2026
5bdcf36
feat: add lib/Service/Policy/Provider/Reminder/ReminderPolicy.php
vitormattos Apr 30, 2026
e32e8e1
feat: add lib/Service/Policy/Provider/Reminder/ReminderPolicyValue.php
vitormattos Apr 30, 2026
d8b5061
feat: add lib/Service/Policy/Provider/SignatureHashAlgorithm/Signatur…
vitormattos Apr 30, 2026
958fca1
test: add playwright/e2e/policy-preferences-boolean-settings.spec.ts
vitormattos Apr 30, 2026
b07c7bc
test: add playwright/e2e/policy-workbench-boolean-settings.spec.ts
vitormattos Apr 30, 2026
662d697
test: add playwright/e2e/policy-workbench-reminder-settings.spec.ts
vitormattos Apr 30, 2026
4511351
feat: add src/views/Settings/PolicyWorkbench/settings/confetti/Confet…
vitormattos Apr 30, 2026
4d0dd68
feat: add src/views/Settings/PolicyWorkbench/settings/confetti/realDe…
vitormattos Apr 30, 2026
4d01e64
feat: add src/views/Settings/PolicyWorkbench/settings/crl-validation/…
vitormattos Apr 30, 2026
bdf43c4
feat: add src/views/Settings/PolicyWorkbench/settings/crl-validation/…
vitormattos Apr 30, 2026
9029ae3
feat: add src/views/Settings/PolicyWorkbench/settings/default-user-fo…
vitormattos Apr 30, 2026
1b215f2
feat: add src/views/Settings/PolicyWorkbench/settings/default-user-fo…
vitormattos Apr 30, 2026
741594f
feat: add src/views/Settings/PolicyWorkbench/settings/default-user-fo…
vitormattos Apr 30, 2026
bc8d87b
feat: add src/views/Settings/PolicyWorkbench/settings/envelope/Envelo…
vitormattos Apr 30, 2026
df74c71
feat: add src/views/Settings/PolicyWorkbench/settings/envelope/realDe…
vitormattos Apr 30, 2026
ee8e875
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
07b4ea6
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
ec3df85
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
aad98e2
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
811d805
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
4ca23ac
feat: add src/views/Settings/PolicyWorkbench/settings/legal-informati…
vitormattos Apr 30, 2026
6335e6f
feat: add src/views/Settings/PolicyWorkbench/settings/legal-informati…
vitormattos Apr 30, 2026
74e8510
feat: add src/views/Settings/PolicyWorkbench/settings/legal-informati…
vitormattos Apr 30, 2026
80d5292
feat: add src/views/Settings/PolicyWorkbench/settings/reminder/Remind…
vitormattos Apr 30, 2026
d023626
feat: add src/views/Settings/PolicyWorkbench/settings/reminder/model.ts
vitormattos Apr 30, 2026
d2d0b41
feat: add src/views/Settings/PolicyWorkbench/settings/reminder/realDe…
vitormattos Apr 30, 2026
a3b5906
feat: add src/views/Settings/PolicyWorkbench/settings/signature-hash-…
vitormattos Apr 30, 2026
c72a796
feat: add src/views/Settings/PolicyWorkbench/settings/signature-hash-…
vitormattos Apr 30, 2026
bf95fb6
feat: add src/views/Settings/PolicyWorkbench/settings/signature-hash-…
vitormattos Apr 30, 2026
02e317e
test: add tests/integration/features/admin/boolean_policy_layers.feature
vitormattos Apr 30, 2026
13edd78
test: add tests/integration/features/admin/reminder_policy_settings.f…
vitormattos Apr 30, 2026
d04437c
test: add tests/php/Unit/Service/Policy/Provider/Confetti/ConfettiPol…
vitormattos Apr 30, 2026
042f77c
test: add tests/php/Unit/Service/Policy/Provider/CrlValidation/CrlVal…
vitormattos Apr 30, 2026
956c1b3
test: add tests/php/Unit/Service/Policy/Provider/DefaultUserFolder/De…
vitormattos Apr 30, 2026
5ae8360
test: add tests/php/Unit/Service/Policy/Provider/Envelope/EnvelopePol…
vitormattos Apr 30, 2026
220e28a
test: add tests/php/Unit/Service/Policy/Provider/ExpirationRules/Expi…
vitormattos Apr 30, 2026
1690005
test: add tests/php/Unit/Service/Policy/Provider/LegalInformation/Leg…
vitormattos Apr 30, 2026
6a744c3
test: add tests/php/Unit/Service/Policy/Provider/Reminder/ReminderPol…
vitormattos Apr 30, 2026
33a777b
test: add tests/php/Unit/Service/Policy/Provider/SignatureHashAlgorit…
vitormattos Apr 30, 2026
d79dce3
refactor: migrate TSA settings to policy system
vitormattos Apr 30, 2026
1b89786
refactor: migrate identify_methods settings to policy system
vitormattos Apr 30, 2026
7878c6b
refactor: remove legacy initial state values (docmdp_config, legal_in…
vitormattos Apr 30, 2026
9e34152
refactor: migrate sign engine handlers settings to policy system
vitormattos Apr 30, 2026
aefcbef
refactor: inject PolicyService into certificate engine handlers
vitormattos Apr 30, 2026
8073953
refactor: make setEngine() atomic and remove swallowed exceptions
vitormattos Apr 30, 2026
ca57a72
chore: add migration to remove legacy appConfig keys
vitormattos Apr 30, 2026
86d118a
chore: register new policy definitions and update frontend specs
vitormattos Apr 30, 2026
8472783
feat(frontend): add identify-methods and tsa policy UI definitions
vitormattos Apr 30, 2026
c691c5d
refactor(frontend): remove double cast in normalizeIdentifyMethodsPolicy
vitormattos Apr 30, 2026
31cf1a8
fix(types): widen EffectivePolicyValue to include arrays, remove cast…
vitormattos Apr 30, 2026
5696f98
fix(ci): add missing policy providers and restore scalar policy paylo…
vitormattos Apr 30, 2026
67fef15
fix: cs
vitormattos Apr 30, 2026
acd6593
fix(compat): restore legacy admin state and tsa config fallback
vitormattos Apr 30, 2026
897eec0
fix: remove legacy appConfig TSA fallbacks, fix policy API response d…
vitormattos Apr 30, 2026
e8b18c7
fix: remove duplicated admin initial states and align TSA integration…
vitormattos May 3, 2026
38af4c7
fix: migrate CRL admin state to effective policies
vitormattos May 3, 2026
43bd67e
fix: migrate footer preview states from app config to policies
vitormattos May 3, 2026
c85788b
fix: cs
vitormattos May 3, 2026
3c40c70
fix: align response type aliases with policy payloads
vitormattos May 3, 2026
f7e71a9
fix: align frontend policy typing after OpenAPI regen
vitormattos May 3, 2026
40f78ae
test: align identify methods initial-state assertions
vitormattos May 3, 2026
3c4af80
test: strengthen page index feature with policy value validation
vitormattos May 3, 2026
7842330
test: validate identify_methods attributes in page initial state
vitormattos May 3, 2026
2659b06
test: simplify jq expressions by removing redundant if/else
vitormattos May 3, 2026
2b96e94
test: reformat table in page index feature for readability
vitormattos May 3, 2026
cc8ff49
fix: handle AppConfigTypeConflictException when array policy stored a…
vitormattos May 3, 2026
d76bcd8
fix(policy): enrich identify_methods with friendly_name in normalizer
vitormattos May 3, 2026
0406158
fix(policy): resolve IdentifyService constructor injection and fix un…
vitormattos May 3, 2026
0bf6567
fix: harden footer policy fallback
vitormattos May 3, 2026
3a619ba
test: align e2e footer flows with policy workbench
vitormattos May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8",
"nextcloud/ocp": "dev-master",
"psr/http-client": "^1.0",
"roave/security-advisories": "dev-latest"
},
"config": {
Expand Down
2 changes: 1 addition & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 14 additions & 2 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,23 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

import js from '@eslint/js'
import { FlatCompat } from '@eslint/eslintrc'
import nextcloudConfig from '@nextcloud/eslint-config'
import globals from 'globals'
import { dirname } from 'node:path'
import { fileURLToPath } from 'node:url'

const compat = new FlatCompat({
baseDirectory: dirname(fileURLToPath(import.meta.url)),
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
})

const compatConfigs = (Array.isArray(nextcloudConfig) ? nextcloudConfig : [nextcloudConfig])
.flatMap((config) => compat.config(config))

export default [
...(Array.isArray(nextcloudConfig) ? nextcloudConfig : [nextcloudConfig]),
...compatConfigs,

{
name: 'libresign/ignores',
Expand Down
1 change: 0 additions & 1 deletion lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ public function register(IRegistrationContext $context): void {
$context->registerNotifierService(Notifier::class);

$context->registerSearchProvider(FileSearchProvider::class);

$context->registerEventListener(LoadSidebar::class, TemplateLoader::class);
$context->registerEventListener(BeforeNodeDeletedEvent::class, BeforeNodeDeletedListener::class);
$context->registerEventListener(CacheEntryRemovedEvent::class, BeforeNodeDeletedListener::class);
Expand Down
8 changes: 4 additions & 4 deletions lib/Capabilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@

namespace OCA\Libresign;

use OCA\Libresign\AppInfo\Application;
use OCA\Libresign\Service\Envelope\EnvelopeService;
use OCA\Libresign\Service\Policy\PolicyService;
use OCA\Libresign\Service\Policy\Provider\Confetti\ConfettiPolicy;
use OCA\Libresign\Service\SignatureTextService;
use OCA\Libresign\Service\SignerElementsService;
use OCP\App\IAppManager;
use OCP\Capabilities\IPublicCapability;
use OCP\IAppConfig;

/**
* @psalm-import-type LibresignCapabilities from ResponseDefinitions
Expand All @@ -29,7 +29,7 @@ public function __construct(
protected SignatureTextService $signatureTextService,
protected IAppManager $appManager,
protected EnvelopeService $envelopeService,
protected IAppConfig $appConfig,
protected PolicyService $policyService,
) {
}

Expand All @@ -43,7 +43,7 @@ public function getCapabilities(): array {
$capabilities = [
'features' => self::FEATURES,
'config' => [
'show-confetti' => $this->appConfig->getValueBool(Application::APP_ID, 'show_confetti_after_signing', true),
'show-confetti' => $this->policyService->resolve(ConfettiPolicy::KEY)->getEffectiveValueAsBool(true),
'sign-elements' => [
'is-available' => $this->signerElementsService->isSignElementsAvailable(),
'can-create-signature' => $this->signerElementsService->canCreateSignature(),
Expand Down
23 changes: 23 additions & 0 deletions lib/Command/Developer/Reset.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,12 @@ protected function configure(): void {
mode: InputOption::VALUE_NONE,
description: 'Reset config'
)
->addOption(
name: 'policy',
shortcut: null,
mode: InputOption::VALUE_NONE,
description: 'Reset policy data'
)
;
}

Expand Down Expand Up @@ -140,6 +146,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$this->resetConfig();
$ok = true;
}
if ($input->getOption('policy') || $all) {
$this->resetPolicy();
$ok = true;
}
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
throw $e;
Expand Down Expand Up @@ -254,4 +264,17 @@ private function resetConfig(): void {
} catch (\Throwable) {
}
}

private function resetPolicy(): void {
try {
$delete = $this->db->getQueryBuilder();
$delete->delete('libresign_permission_set_binding')
->executeStatement();

$delete = $this->db->getQueryBuilder();
$delete->delete('libresign_permission_set')
->executeStatement();
} catch (\Throwable) {
}
}
}
110 changes: 34 additions & 76 deletions lib/Controller/AdminController.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,23 @@
use OCA\Libresign\Exception\LibresignException;
use OCA\Libresign\Handler\CertificateEngine\CertificateEngineFactory;
use OCA\Libresign\Handler\CertificateEngine\IEngineHandler;
use OCA\Libresign\Helper\ConfigureCheckHelper;
use OCA\Libresign\Service\Certificate\ValidateService;
use OCA\Libresign\Service\CertificatePolicyService;
use OCA\Libresign\Service\DocMdp\ConfigService as DocMdpConfigService;
use OCA\Libresign\Service\FooterService;
use OCA\Libresign\Service\IdentifyMethodService;
use OCA\Libresign\Service\Install\ConfigureCheckService;
use OCA\Libresign\Service\Install\InstallService;
use OCA\Libresign\Service\Policy\PolicyService;
use OCA\Libresign\Service\Policy\Provider\Tsa\TsaPolicy;
use OCA\Libresign\Service\Policy\Provider\Tsa\TsaPolicyValue;
use OCA\Libresign\Service\ReminderService;
use OCA\Libresign\Service\SignatureBackgroundService;
use OCA\Libresign\Service\SignatureTextService;
use OCA\Libresign\Settings\Admin;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\ApiRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\DataDownloadResponse;
Expand Down Expand Up @@ -83,6 +86,7 @@ public function __construct(
private ReminderService $reminderService,
private FooterService $footerService,
private DocMdpConfigService $docMdpConfigService,
private PolicyService $policyService,
private IdentifyMethodService $identifyMethodService,
private FileMapper $fileMapper,
) {
Expand Down Expand Up @@ -233,14 +237,8 @@ private function generateCertificate(
#[ApiRoute(verb: 'GET', url: '/api/{apiVersion}/admin/certificate', requirements: ['apiVersion' => '(v1)'])]
public function loadCertificate(): DataResponse {
$engine = $this->certificateEngineFactory->getEngine();
/** @var LibresignEngineHandler */
/** @var LibresignCetificateDataGenerated */
$certificate = $engine->toArray();
$configureResult = $engine->configureCheck();
$success = array_filter(
$configureResult,
fn (ConfigureCheckHelper $config) => $config->getStatus() === 'success'
);
$certificate['generated'] = count($success) === count($configureResult);

return new DataResponse($certificate);
}
Expand Down Expand Up @@ -764,10 +762,9 @@ public function setTsaConfig(
], Http::STATUS_BAD_REQUEST);
}

$this->appConfig->setValueString(Application::APP_ID, 'tsa_url', $trimmedUrl);

$trimmedOid = '';
if (empty($tsa_policy_oid)) {
$this->appConfig->deleteKey(Application::APP_ID, 'tsa_policy_oid');
$trimmedOid = '';
} else {
$trimmedOid = trim($tsa_policy_oid);
if (!preg_match('/^[0-9]+(\.[0-9]+)*$/', $trimmedOid)) {
Expand All @@ -776,11 +773,10 @@ public function setTsaConfig(
'message' => 'Invalid OID format'
], Http::STATUS_BAD_REQUEST);
}
$this->appConfig->setValueString(Application::APP_ID, 'tsa_policy_oid', $trimmedOid);
}

$authType = $tsa_auth_type ?? 'none';
$this->appConfig->setValueString(Application::APP_ID, 'tsa_auth_type', $authType);
$username = '';

if ($authType === 'basic') {
$hasUsername = !empty($tsa_username);
Expand All @@ -803,18 +799,29 @@ public function setTsaConfig(
], Http::STATUS_BAD_REQUEST);
}

$this->appConfig->setValueString(Application::APP_ID, 'tsa_username', trim($tsa_username));
$username = trim($tsa_username);
$this->appConfig->setValueString(
Application::APP_ID,
key: 'tsa_password',
value: $tsa_password,
sensitive: true,
);
} else {
$this->appConfig->deleteKey(Application::APP_ID, 'tsa_username');
$username = '';
$this->appConfig->deleteKey(Application::APP_ID, 'tsa_password');
}

$this->policyService->saveSystem(
TsaPolicy::KEY,
[
'url' => $trimmedUrl,
'policy_oid' => $trimmedOid,
'auth_type' => $authType,
'username' => $username,
],
false,
);

return new DataResponse(['status' => 'success']);
}

Expand All @@ -830,11 +837,7 @@ public function setTsaConfig(
#[NoCSRFRequired]
#[ApiRoute(verb: 'DELETE', url: '/api/{apiVersion}/admin/tsa', requirements: ['apiVersion' => '(v1)'])]
public function deleteTsaConfig(): DataResponse {
$fields = ['tsa_url', 'tsa_policy_oid', 'tsa_auth_type', 'tsa_username', 'tsa_password'];

foreach ($fields as $field) {
$this->appConfig->deleteKey(Application::APP_ID, $field);
}
$this->policyService->saveSystem(TsaPolicy::KEY, TsaPolicyValue::defaults(), false);

return new DataResponse(['status' => 'success']);
}
Expand All @@ -850,11 +853,14 @@ public function deleteTsaConfig(): DataResponse {
*/
#[ApiRoute(verb: 'GET', url: '/api/{apiVersion}/admin/footer-template', requirements: ['apiVersion' => '(v1)'])]
public function getFooterTemplate(): DataResponse {
$previewSettings = $this->footerService->getPreviewSettings();

return new DataResponse([
'template' => $this->footerService->getTemplate(),
'isDefault' => $this->footerService->isDefaultTemplate(),
'preview_width' => $this->appConfig->getValueInt(Application::APP_ID, 'footer_preview_width', 595),
'preview_height' => $this->appConfig->getValueInt(Application::APP_ID, 'footer_preview_height', 100),
'preview_width' => $previewSettings['preview_width'],
'preview_height' => $previewSettings['preview_height'],
'preview_zoom' => $previewSettings['preview_zoom'],
]);
}

Expand All @@ -874,7 +880,7 @@ public function getFooterTemplate(): DataResponse {
#[ApiRoute(verb: 'POST', url: '/api/{apiVersion}/admin/footer-template', requirements: ['apiVersion' => '(v1)'])]
public function saveFooterTemplate(string $template = '', int $width = 595, int $height = 50) {
try {
$this->footerService->saveTemplate($template);
$this->footerService->saveTemplate($template, $width, $height);
$pdf = $this->footerService->renderPreviewPdf('', $width, $height);

return new DataDownloadResponse($pdf, 'footer-preview.pdf', 'application/pdf');
Expand All @@ -894,15 +900,18 @@ public function saveFooterTemplate(string $template = '', int $width = 595, int
* @param string $template Template to preview
* @param int $width Width of preview in points (default: 595 - A4 width)
* @param int $height Height of preview in points (default: 50)
* @param ?bool $writeQrcodeOnFooter Whether to force QR code rendering in footer preview (null uses policy)
* @return DataDownloadResponse<Http::STATUS_OK, 'application/pdf', array{}>|DataResponse<Http::STATUS_BAD_REQUEST, LibresignErrorResponse, array{}>
*
* 200: OK
* 400: Bad request
*/
#[NoAdminRequired]
#[NoCSRFRequired]
#[ApiRoute(verb: 'POST', url: '/api/{apiVersion}/admin/footer-template/preview-pdf', requirements: ['apiVersion' => '(v1)'])]
public function footerTemplatePreviewPdf(string $template = '', int $width = 595, int $height = 50) {
public function footerTemplatePreviewPdf(string $template = '', int $width = 595, int $height = 50, ?bool $writeQrcodeOnFooter = null) {
try {
$pdf = $this->footerService->renderPreviewPdf($template ?: null, $width, $height);
$pdf = $this->footerService->renderPreviewPdf($template ?: null, $width, $height, $writeQrcodeOnFooter);
return new DataDownloadResponse($pdf, 'footer-preview.pdf', 'application/pdf');
} catch (\Exception $e) {
return new DataResponse([
Expand Down Expand Up @@ -960,57 +969,6 @@ private function saveOrDeleteConfig(string $key, ?string $value, string $default
}
}

/**
* Set signature flow configuration
*
* @param bool $enabled Whether to force a signature flow for all documents
* @param string|null $mode Signature flow mode: 'parallel' or 'ordered_numeric' (only used when enabled is true)
* @return DataResponse<Http::STATUS_OK, LibresignMessageResponse, array{}>|DataResponse<Http::STATUS_BAD_REQUEST, LibresignErrorResponse, array{}>|DataResponse<Http::STATUS_INTERNAL_SERVER_ERROR, LibresignErrorResponse, array{}>
*
* 200: Configuration saved successfully
* 400: Invalid signature flow mode provided
* 500: Internal server error
*/
#[ApiRoute(verb: 'POST', url: '/api/{apiVersion}/admin/signature-flow/config', requirements: ['apiVersion' => '(v1)'])]
public function setSignatureFlowConfig(bool $enabled, ?string $mode = null): DataResponse {
try {
if (!$enabled) {
$this->appConfig->deleteKey(Application::APP_ID, 'signature_flow');
return new DataResponse([
'message' => $this->l10n->t('Settings saved'),
]);
}

if ($mode === null) {
return new DataResponse([
'error' => $this->l10n->t('Mode is required when signature flow is enabled.'),
], Http::STATUS_BAD_REQUEST);
}

try {
$signatureFlow = \OCA\Libresign\Enum\SignatureFlow::from($mode);
} catch (\ValueError) {
return new DataResponse([
'error' => $this->l10n->t('Invalid signature flow mode. Use "parallel" or "ordered_numeric".'),
], Http::STATUS_BAD_REQUEST);
}

$this->appConfig->setValueString(
Application::APP_ID,
'signature_flow',
$signatureFlow->value
);

return new DataResponse([
'message' => $this->l10n->t('Settings saved'),
]);
} catch (\Exception $e) {
return new DataResponse([
'error' => $e->getMessage(),
], Http::STATUS_INTERNAL_SERVER_ERROR);
}
}

/**
* Configure DocMDP signature restrictions
*
Expand Down
8 changes: 4 additions & 4 deletions lib/Controller/FileController.php
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ public function validateBinary(): DataResponse {
->toArray();
$statusCode = Http::STATUS_OK;
} catch (InvalidArgumentException $e) {
$message = $this->l10n->t($e->getMessage());
$message = $e->getMessage();
$return = [
'action' => JSActions::ACTION_DO_NOTHING,
'errors' => [['message' => $message]]
Expand Down Expand Up @@ -255,15 +255,15 @@ private function validate(
->toArray();
$statusCode = Http::STATUS_OK;
} catch (LibresignException $e) {
$message = $this->l10n->t($e->getMessage());
$message = $e->getMessage();
$return = [
'action' => JSActions::ACTION_DO_NOTHING,
'errors' => [['message' => $message]]
];
$statusCode = Http::STATUS_NOT_FOUND;
} catch (\Throwable $th) {
$message = $this->l10n->t($th->getMessage());
$this->logger->error($message);
$this->logger->error($th->getMessage(), ['exception' => $th]);
$message = $this->l10n->t('Internal error. Contact admin.');
$return = [
'action' => JSActions::ACTION_DO_NOTHING,
'errors' => [['message' => $message]]
Expand Down
Loading
Loading