Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
694 commits
Select commit Hold shift + click to select a range
daa3f41
test: improve typing in PdfEditor.spec.ts
vitormattos Feb 24, 2026
89525bd
test: improve typing in IdentifySigner.spec.ts
vitormattos Feb 24, 2026
748ba8a
test: improve typing in VisibleElements.spec.ts
vitormattos Feb 24, 2026
60dfab5
test: improve typing in RequestSignatureTab.spec.ts
vitormattos Feb 24, 2026
ec2a61c
test: improve typing in SigningOrderDiagram.spec.ts
vitormattos Feb 24, 2026
f7ce58c
test: improve typing in TopBar.spec.ts
vitormattos Feb 24, 2026
f172262
test: improve typing in UploadProgress.spec.ts
vitormattos Feb 24, 2026
ccfd3a4
test: improve typing in CertificateChain.spec.ts
vitormattos Feb 24, 2026
894cb17
test: improve typing in FileValidation.spec.ts
vitormattos Feb 24, 2026
e1b855f
test: improve typing in SignerDetails.spec.ts
vitormattos Feb 24, 2026
c8a8538
test: improve typing in SignersList.spec.ts
vitormattos Feb 24, 2026
7cc1d19
test: improve typing in SigningActionHelper.spec.ts
vitormattos Feb 24, 2026
276c131
test: improve typing in certification.spec.ts
vitormattos Feb 24, 2026
b1d09e8
test: improve typing in isExternal.spec.ts
vitormattos Feb 24, 2026
aa6aff0
test: improve typing in useIsDarkTheme.spec.ts
vitormattos Feb 24, 2026
b343625
test: improve typing in isTouchDevice.spec.ts
vitormattos Feb 24, 2026
08c5391
test: improve typing in SigningRequirementValidator.spec.ts
vitormattos Feb 24, 2026
149c553
test: improve typing in filesSorting.spec.ts
vitormattos Feb 24, 2026
d49cc15
test: improve typing in keyboard.spec.ts
vitormattos Feb 24, 2026
a51848a
test: improve typing in userconfig.spec.ts
vitormattos Feb 24, 2026
c27f49f
test: improve typing in test-types.ts
vitormattos Feb 24, 2026
53347d3
test: improve typing in fileStatus.spec.ts
vitormattos Feb 24, 2026
58fca4a
test: improve typing in CreateAccount.spec.ts
vitormattos Feb 24, 2026
98dd0c3
test: improve typing in DocumentValidationLogic.spec.ts
vitormattos Feb 24, 2026
6d98342
test: improve typing in FileRequestFlow.spec.ts
vitormattos Feb 24, 2026
ff0bb78
test: improve typing in LegalInformation.spec.ts
vitormattos Feb 24, 2026
5b284c6
test: improve typing in SignatureElementsManagement.spec.ts
vitormattos Feb 24, 2026
7561a90
test: improve typing in SigningInvitations.spec.ts
vitormattos Feb 24, 2026
c8ebfa1
test: improve typing in Validation.spec.ts
vitormattos Feb 24, 2026
cb72b04
fix: default docmdp level when config is missing
vitormattos Feb 24, 2026
bb8ac31
fix: use typed values in admin initial state
vitormattos Feb 24, 2026
b715cf5
fix: persist allowed groups on model updates
vitormattos Feb 24, 2026
2ccd9ca
fix: align docmdp settings with modelValue contract
vitormattos Feb 24, 2026
a735e89
fix: align envelope toggle with modelValue contract
vitormattos Feb 24, 2026
7bb045f
fix: load identification settings from initial state
vitormattos Feb 24, 2026
1bdcc1a
fix: align signature flow controls with modelValue
vitormattos Feb 24, 2026
e4f79bf
test: add allowed groups model update coverage
vitormattos Feb 24, 2026
0ff00c7
test: add docmdp default backend config coverage
vitormattos Feb 24, 2026
55e4a6a
test: add envelope initial state coverage
vitormattos Feb 24, 2026
b6764e5
test: add identification groups model update coverage
vitormattos Feb 24, 2026
294c784
test: add signature flow model binding coverage
vitormattos Feb 24, 2026
93795fc
test: ensure reset does not restore app defaults
vitormattos Feb 24, 2026
1bf8830
test: cover docmdp config default and toggle semantics
vitormattos Feb 24, 2026
b185da6
fix(draw): expose delete mdi icon via setup
vitormattos Feb 24, 2026
28d52bb
fix(footer): use logical inset for hidden element
vitormattos Feb 24, 2026
217bf04
fix(sidebar): restore mdi menu icons and wrapper registration
vitormattos Feb 24, 2026
384ea4b
fix(account): register document action mdi icons
vitormattos Feb 24, 2026
0b0394b
fix(account): register manage password mdi icons
vitormattos Feb 24, 2026
7729495
fix(account): normalize signature setup icon bindings
vitormattos Feb 24, 2026
b5b2495
fix(account): add missing email mdi icon binding
vitormattos Feb 24, 2026
f95e63b
fix(incomplete): register setup cogs icon
vitormattos Feb 24, 2026
543158f
fix(signpdf): register email modal mdi icons
vitormattos Feb 24, 2026
4b38084
test(sidebar): cover menu icon path wiring
vitormattos Feb 24, 2026
df43987
test(account): cover documents icon bindings
vitormattos Feb 24, 2026
064ba4f
test(account): cover manage password icon bindings
vitormattos Feb 24, 2026
bbc74e6
test(account): cover signature icon bindings
vitormattos Feb 24, 2026
c53f534
test(incomplete): cover cogs icon binding
vitormattos Feb 24, 2026
523ab8f
test(signpdf): cover modal email icon bindings
vitormattos Feb 24, 2026
8a1fbcf
fix(app): hide left sidebar from route meta
vitormattos Feb 24, 2026
dc87928
fix(app): mount only after router is ready
vitormattos Feb 24, 2026
e786de1
fix(router): mark incomplete routes to hide left sidebar
vitormattos Feb 24, 2026
e2a9ca5
test(app): cover sidebar visibility by route meta
vitormattos Feb 24, 2026
5978b43
fix(request): migrate SignerRow attrs and slots
vitormattos Feb 25, 2026
3f1d5c5
fix(request): migrate VisibleElements actions slot
vitormattos Feb 25, 2026
154412a
fix(sidebar): register EnvelopeFilesList dependencies
vitormattos Feb 25, 2026
d624762
test(request): cover VisibleElements actions slot forwarding
vitormattos Feb 25, 2026
2c630e1
test(account): cover Signature draw editor rendering
vitormattos Feb 25, 2026
b83d29e
test(sign): cover create signature draw modal
vitormattos Feb 25, 2026
e2ad64c
fix(account): register Documents loading icon
vitormattos Feb 25, 2026
c5a5dac
fix(account): restore Signature draw editor
vitormattos Feb 25, 2026
723ff94
fix(account): migrate Signatures named slots
vitormattos Feb 25, 2026
993d203
fix(files-list): register FileEntryCheckbox switch
vitormattos Feb 25, 2026
ff8662f
fix(files-list): register FileEntryGrid children
vitormattos Feb 25, 2026
d69b677
fix(files-list): register FileListFilterModified wrapper
vitormattos Feb 25, 2026
6ea7081
fix(files-list): register FileListFilterStatus wrapper
vitormattos Feb 25, 2026
55c0e8a
fix(files-list): register FileListFilters children
vitormattos Feb 25, 2026
4387c71
fix(files-list): restore FilesList icon bindings
vitormattos Feb 25, 2026
f8f7c4d
fix(files-list): register FilesListTableHeader components
vitormattos Feb 25, 2026
2a951f7
fix(account): register ResetPassword loading icon
vitormattos Feb 25, 2026
8e6b97f
fix(sign): register ModalEmailManager loading icon
vitormattos Feb 25, 2026
36c9ccb
fix(sign): register ModalTokenManager loading icon
vitormattos Feb 25, 2026
0d277b2
fix(sign): restore Draw modal in Sign view
vitormattos Feb 25, 2026
8c3b2d5
test(request): add SignerRow slot rendering spec
vitormattos Feb 25, 2026
5284d48
test(account): add Signatures slot regression spec
vitormattos Feb 25, 2026
3098542
test(files-list): add FilesList rendering regression spec
vitormattos Feb 25, 2026
1a00acf
fix(draw): use PreviewSignature in text confirmation
vitormattos Feb 25, 2026
c25876e
test(draw): cover text confirmation preview rendering
vitormattos Feb 25, 2026
9e338a2
fix: clear reset password form on close
vitormattos Feb 25, 2026
97cd819
test: add reset password cleanup regression spec
vitormattos Feb 25, 2026
e274c79
fix: register certificate content component
vitormattos Feb 25, 2026
33a69ef
fix: enforce strict upload ref invocation
vitormattos Feb 25, 2026
697742e
test: align manage password upload ref spec
vitormattos Feb 25, 2026
425ab06
fix: improve reset password enter-key flow
vitormattos Feb 25, 2026
5a07ae1
test: cover reset password focus behavior
vitormattos Feb 25, 2026
bf177e1
fix: improve signer select search rendering
vitormattos Feb 25, 2026
02709ef
test: add signer select label fallback coverage
vitormattos Feb 25, 2026
25d5b37
refactor: expose mdi icons via setup in incomplete certification
vitormattos Feb 25, 2026
2096ed0
refactor: move documents mdi bindings to setup
vitormattos Feb 25, 2026
0291ad9
refactor: expose modal email icons from setup
vitormattos Feb 25, 2026
44c5cf9
refactor: move file entry signers icon to setup
vitormattos Feb 25, 2026
b99d549
refactor: expose signer menu icon via setup
vitormattos Feb 25, 2026
26b969b
refactor: expose pdf editor action icons via setup
vitormattos Feb 25, 2026
a4f7edb
refactor: move left sidebar mdi bindings to setup
vitormattos Feb 25, 2026
e0b3730
chore: remove unused l10n import from file entry preview
vitormattos Feb 25, 2026
3e1f740
chore: remove unused l10n import from file entry status
vitormattos Feb 25, 2026
0042816
fix: keep file list status text-only
vitormattos Feb 25, 2026
543e27b
test: relax logger instance identity assertion
vitormattos Feb 25, 2026
dfd010b
test: stabilize pdf editor missing refs scenario
vitormattos Feb 25, 2026
f4e7e6c
test: simplify app route state typing
vitormattos Feb 25, 2026
f8e3e82
test: simplify documents axios mock typing
vitormattos Feb 25, 2026
16e65da
fix: tighten signer select icon mapping
vitormattos Feb 25, 2026
b749e7e
test: cover strict signer select icon handling
vitormattos Feb 25, 2026
7e92386
test: allow undefined route name in app spec
vitormattos Feb 25, 2026
18a2137
refactor: extract identify share type resolver
vitormattos Feb 25, 2026
860beff
test: add coverage for share type resolver scenarios
vitormattos Feb 25, 2026
c353ea4
fix: normalize identify search payload and resolver usage
vitormattos Feb 25, 2026
e9be3fe
test: cover identify controller share type behavior
vitormattos Feb 25, 2026
7a749c7
fix: harden signer select async search state
vitormattos Feb 25, 2026
194899d
test: add signer select regressions for async search
vitormattos Feb 25, 2026
c583b56
fix: avoid null counter value in signer row
vitormattos Feb 25, 2026
416e6a2
test: align signer counter assertions with zero default
vitormattos Feb 25, 2026
9e23147
fix: keep signersCount synced on signer mutations
vitormattos Feb 25, 2026
3d17c33
test: ensure signersCount updates after signer deletion
vitormattos Feb 25, 2026
ca633c0
fix: use async component wrapper in validation view
vitormattos Feb 25, 2026
5b21634
test: prevent promise text rendering in validation view
vitormattos Feb 25, 2026
4e41d51
fix: normalize CRL certificate type chip spacing
vitormattos Feb 25, 2026
712892f
fix: indent
vitormattos Feb 25, 2026
e12039c
fix: indent
vitormattos Feb 25, 2026
c57a6c4
fix: indent
vitormattos Feb 25, 2026
33deb30
fix: indnet
vitormattos Feb 25, 2026
4c6780c
fix: indent
vitormattos Feb 25, 2026
64f18e5
fix: indent
vitormattos Feb 25, 2026
dc74244
fix: year
vitormattos Feb 25, 2026
0cbd96d
fix: indent
vitormattos Feb 25, 2026
c14e771
fix: indent
vitormattos Feb 25, 2026
5c9ee56
fix: indent
vitormattos Feb 25, 2026
0adcb83
fix: indent
vitormattos Feb 25, 2026
eb8bff8
refactor: migrate Validation.vue beforeDestroy to beforeUnmount
vitormattos Feb 25, 2026
511b369
refactor: migrate SigningProgress.vue beforeDestroy to beforeUnmount
vitormattos Feb 25, 2026
990b8a4
refactor: migrate SignerSelect.vue beforeDestroy to beforeUnmount
vitormattos Feb 25, 2026
4ad62fd
refactor: replace Vue2 dialog pattern with Vue3 spawnDialog
vitormattos Feb 25, 2026
5b9b422
refactor: enhance test setup with error/warn interception
vitormattos Feb 25, 2026
3da34cc
test: migrate EditNameDialog.spec.ts propsData to props
vitormattos Feb 25, 2026
ac4cc78
test: migrate SigningOrderDiagram.spec.ts propsData to props
vitormattos Feb 25, 2026
42d402f
test: migrate SignerDetails.spec.ts propsData to props
vitormattos Feb 25, 2026
901d91a
test: migrate FileEntrySigners.spec.ts propsData to props
vitormattos Feb 25, 2026
ccb9721
test: migrate Draw.spec.ts propsData to props (14 instances)
vitormattos Feb 25, 2026
5e115da
test: migrate InputAction.spec.ts propsData to props
vitormattos Feb 25, 2026
4f9d9e2
test: migrate IdentifySigner.spec.ts propsData to props (2 instances)
vitormattos Feb 25, 2026
4dfe0c4
test: rewrite SigningProgress.spec.ts lifecycle tests
vitormattos Feb 25, 2026
aaabe6d
style: fix FileUpload.vue prop closing bracket alignment
vitormattos Feb 25, 2026
8517c2f
style: fix FileStatusList.vue prop closing bracket alignment
vitormattos Feb 25, 2026
e2358b0
style: fix IdentifySigner.vue prop closing bracket alignment
vitormattos Feb 25, 2026
7f72616
style: fix RequestPicker.vue prop closing bracket alignment
vitormattos Feb 25, 2026
04f83b4
style: fix SignerRow.vue prop closing bracket alignment
vitormattos Feb 25, 2026
636f442
style: fix validation/FileStatusList.vue prop closing bracket alignment
vitormattos Feb 25, 2026
a8ee994
style: fix FileValidation.vue prop closing bracket alignment
vitormattos Feb 25, 2026
283a176
style: fix RequestSigningProgress.vue prop closing bracket alignment
vitormattos Feb 25, 2026
3c64a62
style: fix Signer.vue prop closing bracket alignment
vitormattos Feb 25, 2026
473cc11
style: fix Signers.vue prop closing bracket alignment
vitormattos Feb 25, 2026
2ff901e
style: fix SigningOrderDiagram.vue prop closing bracket alignment
vitormattos Feb 25, 2026
a3d96fd
style: fix UploadProgress.vue prop closing bracket alignment
vitormattos Feb 25, 2026
3245487
style: fix FileEntryActions.vue prop closing bracket alignment
vitormattos Feb 25, 2026
4dcf265
style: fix FileEntryCheckbox.vue prop closing bracket alignment
vitormattos Feb 25, 2026
8c2ed99
style: fix FileEntryStatus.vue prop closing bracket alignment
vitormattos Feb 25, 2026
30d8027
style: fix FileListFilter.vue prop closing bracket alignment
vitormattos Feb 25, 2026
52d7134
style: fix FilesListTableHeaderButton.vue prop closing bracket alignment
vitormattos Feb 25, 2026
7e0c7cc
style: fix CertificateContent.vue prop closing bracket alignment
vitormattos Feb 25, 2026
28fa247
style: fix SignatureStamp.vue prop closing bracket alignment
vitormattos Feb 25, 2026
4678760
style: fix UploadCertificate.vue prop closing bracket alignment
vitormattos Feb 25, 2026
a8351f0
build: configure __VUE_PROD_DEVTOOLS__ flag via vite plugin
vitormattos Feb 25, 2026
fa3b15e
chore: update copyright year to 2026
vitormattos Feb 25, 2026
68113ad
chore: update copyright year to 2026
vitormattos Feb 25, 2026
35b3c17
fix: await upload before registering file with API and opening sidebar
vitormattos Feb 25, 2026
d77ebfa
refactor: remove side-effect action imports from tab entry point
vitormattos Feb 25, 2026
19cccec
fix: add defineOptions name to App root component
vitormattos Feb 25, 2026
4cb4509
chore: update copyright year to 2026
vitormattos Feb 25, 2026
9910eaf
chore: update copyright year to 2026
vitormattos Feb 25, 2026
5a5096a
chore: update copyright year to 2026
vitormattos Feb 25, 2026
5e4e4be
chore: update copyright year to 2026
vitormattos Feb 25, 2026
162f7c3
chore: update copyright year to 2026
vitormattos Feb 25, 2026
949cf46
chore: update copyright year to 2026
vitormattos Feb 25, 2026
8e1a1ad
chore: update copyright year to 2026
vitormattos Feb 25, 2026
73da6af
fix: correct spawnDialog return value (remove array destructuring)
vitormattos Feb 25, 2026
c978c92
chore: update copyright year to 2026
vitormattos Feb 25, 2026
17d7222
fix: register NcCheckboxRadioSwitch and remove stray console.error
vitormattos Feb 25, 2026
0ead0c6
fix: add missing closing brace in icons data object
vitormattos Feb 25, 2026
cfc2ed1
fix: remove console.error debug logs from envelope files list
vitormattos Feb 25, 2026
f24f805
fix: register NcCheckboxRadioSwitch and NcLoadingIcon components
vitormattos Feb 25, 2026
1267162
fix: use signer.identify as sole :key, remove || index fallback
vitormattos Feb 25, 2026
19eb0fc
fix: register NcCheckboxRadioSwitch in FileEntryActions
vitormattos Feb 25, 2026
e929287
fix: normalize file IDs to Number for consistent selection comparison
vitormattos Feb 25, 2026
fe8571a
fix: normalize ordered IDs to Number in onToggleAll selection
vitormattos Feb 25, 2026
329bb9b
fix: register NcCheckboxRadioSwitch and normalize IDs in changeLoadin…
vitormattos Feb 25, 2026
664543a
chore: update copyright year in pdf-elements mock index
vitormattos Feb 25, 2026
c7864ae
chore: update copyright year in PDFElements mock component
vitormattos Feb 25, 2026
3f0d8a1
chore: update copyright year in asyncReader mock
vitormattos Feb 25, 2026
6015388
chore: update copyright year in vue-select mock
vitormattos Feb 25, 2026
033ab7e
chore: update copyright year in vitest type declarations
vitormattos Feb 25, 2026
4b5162d
test: add coverage for App external-page class and conditional rendering
vitormattos Feb 25, 2026
e11f1d8
test: simplify spawnDialog mock to plain resolved promise
vitormattos Feb 25, 2026
6633c24
test: refactor PdfEditor mock to use inline expose and direct $refs a…
vitormattos Feb 25, 2026
db81467
test: update RequestSignatureTab tests for component registration cha…
vitormattos Feb 25, 2026
efb2d9f
test: remove obsolete Signer spec cases
vitormattos Feb 25, 2026
fda6eec
test: expand Signers spec coverage
vitormattos Feb 25, 2026
e0937e5
test: update SignerDetails spec for current component shape
vitormattos Feb 25, 2026
b3963ed
test: add files store test coverage
vitormattos Feb 25, 2026
aae550f
test: update FileEntry spec for normalized ID comparisons
vitormattos Feb 25, 2026
8b99d6d
fix: update to newest version
vitormattos Feb 25, 2026
e1b3ebb
fix: initialize git submodules in the devcontainer setup script
vitormattos Feb 25, 2026
3ea3494
fix(a11y): add aria-expanded to Document certification section
vitormattos Feb 25, 2026
9363b03
fix: throws libresign exception
vitormattos Feb 26, 2026
1eee7e9
chore: cover new scenarios
vitormattos Feb 26, 2026
fdf5515
fix(validation): fix indentation of chain prop closing brace
vitormattos Feb 26, 2026
7a54975
fix(validation): fix indentation of signRequestUuid prop and setup re…
vitormattos Feb 26, 2026
d6f22a0
fix(validation): remove unused n import from DocumentValidationDetails
vitormattos Feb 26, 2026
46dc25f
fix(views): remove unused n import from Validation
vitormattos Feb 26, 2026
bf4e594
fix: remove unused n import from init
vitormattos Feb 26, 2026
a8f19e1
fix: fix prop closing brace indentation in FooterTemplateEditor
vitormattos Feb 26, 2026
4dd5473
fix: fix prop closing brace indentation in IdentifySigner
vitormattos Feb 26, 2026
ec97481
fix: fix prop closing brace indentation in RequestPicker
vitormattos Feb 26, 2026
3316170
fix: fix prop closing brace indentation in SignerSelect
vitormattos Feb 26, 2026
edc9889
fix: fix prop closing brace indentation in VisibleElements
vitormattos Feb 26, 2026
9270cd6
fix: fix prop closing brace indentation in EnvelopeFilesList
vitormattos Feb 26, 2026
fbe00b2
fix: fix prop closing brace indentation in RequestSignatureTab
vitormattos Feb 26, 2026
75fa8a8
fix: fix prop closing brace indentation in SignTab
vitormattos Feb 26, 2026
1692790
fix: fix prop closing brace indentation in Signers
vitormattos Feb 26, 2026
8cc6d95
fix: fix prop closing brace indentation in TopBar
vitormattos Feb 26, 2026
05d0bcf
fix: fix prop closing brace indentation in SignerDetails
vitormattos Feb 26, 2026
f9faba9
fix: fix prop closing brace indentation in Documents
vitormattos Feb 26, 2026
9e9afb0
fix: fix prop closing brace indentation in Signature
vitormattos Feb 26, 2026
9815c81
fix: fix prop closing brace indentation in UserImage
vitormattos Feb 26, 2026
4305fad
fix: fix prop closing brace indentation in CrlManagement
vitormattos Feb 26, 2026
38615a0
fix: fix prop closing brace indentation in FileEntryActions
vitormattos Feb 26, 2026
60838d6
fix: fix prop closing brace indentation in FileEntryName
vitormattos Feb 26, 2026
cb9f372
fix: fix prop closing brace indentation in FilesListTableHeaderButton
vitormattos Feb 26, 2026
4da4b3e
fix: fix prop closing brace indentation in CertificateCustonOptions
vitormattos Feb 26, 2026
3a9ec7f
fix: fix prop closing brace indentation in CertificatePolicy
vitormattos Feb 26, 2026
755ed27
fix: fix prop closing brace indentation in DownloadBinaries
vitormattos Feb 26, 2026
906808c
fix: fix prop closing brace indentation in IdentificationFactors
vitormattos Feb 26, 2026
e7db13f
fix: fix prop closing brace indentation in RootCertificateCfssl
vitormattos Feb 26, 2026
66b0fdc
fix: fix prop closing brace indentation in RootCertificateOpenSsl
vitormattos Feb 26, 2026
561a478
fix: fix prop closing brace indentation in SignatureFlow
vitormattos Feb 26, 2026
5fae7fd
fix: fix prop closing brace indentation in TSA
vitormattos Feb 26, 2026
ba79661
fix: fix prop closing brace indentation in SignPDF
vitormattos Feb 26, 2026
86c2c08
fix: fix prop closing brace indentation in ModalEmailManager
vitormattos Feb 26, 2026
cca9a57
fix: fix prop closing brace indentation in ModalTokenManager
vitormattos Feb 26, 2026
d1e7162
fix: fix prop closing brace indentation in Sign
vitormattos Feb 26, 2026
57ca656
fix: fix prop closing brace indentation in Validation
vitormattos Feb 26, 2026
2944d98
fix: review previous commit
vitormattos Feb 26, 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 @@ -317,6 +317,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