From 5875ebb1ca8a1066600d4dc69ca4a11ff9111e3e Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Sat, 10 Apr 2021 16:53:17 +0200 Subject: [PATCH] Display widget signature - but don't validate them for now; - Firefox will display a bar to warn that the signature validation is not supported (see https://bugzilla.mozilla.org/show_bug.cgi?id=854315) - almost all (all ?) pdf readers display signatures; - validation is done in edge but for now it's behind a pref. --- l10n/en-US/chrome.properties | 1 + src/core/annotation.js | 39 ++++++++++++++++++++--------------- src/core/document.js | 12 +++++++++-- src/shared/util.js | 1 + test/pdfs/.gitignore | 1 + test/pdfs/bug854315.pdf | Bin 0 -> 107532 bytes test/test_manifest.json | 6 ++++++ test/unit/api_spec.js | 3 +++ test/unit/document_spec.js | 9 ++++++++ web/app.js | 5 +++++ 10 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 test/pdfs/bug854315.pdf diff --git a/l10n/en-US/chrome.properties b/l10n/en-US/chrome.properties index e42ac790c..a8284958a 100644 --- a/l10n/en-US/chrome.properties +++ b/l10n/en-US/chrome.properties @@ -15,5 +15,6 @@ # Chrome notification bar messages and buttons unsupported_feature=This PDF document might not be displayed correctly. unsupported_feature_forms=This PDF document contains forms. The filling of form fields is not supported. +unsupported_feature_signatures=This PDF document contains digital signatures. Validation of signatures is not supported. open_with_different_viewer=Open With Different Viewer open_with_different_viewer.accessKey=o diff --git a/src/core/annotation.js b/src/core/annotation.js index 1896e8989..f3c670ea0 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -126,6 +126,8 @@ class AnnotationFactory { return new ButtonWidgetAnnotation(parameters); case "Ch": return new ChoiceWidgetAnnotation(parameters); + case "Sig": + return new SignatureWidgetAnnotation(parameters); } warn( `Unimplemented widget field type "${fieldType}", ` + @@ -1151,15 +1153,6 @@ class WidgetAnnotation extends Annotation { data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); data.hidden = this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN); - - // Hide signatures because we cannot validate them, and unset the fieldValue - // since it's (most likely) a `Dict` which is non-serializable and will thus - // cause errors when sending annotations to the main-thread (issue 10347). - if (data.fieldType === "Sig") { - data.fieldValue = null; - this.setFlags(AnnotationFlag.HIDDEN); - data.hidden = true; - } } /** @@ -1201,7 +1194,7 @@ class WidgetAnnotation extends Annotation { getOperatorList(evaluator, task, renderForms, annotationStorage) { // Do not render form elements on the canvas when interactive forms are // enabled. The display layer is responsible for rendering them instead. - if (renderForms) { + if (renderForms && !(this instanceof SignatureWidgetAnnotation)) { return Promise.resolve(new OperatorList()); } @@ -1600,13 +1593,6 @@ class WidgetAnnotation extends Annotation { } getFieldObject() { - if (this.data.fieldType === "Sig") { - return { - id: this.data.id, - value: null, - type: "signature", - }; - } return null; } } @@ -2203,6 +2189,25 @@ class ChoiceWidgetAnnotation extends WidgetAnnotation { } } +class SignatureWidgetAnnotation extends WidgetAnnotation { + constructor(params) { + super(params); + + // Unset the fieldValue since it's (most likely) a `Dict` which is + // non-serializable and will thus cause errors when sending annotations + // to the main-thread (issue 10347). + this.data.fieldValue = null; + } + + getFieldObject() { + return { + id: this.data.id, + value: null, + type: "signature", + }; + } +} + class TextAnnotation extends MarkupAnnotation { constructor(parameters) { const DEFAULT_ICON_SIZE = 22; // px diff --git a/src/core/document.js b/src/core/document.js index ff5c76cb8..ea09f5f60 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -828,7 +828,12 @@ class PDFDocument { } get formInfo() { - const formInfo = { hasFields: false, hasAcroForm: false, hasXfa: false }; + const formInfo = { + hasFields: false, + hasAcroForm: false, + hasXfa: false, + hasSignatures: false, + }; const acroForm = this.catalog.acroForm; if (!acroForm) { return shadow(this, "formInfo", formInfo); @@ -854,9 +859,11 @@ class PDFDocument { // the first bit of the `SigFlags` integer (see Table 219 in the // specification). const sigFlags = acroForm.get("SigFlags"); + const hasSignatures = !!(sigFlags & 0x1); const hasOnlyDocumentSignatures = - !!(sigFlags & 0x1) && this._hasOnlyDocumentSignatures(fields); + hasSignatures && this._hasOnlyDocumentSignatures(fields); formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures; + formInfo.hasSignatures = hasSignatures; } catch (ex) { if (ex instanceof MissingDataException) { throw ex; @@ -894,6 +901,7 @@ class PDFDocument { IsAcroFormPresent: this.formInfo.hasAcroForm, IsXFAPresent: this.formInfo.hasXfa, IsCollectionPresent: !!this.catalog.collection, + IsSignaturesPresent: this.formInfo.hasSignatures, }; let infoDict; diff --git a/src/shared/util.js b/src/shared/util.js index cfa37d033..0cbeda35d 100644 --- a/src/shared/util.js +++ b/src/shared/util.js @@ -315,6 +315,7 @@ const UNSUPPORTED_FEATURES = { unknown: "unknown", forms: "forms", javaScript: "javaScript", + signatures: "signatures", smask: "smask", shadingPattern: "shadingPattern", /** @deprecated unused */ diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 15f105b38..6350e3907 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -85,6 +85,7 @@ !issue9458.pdf !issue9655_reduced.pdf !issue9915_reduced.pdf +!bug854315.pdf !issue9940.pdf !issue10388_reduced.pdf !issue10438_reduced.pdf diff --git a/test/pdfs/bug854315.pdf b/test/pdfs/bug854315.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d175e8970bc6c16a3f85efaf5ed023755f5c62fb GIT binary patch literal 107532 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 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 319959420..8abfcf024 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -389,6 +389,12 @@ "rounds": 1, "type": "load" }, + { "id": "bug854315", + "file": "pdfs/bug854315.pdf", + "md5": "675754c07f71c068d2997905a5456f05", + "rounds": 1, + "type": "eq" + }, { "id": "bug868745", "file": "pdfs/bug868745.pdf", "md5": "86111ea5097dd7daffcdea891ad1b348", diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index d44050f6b..7267c078a 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -1212,6 +1212,7 @@ describe("api", function () { expect(info.IsAcroFormPresent).toEqual(false); expect(info.IsXFAPresent).toEqual(false); expect(info.IsCollectionPresent).toEqual(false); + expect(info.IsSignaturesPresent).toEqual(false); expect(metadata instanceof Metadata).toEqual(true); expect(metadata.get("dc:title")).toEqual("Basic API Test"); @@ -1254,6 +1255,7 @@ describe("api", function () { expect(info.IsAcroFormPresent).toEqual(false); expect(info.IsXFAPresent).toEqual(false); expect(info.IsCollectionPresent).toEqual(false); + expect(info.IsSignaturesPresent).toEqual(false); expect(metadata).toEqual(null); expect(contentDispositionFilename).toEqual(null); @@ -1282,6 +1284,7 @@ describe("api", function () { expect(info.IsAcroFormPresent).toEqual(false); expect(info.IsXFAPresent).toEqual(false); expect(info.IsCollectionPresent).toEqual(false); + expect(info.IsSignaturesPresent).toEqual(false); expect(metadata).toEqual(null); expect(contentDispositionFilename).toEqual(null); diff --git a/test/unit/document_spec.js b/test/unit/document_spec.js index e4109284d..91001e0e5 100644 --- a/test/unit/document_spec.js +++ b/test/unit/document_spec.js @@ -77,6 +77,7 @@ describe("document", function () { const pdfDocument = getDocument(null); expect(pdfDocument.formInfo).toEqual({ hasAcroForm: false, + hasSignatures: false, hasXfa: false, hasFields: false, }); @@ -90,6 +91,7 @@ describe("document", function () { let pdfDocument = getDocument(acroForm); expect(pdfDocument.formInfo).toEqual({ hasAcroForm: false, + hasSignatures: false, hasXfa: false, hasFields: false, }); @@ -98,6 +100,7 @@ describe("document", function () { pdfDocument = getDocument(acroForm); expect(pdfDocument.formInfo).toEqual({ hasAcroForm: false, + hasSignatures: false, hasXfa: true, hasFields: false, }); @@ -106,6 +109,7 @@ describe("document", function () { pdfDocument = getDocument(acroForm); expect(pdfDocument.formInfo).toEqual({ hasAcroForm: false, + hasSignatures: false, hasXfa: false, hasFields: false, }); @@ -114,6 +118,7 @@ describe("document", function () { pdfDocument = getDocument(acroForm); expect(pdfDocument.formInfo).toEqual({ hasAcroForm: false, + hasSignatures: false, hasXfa: true, hasFields: false, }); @@ -127,6 +132,7 @@ describe("document", function () { let pdfDocument = getDocument(acroForm); expect(pdfDocument.formInfo).toEqual({ hasAcroForm: false, + hasSignatures: false, hasXfa: false, hasFields: false, }); @@ -135,6 +141,7 @@ describe("document", function () { pdfDocument = getDocument(acroForm); expect(pdfDocument.formInfo).toEqual({ hasAcroForm: true, + hasSignatures: false, hasXfa: false, hasFields: true, }); @@ -146,6 +153,7 @@ describe("document", function () { pdfDocument = getDocument(acroForm); expect(pdfDocument.formInfo).toEqual({ hasAcroForm: true, + hasSignatures: false, hasXfa: false, hasFields: true, }); @@ -169,6 +177,7 @@ describe("document", function () { pdfDocument = getDocument(acroForm, xref); expect(pdfDocument.formInfo).toEqual({ hasAcroForm: false, + hasSignatures: true, hasXfa: false, hasFields: true, }); diff --git a/web/app.js b/web/app.js index cec82bddd..e4ba9da19 100644 --- a/web/app.js +++ b/web/app.js @@ -1583,6 +1583,11 @@ const PDFViewerApplication = { this._delayedFallback(UNSUPPORTED_FEATURES.forms); } + if (info.IsSignaturesPresent) { + console.warn("Warning: Digital signatures validation is not supported"); + this.fallback(UNSUPPORTED_FEATURES.signatures); + } + // Telemetry labels must be C++ variable friendly. let versionId = "other"; if (KNOWN_VERSIONS.includes(info.PDFFormatVersion)) {