include/vcl/filter/PDFiumLibrary.hxx | 16 +++++++++- vcl/source/pdf/PDFiumLibrary.cxx | 15 ++++++++- xmlsecurity/source/helper/pdfsignaturehelper.cxx | 35 +++++++++++++---------- 3 files changed, 48 insertions(+), 18 deletions(-)
New commits: commit 49efdb7aa23abccf4fa4705c6a207219d50e8600 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Thu Nov 19 21:02:41 2020 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Fri Nov 20 08:35:55 2020 +0100 pdfium: add a signature wrapper class It just hides the underlying FPDF_SIGNATURE, no real member functions yet. Change-Id: I37d27c26d6f05b1f8c697a5afe682c795e5d4d1b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106184 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/include/vcl/filter/PDFiumLibrary.hxx b/include/vcl/filter/PDFiumLibrary.hxx index 2663a6cf03ae..8d139889591a 100644 --- a/include/vcl/filter/PDFiumLibrary.hxx +++ b/include/vcl/filter/PDFiumLibrary.hxx @@ -230,6 +230,20 @@ public: bool hasTransparency(); }; +/// Represents one digital signature, as exposed by PDFium. +class VCL_DLLPUBLIC PDFiumSignature final +{ +private: + FPDF_SIGNATURE mpSignature; + PDFiumSignature(const PDFiumSignature&) = delete; + PDFiumSignature& operator=(const PDFiumSignature&) = delete; + +public: + PDFiumSignature(FPDF_SIGNATURE pSignature); + + FPDF_SIGNATURE getPointer() { return mpSignature; } +}; + class VCL_DLLPUBLIC PDFiumDocument final { private: @@ -251,7 +265,7 @@ public: bool saveWithVersion(SvMemoryStream& rStream, int nFileVersion); std::unique_ptr<PDFiumPage> openPage(int nIndex); - FPDF_SIGNATURE getSignature(int nIndex); + std::unique_ptr<PDFiumSignature> getSignature(int nIndex); std::vector<unsigned int> getTrailerEnds(); }; diff --git a/vcl/source/pdf/PDFiumLibrary.cxx b/vcl/source/pdf/PDFiumLibrary.cxx index 391a93f90ffb..3e9ae64dc950 100644 --- a/vcl/source/pdf/PDFiumLibrary.cxx +++ b/vcl/source/pdf/PDFiumLibrary.cxx @@ -191,6 +191,11 @@ std::unique_ptr<PDFiumBitmap> PDFium::createBitmap(int nWidth, int nHeight, int return pPDFiumBitmap; } +PDFiumSignature::PDFiumSignature(FPDF_SIGNATURE pSignature) + : mpSignature(pSignature) +{ +} + PDFiumDocument::PDFiumDocument(FPDF_DOCUMENT pPdfDocument) : mpPdfDocument(pPdfDocument) { @@ -213,9 +218,15 @@ std::unique_ptr<PDFiumPage> PDFiumDocument::openPage(int nIndex) return pPDFiumPage; } -FPDF_SIGNATURE PDFiumDocument::getSignature(int nIndex) +std::unique_ptr<PDFiumSignature> PDFiumDocument::getSignature(int nIndex) { - return FPDF_GetSignatureObject(mpPdfDocument, nIndex); + std::unique_ptr<PDFiumSignature> pPDFiumSignature; + FPDF_SIGNATURE pSignature = FPDF_GetSignatureObject(mpPdfDocument, nIndex); + if (pSignature) + { + pPDFiumSignature = std::make_unique<PDFiumSignature>(pSignature); + } + return pPDFiumSignature; } std::vector<unsigned int> PDFiumDocument::getTrailerEnds() diff --git a/xmlsecurity/source/helper/pdfsignaturehelper.cxx b/xmlsecurity/source/helper/pdfsignaturehelper.cxx index 6e0f1cfb176b..a9ab7a84546c 100644 --- a/xmlsecurity/source/helper/pdfsignaturehelper.cxx +++ b/xmlsecurity/source/helper/pdfsignaturehelper.cxx @@ -123,16 +123,16 @@ void GetSignatureLineShape(const uno::Reference<frame::XModel>& xModel, sal_Int3 /// Represents a parsed signature. struct Signature { - FPDF_SIGNATURE m_pSignature; + std::unique_ptr<vcl::pdf::PDFiumSignature> m_pSignature; /// Offset+length pairs. std::vector<std::pair<size_t, size_t>> m_aByteRanges; }; /// Turns an array of floats into offset + length pairs. -void GetByteRangesFromPDF(FPDF_SIGNATURE pSignature, +void GetByteRangesFromPDF(std::unique_ptr<vcl::pdf::PDFiumSignature>& pSignature, std::vector<std::pair<size_t, size_t>>& rByteRanges) { - int nByteRangeLen = FPDFSignatureObj_GetByteRange(pSignature, nullptr, 0); + int nByteRangeLen = FPDFSignatureObj_GetByteRange(pSignature->getPointer(), nullptr, 0); if (nByteRangeLen <= 0) { SAL_WARN("xmlsecurity.helper", "GetByteRangesFromPDF: no byte ranges"); @@ -140,7 +140,7 @@ void GetByteRangesFromPDF(FPDF_SIGNATURE pSignature, } std::vector<int> aByteRange(nByteRangeLen); - FPDFSignatureObj_GetByteRange(pSignature, aByteRange.data(), aByteRange.size()); + FPDFSignatureObj_GetByteRange(pSignature->getPointer(), aByteRange.data(), aByteRange.size()); size_t nByteRangeOffset = 0; for (size_t i = 0; i < aByteRange.size(); ++i) @@ -183,7 +183,7 @@ int GetMDPPerm(const std::vector<Signature>& rSignatures) for (const auto& rSignature : rSignatures) { - int nPerm = FPDFSignatureObj_GetDocMDPPermission(rSignature.m_pSignature); + int nPerm = FPDFSignatureObj_GetDocMDPPermission(rSignature.m_pSignature->getPointer()); if (nPerm != 0) { return nPerm; @@ -346,18 +346,21 @@ bool ValidateSignature(SvStream& rStream, const Signature& rSignature, const std::set<unsigned int>& rSignatureEOFs, const std::vector<unsigned int>& rTrailerEnds) { - int nContentsLen = FPDFSignatureObj_GetContents(rSignature.m_pSignature, nullptr, 0); + int nContentsLen + = FPDFSignatureObj_GetContents(rSignature.m_pSignature->getPointer(), nullptr, 0); if (nContentsLen <= 0) { SAL_WARN("xmlsecurity.helper", "ValidateSignature: no contents"); return false; } std::vector<unsigned char> aContents(nContentsLen); - FPDFSignatureObj_GetContents(rSignature.m_pSignature, aContents.data(), aContents.size()); + FPDFSignatureObj_GetContents(rSignature.m_pSignature->getPointer(), aContents.data(), + aContents.size()); - int nSubFilterLen = FPDFSignatureObj_GetSubFilter(rSignature.m_pSignature, nullptr, 0); + int nSubFilterLen + = FPDFSignatureObj_GetSubFilter(rSignature.m_pSignature->getPointer(), nullptr, 0); std::vector<char> aSubFilterBuf(nSubFilterLen); - FPDFSignatureObj_GetSubFilter(rSignature.m_pSignature, aSubFilterBuf.data(), + FPDFSignatureObj_GetSubFilter(rSignature.m_pSignature->getPointer(), aSubFilterBuf.data(), aSubFilterBuf.size()); // Buffer is NUL-terminated. OString aSubFilter(aSubFilterBuf.data(), aSubFilterBuf.size() - 1); @@ -376,22 +379,24 @@ bool ValidateSignature(SvStream& rStream, const Signature& rSignature, } // Reason / comment / description is optional. - int nReasonLen = FPDFSignatureObj_GetReason(rSignature.m_pSignature, nullptr, 0); + int nReasonLen = FPDFSignatureObj_GetReason(rSignature.m_pSignature->getPointer(), nullptr, 0); if (nReasonLen > 0) { std::vector<char16_t> aReasonBuf(nReasonLen); - FPDFSignatureObj_GetReason(rSignature.m_pSignature, aReasonBuf.data(), aReasonBuf.size()); + FPDFSignatureObj_GetReason(rSignature.m_pSignature->getPointer(), aReasonBuf.data(), + aReasonBuf.size()); rInformation.ouDescription = OUString(aReasonBuf.data(), aReasonBuf.size() - 1); } // Date: used only when the time of signing is not available in the // signature. - int nTimeLen = FPDFSignatureObj_GetTime(rSignature.m_pSignature, nullptr, 0); + int nTimeLen = FPDFSignatureObj_GetTime(rSignature.m_pSignature->getPointer(), nullptr, 0); if (nTimeLen > 0) { // Example: "D:20161027100104". std::vector<char> aTimeBuf(nTimeLen); - FPDFSignatureObj_GetTime(rSignature.m_pSignature, aTimeBuf.data(), aTimeBuf.size()); + FPDFSignatureObj_GetTime(rSignature.m_pSignature->getPointer(), aTimeBuf.data(), + aTimeBuf.size()); OString aM(aTimeBuf.data(), aTimeBuf.size() - 1); if (aM.startsWith("D:") && aM.getLength() >= 16) { @@ -480,10 +485,10 @@ bool PDFSignatureHelper::ReadAndVerifySignatureSvStream(SvStream& rStream) std::vector<Signature> aSignatures(nSignatureCount); for (int i = 0; i < nSignatureCount; ++i) { - FPDF_SIGNATURE pSignature = pPdfDocument->getSignature(i); + std::unique_ptr<vcl::pdf::PDFiumSignature> pSignature = pPdfDocument->getSignature(i); std::vector<std::pair<size_t, size_t>> aByteRanges; GetByteRangesFromPDF(pSignature, aByteRanges); - aSignatures[i] = Signature{ pSignature, aByteRanges }; + aSignatures[i] = Signature{ std::move(pSignature), aByteRanges }; } std::set<unsigned int> aSignatureEOFs; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits