package/source/manifest/ManifestExport.cxx | 57 +++++++++++++++++++---------- xmlsecurity/qa/unit/signing/signing.cxx | 17 ++++++++ 2 files changed, 55 insertions(+), 19 deletions(-)
New commits: commit 5eda583443cd0ec323e925395ea734c20fdbcf13 Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Tue Apr 28 13:58:30 2020 +0200 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Fri May 15 17:51:43 2020 +0200 package: OFFICE-3940 ODF 1.3 export of OpenPGP encryption Import was implemented with a7bf6488ebb544e1efaed0a1e53073df9cc2064d but it doesn't correspond to the schema so see previous commit. Change-Id: Ic19db07da20e88d6533509217a70983938e61beb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93088 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> diff --git a/package/source/manifest/ManifestExport.cxx b/package/source/manifest/ManifestExport.cxx index f30b1604f20e..fefb1aa7c1e9 100644 --- a/package/source/manifest/ManifestExport.cxx +++ b/package/source/manifest/ManifestExport.cxx @@ -79,6 +79,15 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > con const OUString sAlgorithmAttribute ( ATTRIBUTE_ALGORITHM ); const OUString sCipherDataElement ( ELEMENT_CIPHERDATA ); const OUString sCipherValueElement ( ELEMENT_CIPHERVALUE ); + const OUString sManifestKeyInfoElement13 ( ELEMENT_MANIFEST13_KEYINFO ); + const OUString sEncryptedKeyElement13 ( ELEMENT_ENCRYPTEDKEY13 ); + const OUString sEncryptionMethodElement13 ( ELEMENT_ENCRYPTIONMETHOD13 ); + const OUString sPgpDataElement13 ( ELEMENT_PGPDATA13 ); + const OUString sPgpKeyIDElement13 ( ELEMENT_PGPKEYID13 ); + const OUString sPGPKeyPacketElement13 ( ELEMENT_PGPKEYPACKET13 ); + const OUString sAlgorithmAttribute13 ( ATTRIBUTE_ALGORITHM13 ); + const OUString sCipherDataElement13 ( ELEMENT_CIPHERDATA13 ); + const OUString sCipherValueElement13 ( ELEMENT_CIPHERVALUE13 ); const OUString sKeyInfo ( "KeyInfo" ); const OUString sPgpKeyIDProperty ( "KeyId" ); const OUString sPgpKeyPacketProperty ( "KeyPacket" ); @@ -232,7 +241,11 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > con xHandler->ignorableWhitespace ( sWhiteSpace ); // ==== manifest:keyinfo & children - xHandler->startElement( sManifestKeyInfoElement, nullptr ); + bool const isODF13(aDocVersion.compareTo(ODFVER_013_TEXT) >= 0); + if (!isODF13) + { + xHandler->startElement(sManifestKeyInfoElement, nullptr); + } xHandler->ignorableWhitespace ( sWhiteSpace ); uno::Sequence< uno::Sequence < beans::NamedValue > > aKeyInfoSequence; @@ -255,64 +268,70 @@ ManifestExport::ManifestExport( uno::Reference< xml::sax::XDocumentHandler > con if (aPgpKeyID.hasElements() && aCipherValue.hasElements() ) { // ==== manifest:encrypted-key & children - one for each recipient - xHandler->startElement( sEncryptedKeyElement, nullptr ); + xHandler->startElement(isODF13 ? sEncryptedKeyElement13 : sEncryptedKeyElement, nullptr); xHandler->ignorableWhitespace ( sWhiteSpace ); ::comphelper::AttributeList * pNewAttrList = new ::comphelper::AttributeList; uno::Reference < xml::sax::XAttributeList > xNewAttrList (pNewAttrList); // TODO: the algorithm should rather be configurable - pNewAttrList->AddAttribute ( sAlgorithmAttribute, sCdataAttribute, + pNewAttrList->AddAttribute( + isODF13 ? sAlgorithmAttribute13 : sAlgorithmAttribute, + sCdataAttribute, "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" ); - xHandler->startElement( sEncryptionMethodElement, xNewAttrList ); - xHandler->endElement( sEncryptionMethodElement ); + xHandler->startElement(isODF13 ? sEncryptionMethodElement13 : sEncryptionMethodElement, xNewAttrList); + xHandler->endElement(isODF13 ? sEncryptionMethodElement13 : sEncryptionMethodElement); xHandler->ignorableWhitespace ( sWhiteSpace ); - xHandler->startElement( sKeyInfoElement, nullptr ); + // note: the mismatch here corresponds to ODF 1.3 cs01 schema + xHandler->startElement(isODF13 ? sManifestKeyInfoElement13 : sKeyInfoElement, nullptr); xHandler->ignorableWhitespace ( sWhiteSpace ); - xHandler->startElement( sPgpDataElement, nullptr ); + xHandler->startElement(isODF13 ? sPgpDataElement13 : sPgpDataElement, nullptr); xHandler->ignorableWhitespace ( sWhiteSpace ); - xHandler->startElement( sPgpKeyIDElement, nullptr ); + xHandler->startElement(isODF13 ? sPgpKeyIDElement13 : sPgpKeyIDElement, nullptr); ::comphelper::Base64::encode(aBuffer, aPgpKeyID); xHandler->characters( aBuffer.makeStringAndClear() ); - xHandler->endElement( sPgpKeyIDElement ); + xHandler->endElement(isODF13 ? sPgpKeyIDElement13 : sPgpKeyIDElement); xHandler->ignorableWhitespace ( sWhiteSpace ); // key packet is optional if (aPgpKeyPacket.hasElements()) { - xHandler->startElement( sPGPKeyPacketElement, nullptr ); + xHandler->startElement(isODF13 ? sPGPKeyPacketElement13 : sPGPKeyPacketElement, nullptr); ::comphelper::Base64::encode(aBuffer, aPgpKeyPacket); xHandler->characters( aBuffer.makeStringAndClear() ); - xHandler->endElement( sPGPKeyPacketElement ); + xHandler->endElement(isODF13 ? sPGPKeyPacketElement13 : sPGPKeyPacketElement); xHandler->ignorableWhitespace ( sWhiteSpace ); } - xHandler->endElement( sPgpDataElement ); + xHandler->endElement(isODF13 ? sPgpDataElement13 : sPgpDataElement); xHandler->ignorableWhitespace ( sWhiteSpace ); - xHandler->endElement( sKeyInfoElement ); + xHandler->endElement(isODF13 ? sManifestKeyInfoElement13 : sKeyInfoElement); xHandler->ignorableWhitespace ( sWhiteSpace ); - xHandler->startElement( sCipherDataElement, nullptr ); + xHandler->startElement(isODF13 ? sCipherDataElement13 : sCipherDataElement, nullptr); xHandler->ignorableWhitespace ( sWhiteSpace ); - xHandler->startElement( sCipherValueElement, nullptr ); + xHandler->startElement(isODF13 ? sCipherValueElement13 : sCipherValueElement, nullptr); ::comphelper::Base64::encode(aBuffer, aCipherValue); xHandler->characters( aBuffer.makeStringAndClear() ); - xHandler->endElement( sCipherValueElement ); + xHandler->endElement(isODF13 ? sCipherValueElement13 : sCipherValueElement); xHandler->ignorableWhitespace ( sWhiteSpace ); - xHandler->endElement( sCipherDataElement ); + xHandler->endElement(isODF13 ? sCipherDataElement13 : sCipherDataElement); xHandler->ignorableWhitespace ( sWhiteSpace ); - xHandler->endElement( sEncryptedKeyElement ); + xHandler->endElement(isODF13 ? sEncryptedKeyElement13 : sEncryptedKeyElement); xHandler->ignorableWhitespace ( sWhiteSpace ); } } - xHandler->endElement( sManifestKeyInfoElement ); + if (!isODF13) + { + xHandler->endElement(sManifestKeyInfoElement); + } xHandler->ignorableWhitespace ( sWhiteSpace ); } } diff --git a/xmlsecurity/qa/unit/signing/signing.cxx b/xmlsecurity/qa/unit/signing/signing.cxx index eaecd6b7a9e5..4720ee340f7e 100644 --- a/xmlsecurity/qa/unit/signing/signing.cxx +++ b/xmlsecurity/qa/unit/signing/signing.cxx @@ -959,6 +959,23 @@ CPPUNIT_TEST_FIXTURE(SigningTest, testODFEncryptedGPG) CPPUNIT_ASSERT(pBaseModel); pObjectShell = pBaseModel->GetObjectShell(); CPPUNIT_ASSERT(pObjectShell); + + // export and import again + utl::TempFile aTempFile; + { + uno::Sequence<beans::PropertyValue> props( + comphelper::InitPropertySequence({ { "FilterName", uno::Any(OUString("writer8")) } })); + uno::Reference<frame::XStorable> xDocStorable(mxComponent, uno::UNO_QUERY); + xDocStorable->storeToURL(aTempFile.GetURL(), props); + } + + createDoc(aTempFile.GetURL()); + pBaseModel = dynamic_cast<SfxBaseModel*>(mxComponent.get()); + CPPUNIT_ASSERT(pBaseModel); + pObjectShell = pBaseModel->GetObjectShell(); + CPPUNIT_ASSERT(pObjectShell); + + aTempFile.EnableKillingFile(); } #endif _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits