Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
702 commits
Select commit Hold shift + click to select a range
41eb456
test: improve typing in SignerDetails.spec.ts
vitormattos Feb 24, 2026
17ea422
test: improve typing in SignersList.spec.ts
vitormattos Feb 24, 2026
a26bd47
test: improve typing in SigningActionHelper.spec.ts
vitormattos Feb 24, 2026
2161d10
test: improve typing in certification.spec.ts
vitormattos Feb 24, 2026
183f3c0
test: improve typing in isExternal.spec.ts
vitormattos Feb 24, 2026
75deebd
test: improve typing in useIsDarkTheme.spec.ts
vitormattos Feb 24, 2026
d01f4fe
test: improve typing in isTouchDevice.spec.ts
vitormattos Feb 24, 2026
1978aa9
test: improve typing in SigningRequirementValidator.spec.ts
vitormattos Feb 24, 2026
15fb652
test: improve typing in filesSorting.spec.ts
vitormattos Feb 24, 2026
6cbb170
test: improve typing in keyboard.spec.ts
vitormattos Feb 24, 2026
7bd8cdd
test: improve typing in userconfig.spec.ts
vitormattos Feb 24, 2026
56a610c
test: improve typing in test-types.ts
vitormattos Feb 24, 2026
e906a96
test: improve typing in fileStatus.spec.ts
vitormattos Feb 24, 2026
b87c299
test: improve typing in CreateAccount.spec.ts
vitormattos Feb 24, 2026
fc3f87a
test: improve typing in DocumentValidationLogic.spec.ts
vitormattos Feb 24, 2026
d91a757
test: improve typing in FileRequestFlow.spec.ts
vitormattos Feb 24, 2026
cfd52fd
test: improve typing in LegalInformation.spec.ts
vitormattos Feb 24, 2026
5b2a3bf
test: improve typing in SignatureElementsManagement.spec.ts
vitormattos Feb 24, 2026
b61e2b8
test: improve typing in SigningInvitations.spec.ts
vitormattos Feb 24, 2026
81b91a8
test: improve typing in Validation.spec.ts
vitormattos Feb 24, 2026
e0012d4
fix: default docmdp level when config is missing
vitormattos Feb 24, 2026
2d614e7
fix: use typed values in admin initial state
vitormattos Feb 24, 2026
194b771
fix: persist allowed groups on model updates
vitormattos Feb 24, 2026
27b2914
fix: align docmdp settings with modelValue contract
vitormattos Feb 24, 2026
0b1f5c7
fix: align envelope toggle with modelValue contract
vitormattos Feb 24, 2026
761097f
fix: load identification settings from initial state
vitormattos Feb 24, 2026
ad716e3
fix: align signature flow controls with modelValue
vitormattos Feb 24, 2026
218fad2
test: add allowed groups model update coverage
vitormattos Feb 24, 2026
8c94f63
test: add docmdp default backend config coverage
vitormattos Feb 24, 2026
011d5ab
test: add envelope initial state coverage
vitormattos Feb 24, 2026
31c38f5
test: add identification groups model update coverage
vitormattos Feb 24, 2026
b6f0089
test: add signature flow model binding coverage
vitormattos Feb 24, 2026
150cb76
test: ensure reset does not restore app defaults
vitormattos Feb 24, 2026
a8c2f1b
test: cover docmdp config default and toggle semantics
vitormattos Feb 24, 2026
34e10e2
fix(draw): expose delete mdi icon via setup
vitormattos Feb 24, 2026
09f7b2e
fix(footer): use logical inset for hidden element
vitormattos Feb 24, 2026
14ece37
fix(sidebar): restore mdi menu icons and wrapper registration
vitormattos Feb 24, 2026
76f249d
fix(account): register document action mdi icons
vitormattos Feb 24, 2026
ff98122
fix(account): register manage password mdi icons
vitormattos Feb 24, 2026
5bbb34d
fix(account): normalize signature setup icon bindings
vitormattos Feb 24, 2026
d448164
fix(account): add missing email mdi icon binding
vitormattos Feb 24, 2026
957c1b1
fix(incomplete): register setup cogs icon
vitormattos Feb 24, 2026
1f02d08
fix(signpdf): register email modal mdi icons
vitormattos Feb 24, 2026
c53e0a9
test(sidebar): cover menu icon path wiring
vitormattos Feb 24, 2026
69fc46f
test(account): cover documents icon bindings
vitormattos Feb 24, 2026
8c1dcb7
test(account): cover manage password icon bindings
vitormattos Feb 24, 2026
75dc4dd
test(account): cover signature icon bindings
vitormattos Feb 24, 2026
76ea4d5
test(incomplete): cover cogs icon binding
vitormattos Feb 24, 2026
44a73ea
test(signpdf): cover modal email icon bindings
vitormattos Feb 24, 2026
206a820
fix(app): hide left sidebar from route meta
vitormattos Feb 24, 2026
88b9546
fix(app): mount only after router is ready
vitormattos Feb 24, 2026
f054c36
fix(router): mark incomplete routes to hide left sidebar
vitormattos Feb 24, 2026
fd97356
test(app): cover sidebar visibility by route meta
vitormattos Feb 24, 2026
10966fc
fix(request): migrate SignerRow attrs and slots
vitormattos Feb 25, 2026
fac73de
fix(request): migrate VisibleElements actions slot
vitormattos Feb 25, 2026
fba0520
fix(sidebar): register EnvelopeFilesList dependencies
vitormattos Feb 25, 2026
c34ef6d
test(request): cover VisibleElements actions slot forwarding
vitormattos Feb 25, 2026
d5c677e
test(account): cover Signature draw editor rendering
vitormattos Feb 25, 2026
4a1a683
test(sign): cover create signature draw modal
vitormattos Feb 25, 2026
3d11f44
fix(account): register Documents loading icon
vitormattos Feb 25, 2026
33a875f
fix(account): restore Signature draw editor
vitormattos Feb 25, 2026
dd4fd74
fix(account): migrate Signatures named slots
vitormattos Feb 25, 2026
fec40ae
fix(files-list): register FileEntryCheckbox switch
vitormattos Feb 25, 2026
daa7de8
fix(files-list): register FileEntryGrid children
vitormattos Feb 25, 2026
04315f7
fix(files-list): register FileListFilterModified wrapper
vitormattos Feb 25, 2026
32883a9
fix(files-list): register FileListFilterStatus wrapper
vitormattos Feb 25, 2026
72ff63d
fix(files-list): register FileListFilters children
vitormattos Feb 25, 2026
d23d2a4
fix(files-list): restore FilesList icon bindings
vitormattos Feb 25, 2026
44c29f9
fix(files-list): register FilesListTableHeader components
vitormattos Feb 25, 2026
ed614c9
fix(account): register ResetPassword loading icon
vitormattos Feb 25, 2026
6a584bb
fix(sign): register ModalEmailManager loading icon
vitormattos Feb 25, 2026
75f2f12
fix(sign): register ModalTokenManager loading icon
vitormattos Feb 25, 2026
6c4af13
fix(sign): restore Draw modal in Sign view
vitormattos Feb 25, 2026
20ce457
test(request): add SignerRow slot rendering spec
vitormattos Feb 25, 2026
ab69a07
test(account): add Signatures slot regression spec
vitormattos Feb 25, 2026
0b02b73
test(files-list): add FilesList rendering regression spec
vitormattos Feb 25, 2026
28d2524
fix(draw): use PreviewSignature in text confirmation
vitormattos Feb 25, 2026
bbcaef5
test(draw): cover text confirmation preview rendering
vitormattos Feb 25, 2026
58c4f80
fix: clear reset password form on close
vitormattos Feb 25, 2026
930fbcc
test: add reset password cleanup regression spec
vitormattos Feb 25, 2026
56f1851
fix: register certificate content component
vitormattos Feb 25, 2026
92c6a67
fix: enforce strict upload ref invocation
vitormattos Feb 25, 2026
990f9d3
test: align manage password upload ref spec
vitormattos Feb 25, 2026
5579e14
fix: improve reset password enter-key flow
vitormattos Feb 25, 2026
315d4bb
test: cover reset password focus behavior
vitormattos Feb 25, 2026
911cd0e
fix: improve signer select search rendering
vitormattos Feb 25, 2026
518959d
test: add signer select label fallback coverage
vitormattos Feb 25, 2026
72ebe90
refactor: expose mdi icons via setup in incomplete certification
vitormattos Feb 25, 2026
b5a2065
refactor: move documents mdi bindings to setup
vitormattos Feb 25, 2026
1923508
refactor: expose modal email icons from setup
vitormattos Feb 25, 2026
1fac750
refactor: move file entry signers icon to setup
vitormattos Feb 25, 2026
4603974
refactor: expose signer menu icon via setup
vitormattos Feb 25, 2026
4cf4f29
refactor: expose pdf editor action icons via setup
vitormattos Feb 25, 2026
c4a83cf
refactor: move left sidebar mdi bindings to setup
vitormattos Feb 25, 2026
c20bf4d
chore: remove unused l10n import from file entry preview
vitormattos Feb 25, 2026
440408a
chore: remove unused l10n import from file entry status
vitormattos Feb 25, 2026
e639558
fix: keep file list status text-only
vitormattos Feb 25, 2026
8429769
test: relax logger instance identity assertion
vitormattos Feb 25, 2026
73a82bf
test: stabilize pdf editor missing refs scenario
vitormattos Feb 25, 2026
a0df8a3
test: simplify app route state typing
vitormattos Feb 25, 2026
f922b73
test: simplify documents axios mock typing
vitormattos Feb 25, 2026
51b9000
fix: tighten signer select icon mapping
vitormattos Feb 25, 2026
32ea1a1
test: cover strict signer select icon handling
vitormattos Feb 25, 2026
bee58d0
test: allow undefined route name in app spec
vitormattos Feb 25, 2026
70be00e
refactor: extract identify share type resolver
vitormattos Feb 25, 2026
6d1f298
test: add coverage for share type resolver scenarios
vitormattos Feb 25, 2026
fc60f0a
fix: normalize identify search payload and resolver usage
vitormattos Feb 25, 2026
0c851c1
test: cover identify controller share type behavior
vitormattos Feb 25, 2026
a763ae2
fix: harden signer select async search state
vitormattos Feb 25, 2026
a5b0904
test: add signer select regressions for async search
vitormattos Feb 25, 2026
bcdb291
fix: avoid null counter value in signer row
vitormattos Feb 25, 2026
4766722
test: align signer counter assertions with zero default
vitormattos Feb 25, 2026
c83e4ca
fix: keep signersCount synced on signer mutations
vitormattos Feb 25, 2026
fe1005b
test: ensure signersCount updates after signer deletion
vitormattos Feb 25, 2026
cbdd5cd
fix: use async component wrapper in validation view
vitormattos Feb 25, 2026
37d00e1
test: prevent promise text rendering in validation view
vitormattos Feb 25, 2026
9ed8c21
fix: normalize CRL certificate type chip spacing
vitormattos Feb 25, 2026
a133f08
fix: indent
vitormattos Feb 25, 2026
9e8ccd5
fix: indent
vitormattos Feb 25, 2026
0ba7bf1
fix: indent
vitormattos Feb 25, 2026
8e27e16
fix: indnet
vitormattos Feb 25, 2026
2c429fc
fix: indent
vitormattos Feb 25, 2026
93a95cd
fix: indent
vitormattos Feb 25, 2026
7d7a8e9
fix: year
vitormattos Feb 25, 2026
ba981b4
fix: indent
vitormattos Feb 25, 2026
4f1dce3
fix: indent
vitormattos Feb 25, 2026
3c5e98b
fix: indent
vitormattos Feb 25, 2026
5fa45ee
fix: indent
vitormattos Feb 25, 2026
a92d6b1
refactor: migrate Validation.vue beforeDestroy to beforeUnmount
vitormattos Feb 25, 2026
5ff33d0
refactor: migrate SigningProgress.vue beforeDestroy to beforeUnmount
vitormattos Feb 25, 2026
1458997
refactor: migrate SignerSelect.vue beforeDestroy to beforeUnmount
vitormattos Feb 25, 2026
dc17e29
refactor: replace Vue2 dialog pattern with Vue3 spawnDialog
vitormattos Feb 25, 2026
f01293f
refactor: enhance test setup with error/warn interception
vitormattos Feb 25, 2026
3c778e9
test: migrate EditNameDialog.spec.ts propsData to props
vitormattos Feb 25, 2026
e0db403
test: migrate SigningOrderDiagram.spec.ts propsData to props
vitormattos Feb 25, 2026
7eadea1
test: migrate SignerDetails.spec.ts propsData to props
vitormattos Feb 25, 2026
1e6aa7f
test: migrate FileEntrySigners.spec.ts propsData to props
vitormattos Feb 25, 2026
c2f5ed2
test: migrate Draw.spec.ts propsData to props (14 instances)
vitormattos Feb 25, 2026
6d226ab
test: migrate InputAction.spec.ts propsData to props
vitormattos Feb 25, 2026
823febb
test: migrate IdentifySigner.spec.ts propsData to props (2 instances)
vitormattos Feb 25, 2026
7320e7e
test: rewrite SigningProgress.spec.ts lifecycle tests
vitormattos Feb 25, 2026
4a4151b
style: fix FileUpload.vue prop closing bracket alignment
vitormattos Feb 25, 2026
528c0b4
style: fix FileStatusList.vue prop closing bracket alignment
vitormattos Feb 25, 2026
723f7a0
style: fix IdentifySigner.vue prop closing bracket alignment
vitormattos Feb 25, 2026
28b547a
style: fix RequestPicker.vue prop closing bracket alignment
vitormattos Feb 25, 2026
a61bed3
style: fix SignerRow.vue prop closing bracket alignment
vitormattos Feb 25, 2026
2374233
style: fix validation/FileStatusList.vue prop closing bracket alignment
vitormattos Feb 25, 2026
58bea72
style: fix FileValidation.vue prop closing bracket alignment
vitormattos Feb 25, 2026
e63e3bd
style: fix RequestSigningProgress.vue prop closing bracket alignment
vitormattos Feb 25, 2026
bd56a55
style: fix Signer.vue prop closing bracket alignment
vitormattos Feb 25, 2026
609e61f
style: fix Signers.vue prop closing bracket alignment
vitormattos Feb 25, 2026
fea6593
style: fix SigningOrderDiagram.vue prop closing bracket alignment
vitormattos Feb 25, 2026
29e3b74
style: fix UploadProgress.vue prop closing bracket alignment
vitormattos Feb 25, 2026
d512792
style: fix FileEntryActions.vue prop closing bracket alignment
vitormattos Feb 25, 2026
eefc691
style: fix FileEntryCheckbox.vue prop closing bracket alignment
vitormattos Feb 25, 2026
1b0b8a2
style: fix FileEntryStatus.vue prop closing bracket alignment
vitormattos Feb 25, 2026
7682a57
style: fix FileListFilter.vue prop closing bracket alignment
vitormattos Feb 25, 2026
bbe8f8b
style: fix FilesListTableHeaderButton.vue prop closing bracket alignment
vitormattos Feb 25, 2026
a085b64
style: fix CertificateContent.vue prop closing bracket alignment
vitormattos Feb 25, 2026
2c6e43d
style: fix SignatureStamp.vue prop closing bracket alignment
vitormattos Feb 25, 2026
0e2e7ed
style: fix UploadCertificate.vue prop closing bracket alignment
vitormattos Feb 25, 2026
ca3dfb4
build: configure __VUE_PROD_DEVTOOLS__ flag via vite plugin
vitormattos Feb 25, 2026
a63cbc1
chore: update copyright year to 2026
vitormattos Feb 25, 2026
7196df3
chore: update copyright year to 2026
vitormattos Feb 25, 2026
82112db
fix: await upload before registering file with API and opening sidebar
vitormattos Feb 25, 2026
66de464
refactor: remove side-effect action imports from tab entry point
vitormattos Feb 25, 2026
9f262e6
fix: add defineOptions name to App root component
vitormattos Feb 25, 2026
62bbb0d
chore: update copyright year to 2026
vitormattos Feb 25, 2026
806fc0c
chore: update copyright year to 2026
vitormattos Feb 25, 2026
0ba274a
chore: update copyright year to 2026
vitormattos Feb 25, 2026
031c60b
chore: update copyright year to 2026
vitormattos Feb 25, 2026
c26a4f2
chore: update copyright year to 2026
vitormattos Feb 25, 2026
a632ddb
chore: update copyright year to 2026
vitormattos Feb 25, 2026
ae627e9
chore: update copyright year to 2026
vitormattos Feb 25, 2026
fe215f3
fix: correct spawnDialog return value (remove array destructuring)
vitormattos Feb 25, 2026
bd9f6ee
chore: update copyright year to 2026
vitormattos Feb 25, 2026
f76963e
fix: register NcCheckboxRadioSwitch and remove stray console.error
vitormattos Feb 25, 2026
df03a9a
fix: add missing closing brace in icons data object
vitormattos Feb 25, 2026
817ba1b
fix: remove console.error debug logs from envelope files list
vitormattos Feb 25, 2026
74af5d1
fix: register NcCheckboxRadioSwitch and NcLoadingIcon components
vitormattos Feb 25, 2026
0201405
fix: use signer.identify as sole :key, remove || index fallback
vitormattos Feb 25, 2026
e2c2ee3
fix: register NcCheckboxRadioSwitch in FileEntryActions
vitormattos Feb 25, 2026
01445a5
fix: normalize file IDs to Number for consistent selection comparison
vitormattos Feb 25, 2026
93e373d
fix: normalize ordered IDs to Number in onToggleAll selection
vitormattos Feb 25, 2026
09f2e16
fix: register NcCheckboxRadioSwitch and normalize IDs in changeLoadin…
vitormattos Feb 25, 2026
3f91541
chore: update copyright year in pdf-elements mock index
vitormattos Feb 25, 2026
acf4ce8
chore: update copyright year in PDFElements mock component
vitormattos Feb 25, 2026
d7c2bc3
chore: update copyright year in asyncReader mock
vitormattos Feb 25, 2026
aeaaa77
chore: update copyright year in vue-select mock
vitormattos Feb 25, 2026
e0a1cf5
chore: update copyright year in vitest type declarations
vitormattos Feb 25, 2026
60f3dcd
test: add coverage for App external-page class and conditional rendering
vitormattos Feb 25, 2026
486bc41
test: simplify spawnDialog mock to plain resolved promise
vitormattos Feb 25, 2026
b0afe22
test: refactor PdfEditor mock to use inline expose and direct $refs a…
vitormattos Feb 25, 2026
cb435bc
test: update RequestSignatureTab tests for component registration cha…
vitormattos Feb 25, 2026
eb82c37
test: remove obsolete Signer spec cases
vitormattos Feb 25, 2026
1bae139
test: expand Signers spec coverage
vitormattos Feb 25, 2026
cb4ad5d
test: update SignerDetails spec for current component shape
vitormattos Feb 25, 2026
708391c
test: add files store test coverage
vitormattos Feb 25, 2026
b36d693
test: update FileEntry spec for normalized ID comparisons
vitormattos Feb 25, 2026
d2b972e
fix: update to newest version
vitormattos Feb 25, 2026
16b6f7a
fix: initialize git submodules in the devcontainer setup script
vitormattos Feb 25, 2026
3cba95c
fix(a11y): add aria-expanded to Document certification section
vitormattos Feb 25, 2026
fee5f44
fix: throws libresign exception
vitormattos Feb 26, 2026
0a4f631
chore: cover new scenarios
vitormattos Feb 26, 2026
5abbca1
fix(validation): fix indentation of chain prop closing brace
vitormattos Feb 26, 2026
e91bd58
fix(validation): fix indentation of signRequestUuid prop and setup re…
vitormattos Feb 26, 2026
c7936b3
fix(validation): remove unused n import from DocumentValidationDetails
vitormattos Feb 26, 2026
0b2f089
fix(views): remove unused n import from Validation
vitormattos Feb 26, 2026
db5f1c6
fix: remove unused n import from init
vitormattos Feb 26, 2026
4a4958b
fix: fix prop closing brace indentation in FooterTemplateEditor
vitormattos Feb 26, 2026
2049466
fix: fix prop closing brace indentation in IdentifySigner
vitormattos Feb 26, 2026
d39d117
fix: fix prop closing brace indentation in RequestPicker
vitormattos Feb 26, 2026
510b93f
fix: fix prop closing brace indentation in SignerSelect
vitormattos Feb 26, 2026
0ad95ea
fix: fix prop closing brace indentation in VisibleElements
vitormattos Feb 26, 2026
0cca2a4
fix: fix prop closing brace indentation in EnvelopeFilesList
vitormattos Feb 26, 2026
b1ea615
fix: fix prop closing brace indentation in RequestSignatureTab
vitormattos Feb 26, 2026
c0987c6
fix: fix prop closing brace indentation in SignTab
vitormattos Feb 26, 2026
5e02322
fix: fix prop closing brace indentation in Signers
vitormattos Feb 26, 2026
50af344
fix: fix prop closing brace indentation in TopBar
vitormattos Feb 26, 2026
983db84
fix: fix prop closing brace indentation in SignerDetails
vitormattos Feb 26, 2026
0cf76ca
fix: fix prop closing brace indentation in Documents
vitormattos Feb 26, 2026
dd759fb
fix: fix prop closing brace indentation in Signature
vitormattos Feb 26, 2026
1362f1f
fix: fix prop closing brace indentation in UserImage
vitormattos Feb 26, 2026
03a457a
fix: fix prop closing brace indentation in CrlManagement
vitormattos Feb 26, 2026
a435aaf
fix: fix prop closing brace indentation in FileEntryActions
vitormattos Feb 26, 2026
4ffaed7
fix: fix prop closing brace indentation in FileEntryName
vitormattos Feb 26, 2026
688a494
fix: fix prop closing brace indentation in FilesListTableHeaderButton
vitormattos Feb 26, 2026
adfc0d5
fix: fix prop closing brace indentation in CertificateCustonOptions
vitormattos Feb 26, 2026
34f16ff
fix: fix prop closing brace indentation in CertificatePolicy
vitormattos Feb 26, 2026
8d5ad0b
fix: fix prop closing brace indentation in DownloadBinaries
vitormattos Feb 26, 2026
93f12da
fix: fix prop closing brace indentation in IdentificationFactors
vitormattos Feb 26, 2026
8b7e0ef
fix: fix prop closing brace indentation in RootCertificateCfssl
vitormattos Feb 26, 2026
a753581
fix: fix prop closing brace indentation in RootCertificateOpenSsl
vitormattos Feb 26, 2026
e96915f
fix: fix prop closing brace indentation in SignatureFlow
vitormattos Feb 26, 2026
df10927
fix: fix prop closing brace indentation in TSA
vitormattos Feb 26, 2026
76b3323
fix: fix prop closing brace indentation in SignPDF
vitormattos Feb 26, 2026
3a77d36
fix: fix prop closing brace indentation in ModalEmailManager
vitormattos Feb 26, 2026
b17e5f7
fix: fix prop closing brace indentation in ModalTokenManager
vitormattos Feb 26, 2026
03e3463
fix: fix prop closing brace indentation in Sign
vitormattos Feb 26, 2026
7a8c89d
fix: fix prop closing brace indentation in Validation
vitormattos Feb 26, 2026
e5678a7
fix: review previous commit
vitormattos Feb 26, 2026
010f737
fix(stable32): add OCA.Files.Sidebar TypeScript type definitions
vitormattos Mar 5, 2026
c435ee4
fix(stable32): replace registerSidebarTab (v4-only) with OCA.Files.Si…
vitormattos Mar 5, 2026
bf6352d
fix(stable32): replace getSidebar() with OCA.Files.Sidebar in init.ts
vitormattos Mar 5, 2026
c56ce82
fix(stable32): replace getSidebar() with OCA.Files.Sidebar in openInL…
vitormattos Mar 5, 2026
4128420
fix(stable32): replace getSidebar() with OCA.Files.Sidebar in showSta…
vitormattos Mar 5, 2026
6fdda58
test(stable32): update showStatusInlineAction spec to mock OCA.Files.…
vitormattos Mar 5, 2026
8f5fd7a
chore(stable32): regenerate package-lock.json after npm install
vitormattos Mar 5, 2026
40ade1a
fix(stable32): add missing return null to exec() in openInLibreSignAc…
vitormattos Mar 5, 2026
d701504
test(stable32): update openInLibreSignAction spec for NC32 sidebar API
vitormattos Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .devcontainer/setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
git config --global --add safe.directory /var/www/html
git config --global --add safe.directory /var/www/html/apps-extra/libresign
cd /var/www/html/apps-extra/libresign
git submodule update --init --recursive
if [[ ! -d "vendor" ]]; then
composer install
fi
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ The second example is clear without comments because the method names describe e
- **Db**: `OCA\Libresign\Db\*` - Entities extend `Entity`, Mappers extend `QBMapper`

### Frontend Architecture
- **Vue 2** with Composition API patterns via `@vueuse/core`
- **Vue 3** with Composition API patterns via `@vueuse/core`
- **Pinia stores** for state (not Vuex)
- **Router**: `src/router/router.js` defines SPA routes
- **OpenAPI integration**: TypeScript types generated from OpenAPI spec via `npm run typescript:generate`
Expand Down
100 changes: 100 additions & 0 deletions .github/workflows/lint-typescript.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT

name: Type checking

on:
pull_request:
push:
branches:
- main
- master
- stable*

permissions:
contents: read

concurrency:
group: lint-typescript-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

jobs:
changes:
runs-on: ubuntu-latest-low
permissions:
contents: read
pull-requests: read

outputs:
src: ${{ steps.changes.outputs.src}}

steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/lint-typescript.yml'
- 'package.json'
- 'package-lock.json'
- 'tsconfig.json'
- '**.ts'
- '**.vue'

test:
runs-on: ubuntu-latest

needs: changes
if: needs.changes.outputs.src != 'false'

steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3
id: versions
with:
fallbackNode: '^24'
fallbackNpm: '^11.3'

- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}

- name: Set up npm ${{ steps.versions.outputs.npmVersion }}
run: npm i -g 'npm@${{ steps.versions.outputs.npmVersion }}'

