summaryrefslogtreecommitdiff
path: root/xmlsecurity
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2020-06-19 17:21:58 +0200
committerMiklos Vajna <vmiklos@collabora.com>2020-06-29 09:10:30 +0200
commit5b7b7731a2d1941d39cd10c0b12dab427d2cea07 (patch)
treef2318406211c11304d77d2a63b3dca03f022c9cb /xmlsecurity
parente9ee1289b2307af3d0a6023f5c0fa01c92f3b26f (diff)
sd signature line: add testcase
Fails with commit 9b7a890fd59744459692d7f66402c6bdd25acec4 (sd signature line: include shape in the appearance widget, 2020-06-19) reverted. (cherry picked from commit fb8f0ef26d57986bd27c6c5088939c32453e6b06) Change-Id: Ib237774374553af5d37c9deaffdea6fae65a28f4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97252 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'xmlsecurity')
-rw-r--r--xmlsecurity/CppunitTest_xmlsecurity_signing.mk3
-rw-r--r--xmlsecurity/qa/unit/signing/data/add-visible-signature.pdfbin0 -> 2235 bytes
-rw-r--r--xmlsecurity/qa/unit/signing/signing.cxx76
3 files changed, 79 insertions, 0 deletions
diff --git a/xmlsecurity/CppunitTest_xmlsecurity_signing.mk b/xmlsecurity/CppunitTest_xmlsecurity_signing.mk
index 84e7a76c043b..3554b3eaa468 100644
--- a/xmlsecurity/CppunitTest_xmlsecurity_signing.mk
+++ b/xmlsecurity/CppunitTest_xmlsecurity_signing.mk
@@ -22,16 +22,19 @@ $(eval $(call gb_CppunitTest_use_libraries,xmlsecurity_signing, \
sal \
sax \
sfx \
+ svx \
test \
tl \
unotest \
utl \
+ vcl \
xmlsecurity \
))
$(eval $(call gb_CppunitTest_use_externals,xmlsecurity_signing,\
boost_headers \
libxml2 \
+ $(if $(filter PDFIUM,$(BUILD_TYPE)),pdfium) \
))
$(eval $(call gb_CppunitTest_set_include,xmlsecurity_signing,\
diff --git a/xmlsecurity/qa/unit/signing/data/add-visible-signature.pdf b/xmlsecurity/qa/unit/signing/data/add-visible-signature.pdf
new file mode 100644
index 000000000000..8dedb6998b23
--- /dev/null
+++ b/xmlsecurity/qa/unit/signing/data/add-visible-signature.pdf
Binary files differ
diff --git a/xmlsecurity/qa/unit/signing/signing.cxx b/xmlsecurity/qa/unit/signing/signing.cxx
index f2039b609e7e..04eb91e8822b 100644
--- a/xmlsecurity/qa/unit/signing/signing.cxx
+++ b/xmlsecurity/qa/unit/signing/signing.cxx
@@ -27,6 +27,8 @@
#include <com/sun/star/security/DocumentDigitalSignatures.hpp>
#include <com/sun/star/security/XDocumentDigitalSignatures.hpp>
#include <com/sun/star/xml/crypto/SEInitializer.hpp>
+#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/view/XSelectionSupplier.hpp>
#include <comphelper/processfactory.hxx>
#include <comphelper/propertysequence.hxx>
@@ -51,6 +53,16 @@
#include <sfx2/docfilt.hxx>
#include <officecfg/Office/Common.hxx>
#include <comphelper/configuration.hxx>
+#include <svx/signaturelinehelper.hxx>
+#include <sfx2/viewsh.hxx>
+#include <comphelper/propertyvalue.hxx>
+#include <vcl/filter/PDFiumLibrary.hxx>
+
+#if HAVE_FEATURE_PDFIUM
+#include <fpdf_annot.h>
+#include <fpdfview.h>
+#include <cpp/fpdf_scopers.h>
+#endif
using namespace com::sun::star;
@@ -629,6 +641,70 @@ CPPUNIT_TEST_FIXTURE(SigningTest, testPDFNo)
static_cast<int>(pObjectShell->GetDocumentSignatureState()));
}
+#if HAVE_FEATURE_PDFIUM
+CPPUNIT_TEST_FIXTURE(SigningTest, testPDFAddVisibleSignature)
+{
+ // Given: copy the test document to a temporary file, as it'll be modified.
+ utl::TempFile aTempFile;
+ aTempFile.EnableKillingFile();
+ OUString aSourceURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "add-visible-signature.pdf";
+ OUString aURL = aTempFile.GetURL();
+ osl::File::RC eRet = osl::File::copy(aSourceURL, aURL);
+ CPPUNIT_ASSERT_EQUAL(osl::File::RC::E_None, eRet);
+
+ // Open it.
+ uno::Sequence<beans::PropertyValue> aArgs = { comphelper::makePropertyValue("ReadOnly", true) };
+ mxComponent = loadFromDesktop(aURL, "com.sun.star.drawing.DrawingDocument", aArgs);
+ SfxBaseModel* pBaseModel = dynamic_cast<SfxBaseModel*>(mxComponent.get());
+ CPPUNIT_ASSERT(pBaseModel);
+ SfxObjectShell* pObjectShell = pBaseModel->GetObjectShell();
+ CPPUNIT_ASSERT(pObjectShell);
+
+ // Add a signature line.
+ uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XShape> xShape(
+ xFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), uno::UNO_QUERY);
+ xShape->setPosition(awt::Point(1000, 15000));
+ xShape->setSize(awt::Size(10000, 10000));
+ uno::Reference<drawing::XDrawPagesSupplier> xSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPages> xDrawPages = xSupplier->getDrawPages();
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY);
+ xDrawPage->add(xShape);
+
+ // Select it and assign a certificate.
+ uno::Reference<view::XSelectionSupplier> xSelectionSupplier(pBaseModel->getCurrentController(),
+ uno::UNO_QUERY);
+ xSelectionSupplier->select(uno::makeAny(xShape));
+ uno::Sequence<uno::Reference<security::XCertificate>> aCertificates
+ = mxSecurityContext->getSecurityEnvironment()->getPersonalCertificates();
+ if (!aCertificates.hasElements())
+ {
+ return;
+ }
+ SdrView* pView = SfxViewShell::Current()->GetDrawView();
+ svx::SignatureLineHelper::setShapeCertificate(pView, aCertificates[0]);
+
+ // When: do the actual signing.
+ pObjectShell->SignDocumentContentUsingCertificate(aCertificates[0]);
+
+ // Then: count the # of shapes on the signature widget/annotation.
+ std::shared_ptr<vcl::pdf::PDFium> pPDFium = vcl::pdf::PDFiumLibrary::get();
+ SvFileStream aFile(aTempFile.GetURL(), StreamMode::READ);
+ SvMemoryStream aMemory;
+ aMemory.WriteStream(aFile);
+ ScopedFPDFDocument pPdfDocument(
+ FPDF_LoadMemDocument(aMemory.GetData(), aMemory.GetSize(), /*password=*/nullptr));
+ ScopedFPDFPage pPdfPage(FPDF_LoadPage(pPdfDocument.get(), /*page_index=*/0));
+ CPPUNIT_ASSERT_EQUAL(1, FPDFPage_GetAnnotCount(pPdfPage.get()));
+ ScopedFPDFAnnotation pAnnot(FPDFPage_GetAnnot(pPdfPage.get(), 0));
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 4
+ // - Actual : 0
+ // i.e. the signature was there, but it was empty / not visible.
+ CPPUNIT_ASSERT_EQUAL(4, FPDFAnnot_GetObjectCount(pAnnot.get()));
+}
+#endif
+
#endif
CPPUNIT_TEST_FIXTURE(SigningTest, test96097Calc)