fix: add ordering validation for signature request actions

In ordered numeric signing flow, the frontend now validates that
all lower-order signers have signed before showing 'Request signature'
or 'Send reminder' buttons for higher-order signers.

Changes:
- Extract duplicate ordering validation logic into shared method
  canSignerActInOrder
- Apply ordering validation to both canRequestSignature and
  canSendReminder computed properties
- Move canSignerActInOrder to methods section (takes parameter)

This prevents users from requesting signatures or sending reminders
to signers out of turn when sequential signing is enabled.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
This commit is contained in:
Vitor Mattos 2025-12-12 14:46:24 -03:00
parent 4535979d7d
commit c9f2fa9feb
No known key found for this signature in database
GPG key ID: 6FECE2AD4809003A

View file

@ -263,20 +263,28 @@ export default {
},
canRequestSignature() {
return (signer) => {
return this.filesStore.canRequestSign
&& !signer.signed
&& signer.signRequestId
&& !signer.me
&& signer.status === 0
if (!this.filesStore.canRequestSign
|| signer.signed
|| !signer.signRequestId
|| signer.me
|| signer.status !== 0) {
return false
}
return this.canSignerActInOrder(signer)
}
},
canSendReminder() {
return (signer) => {
return this.filesStore.canRequestSign
&& !signer.signed
&& signer.signRequestId
&& !signer.me
&& signer.status === 1
if (!this.filesStore.canRequestSign
|| signer.signed
|| !signer.signRequestId
|| signer.me
|| signer.status !== 1) {
return false
}
return this.canSignerActInOrder(signer)
}
},
showSaveButton() {
@ -353,6 +361,21 @@ export default {
getSvgIcon(name) {
return iconMap[`svg${name.charAt(0).toUpperCase() + name.slice(1)}`] || iconMap.svgAccount
},
canSignerActInOrder(signer) {
if (!this.isOrderedNumeric) {
return true
}
const file = this.filesStore.getFile()
const signerOrder = signer.signingOrder || 1
const hasPendingLowerOrder = file.signers.some(s => {
const otherOrder = s.signingOrder || 1
return otherOrder < signerOrder && !s.signed
})
return !hasPendingLowerOrder
},
enabledMethods() {
return this.methods.filter(method => method.enabled)
},
@ -473,7 +496,6 @@ export default {
await this.filesStore.updateSignatureRequest({
visibleElements: [],
signers,
status: 1,
})
showSuccess(t('libresign', 'Signature requested'))
} catch (error) {