[poppler] poppler/Form.cc poppler/Form.h poppler/Page.cc poppler/PDFDoc.cc poppler/PDFDoc.h poppler/SignatureInfo.cc poppler/SignatureInfo.h utils/pdfsig.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 23 20:30:36 UTC 2020


 poppler/Form.cc          |  277 ++++++++++++++++++++++++-----------------------
 poppler/Form.h           |   21 ++-
 poppler/PDFDoc.cc        |   39 +++---
 poppler/PDFDoc.h         |    2 
 poppler/Page.cc          |    1 
 poppler/SignatureInfo.cc |   12 +-
 poppler/SignatureInfo.h  |   14 +-
 utils/pdfsig.cc          |   54 +++------
 8 files changed, 216 insertions(+), 204 deletions(-)

New commits:
commit ba311960d2486e07e66f59dd8d8a5f6e49a918d0
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Apr 9 16:59:54 2020 +0200

    pdfsig: Show also signatures that aren't attached to any page
    
    Move two methods from FormWidgetSignature to FormFieldSignature where
    they actually belong
    
    Rename PDFDoc::getSignatureWidgets to getSignatureFields, making it go
    through the FormsFields instead of the Page FormWidgets
    
    Remove the gotos from pdfsig code
    
    Add a few const here and there
    
    Fixes part of #895

diff --git a/poppler/Form.cc b/poppler/Form.cc
index 872f1bdd..5018bc9d 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -479,143 +479,14 @@ SignatureInfo *FormWidgetSignature::validateSignature(bool doVerifyCert, bool fo
   return static_cast<FormFieldSignature*>(field)->validateSignature(doVerifyCert, forceRevalidation, validationTime);
 }
 
