[poppler] 3 commits - poppler/Form.cc utils/pdfsig.1 utils/pdfsig.cc
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Aug 3 23:39:29 UTC 2022
poppler/Form.cc | 2 +-
utils/pdfsig.1 | 4 ++--
utils/pdfsig.cc | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 56 insertions(+), 4 deletions(-)
New commits:
commit 64ccb8d248611fd1d7aef279d08ea7589a4e1fcb
Author: Erich E. Hoover <erich.e.hoover at gmail.com>
Date: Mon Aug 1 16:02:05 2022 -0600
pdfsig: Add support for specifying signature by field name
diff --git a/utils/pdfsig.1 b/utils/pdfsig.1
index 7e262009..872c6e8d 100644
--- a/utils/pdfsig.1
+++ b/utils/pdfsig.1
@@ -58,8 +58,8 @@ Add a new signature to the document.
.B \-new-signature-field-name " name"
Specifies the field name to be used when adding a new signature. A random ID will be used by default.
.TP
-.B \-sign " n"
-Sign the document in the n-th signature field present in the document (must be unsigned).
+.B \-sign " field"
+Sign the document in the specified signature field present in the document (must be unsigned). Field can be specified by field name (string) or the n-th signature field in the document (integer).
.TP
.B \-nick " nickname"
Use the certificate with the given nickname for signing.
diff --git a/utils/pdfsig.cc b/utils/pdfsig.cc
index 88ce3808..ca522de9 100644
--- a/utils/pdfsig.cc
+++ b/utils/pdfsig.cc
@@ -136,6 +136,7 @@ static bool dontVerifyCert = false;
static bool noOCSPRevocationCheck = false;
static bool dumpSignatures = false;
static bool etsiCAdESdetached = false;
+static char signatureName[256] = "";
static int signatureNumber = 0;
static char certNickname[256] = "";
static char password[256] = "";
@@ -154,7 +155,7 @@ static const ArgDesc argDesc[] = { { "-nssdir", argGooString, &nssDir, 0, "path
{ "-dump", argFlag, &dumpSignatures, 0, "dump all signatures into current directory" },
{ "-add-signature", argFlag, &addNewSignature, 0, "adds a new signature to the document" },
{ "-new-signature-field-name", argGooString, &newSignatureFieldName, 0, "field name used for the newly added signature. A random ID will be used if empty" },
- { "-sign", argInt, &signatureNumber, 0, "sign the document in the signature field with the given number" },
+ { "-sign", argString, &signatureName, 256, "sign the document in the given signature field (by name or number)" },
{ "-etsi", argFlag, &etsiCAdESdetached, 0, "create a signature of type ETSI.CAdES.detached instead of adbe.pkcs7.detached" },
{ "-nick", argString, &certNickname, 256, "use the certificate with the given nickname for signing" },
{ "-kpw", argString, &password, 256, "password for the signing key (might be missing if the key isn't password protected)" },
@@ -301,6 +302,15 @@ int main(int argc, char *argv[])
return 1;
}
+ if (strlen(signatureName) > 0) {
+ signatureNumber = atoi(signatureName);
+ if (signatureNumber == 0) {
+ signatureNumber = -1;
+ }
+ } else {
+ signatureNumber = 0;
+ }
+
if (addNewSignature && signatureNumber > 0) {
// incompatible options
print_version_usage(true);
@@ -367,6 +377,26 @@ int main(int argc, char *argv[])
const std::vector<FormFieldSignature *> signatures = doc->getSignatureFields();
const unsigned int sigCount = signatures.size();
+ if (signatureNumber == -1) {
+ for (unsigned int i = 0; i < sigCount; i++) {
+ const GooString *goo = signatures.at(i)->getCreateWidget()->getField()->getFullyQualifiedName();
+ if (!goo) {
+ continue;
+ }
+
+ const std::string name = TextStringToUTF8(goo->toStr());
+ if (name == signatureName) {
+ signatureNumber = i + 1;
+ break;
+ }
+ }
+
+ if (signatureNumber == -1) {
+ fprintf(stderr, "Signature field not found by name\n");
+ return 2;
+ }
+ }
+
if (signatureNumber > 0) {
// We are signing an existing signature field
if (argc == 2) {
commit ec71a5dc45039f2a8352b99803e98c148a2679a8
Author: Erich E. Hoover <erich.e.hoover at gmail.com>
Date: Fri Jul 29 10:12:53 2022 -0600
pdfsig: List signature field names when listing signature information
diff --git a/utils/pdfsig.cc b/utils/pdfsig.cc
index 6effd9d4..88ce3808 100644
--- a/utils/pdfsig.cc
+++ b/utils/pdfsig.cc
@@ -217,6 +217,23 @@ static std::vector<std::unique_ptr<X509CertificateInfo>> getAvailableSigningCert
return vCerts;
}
+static std::string TextStringToUTF8(const std::string &str)
+{
+ const UnicodeMap *utf8Map = globalParams->getUtf8Map();
+
+ Unicode *u;
+ int len = TextStringToUCS4(str, &u);
+
+ std::string convertedStr;
+ for (int i = 0; i < len; ++i) {
+ char buf[8];
+ const int n = utf8Map->mapUnicode(u[i], buf, sizeof(buf));
+ convertedStr.append(buf, n);
+ }
+
+ return convertedStr;
+}
+
int main(int argc, char *argv[])
{
char *time_str = nullptr;
@@ -422,6 +439,11 @@ int main(int argc, char *argv[])
for (unsigned int i = 0; i < sigCount; i++) {
FormFieldSignature *ffs = signatures.at(i);
printf("Signature #%u:\n", i + 1);
+ const GooString *goo = ffs->getCreateWidget()->getField()->getFullyQualifiedName();
+ if (goo) {
+ const std::string name = TextStringToUTF8(goo->toStr());
+ printf(" - Signature Field Name: %s\n", name.c_str());
+ }
if (ffs->getSignatureType() == unsigned_signature_field) {
printf(" The signature form field is not signed.\n");
commit 41af89601202f7973a6044f31ed14eba05c77f9a
Author: Erich E. Hoover <erich.e.hoover at gmail.com>
Date: Tue Aug 2 14:12:06 2022 -0600
Fix convertToUtf16 so it does not add the Unicode marker to the output string
diff --git a/poppler/Form.cc b/poppler/Form.cc
index 2b725606..3ee37611 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -103,7 +103,7 @@ static GooString *convertToUtf16(GooString *pdfDocEncodingString)
int tmp_length;
char *tmp_str = pdfDocEncodingToUTF16(pdfDocEncodingString->toStr(), &tmp_length);
delete pdfDocEncodingString;
- pdfDocEncodingString = new GooString(tmp_str, tmp_length);
+ pdfDocEncodingString = new GooString(tmp_str + 2, tmp_length - 2); // Remove the unicode BOM
delete[] tmp_str;
return pdfDocEncodingString;
}
More information about the poppler
mailing list