filter/qa/pdf.cxx | 16 ++++++++-------- include/unotest/macros_test.hxx | 3 ++- unotest/source/cpp/macros_test.cxx | 35 +++++++++++++++++++++++++++++++---- 3 files changed, 41 insertions(+), 13 deletions(-)
New commits: commit 8fc338f2afb9abb75f9b7c0a2d442f7d4f1b2a40 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri Jul 29 12:32:36 2022 +0300 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Fri Jul 29 13:28:13 2022 +0200 Better valid certificate check, consider filter data Otherwise, testSignCertificateSubjectName that has an explicit certificate subject name requirement would fail when user has other valid certificates, but not this one. Change-Id: Ic3c440a8316314c922a53a51085a3e829f235f6d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137593 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/filter/qa/pdf.cxx b/filter/qa/pdf.cxx index 04bd4170c17e..7cb713fefce1 100644 --- a/filter/qa/pdf.cxx +++ b/filter/qa/pdf.cxx @@ -65,7 +65,14 @@ CPPUNIT_TEST_FIXTURE(Test, testSignCertificateSubjectName) = xSEInitializer->createSecurityContext(OUString()); uno::Reference<xml::crypto::XSecurityEnvironment> xSecurityEnvironment = xSecurityContext->getSecurityEnvironment(); - if (!GetValidCertificate(xSecurityEnvironment->getPersonalCertificates())) + uno::Sequence<beans::PropertyValue> aFilterData{ + comphelper::makePropertyValue("SignPDF", true), + comphelper::makePropertyValue( + "SignCertificateSubjectName", + OUString( + "CN=Xmlsecurity RSA Test example Alice,O=Xmlsecurity RSA Test,ST=England,C=UK")), + }; + if (!GetValidCertificate(xSecurityEnvironment->getPersonalCertificates(), aFilterData)) { return; } @@ -83,13 +90,6 @@ CPPUNIT_TEST_FIXTURE(Test, testSignCertificateSubjectName) SvMemoryStream aStream; uno::Reference<io::XOutputStream> xOutputStream(new utl::OStreamWrapper(aStream)); - uno::Sequence<beans::PropertyValue> aFilterData{ - comphelper::makePropertyValue("SignPDF", true), - comphelper::makePropertyValue( - "SignCertificateSubjectName", - OUString( - "CN=Xmlsecurity RSA Test example Alice,O=Xmlsecurity RSA Test,ST=England,C=UK")), - }; uno::Sequence<beans::PropertyValue> aDescriptor{ comphelper::makePropertyValue("FilterName", OUString("writer_pdf_Export")), comphelper::makePropertyValue("FilterData", aFilterData), diff --git a/include/unotest/macros_test.hxx b/include/unotest/macros_test.hxx index 6a476cf0ec40..dc5ca20dd23d 100644 --- a/include/unotest/macros_test.hxx +++ b/include/unotest/macros_test.hxx @@ -95,7 +95,8 @@ public: static bool IsValid(const css::uno::Reference<css::security::XCertificate>& cert); static css::uno::Reference<css::security::XCertificate> GetValidCertificate( - const css::uno::Sequence<css::uno::Reference<css::security::XCertificate>>& certs); + const css::uno::Sequence<css::uno::Reference<css::security::XCertificate>>& certs, + const css::uno::Sequence<css::beans::PropertyValue>& rFilterData = {}); protected: css::uno::Reference<css::frame::XDesktop2> mxDesktop; diff --git a/unotest/source/cpp/macros_test.cxx b/unotest/source/cpp/macros_test.cxx index 6e8a26cceeb4..76105b88b1a7 100644 --- a/unotest/source/cpp/macros_test.cxx +++ b/unotest/source/cpp/macros_test.cxx @@ -173,16 +173,43 @@ void MacrosTest::tearDownNssGpg() #endif } +namespace +{ +struct Valid +{ + DateTime now; + OUString subjectName; + Valid(const css::uno::Sequence<css::beans::PropertyValue>& rFilterData) + : now(DateTime::SYSTEM) + { + for (const auto& propVal : rFilterData) + { + if (propVal.Name == "SignCertificateSubjectName") + propVal.Value >>= subjectName; + } + } + bool operator()(const css::uno::Reference<css::security::XCertificate>& cert) const + { + if (!now.IsBetween(cert->getNotValidBefore(), cert->getNotValidAfter())) + return false; + if (!subjectName.isEmpty() && subjectName != cert->getSubjectName()) + return false; + return true; + } +}; +} + bool MacrosTest::IsValid(const css::uno::Reference<css::security::XCertificate>& cert) { - return DateTime(DateTime::SYSTEM) - .IsBetween(cert->getNotValidBefore(), cert->getNotValidAfter()); + const Valid test({}); + return test(cert); } css::uno::Reference<css::security::XCertificate> MacrosTest::GetValidCertificate( - const css::uno::Sequence<css::uno::Reference<css::security::XCertificate>>& certs) + const css::uno::Sequence<css::uno::Reference<css::security::XCertificate>>& certs, + const css::uno::Sequence<css::beans::PropertyValue>& rFilterData) { - if (auto it = std::find_if(certs.begin(), certs.end(), IsValid); it != certs.end()) + if (auto it = std::find_if(certs.begin(), certs.end(), Valid(rFilterData)); it != certs.end()) return *it; return {}; }