From 1224d9be47e5235f39556d9118c9893ee6e68a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?=
Date: Fri, 4 Sep 2020 15:34:33 +0200 Subject: Return errors rather than mangle documents --- pdf-simple-sign.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'pdf-simple-sign.cpp') diff --git a/pdf-simple-sign.cpp b/pdf-simple-sign.cpp index 818270e..b724f69 100644 --- a/pdf-simple-sign.cpp +++ b/pdf-simple-sign.cpp @@ -2,7 +2,7 @@ // // pdf-simple-sign: simple PDF signer // -// Copyright (c) 2017, Přemysl Eric Janouch
+// Copyright (c) 2017 - 2020, Přemysl Eric Janouch
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted.
@@ -869,15 +869,21 @@ static std::string pdf_sign(std::string& document) {
if (page.type != pdf_object::DICT)
return "invalid or unsupported page tree";
- // XXX assuming this won't be an indirectly referenced array
auto& annots = page.dict["Annots"];
- if (annots.type != pdf_object::ARRAY)
+ if (annots.type != pdf_object::ARRAY) {
+ // TODO indirectly referenced arrays might not be that hard to support
+ if (annots.type != pdf_object::END)
+ return "unexpected Annots";
+
annots = {pdf_object::ARRAY};
+ }
annots.array.emplace_back(pdf_object::REFERENCE, sigfield_n, 0);
pdf.update(page.n, [&]{ pdf.document += pdf_serialize(page); });
// 8.6.1 Interactive Form Dictionary
- // XXX assuming there are no forms already, overwriting everything
+ if (root.dict.count("AcroForm"))
+ return "the document already contains forms, they would be overwritten";
+
root.dict["AcroForm"] = {std::map