-std::vector<Goffset> FormWidgetSignature::getSignedRangeBounds()
+std::vector<Goffset> FormWidgetSignature::getSignedRangeBounds() const
 {
-  Object* byteRangeObj = static_cast<FormFieldSignature*>(field)->getByteRange();
-  std::vector<Goffset> range_vec;
-  if (byteRangeObj->isArray())
-  {
-    if (byteRangeObj->arrayGetLength() == 4)
-    {
-      for (int i = 0; i < 2; ++i)
-      {
-        Object offsetObj(byteRangeObj->arrayGet(2*i));
-        Object lenObj(byteRangeObj->arrayGet(2*i+1));
-        if (offsetObj.isIntOrInt64() && lenObj.isIntOrInt64())
-        {
-          Goffset offset = offsetObj.getIntOrInt64();
-          Goffset len = lenObj.getIntOrInt64();
-          range_vec.push_back(offset);
-          range_vec.push_back(offset+len);
-        }
-      }
-    }
-  }
-  return range_vec;
+  return static_cast<FormFieldSignature*>(field)->getSignedRangeBounds();
 }
 
 GooString* FormWidgetSignature::getCheckedSignature(Goffset *checkedFileSize)
 {
-  Goffset start = 0;
-  Goffset end = 0;
-  const std::vector<Goffset> ranges = getSignedRangeBounds();
-  if (ranges.size() == 4)
-  {
-    start = ranges[1];
-    end = ranges[2];
-  }
-  if (end >= start+6)
-  {
-    BaseStream* stream = doc->getBaseStream();
-    *checkedFileSize = stream->getLength();
-    Goffset len = end-start;
-    stream->setPos(end-1);
-    int c2 = stream->lookChar();
-    stream->setPos(start);
-    int c1 = stream->getChar();
-    // PDF signatures are first ASN1 DER, then hex encoded PKCS#7 structures,
-    // possibly padded with 0 characters and enclosed in '<' and '>'.
-    // The ASN1 DER encoding of a PKCS#7 structure must start with the tag 0x30
-    // for SEQUENCE. The next byte must be 0x80 for ASN1 DER indefinite length
-    // encoding or (0x80 + n) for ASN1 DER definite length encoding
-    // where n is the number of subsequent "length bytes" which big-endian
-    // encode the length of the content of the SEQUENCE following them.
-    if (len <= std::numeric_limits<int>::max() && *checkedFileSize > end && c1 == '<' && c2 == '>')
-    {
-      GooString gstr;
-      ++start;
-      --end;
-      len = end-start;
-      Goffset pos = 0;
-      do
-      {
-        c1 = stream->getChar();
-        if (c1 == EOF)
-          return nullptr;
-        gstr.append(static_cast<char>(c1));
-      } while (++pos < len);
-      if (gstr.getChar(0) == '3' && gstr.getChar(1) == '0')
-      {
-        if (gstr.getChar(2) == '8' && gstr.getChar(3) == '0')
-        {
-          // ASN1 DER indefinite length encoding:
-          // We only check that all characters up to the enclosing '>'
-          // are hex characters and that there are two hex encoded 0 bytes
-          // just before the enclosing '>' marking the end of the indefinite
-          // length encoding.
-          int paddingCount = 0;
-          while (gstr.getChar(len-1) == '0' && gstr.getChar(len-2) == '0')
-          {
-            ++paddingCount;
-            len -= 2;
-          }
-          if (paddingCount < 2 || len%2 == 1)
-            len = 0;
-        }
-        else if (gstr.getChar(2) == '8')
-        {
-          // ASN1 DER definite length encoding:
-          // We calculate the length of the following bytes from the length bytes and
-          // check that after the length bytes and the following calculated number of
-          // bytes all bytes up to the enclosing '>' character are hex encoded 0 bytes.
-          int lenBytes = gstr.getChar(3) - '0';
-          if (lenBytes > 0 && lenBytes <= 4)
-          {
-            int sigLen = 0;
-            for (int i = 0; i < 2*lenBytes; ++i)
-            {
-              sigLen <<= 4;
-              char c = gstr.getChar(i+4);
-              if (isdigit(c))
-                sigLen += c - '0';
-              else if (isxdigit(c) && c >= 'a')
-                sigLen += c - 'a' + 10;
-              else if (isxdigit(c) && c >= 'A')
-                sigLen += c - 'A' + 10;
-              else
-              {
-                len = 0;
-                break;
-              }
-            }
-            if (sigLen > 0 && 2*(sigLen+lenBytes) <= len-4)
-            {
-              for (Goffset i = 2*(sigLen+lenBytes)+4; i < len; ++i)
-              {
-                if (gstr.getChar(i) != '0')
-                {
-                  len = 0;
-                  break;
-                }
-              }
-            }
-            else
-              len = 0;
-          }
-        }
-        for ( const char c : gstr.toStr() )
-        {
-          if (!isxdigit(c))
-            len = 0;
-        }
-        if (len > 0)
-        {
-          return new GooString(&gstr, 0, len);
-        }
-      }
-    }
-  }
-  return nullptr;
+  return static_cast<FormFieldSignature*>(field)->getCheckedSignature(checkedFileSize);
 }
 
 void FormWidgetSignature::updateWidgetAppearance()
@@ -1729,9 +1600,9 @@ void FormFieldSignature::hashSignedDataBlock(SignatureHandler *handler, Goffset
 #endif
 }
 
-FormSignatureType FormWidgetSignature::signatureType()
+FormSignatureType FormWidgetSignature::signatureType() const
 {
-  return static_cast<FormFieldSignature*>(field)->signature_type;
+  return static_cast<FormFieldSignature*>(field)->getSignatureType();
 }
 
 SignatureInfo *FormFieldSignature::validateSignature(bool doVerifyCert, bool forceRevalidation, time_t validationTime)
@@ -1812,6 +1683,144 @@ SignatureInfo *FormFieldSignature::validateSignature(bool doVerifyCert, bool for
   return signature_info;
 }
 
