[Libreoffice-commits] core.git: xmlsecurity/inc xmlsecurity/source

Miklos Vajna vmiklos at collabora.co.uk
Wed Nov 9 19:22:24 UTC 2016


 xmlsecurity/inc/pdfio/pdfdocument.hxx    |    2 ++
 xmlsecurity/source/pdfio/pdfdocument.cxx |   23 +++++++++++++++++++++--
 2 files changed, 23 insertions(+), 2 deletions(-)

New commits:
commit f68b1541ea2f26a1137d4d20ceb23d036d0a00b7
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Nov 9 16:32:48 2016 +0100

    xmlsecurity PDF sign: improve suggested signature ID
    
    So that when we have a single signature with ID="Signature2", then we
    use "Signature3" for the next ID, not "Signature2". (Acrobat uses that ID
    for the first signature.)
    
    Change-Id: I7032fbf014184da2a5be24730a92abc32a9a1258
    Reviewed-on: https://gerrit.libreoffice.org/30725
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/xmlsecurity/inc/pdfio/pdfdocument.hxx b/xmlsecurity/inc/pdfio/pdfdocument.hxx
index d90fdf5..79ef60b 100644
--- a/xmlsecurity/inc/pdfio/pdfdocument.hxx
+++ b/xmlsecurity/inc/pdfio/pdfdocument.hxx
@@ -113,6 +113,8 @@ class XMLSECURITY_DLLPUBLIC PDFDocument
     static int AsHex(char ch);
     /// Decode a hex dump.
     static std::vector<unsigned char> DecodeHexString(PDFHexStringElement* pElement);
+    /// Suggest a minimal, yet free signature ID to use for the next signature.
+    sal_uInt32 GetNextSignature();
 
 public:
     PDFDocument();
diff --git a/xmlsecurity/source/pdfio/pdfdocument.cxx b/xmlsecurity/source/pdfio/pdfdocument.cxx
index 8bd942f..fa0d9cc 100644
--- a/xmlsecurity/source/pdfio/pdfdocument.cxx
+++ b/xmlsecurity/source/pdfio/pdfdocument.cxx
@@ -335,11 +335,30 @@ bool PDFDocument::RemoveSignature(size_t nPosition)
     return m_aEditBuffer.good();
 }
 
+sal_uInt32 PDFDocument::GetNextSignature()
+{
+    sal_uInt32 nRet = 0;
+    for (const auto& pSignature : GetSignatureWidgets())
+    {
+        auto pT = dynamic_cast<PDFLiteralStringElement*>(pSignature->Lookup("T"));
+        if (!pT)
+            continue;
+
+        const OString& rValue = pT->GetValue();
+        const OString aPrefix = "Signature";
+        if (!rValue.startsWith(aPrefix))
+            continue;
+
+        nRet = std::max(nRet, rValue.copy(aPrefix.getLength()).toUInt32());
+    }
+
+    return nRet + 1;
+}
+
 bool PDFDocument::Sign(const uno::Reference<security::XCertificate>& xCertificate, const OUString& rDescription)
 {
     // Decide what identifier to use for the new signature.
-    std::vector<PDFObjectElement*> aSignatures = GetSignatureWidgets();
-    sal_uInt32 nNextSignature = aSignatures.size() + 1;
+    sal_uInt32 nNextSignature = GetNextSignature();
 
     m_aEditBuffer.Seek(STREAM_SEEK_TO_END);
     m_aEditBuffer.WriteCharPtr("\n");


More information about the Libreoffice-commits mailing list