- name: Install dependencies
env:
CYPRESS_INSTALL_BINARY: 0
run: |
npm ci

- name: Check types
run: |
npm run --if-present check-types
npm run --if-present ts:check

summary:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, test]

if: always()

name: typescript-summary

steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.test.result != 'success' }}; then exit 1; fi
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
/tests/integration/vendor
/tests/integration/output
/js/
/css/
/build/
node_modules/
/.php-cs-fixer.cache
Expand All @@ -20,4 +21,4 @@ node_modules/
/appinfo/install-*.json
/lib/Vendor/
/coverage

/dist/
28 changes: 3 additions & 25 deletions lib/Controller/IdentifyController.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,28 +19,23 @@
use OCA\Libresign\Service\Identify\ResultFilter;
use OCA\Libresign\Service\Identify\ResultFormatter;
use OCA\Libresign\Service\Identify\SearchNormalizer;
use OCA\Libresign\Service\Identify\ShareTypeResolver;
use OCA\Libresign\Service\Identify\SignerSearchContext;
use OCA\Libresign\Service\IdentifyMethod\Account;
use OCA\Libresign\Service\IdentifyMethod\Email;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\ApiRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\Collaboration\Collaborators\ISearch;
use OCP\IRequest;
use OCP\Share\IShare;

