Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1281 commits
Select commit Hold shift + click to select a range
ab8af95
feat: update lib/Settings/Admin.php
vitormattos Apr 30, 2026
ed8f89b
test: remove playwright/e2e/policy-preferences-migrated-settings.spec.ts
vitormattos Apr 30, 2026
525e25c
test: remove src/tests/views/Settings/Confetti.spec.ts
vitormattos Apr 30, 2026
5b55f2b
test: remove src/tests/views/Settings/CrlValidation.spec.ts
vitormattos Apr 30, 2026
38b8f52
test: remove src/tests/views/Settings/DefaultUserFolder.spec.ts
vitormattos Apr 30, 2026
fd208ee
test: remove src/tests/views/Settings/Envelope.spec.ts
vitormattos Apr 30, 2026
8b27a93
test: remove src/tests/views/Settings/ExpirationRules.spec.ts
vitormattos Apr 30, 2026
db696a5
test: remove src/tests/views/Settings/LegalInformation.spec.ts
vitormattos Apr 30, 2026
6a7a84f
test: remove src/tests/views/Settings/Reminders.spec.ts
vitormattos Apr 30, 2026
3464445
test: update src/tests/views/Settings/Settings.spec.ts
vitormattos Apr 30, 2026
30e17b3
test: remove src/tests/views/Settings/SignatureHashAlgorithm.spec.ts
vitormattos Apr 30, 2026
9043a9f
refactor: remove src/views/Settings/Confetti.vue
vitormattos Apr 30, 2026
63caec9
refactor: remove src/views/Settings/CrlValidation.vue
vitormattos Apr 30, 2026
3f34fb1
refactor: remove src/views/Settings/DefaultUserFolder.vue
vitormattos Apr 30, 2026
d9b1629
refactor: remove src/views/Settings/Envelope.vue
vitormattos Apr 30, 2026
376e3ed
refactor: remove src/views/Settings/ExpirationRules.vue
vitormattos Apr 30, 2026
827eac9
refactor: remove src/views/Settings/LegalInformation.vue
vitormattos Apr 30, 2026
409c64a
feat: update src/views/Settings/PolicyWorkbench/settings/realDefiniti…
vitormattos Apr 30, 2026
1e5bf61
refactor: remove src/views/Settings/Reminders.vue
vitormattos Apr 30, 2026
ca65f08
feat: update src/views/Settings/Settings.vue
vitormattos Apr 30, 2026
7a63397
refactor: remove src/views/Settings/SignatureHashAlgorithm.vue
vitormattos Apr 30, 2026
29650f9
test: update tests/php/Unit/CapabilitiesTest.php
vitormattos Apr 30, 2026
c2b32d6
test: update tests/php/Unit/Migration/Version18001Date20260320000000T…
vitormattos Apr 30, 2026
a788f01
test: update tests/php/Unit/Service/Crl/CrlRevocationCheckerTest.php
vitormattos Apr 30, 2026
6bd15bc
test: update tests/php/Unit/Service/EnvelopeServiceTest.php
vitormattos Apr 30, 2026
64802f4
test: update tests/php/Unit/Service/ReminderServiceTest.php
vitormattos Apr 30, 2026
42bd93f
feat: add lib/Service/Policy/Provider/Confetti/ConfettiPolicy.php
vitormattos Apr 30, 2026
f15e1a5
feat: add lib/Service/Policy/Provider/CrlValidation/CrlValidationPoli…
vitormattos Apr 30, 2026
61452e6
feat: add lib/Service/Policy/Provider/DefaultUserFolder/DefaultUserFo…
vitormattos Apr 30, 2026
b6bcf53
feat: add lib/Service/Policy/Provider/Envelope/EnvelopePolicy.php
vitormattos Apr 30, 2026
e2a2dbf
feat: add lib/Service/Policy/Provider/ExpirationRules/ExpirationRules…
vitormattos Apr 30, 2026
e7d28cd
feat: add lib/Service/Policy/Provider/LegalInformation/LegalInformati…
vitormattos Apr 30, 2026
4ad6b3b
feat: add lib/Service/Policy/Provider/Reminder/ReminderPolicy.php
vitormattos Apr 30, 2026
c01333a
feat: add lib/Service/Policy/Provider/Reminder/ReminderPolicyValue.php
vitormattos Apr 30, 2026
fb3b2cb
feat: add lib/Service/Policy/Provider/SignatureHashAlgorithm/Signatur…
vitormattos Apr 30, 2026
7536421
test: add playwright/e2e/policy-preferences-boolean-settings.spec.ts
vitormattos Apr 30, 2026
06123ba
test: add playwright/e2e/policy-workbench-boolean-settings.spec.ts
vitormattos Apr 30, 2026
267c790
test: add playwright/e2e/policy-workbench-reminder-settings.spec.ts
vitormattos Apr 30, 2026
2e1b4c1
feat: add src/views/Settings/PolicyWorkbench/settings/confetti/Confet…
vitormattos Apr 30, 2026
e663b8a
feat: add src/views/Settings/PolicyWorkbench/settings/confetti/realDe…
vitormattos Apr 30, 2026
31ed6eb
feat: add src/views/Settings/PolicyWorkbench/settings/crl-validation/…
vitormattos Apr 30, 2026
2e5ae2f
feat: add src/views/Settings/PolicyWorkbench/settings/crl-validation/…
vitormattos Apr 30, 2026
cf9124e
feat: add src/views/Settings/PolicyWorkbench/settings/default-user-fo…
vitormattos Apr 30, 2026
f3e0015
feat: add src/views/Settings/PolicyWorkbench/settings/default-user-fo…
vitormattos Apr 30, 2026
f033cd5
feat: add src/views/Settings/PolicyWorkbench/settings/default-user-fo…
vitormattos Apr 30, 2026
ac361b2
feat: add src/views/Settings/PolicyWorkbench/settings/envelope/Envelo…
vitormattos Apr 30, 2026
9ed59a8
feat: add src/views/Settings/PolicyWorkbench/settings/envelope/realDe…
vitormattos Apr 30, 2026
fed585a
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
9f37a1b
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
67e8bec
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
d11fee1
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
79397b7
feat: add src/views/Settings/PolicyWorkbench/settings/expiration-rule…
vitormattos Apr 30, 2026
4aa6499
feat: add src/views/Settings/PolicyWorkbench/settings/legal-informati…
vitormattos Apr 30, 2026
f7ad3eb
feat: add src/views/Settings/PolicyWorkbench/settings/legal-informati…
vitormattos Apr 30, 2026
c680fa7
feat: add src/views/Settings/PolicyWorkbench/settings/legal-informati…
vitormattos Apr 30, 2026
e4bbf44
feat: add src/views/Settings/PolicyWorkbench/settings/reminder/Remind…
vitormattos Apr 30, 2026
8af3985
feat: add src/views/Settings/PolicyWorkbench/settings/reminder/model.ts
vitormattos Apr 30, 2026
635252d
feat: add src/views/Settings/PolicyWorkbench/settings/reminder/realDe…
vitormattos Apr 30, 2026
bdf9f79
feat: add src/views/Settings/PolicyWorkbench/settings/signature-hash-…
vitormattos Apr 30, 2026
1cffba4
feat: add src/views/Settings/PolicyWorkbench/settings/signature-hash-…
vitormattos Apr 30, 2026
1a395b3
feat: add src/views/Settings/PolicyWorkbench/settings/signature-hash-…
vitormattos Apr 30, 2026
066731e
test: add tests/integration/features/admin/boolean_policy_layers.feature
vitormattos Apr 30, 2026
1bd90f6
test: add tests/integration/features/admin/reminder_policy_settings.f…
vitormattos Apr 30, 2026
1dde85c
test: add tests/php/Unit/Service/Policy/Provider/Confetti/ConfettiPol…
vitormattos Apr 30, 2026
37f74ca
test: add tests/php/Unit/Service/Policy/Provider/CrlValidation/CrlVal…
vitormattos Apr 30, 2026
db258f0
test: add tests/php/Unit/Service/Policy/Provider/DefaultUserFolder/De…
vitormattos Apr 30, 2026
c793243
test: add tests/php/Unit/Service/Policy/Provider/Envelope/EnvelopePol…
vitormattos Apr 30, 2026
c3a2a12
test: add tests/php/Unit/Service/Policy/Provider/ExpirationRules/Expi…
vitormattos Apr 30, 2026
41e7fce
test: add tests/php/Unit/Service/Policy/Provider/LegalInformation/Leg…
vitormattos Apr 30, 2026
59064c4
test: add tests/php/Unit/Service/Policy/Provider/Reminder/ReminderPol…
vitormattos Apr 30, 2026
b5efd68
test: add tests/php/Unit/Service/Policy/Provider/SignatureHashAlgorit…
vitormattos Apr 30, 2026
728ce31
refactor: migrate TSA settings to policy system
vitormattos Apr 30, 2026
3f17494
refactor: migrate identify_methods settings to policy system
vitormattos Apr 30, 2026
5fbf3d7
refactor: remove legacy initial state values (docmdp_config, legal_in…
vitormattos Apr 30, 2026
f38dcbd
refactor: migrate sign engine handlers settings to policy system
vitormattos Apr 30, 2026
6a39b71
refactor: inject PolicyService into certificate engine handlers
vitormattos Apr 30, 2026
c851fdb
refactor: make setEngine() atomic and remove swallowed exceptions
vitormattos Apr 30, 2026
d48e7f5
chore: add migration to remove legacy appConfig keys
vitormattos Apr 30, 2026
e064f2a
chore: register new policy definitions and update frontend specs
vitormattos Apr 30, 2026
61ba60e
feat(frontend): add identify-methods and tsa policy UI definitions
vitormattos Apr 30, 2026
84f7f75
refactor(frontend): remove double cast in normalizeIdentifyMethodsPolicy
vitormattos Apr 30, 2026
7e3d0cd
fix(types): widen EffectivePolicyValue to include arrays, remove cast…
vitormattos Apr 30, 2026
6ae0c8a
fix(ci): add missing policy providers and restore scalar policy paylo…
vitormattos Apr 30, 2026
a85937c
fix: cs
vitormattos Apr 30, 2026
aeda0b1
fix(compat): restore legacy admin state and tsa config fallback
vitormattos Apr 30, 2026
4206466
fix: remove legacy appConfig TSA fallbacks, fix policy API response d…
vitormattos Apr 30, 2026
d513f0d
fix: remove duplicated admin initial states and align TSA integration…
vitormattos May 3, 2026
582fa16
fix: migrate CRL admin state to effective policies
vitormattos May 3, 2026
c5c5c87
fix: migrate footer preview states from app config to policies
vitormattos May 3, 2026
fe749a0
fix: cs
vitormattos May 3, 2026
83d7c1b
fix: align response type aliases with policy payloads
vitormattos May 3, 2026
a4c6bc4
fix: align frontend policy typing after OpenAPI regen
vitormattos May 3, 2026
08552c5
test: align identify methods initial-state assertions
vitormattos May 3, 2026
45feaac
test: strengthen page index feature with policy value validation
vitormattos May 3, 2026
dc93f1d
test: validate identify_methods attributes in page initial state
vitormattos May 3, 2026
a985818
test: simplify jq expressions by removing redundant if/else
vitormattos May 3, 2026
39940bd
test: reformat table in page index feature for readability
vitormattos May 3, 2026
1b0ab2f
fix: handle AppConfigTypeConflictException when array policy stored a…
vitormattos May 3, 2026
1dd8d9d
fix(policy): enrich identify_methods with friendly_name in normalizer
vitormattos May 3, 2026
a975117
fix(policy): resolve IdentifyService constructor injection and fix un…
vitormattos May 3, 2026
8242a85
fix: harden footer policy fallback
vitormattos May 3, 2026
b857794
test: align e2e footer flows with policy workbench
vitormattos May 3, 2026
263778f
fix(ci): add missing newline, fix IdentifyMethodsPolicy ctor in test,…
vitormattos May 4, 2026
be7081c
fix: cs
vitormattos May 4, 2026
9cb2ccf
fix(test): use async import in vi.mock factory to fix vitest hoisting…
vitormattos May 4, 2026
e58c401
feat: polish PolicyWorkbench UI - active chip indicator, focus manage…
vitormattos May 5, 2026
0a30098
refactor: establish Catalog component directory structure for PolicyW…
vitormattos May 5, 2026
e9881c5
refactor: extract catalog and navigation composables from PolicyWorkb…
vitormattos May 5, 2026
81f8f0f
refactor: fix settingsFilter references in Catalog.vue template and c…
vitormattos May 5, 2026
a73334d
refactor: consolidate policy workbench on Catalog implementation
vitormattos May 5, 2026
33bdc58
refactor: extract catalog interaction handlers into composable
vitormattos May 5, 2026
6f4cf9f
refactor: split catalog presentation and crud table composables
vitormattos May 5, 2026
a433cb6
fix: persist policy workbench user preferences
vitormattos May 5, 2026
75c813b
fix: resolve TypeScript type errors in policy workbench
vitormattos May 5, 2026
9be9b15
fix: stabilize policy workbench Playwright scenarios
vitormattos May 5, 2026
768b91d
fix: restore catalog JS by removing TS annotation from template event
vitormattos May 5, 2026
dbda415
fix: expand filtered catalog sections without persisting state
vitormattos May 5, 2026
c014df9
test: fix hoisted l10n mocks in policy workbench specs
vitormattos May 5, 2026
5b8c183
test: replace insecure randomness in policy visibility spec
vitormattos May 5, 2026
671ef48
fix: send back-to-top to catalog search field
vitormattos May 5, 2026
9351ab6
test: add unit coverage for policy workbench navigation
vitormattos May 5, 2026
cc68589
fix: align active category chip with fully visible cards
vitormattos May 5, 2026
25e8beb
fix: wire catalog refs for back-to-top search targeting
vitormattos May 5, 2026
807c0a2
fix: keep active category chip synced during scroll
vitormattos May 5, 2026
917c4ec
test: stabilize policy workbench card-opening flows in e2e
vitormattos May 5, 2026
daea62a
test: stabilize active chip sync assertion in catalog e2e
vitormattos May 5, 2026
1c7b6f6
refactor(policy): remove legacy validation_site appconfig usage
vitormattos May 7, 2026
0b1d973
test: fix unit regressions after policy migration
vitormattos May 7, 2026
ec0a7ff
fix: align admin certificate schema and regenerate openapi
vitormattos May 8, 2026
6555f0d
fix(types): restore policy aliases and test signer typing
vitormattos May 8, 2026
8c3d6b9
refactor: Refine PolicyRuleEditorPanel CSS for lighter visual hierarchy
vitormattos May 10, 2026
541e36d
refactor: Convert account creation option to switch control
vitormattos May 10, 2026
c07cd83
fix: Correct alignment of global onboarding toggle
vitormattos May 10, 2026
fbbb6d6
refactor: UX polish pass on Identification factors rule editor
vitormattos May 10, 2026
7627d58
fix: Disable 'Create rule' when no identification factors are enabled
vitormattos May 10, 2026
7a3c921
fix: enable create rule button on initial load when factors are pre-s…
vitormattos May 10, 2026
846e325
refactor: refine identify methods rule modal density and hierarchy
vitormattos May 10, 2026
bd68858
refactor: revert 2-column grid, remove badge from locked required state
vitormattos May 10, 2026
68c6d56
feat: add RuntimeRequirementValidator service
vitormattos May 10, 2026
8f68d56
refactor: delegate runtime requirement validation to RuntimeRequireme…
vitormattos May 10, 2026
3bca8bc
refactor: unpack structured identify_methods payload in IdentifyService
vitormattos May 10, 2026
0ddac84
feat: normalize identify_methods to structured payload in IdentifyMet…
vitormattos May 10, 2026
6de6145
fix: handle both flat-list and object payloads in migration normalizer
vitormattos May 10, 2026
9e0ec9d
feat: update frontend identify-methods model to object payload
vitormattos May 10, 2026
d0ccc1d
refactor: read/write new identify-methods payload shape in workbench
vitormattos May 10, 2026
7bf3bf3
fix: use normalizeIdentifyMethodsPolicy in RequestSignatureTab
vitormattos May 10, 2026
9f65639
fix: use normalizeIdentifyMethodsPolicy in Signer
vitormattos May 10, 2026
ef50bc9
fix: use normalizeIdentifyMethodsPolicy in configureCheck store
vitormattos May 10, 2026
0b4eead
test: update ValidateHelper tests after RuntimeRequirementValidator e…
vitormattos May 10, 2026
9d8d70c
test: add RuntimeRequirementValidator unit tests
vitormattos May 10, 2026
c67ac9c
test: update IdentifyMethodsPolicyValue tests for structured payload
vitormattos May 10, 2026
9023270
test: update IdentifyMethodsPolicy tests
vitormattos May 10, 2026
084f119
test: update IdentifyMethodsFilePolicyApplier tests
vitormattos May 10, 2026
6204bd8
test: add migration tests for object payload normalization
vitormattos May 10, 2026
c5e9f3d
test: update identify-methods model spec for object payload
vitormattos May 10, 2026
65e2183
test: update workbench spec for new identify-methods payload shape
vitormattos May 10, 2026
96d47a1
test: add object payload normalization test to RequestSignatureTab spec
vitormattos May 10, 2026
94699de
test: update Signer spec for normalizeIdentifyMethodsPolicy
vitormattos May 10, 2026
caf58f2
test: update configureCheck spec for normalizeIdentifyMethodsPolicy
vitormattos May 10, 2026
ee27d78
refactor: unify identification_documents policy to structured payload
vitormattos May 12, 2026
5b9e51d
refactor: update IdentificationDocumentsPolicy to unified payload
vitormattos May 12, 2026
cb63dc6
refactor: extract approvers from identification_documents policy
vitormattos May 12, 2026
eb31fdd
migration: consolidate approval_group into identification_documents p…
vitormattos May 12, 2026
65c6023
test: update identification documents policy value tests
vitormattos May 12, 2026
4eeb413
test: update IdDocsPolicyService tests for unified policy
vitormattos May 12, 2026
93309de
refactor: update identification documents real definition for unified…
vitormattos May 12, 2026
5b962c3
feat: add conditional approvers section to IdentificationDocumentsRul…
vitormattos May 12, 2026
f11ed52
migration: consolidate approval_group into identification_documents p…
vitormattos May 12, 2026
f021482
refactor: remove legacy value handling from PolicyValue
vitormattos May 12, 2026
80f8c1c
test: remove legacy value tests from PolicyValue
vitormattos May 12, 2026
dc1b964
refactor: remove legacy value handling from real definition
vitormattos May 12, 2026
fd63c1e
refactor: remove legacy value handling from Vue component
vitormattos May 12, 2026
1d969ac
test: remove legacy value tests from Vue component
vitormattos May 12, 2026
66d513a
chore: remove superseded separate migration file
vitormattos May 12, 2026
d1ce04f
fix: resolve identification documents editor SFC parse error
vitormattos May 12, 2026
8282bb3
fix: hide legacy approval_group card from policy workbench
vitormattos May 12, 2026
94b2bd0
refactor: remove orphaned approval groups workbench card
vitormattos May 12, 2026
48a4f81
fix: prevent identification documents editor crash when enabling
vitormattos May 12, 2026
513665e
feat: improve identification documents approver UX
vitormattos May 12, 2026
1c590eb
feat(identify-method): add IdentifyMethodRequirement enum for require…
vitormattos May 12, 2026
5b7093c
refactor(identify-method): add getRequirement/setRequirement using en…
vitormattos May 12, 2026
71802dd
refactor(identify-method): add exists() via class_exists and resolve …
vitormattos May 12, 2026
6a4bd2a
refactor(validate): delegate identify method existence check to Ident…
vitormattos May 12, 2026
bfb1d70
refactor(response): replace optional mandatory with required requirem…
vitormattos May 12, 2026
d4c5632
refactor(envelope): use getRequirement() instead of mapping from getM…
vitormattos May 12, 2026
88dab30
refactor(file-list): replace mandatory with requirement in signer data
vitormattos May 12, 2026
da99cbc
refactor(signers-loader): replace mandatory with requirement in signe…
vitormattos May 12, 2026
1b085dc
refactor(id-docs): use requirement field instead of mandatory in iden…
vitormattos May 12, 2026
012339b
refactor(identify-method): use IdentifyMethodRequirement enum and dro…
vitormattos May 12, 2026
c00761d
refactor(requirement-validator): use getRequirement() enum comparison…
vitormattos May 12, 2026
261589c
refactor(policy-value): simplify identify methods policy value using …
vitormattos May 12, 2026
121926a
refactor(sign-file): pass requirement when building identify method e…
vitormattos May 12, 2026
1356253
refactor(types): add IdentifyMethodRequirement type and relax mandato…
vitormattos May 12, 2026
05e7df5
refactor(policies-store): update identify method types to use require…
vitormattos May 12, 2026
f3ab12e
refactor(files-store): replace mandatory with requirement in identify…
vitormattos May 12, 2026
e778c78
refactor(validation-doc): use requirement instead of mandatory in ide…
vitormattos May 12, 2026
e0c433c
refactor(identify-signer): replace mandatory with requirement in sign…
vitormattos May 12, 2026
b15babe
refactor(visible-elements): use requirement field in identify method …
vitormattos May 12, 2026
62742d8
refactor(request-tab): update identify method requirement handling
vitormattos May 12, 2026
4adcebe
refactor(policy-workbench): add requirement type to real workbench types
vitormattos May 12, 2026
bf95726
refactor(policy-workbench): update identify methods workbench to use …
vitormattos May 12, 2026
b65526d
refactor(identify-methods-model): replace mandatory with requirement …
vitormattos May 12, 2026
7e3a41e
refactor(identify-methods-def): update real definition to use require…
vitormattos May 12, 2026
afb7eab
refactor(identify-methods-editor): use requirement in rule editor com…
vitormattos May 12, 2026
fdc1321
refactor(id-docs-editor): replace mandatory with requirement in ident…
vitormattos May 12, 2026
ed159c8
refactor(id-docs-def): update real definition to use requirement field
vitormattos May 12, 2026
96ed1ba
test(identify-signer): update spec to use requirement instead of mand…
vitormattos May 12, 2026
635d864
test(visible-elements): update spec to use requirement field
vitormattos May 12, 2026
790d00f
test(files-store): update tests to use requirement instead of mandatory
vitormattos May 12, 2026
9c972a7
test(identify-methods-editor): update spec to use requirement field
vitormattos May 12, 2026
d75125b
test(identify-methods-model): update spec to use requirement field
vitormattos May 12, 2026
c9b4d71
test(identify-methods-def): update spec to use requirement field
vitormattos May 12, 2026
1c71da2
test(id-docs-editor): update spec to use requirement instead of manda…
vitormattos May 12, 2026
7e014e8
test(policy-workbench): update spec to use requirement field
vitormattos May 12, 2026
2596745
test(validate-helper): fix exists() mock for validateIfIdentifyMethod…
vitormattos May 12, 2026
f5c4a17
test(envelope-assembler): update test to use requirement instead of m…
vitormattos May 12, 2026
cc0a314
test(file-policy-applier): update test to use requirement instead of …
vitormattos May 12, 2026
4ac8c2d
test(policy-value): update test to use requirement instead of mandatory
vitormattos May 12, 2026
8654c66
test(integration): replace mandatory with requirement in create_to_si…
vitormattos May 12, 2026
0742b81
test(integration): replace mandatory with requirement in signature fe…
vitormattos May 12, 2026
444aa22
test(integration): replace mandatory with requirement in identificati…
vitormattos May 12, 2026
28de940
test(integration): replace mandatory with requirement in initial_stat…
vitormattos May 12, 2026
8be4eb6
test(integration): replace mandatory with requirement in list feature
vitormattos May 12, 2026
9006c2d
test(integration): replace mandatory with requirement in thumbnail fe…
vitormattos May 12, 2026
1063e5e
test(integration): replace mandatory with requirement in validate fea…
vitormattos May 12, 2026
df04795
test(integration): replace mandatory with requirement in index feature
vitormattos May 12, 2026
15c0ca7
test(integration): replace mandatory with requirement in validate fea…
vitormattos May 12, 2026
9342e3b
test(integration): replace mandatory with requirement in request feature
vitormattos May 12, 2026
fb0aebd
test(integration): replace mandatory with requirement in sequential_s…
vitormattos May 12, 2026
efa4889
test(integration): replace mandatory with requirement in signed feature
vitormattos May 12, 2026
2d8ef06
test(integration): replace mandatory with requirement in tsa feature
vitormattos May 12, 2026
957b091
chore(psalm): update baseline after mandatory to requirement refactoring
vitormattos May 12, 2026
1b64ef4
fix(psalm): move type alias before first use and regenerate baseline
vitormattos May 12, 2026
d3c3b2f
fix(tests): stabilize service suite and CRL URL parsing
vitormattos May 12, 2026
70fe7fb
test(crl): expand URL parser data providers
vitormattos May 12, 2026
d62e74e
test(security): remove 0777 from unit TestCase helper
vitormattos May 12, 2026
a52b5e8
test(security): separate dir and file permissions in TestCase helper
vitormattos May 12, 2026
c1d37f0
test: replace deprecated instanceId helper in TestCase
vitormattos May 12, 2026
5675d3c
refactor(crl): use named regex groups for URL parsing
vitormattos May 12, 2026
4c15e19
test: remove broad exception swallowing in recursive copy helper
vitormattos May 12, 2026
dc8f14c
test: remove deprecated container registration from TestCase
vitormattos May 12, 2026
9ab8720
test: restore AppConfigOverwrite and remove deprecated setAppValue usage
vitormattos May 12, 2026
df14791
fix: cs
vitormattos May 12, 2026
cdcee8e
fix: update openapi documentation
vitormattos May 12, 2026
33137c3
fix: align policy tests and appconfig compatibility
vitormattos May 13, 2026
1e1a3d6
fix: align policy tests and metadata response schema
vitormattos May 13, 2026
ca1ac51
test: stabilize policy workbench back-to-top assertion
vitormattos May 13, 2026
9ae2e0a
fix: restore dynamic metadata schema compatibility
vitormattos May 13, 2026
10090b3
chore: update documentation
vitormattos May 13, 2026
bda8155
fix: simplify dynamic metadata type definitions to resolve openapi sc…
vitormattos May 13, 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 LibresignCertificateDataGenerated */
$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