/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace css; namespace { constexpr OUStringLiteral DATA_DIRECTORY = u"/xmlsecurity/qa/unit/signing/data/"; } /// Testsuite for the document signing feature. class SigningTest2 : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools { protected: uno::Reference mxComponent; uno::Reference mxSEInitializer; uno::Reference mxSecurityContext; public: SigningTest2(); virtual void setUp() override; virtual void tearDown() override; void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) override; }; SigningTest2::SigningTest2() {} void SigningTest2::setUp() { test::BootstrapFixture::setUp(); // Initialize crypto after setting up the environment variables. mxDesktop.set(frame::Desktop::create(mxComponentContext)); } void SigningTest2::tearDown() { if (mxComponent.is()) { css::uno::Reference closer(mxComponent, css::uno::UNO_QUERY); if (closer.is()) { closer->close(true); } mxComponent->dispose(); } test::BootstrapFixture::tearDown(); } /// Test if a macro signature from a ODF Database is preserved when saving CPPUNIT_TEST_FIXTURE(SigningTest2, testPreserveMacroSignatureODB) { const OUString aURL(m_directories.getURLFromSrc(DATA_DIRECTORY) + "odb_signed_macros.odb"); // load the file mxComponent = loadFromDesktop(aURL, "com.sun.star.sdb.OfficeDatabaseDocument"); // save as ODB utl::TempFile aTempFileSaveAsODB; aTempFileSaveAsODB.EnableKillingFile(); try { uno::Reference xDocStorable(mxComponent, uno::UNO_QUERY); uno::Sequence descSaveAs(comphelper::InitPropertySequence( { { "FilterName", uno::Any(OUString("StarOffice XML (Base)")) } })); xDocStorable->storeAsURL(aTempFileSaveAsODB.GetURL(), descSaveAs); } catch (...) { CPPUNIT_FAIL("Failed to save ODB file"); } // Parse the resulting XML. uno::Reference xStorage = comphelper::OStorageHelper::GetStorageOfFormatFromURL( ZIP_STORAGE_FORMAT_STRING, aTempFileSaveAsODB.GetURL(), embed::ElementModes::READ); CPPUNIT_ASSERT(xStorage.is()); uno::Reference xMetaInf = xStorage->openStorageElement("META-INF", embed::ElementModes::READ); uno::Reference xInputStream( xMetaInf->openStreamElement("macrosignatures.xml", embed::ElementModes::READ), uno::UNO_QUERY); std::unique_ptr pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true)); xmlDocUniquePtr pXmlDoc = parseXmlStream(pStream.get()); // Make sure the signature is still there assertXPath(pXmlDoc, "//dsig:Signature", "Id", "ID_00a7002f009000bc00ce00f7004400460080002f002e00e400e0003700df00e8"); } void SigningTest2::registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) { xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("odfds"), BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0")); xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("dsig"), BAD_CAST("http://www.w3.org/2000/09/xmldsig#")); xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xd"), BAD_CAST("http://uri.etsi.org/01903/v1.3.2#")); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */