diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-11-09 16:32:48 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-11-09 19:21:59 +0000 |
commit | f68b1541ea2f26a1137d4d20ceb23d036d0a00b7 (patch) | |
tree | 17d63b485284fb27403a31cf9a709412a53d6826 /xmlsecurity | |
parent | xmlsecurity PDF sign: conditionally write xref stream (diff) | |
download | core-f68b1541ea2f26a1137d4d20ceb23d036d0a00b7.tar.gz core-f68b1541ea2f26a1137d4d20ceb23d036d0a00b7.zip |
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@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'xmlsecurity')
-rw-r--r-- | xmlsecurity/inc/pdfio/pdfdocument.hxx | 2 | ||||
-rw-r--r-- | xmlsecurity/source/pdfio/pdfdocument.cxx | 23 |
2 files changed, 23 insertions, 2 deletions
diff --git a/xmlsecurity/inc/pdfio/pdfdocument.hxx b/xmlsecurity/inc/pdfio/pdfdocument.hxx index d90fdf50245b..79ef60b2e8c0 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 8bd942f8dc27..fa0d9cc99a4a 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"); |