+std::vector<Goffset> FormFieldSignature::getSignedRangeBounds() const
+{
+  std::vector<Goffset> range_vec;
+  if (byte_range.isArray())
+  {
+    if (byte_range.arrayGetLength() == 4)
+    {
+      for (int i = 0; i < 2; ++i)
+      {
+        const Object offsetObj(byte_range.arrayGet(2*i));
+        const Object lenObj(byte_range.arrayGet(2*i+1));
+        if (offsetObj.isIntOrInt64() && lenObj.isIntOrInt64())
+        {
+          const Goffset offset = offsetObj.getIntOrInt64();
+          const Goffset len = lenObj.getIntOrInt64();
+          range_vec.push_back(offset);
+          range_vec.push_back(offset+len);
+        }
+      }
+    }
+  }
+  return range_vec;
+}
+
+GooString* FormFieldSignature::getCheckedSignature(Goffset *checkedFileSize)
+{
+  Goffset start = 0;
+  Goffset end = 0;
+  const std::vector<Goffset> ranges = getSignedRangeBounds();
+  if (ranges.size() == 4)
+  {
+    start = ranges[1];
+    end = ranges[2];
+  }
+  if (end >= start+6)
+  {
+    BaseStream* stream = doc->getBaseStream();
+    *checkedFileSize = stream->getLength();
+    Goffset len = end-start;
+    stream->setPos(end-1);
+    int c2 = stream->lookChar();
+    stream->setPos(start);
+    int c1 = stream->getChar();
+    // PDF signatures are first ASN1 DER, then hex encoded PKCS#7 structures,
+    // possibly padded with 0 characters and enclosed in '<' and '>'.
+    // The ASN1 DER encoding of a PKCS#7 structure must start with the tag 0x30
+    // for SEQUENCE. The next byte must be 0x80 for ASN1 DER indefinite length
+    // encoding or (0x80 + n) for ASN1 DER definite length encoding
+    // where n is the number of subsequent "length bytes" which big-endian
+    // encode the length of the content of the SEQUENCE following them.
+    if (len <= std::numeric_limits<int>::max() && *checkedFileSize > end && c1 == '<' && c2 == '>')
+    {
+      GooString gstr;
+      ++start;
+      --end;
+      len = end-start;
+      Goffset pos = 0;
+      do
+      {
+        c1 = stream->getChar();
+        if (c1 == EOF)
+          return nullptr;
+        gstr.append(static_cast<char>(c1));
+      } while (++pos < len);
+      if (gstr.getChar(0) == '3' && gstr.getChar(1) == '0')
+      {
+        if (gstr.getChar(2) == '8' && gstr.getChar(3) == '0')
+        {
+          // ASN1 DER indefinite length encoding:
+          // We only check that all characters up to the enclosing '>'
+          // are hex characters and that there are two hex encoded 0 bytes
+          // just before the enclosing '>' marking the end of the indefinite
+          // length encoding.
+          int paddingCount = 0;
+          while (gstr.getChar(len-1) == '0' && gstr.getChar(len-2) == '0')
+          {
+            ++paddingCount;
+            len -= 2;
+          }
+          if (paddingCount < 2 || len%2 == 1)
+            len = 0;
+        }
+        else if (gstr.getChar(2) == '8')
+        {
+          // ASN1 DER definite length encoding:
+          // We calculate the length of the following bytes from the length bytes and
+          // check that after the length bytes and the following calculated number of
+          // bytes all bytes up to the enclosing '>' character are hex encoded 0 bytes.
+          int lenBytes = gstr.getChar(3) - '0';
+          if (lenBytes > 0 && lenBytes <= 4)
+          {
+            int sigLen = 0;
+            for (int i = 0; i < 2*lenBytes; ++i)
+            {
+              sigLen <<= 4;
+              char c = gstr.getChar(i+4);
+              if (isdigit(c))
+                sigLen += c - '0';
+              else if (isxdigit(c) && c >= 'a')
+                sigLen += c - 'a' + 10;
+              else if (isxdigit(c) && c >= 'A')
+                sigLen += c - 'A' + 10;
+              else
+              {
+                len = 0;
+                break;
+              }
+            }
+            if (sigLen > 0 && 2*(sigLen+lenBytes) <= len-4)
+            {
+              for (Goffset i = 2*(sigLen+lenBytes)+4; i < len; ++i)
+              {
+                if (gstr.getChar(i) != '0')
+                {
+                  len = 0;
+                  break;
+                }
+              }
+            }
+            else
+              len = 0;
+          }
+        }
+        for ( const char c : gstr.toStr() )
+        {
+          if (!isxdigit(c))
+            len = 0;
+        }
+        if (len > 0)
+        {
+          return new GooString(&gstr, 0, len);
+        }
+      }
+    }
+  }
+  return nullptr;
+}
+
 void FormFieldSignature::print(int indent)
 {
   printf ("%*s- (%d %d): [signature] terminal: %s children: %d\n", indent, "", ref.num, ref.gen,
diff --git a/poppler/Form.h b/poppler/Form.h
index fae63634..cf5b4a6f 100644
--- a/poppler/Form.h
+++ b/poppler/Form.h
@@ -268,13 +268,13 @@ public:
   FormWidgetSignature(PDFDoc *docA, Object *dictObj, unsigned num, Ref ref, FormField *p);
   void updateWidgetAppearance() override;
 
-  FormSignatureType signatureType();
+  FormSignatureType signatureType() const;
   // Use -1 for now as validationTime
   SignatureInfo *validateSignature(bool doVerifyCert, bool forceRevalidation, time_t validationTime);
 
   // returns a list with the boundaries of the signed ranges
   // the elements of the list are of type Goffset
-  std::vector<Goffset> getSignedRangeBounds();
+  std::vector<Goffset> getSignedRangeBounds() const;
 
   // checks the length encoding of the signature and returns the hex encoded signature
   // if the check passed (and the checked file size as output parameter in checkedFileSize)
@@ -318,8 +318,10 @@ public:
   GooString *getFullyQualifiedName();
 
   FormWidget* findWidgetByRef (Ref aref);
-  int getNumWidgets() { return terminal ? numChildren : 0; }
-  FormWidget *getWidget(int i) { return terminal ? widgets[i] : nullptr; }
+  int getNumWidgets() const { return terminal ? numChildren : 0; }
+  FormWidget *getWidget(int i) const { return terminal ? widgets[i] : nullptr; }
+  int getNumChildren() const { return !terminal ? numChildren : 0; }
+  FormField *getChildren(int i) const { return children[i]; }
 
   // only implemented in FormFieldButton
   virtual void fillChildrenSiblingsID ();
@@ -528,16 +530,25 @@ protected:
 //------------------------------------------------------------------------
 
 class FormFieldSignature: public FormField {
-  friend class FormWidgetSignature;
 public:
   FormFieldSignature(PDFDoc *docA, Object &&dict, const Ref ref, FormField *parent, std::set<int> *usedParents);
 
   // Use -1 for now as validationTime
   SignatureInfo *validateSignature(bool doVerifyCert, bool forceRevalidation, time_t validationTime);
 
+  // returns a list with the boundaries of the signed ranges
+  // the elements of the list are of type Goffset
+  std::vector<Goffset> getSignedRangeBounds() const;
+
+  // checks the length encoding of the signature and returns the hex encoded signature
+  // if the check passed (and the checked file size as output parameter in checkedFileSize)
+  // otherwise a nullptr is returned
+  GooString* getCheckedSignature(Goffset *checkedFileSize);
+
   ~FormFieldSignature() override;
   Object* getByteRange() { return &byte_range; }
   const GooString* getSignature() const { return signature; }
+  FormSignatureType getSignatureType() const { return signature_type; }
 
 private:
   void parseInfo();
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index f534ce7a..8d506da6 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -597,25 +597,32 @@ void PDFDoc::extractPDFSubtype() {
   delete pdfSubtypeVersion;
 }
 
-std::vector<FormWidgetSignature*> PDFDoc::getSignatureWidgets()
+static void addSignatureFieldsToVector(FormField *ff, std::vector<FormFieldSignature*> &res)
 {
-  int num_pages = getNumPages();
-  FormPageWidgets *page_widgets = nullptr;
-  std::vector<FormWidgetSignature*> widget_vector;
-
-  for (int i = 1; i <= num_pages; i++) {
-    Page *p = getCatalog()->getPage(i);
-    if (p) {
-      page_widgets = p->getFormWidgets();
-      for (int j = 0; page_widgets != nullptr && j < page_widgets->getNumWidgets(); j++) {
-	if (page_widgets->getWidget(j)->getType() == formSignature) {
-	    widget_vector.push_back(static_cast<FormWidgetSignature*>(page_widgets->getWidget(j)));
-	}
-      }
-      delete page_widgets;
+  if (ff->getNumChildren() == 0) {
+    if (ff->getType() == formSignature) {
+      res.push_back(static_cast<FormFieldSignature*>(ff));
     }
+  } else {
+    for (int i = 0; i < ff->getNumChildren(); ++i) {
+      FormField *children = ff->getChildren(i);
+      addSignatureFieldsToVector(children, res);
+    }
+  }
+}
+
+std::vector<FormFieldSignature*> PDFDoc::getSignatureFields()
+{
+//   const int num_pages = getNumPages();
+  std::vector<FormFieldSignature*> res;
+
+  const Form *f = catalog->getForm();
+  const int nRootFields = f->getNumFields();
+  for (int i = 0; i < nRootFields; ++i) {
+    FormField *ff = f->getRootField(i);
+    addSignatureFieldsToVector(ff, res);
   }
-  return widget_vector;
+  return res;
 }
 
 void PDFDoc::displayPage(OutputDev *out, int page,
diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h
index 7ba64b75..ac881a3a 100644
--- a/poppler/PDFDoc.h
+++ b/poppler/PDFDoc.h
@@ -239,7 +239,7 @@ public:
   // Is the file encrypted?
   bool isEncrypted() { return xref->isEncrypted(); }
 
-  std::vector<FormWidgetSignature*> getSignatureWidgets();
+  std::vector<FormFieldSignature*> getSignatureFields();
 
   // Check various permissions.
   bool okToPrint(bool ignoreOwnerPW = false)
diff --git a/poppler/Page.cc b/poppler/Page.cc
index 5140174a..670768ab 100644
--- a/poppler/Page.cc
+++ b/poppler/Page.cc
@@ -362,6 +362,7 @@ void Page::replaceXRef(XRef *xrefA) {
 /* Loads standalone fields into Page, should be called once per page only */
 void Page::loadStandaloneFields(Annots *annotations, Form *form) {
   const int numAnnots = annotations ? annotations->getNumAnnots() : 0;
+
   if (numAnnots < 1)
     return;
 
diff --git a/poppler/SignatureInfo.cc b/poppler/SignatureInfo.cc
index f1ad45e3..c39db409 100644
--- a/poppler/SignatureInfo.cc
+++ b/poppler/SignatureInfo.cc
@@ -67,22 +67,22 @@ SignatureInfo::~SignatureInfo()
 
 /* GETTERS */
 
-SignatureValidationStatus SignatureInfo::getSignatureValStatus()
+SignatureValidationStatus SignatureInfo::getSignatureValStatus() const
 {
   return sig_status;
 }
 
-CertificateValidationStatus SignatureInfo::getCertificateValStatus()
+CertificateValidationStatus SignatureInfo::getCertificateValStatus() const
 {
   return cert_status;
 }
 
-const char *SignatureInfo::getSignerName()
+const char *SignatureInfo::getSignerName() const
 {
   return signer_name;
 }
 
-const char *SignatureInfo::getSubjectDN()
+const char *SignatureInfo::getSubjectDN() const
 {
   return subject_dn;
 }
@@ -97,12 +97,12 @@ const char *SignatureInfo::getReason() const
   return reason;
 }
 
-int SignatureInfo::getHashAlgorithm()
+int SignatureInfo::getHashAlgorithm() const
 {
   return hash_type;
 }
 
-time_t SignatureInfo::getSigningTime()
+time_t SignatureInfo::getSigningTime() const
 {
   return signing_time;
 }
diff --git a/poppler/SignatureInfo.h b/poppler/SignatureInfo.h
index 6de83f62..76a67caa 100644
--- a/poppler/SignatureInfo.h
+++ b/poppler/SignatureInfo.h
@@ -53,15 +53,15 @@ public:
   SignatureInfo& operator=(const SignatureInfo &) = delete;
 
   /* GETTERS */
-  SignatureValidationStatus getSignatureValStatus();
-  CertificateValidationStatus getCertificateValStatus();
-  const char *getSignerName();
-  const char *getSubjectDN();
+  SignatureValidationStatus getSignatureValStatus() const;
+  CertificateValidationStatus getCertificateValStatus() const;
+  const char *getSignerName() const;
+  const char *getSubjectDN() const;
   const char *getLocation() const;
   const char *getReason() const;
-  int getHashAlgorithm(); // Returns a NSS3 HASH_HashType or -1 if compiled without NSS3
-  time_t getSigningTime();
-  bool isSubfilterSupported() { return sig_subfilter_supported; }
+  int getHashAlgorithm() const; // Returns a NSS3 HASH_HashType or -1 if compiled without NSS3
+  time_t getSigningTime() const;
+  bool isSubfilterSupported() const { return sig_subfilter_supported; }
   const X509CertificateInfo *getCertificateInfo() const;
 
   /* SETTERS */
diff --git a/utils/pdfsig.cc b/utils/pdfsig.cc
index 94df5635..2ddfd547 100644
--- a/utils/pdfsig.cc
+++ b/utils/pdfsig.cc
@@ -97,9 +97,9 @@ static char *getReadableTime(time_t unix_time)
   return time_str;
 }
 
-static bool dumpSignature(int sig_num, int sigCount, FormWidgetSignature *sig_widget, const char *filename)
+static bool dumpSignature(int sig_num, int sigCount, FormFieldSignature *s, const char *filename)
 {
-    const GooString *signature = sig_widget->getSignature();
+    const GooString *signature = s->getSignature();
     if (!signature) {
         printf("Cannot dump signature #%d\n", sig_num);
         return false;
@@ -149,19 +149,12 @@ static const ArgDesc argDesc[] = {
 
 int main(int argc, char *argv[])
 {
-  PDFDoc *doc = nullptr;
-  unsigned int sigCount;
-  GooString * fileName = nullptr;
-  SignatureInfo *sig_info = nullptr;
   char *time_str = nullptr;
-  std::vector<FormWidgetSignature*> sig_widgets;
   globalParams = std::make_unique<GlobalParams>();
 
   Win32Console win32Console(&argc, &argv);
-  int exitCode = 99;
-  bool ok;
 
-  ok = parseArgs(argDesc, &argc, argv);
+  const bool ok = parseArgs(argDesc, &argc, argv);
 
   if (!ok || argc != 2 || printVersion || printHelp) {
     fprintf(stderr, "pdfsig version %s\n", PACKAGE_VERSION);
@@ -171,47 +164,44 @@ int main(int argc, char *argv[])
       printUsage("pdfsig", "<PDF-file>", argDesc);
     }
     if (printVersion || printHelp)
-      exitCode = 0;
-    goto end;
+      return 0;
+    return 99;
   }
 
-  fileName = new GooString(argv[argc - 1]);
+  std::unique_ptr<GooString> fileName = std::make_unique<GooString>(argv[argc - 1]);
 
   SignatureHandler::setNSSDir(nssDir);
 
   // open PDF file
-  doc = PDFDocFactory().createPDFDoc(*fileName, nullptr, nullptr);
+  std::unique_ptr<PDFDoc> doc(PDFDocFactory().createPDFDoc(*fileName, nullptr, nullptr));
 
   if (!doc->isOk()) {
-    exitCode = 1;
-    goto end;
+    return 1;
   }
 
-  sig_widgets = doc->getSignatureWidgets();
-  sigCount = sig_widgets.size();
+  const std::vector<FormFieldSignature*> signatures = doc->getSignatureFields();
+  const unsigned int sigCount = signatures.size();
 
   if (sigCount >= 1) {
     if (dumpSignatures) {
-      exitCode = 0;
       printf("Dumping Signatures: %u\n", sigCount);
       for (unsigned int i = 0; i < sigCount; i++) {
-        const bool dumpingOk = dumpSignature(i, sigCount, sig_widgets.at(i), fileName->c_str());
+        const bool dumpingOk = dumpSignature(i, sigCount, signatures.at(i), fileName->c_str());
         if (!dumpingOk) {
-          exitCode = 3;
+	  return 3;
         }
       }
-      goto end;
+      return 0;
     } else {
       printf("Digital Signature Info of: %s\n", fileName->c_str());
     }
   } else {
     printf("File '%s' does not contain any signatures\n", fileName->c_str());
-    exitCode = 2;
-    goto end;
+    return 2;
   }
 
   for (unsigned int i = 0; i < sigCount; i++) {
-    sig_info = sig_widgets.at(i)->validateSignature(!dontVerifyCert, false, -1 /* now */);
+    const SignatureInfo *sig_info = signatures.at(i)->validateSignature(!dontVerifyCert, false, -1 /* now */);
     printf("Signature #%u:\n", i+1);
     printf("  - Signer Certificate Common Name: %s\n", sig_info->getSignerName());
     printf("  - Signer full Distinguished Name: %s\n", sig_info->getSubjectDN());
@@ -244,7 +234,7 @@ int main(int argc, char *argv[])
         printf("unknown\n");
     }
     printf("  - Signature Type: ");
-    switch (sig_widgets.at(i)->signatureType())
+    switch (signatures.at(i)->getSignatureType())
     {
       case adbe_pkcs7_sha1:
         printf("adbe.pkcs7.sha1\n");
@@ -258,13 +248,13 @@ int main(int argc, char *argv[])
       default:
         printf("unknown\n");
     }
-    std::vector<Goffset> ranges = sig_widgets.at(i)->getSignedRangeBounds();
+    std::vector<Goffset> ranges = signatures.at(i)->getSignedRangeBounds();
     if (ranges.size() == 4)
     {
       printf("  - Signed Ranges: [%lld - %lld], [%lld - %lld]\n",
              ranges[0], ranges[1], ranges[2], ranges[3]);
       Goffset checked_file_size;
-      GooString* signature = sig_widgets.at(i)->getCheckedSignature(&checked_file_size);
+      GooString* signature = signatures.at(i)->getCheckedSignature(&checked_file_size);
       if (signature && checked_file_size == ranges[3]) {
         printf("  - Total document signed\n");
       } else {
@@ -280,11 +270,5 @@ int main(int argc, char *argv[])
     printf("  - Certificate Validation: %s\n", getReadableCertState(sig_info->getCertificateValStatus()));
   }
 
-  exitCode = 0;
-
-end:
-  delete fileName;
-  delete doc;
-
-  return exitCode;
+  return 0;
 }


More information about the poppler mailing list