/**
* @psalm-import-type LibresignIdentifyAccount from ResponseDefinitions
*/
class IdentifyController extends AEnvironmentAwareController {
private const PHONE_METHODS = ['whatsapp', 'sms', 'telegram', 'signal'];

public function __construct(
IRequest $request,
private ISearch $collaboratorSearch,
private Email $identifyEmailMethod,
private Account $identifyAccountMethod,
private ShareTypeResolver $shareTypeResolver,
private SearchNormalizer $searchNormalizer,
private SignerSearchContext $signerSearchContext,
private ResultFilter $resultFilter,
Expand Down Expand Up @@ -76,7 +71,7 @@ public function search(string $search = '', string $method = '', int $page = 1,
return new DataResponse([]);
}

$shareTypes = $this->getShareTypes();
$shareTypes = $this->shareTypeResolver->resolve($method);
$offset = $limit * ($page - 1);

$this->signerSearchContext->set($method, $search, $rawSearch);
Expand Down Expand Up @@ -112,21 +107,4 @@ private function registerPlugin(): void {
$refProperty->setValue($this->collaboratorSearch, $plugins);
}

private function getShareTypes(): array {
$shareTypes = [];
$settings = $this->identifyEmailMethod->getSettings();
if ($settings['enabled']) {
$shareTypes[] = IShare::TYPE_EMAIL;
}
$settings = $this->identifyAccountMethod->getSettings();
if ($settings['enabled']) {
$shareTypes[] = IShare::TYPE_USER;
}

$shareTypes[] = SignerPlugin::TYPE_SIGNER;
$shareTypes[] = AccountPhonePlugin::TYPE_SIGNER_ACCOUNT_PHONE;
$shareTypes[] = ContactPhonePlugin::TYPE_SIGNER_CONTACT_PHONE;
$shareTypes[] = ManualPhonePlugin::TYPE_SIGNER_MANUAL_PHONE;
return $shareTypes;
}
}
6 changes: 6 additions & 0 deletions lib/Controller/PageController.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ public function index(): TemplateResponse {
$this->initialState->provideInitialState('legal_information', $this->appConfig->getValueString(Application::APP_ID, 'legal_information'));

Util::addScript(Application::APP_ID, 'libresign-main');
Util::addStyle(Application::APP_ID, 'libresign-main');

if (class_exists(LoadViewer::class)) {
$this->eventDispatcher->dispatchTyped(new LoadViewer());
Expand Down Expand Up @@ -156,6 +157,7 @@ public function indexF(): TemplateResponse {
#[FrontpageRoute(verb: 'GET', url: '/f/incomplete')]
public function incomplete(): TemplateResponse {
Util::addScript(Application::APP_ID, 'libresign-main');
Util::addStyle(Application::APP_ID, 'libresign-main');
$response = new TemplateResponse(Application::APP_ID, 'main');
return $response;
}
Expand All @@ -172,6 +174,7 @@ public function incomplete(): TemplateResponse {
#[FrontpageRoute(verb: 'GET', url: '/p/incomplete')]
public function incompleteP(): TemplateResponse {
Util::addScript(Application::APP_ID, 'libresign-main');
Util::addStyle(Application::APP_ID, 'libresign-main');
$response = new TemplateResponse(Application::APP_ID, 'main', [], TemplateResponse::RENDER_AS_BASE);
return $response;
}
Expand Down Expand Up @@ -378,6 +381,7 @@ public function sign(string $uuid): TemplateResponse {
$this->initialState->provideInitialState('nodeType', $this->getFileEntity()->getNodeType());

Util::addScript(Application::APP_ID, 'libresign-external');
Util::addStyle(Application::APP_ID, 'libresign-external');
if (class_exists(LoadViewer::class)) {
$this->eventDispatcher->dispatchTyped(new LoadViewer());
}
Expand Down Expand Up @@ -532,6 +536,7 @@ public function validation(): TemplateResponse {
}

Util::addScript(Application::APP_ID, 'libresign-validation');
Util::addStyle(Application::APP_ID, 'libresign-validation');
$response = new TemplateResponse(Application::APP_ID, 'validation', [], TemplateResponse::RENDER_AS_BASE);

return $response;
Expand Down Expand Up @@ -580,6 +585,7 @@ public function resetPassword(): TemplateResponse {
);

Util::addScript(Application::APP_ID, 'libresign-main');
Util::addStyle(Application::APP_ID, 'libresign-main');
$response = new TemplateResponse(Application::APP_ID, 'reset_password');

return $response;
Expand Down
1 change: 1 addition & 0 deletions lib/Files/TemplateLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public function handle(Event $event): void {
}

Util::addScript(Application::APP_ID, 'libresign-tab');
Util::addStyle(Application::APP_ID, 'libresign-tab');
Util::addStyle(Application::APP_ID, 'icons');
}

Expand Down
1 change: 1 addition & 0 deletions lib/Middleware/InjectionMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@ public function afterException($controller, $methodName, \Exception $exception):
}

Util::addScript(Application::APP_ID, 'libresign-' . $template);
Util::addStyle(Application::APP_ID, 'libresign-' . $template);
$response = new TemplateResponse(
appName: Application::APP_ID,
templateName: $template,
Expand Down
15 changes: 10 additions & 5 deletions lib/Service/DocMdp/ConfigService.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,23 @@ public function __construct(
}

public function isEnabled(): bool {
return $this->appConfig->hasKey(Application::APP_ID, self::CONFIG_KEY_LEVEL);
return $this->getLevel()->isCertifying();
}

public function setEnabled(bool $enabled): void {
if (!$enabled) {
$this->appConfig->deleteKey(Application::APP_ID, self::CONFIG_KEY_LEVEL);
if ($enabled) {
if (!$this->getLevel()->isCertifying()) {
$this->setLevel(DocMdpLevel::CERTIFIED_FORM_FILLING);
}
return;
}

$this->setLevel(DocMdpLevel::NOT_CERTIFIED);
}

public function getLevel(): DocMdpLevel {
$level = $this->appConfig->getValueInt(Application::APP_ID, self::CONFIG_KEY_LEVEL, DocMdpLevel::NOT_CERTIFIED->value);
return DocMdpLevel::from($level);
$level = $this->appConfig->getValueInt(Application::APP_ID, self::CONFIG_KEY_LEVEL, DocMdpLevel::CERTIFIED_FORM_FILLING->value);
return DocMdpLevel::tryFrom($level) ?? DocMdpLevel::CERTIFIED_FORM_FILLING;
}

public function setLevel(DocMdpLevel $level): void {
Expand Down
23 changes: 15 additions & 8 deletions lib/Service/File/FileContentProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,25 +32,32 @@ public function __construct(
*/
public function getContentFromUrl(string $url): string {
if (!filter_var($url, FILTER_VALIDATE_URL)) {
throw new \Exception($this->l10n->t('Invalid URL file'));
throw new LibresignException($this->l10n->t('Invalid URL file'), 422);
}

try {
$response = $this->client->newClient()->get($url);
} catch (\Throwable) {
throw new \Exception($this->l10n->t('Invalid URL file'));
throw new LibresignException($this->l10n->t('Invalid URL file'), 422);
}

$mimetypeFromHeader = $response->getHeader('Content-Type');
$content = (string)$response->getBody();

if (!$content) {
throw new \Exception($this->l10n->t('Empty file'));
throw new LibresignException($this->l10n->t('Empty file'), 422);
}

$mimetypeFromHeader = $response->getHeader('Content-Type');
// Strip parameters like "; charset=utf-8"
if (str_contains($mimetypeFromHeader, ';')) {
$mimetypeFromHeader = trim(explode(';', $mimetypeFromHeader)[0]);
}

$mimeTypeFromContent = $this->mimeService->getMimeType($content);
if ($mimetypeFromHeader !== $mimeTypeFromContent) {
throw new \Exception($this->l10n->t('Invalid URL file'));

// application/octet-stream is a generic fallback — trust content detection
if ($mimetypeFromHeader !== 'application/octet-stream' && $mimetypeFromHeader !== $mimeTypeFromContent) {
throw new LibresignException($this->l10n->t('Invalid URL file'), 422);
}

return $content;
Expand All @@ -75,7 +82,7 @@ public function getContentFromBase64(string $base64): string {
$mimeTypeFromContent = $this->mimeService->getMimeType($content);

if ($mimeTypeFromType !== $mimeTypeFromContent) {
throw new \Exception($this->l10n->t('Invalid URL file'));
throw new LibresignException($this->l10n->t('Invalid URL file'), 422);
}

$this->mimeService->setMimeType($mimeTypeFromContent);
Expand Down Expand Up @@ -103,7 +110,7 @@ public function getContentFromData(array $data): string {
return $this->getContentFromBase64($data['file']['base64']);
}

throw new \Exception($this->l10n->t('No file source provided'));
throw new LibresignException($this->l10n->t('No file source provided'), 422);
}

/**
Expand Down
Loading
Loading