Unsigned PDF blocked as DocMDP P=1 because of an unreferenced signature object
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 65/100
Línea de trabajo
Start with DocMdpHandler, which the issue identifies as scanning the raw PDF, and trace how it decides whether a DocMDP certification is active. Use the attached synthetic reproducer to compare the unused /P 1 object with the explicitly referenced negative control. Done means unused objects no longer block signing while genuine active P1 certifications still do; the issue author says regression tests are prepared.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Describe the bug
LibreSign refuses to sign an unsigned PDF if it contains an unused signature dictionary with a DocMDP /P 1 entry, even though that object is not referenced by the document's active structure. It returns HTTP 422 with “This document has been certified with no changes allowed. You cannot add more signers to this document.” I originally reproduced this on 13.4.5 and still get the same error after upgrading to 13.4.7.
To reproduce
When trying to sign a PDF that was previously signed outside LibreSign, I got the error below.
I reproduced the same issue with simple test PDFs containing no real signatures or contract data.
The attached ZIP contains three reproduction files:
01-unsigned-control.pdf: a plain unsigned PDF.02-unreferenced-docmdp-p1.pdf: the same document with an unused signature dictionary containing DocMDP/P 1.03-rewritten-control.pdf: a rewritten copy of 02 with the unused object removed.
For each file:
- Upload it to LibreSign.
- Create a signing request.
- Open the request as the signer.
- Confirm signing.
I used two Nextcloud accounts that I control, one requesting the signature and the other signing.
Results from my tests on LibreSign 13.4.5:
| File | Result |
|---|---|
| 01: unsigned baseline | Signed successfully |
| 02: unused DocMDP P1 object | Blocked with HTTP 422 and the certification error |
| 03: rewritten control | Signed successfully |
After upgrading to 13.4.7, the same signing error still occurs. The detailed three-file results above are from the original 13.4.5 tests.
The ZIP also contains a fourth PDF with an explicitly referenced P1 dictionary. That is a separate structural negative control with dummy signature bytes, not part of the three browser signing tests.
Expected behavior
All three unsigned reproduction PDFs should pass the existing-certification check because none contains an active certification signature. An unused DocMDP object should not prevent signing. Genuine active P1 certifications should continue to block additional signatures.
Screenshots
Operational System
Server: Debian, Nextcloud running in Docker
Browser Type and Version
Google Chrome / Edge
Libresign Version
13.4.7; originally reproduced on 13.4.5.
Nextcloud Server Version
33.0.10.1
Logs from Nextcloud Server
No LibreSign exception explaining the rejection.
The signing request returned HTTP 422 with the explicit DocMDP error in its JSON response, included below.
Logs from Developers tools
The failing request is:
POST /ocs/v2.php/apps/libresign/api/v1/sign/uuid/<test-request-uuid>?async=true
HTTP status: 422 Unprocessable Content
Response:
{
"ocs": {
"meta": {
"status": "failure",
"statuscode": 422,
"message": ""
},
"data": {
"action": 2000,
"errors": [
{
"message": "This document has been certified with no changes allowed. You cannot add more signers to this document.",
"code": 422
}
]
}
}
}
Additional context
The failing test PDF has no AcroForm, signature fields, or catalog reference to a certification. It only contains an unused signature object with /P 1.
DocMdpHandler seems to scan the raw PDF and pick up that unused object anyway.
I have a possible fix and regression tests prepared and can submit a PR
- Lenguaje dominante
- PHP
- Estrellas
- 838
- Forks
- 171
- Merge medio
- 1 d 3 h
- PR fusionados (30 d)
- 414
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de LibreSign/libresign
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 83/100
LibreSign/libresign#9007 · 1 comentario · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
Define LibreSign Behat taxonomy and reusable context conventionsPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abiertobackend enhancement php
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
LibreSign/libresign#8284 · 5 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
LibreSign/libresign#9249 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
backend php
Dificultad 4/5 3-5 días Aptitud para principiantes 53/100
Los mantenedores suelen responder en 1 día
Todos los issues de LibreSign/libresign
Issues similares
-
Impact: Medium Level: Easy Type: Bug Value: Users
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
vigetlabs/wordpress-site-starter#315 ·
Los mantenedores suelen responder en 15 días
-
PHP 8.6: bundled guzzlehttp/promises loads class `Is` → "Using "is" as a class name is deprecated"Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
google/site-kit-wp#14004 ·
Los mantenedores suelen responder en 2 días
-
Awaiting Triage bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
jwage/phpamqplib-messenger#159 ·