[Libreoffice-commits] core.git: sfx2/source xmlsecurity/source

Miklos Vajna vmiklos at collabora.co.uk
Thu Feb 4 17:31:34 UTC 2016


 sfx2/source/doc/docfile.cxx                            |   55 ++++++++++++-----
 xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx |    2 
 2 files changed, 40 insertions(+), 17 deletions(-)

New commits:
commit 8865a3b092a4b34530d8ca67286aa3765181d235
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Feb 4 18:13:18 2016 +0100

    sfx2: avoid writing META-INF/ when signing OOXML files
    
    Instead just pass an empty stream, xmlsecurity knows how to look up its
    signature storage from the root one.
    
    With this, opening the digital signatures dialog, clicking on add, and
    then OK in both dialogs no longer results in an (empty) META-INF storage
    written to an OOXML file.
    
    Change-Id: I7e4a93687465ec19be307917ec00cde08ed8092f

diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx
index bb44a1c..af4224a 100644
--- a/sfx2/source/doc/docfile.cxx
+++ b/sfx2/source/doc/docfile.cxx
@@ -3545,11 +3545,16 @@ bool SfxMedium::SignContents_Impl( bool bScriptingContent, const OUString& aODFV
                 if ( !xWriteableZipStor.is() )
                     throw uno::RuntimeException();
 
-                uno::Reference< embed::XStorage > xMetaInf = xWriteableZipStor->openStorageElement(
-                                                "META-INF",
-                                                embed::ElementModes::READWRITE );
-                if ( !xMetaInf.is() )
-                    throw uno::RuntimeException();
+                uno::Reference< embed::XStorage > xMetaInf;
+                uno::Reference<container::XNameAccess> xNameAccess(xWriteableZipStor, uno::UNO_QUERY);
+                if (xNameAccess.is() && xNameAccess->hasByName("META-INF"))
+                {
+                    xMetaInf = xWriteableZipStor->openStorageElement(
+                                                    "META-INF",
+                                                    embed::ElementModes::READWRITE );
+                    if ( !xMetaInf.is() )
+                        throw uno::RuntimeException();
+                }
 
                 if ( bScriptingContent )
                 {
@@ -3579,20 +3584,38 @@ bool SfxMedium::SignContents_Impl( bool bScriptingContent, const OUString& aODFV
                 }
                 else
                 {
-                     uno::Reference< io::XStream > xStream;
-                     if (GetFilter() && GetFilter()->IsOwnFormat())
-                         xStream.set(xMetaInf->openStreamElement(xSigner->getDocumentContentSignatureDefaultStreamName(), embed::ElementModes::READWRITE), uno::UNO_SET_THROW);
+                    if (xMetaInf.is())
+                    {
+                        // ODF.
+                        uno::Reference< io::XStream > xStream;
+                        if (GetFilter() && GetFilter()->IsOwnFormat())
+                            xStream.set(xMetaInf->openStreamElement(xSigner->getDocumentContentSignatureDefaultStreamName(), embed::ElementModes::READWRITE), uno::UNO_SET_THROW);
 
-                    if ( xSigner->signDocumentContent( GetZipStorageToSign_Impl(), xStream ) )
+                        if ( xSigner->signDocumentContent( GetZipStorageToSign_Impl(), xStream ) )
+                        {
+                            uno::Reference< embed::XTransactedObject > xTransact( xMetaInf, uno::UNO_QUERY_THROW );
+                            xTransact->commit();
+                            xTransact.set( xWriteableZipStor, uno::UNO_QUERY_THROW );
+                            xTransact->commit();
+
+                            // the temporary file has been written, commit it to the original file
+                            Commit();
+                            bChanges = true;
+                        }
+                    }
+                    else
                     {
-                        uno::Reference< embed::XTransactedObject > xTransact( xMetaInf, uno::UNO_QUERY_THROW );
-                        xTransact->commit();
-                        xTransact.set( xWriteableZipStor, uno::UNO_QUERY_THROW );
-                        xTransact->commit();
+                        // OOXML.
+                        uno::Reference<io::XStream> xStream;
+                        if (xSigner->signDocumentContent(GetZipStorageToSign_Impl(), xStream))
+                        {
+                            uno::Reference<embed::XTransactedObject> xTransact(xWriteableZipStor, uno::UNO_QUERY_THROW);
+                            xTransact->commit();
 
-                        // the temporary file has been written, commit it to the original file
-                        Commit();
-                        bChanges = true;
+                            // the temporary file has been written, commit it to the original file
+                            Commit();
+                            bChanges = true;
+                        }
                     }
                 }
             }
diff --git a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
index 6601bbe..a5effe9 100644
--- a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
+++ b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
@@ -395,7 +395,7 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, OKButtonHdl, Button*, void)
     SignatureStreamHelper aStreamHelper = ImplOpenSignatureStream(
         embed::ElementModes::WRITE|embed::ElementModes::TRUNCATE, false );
 
-    if (aStreamHelper.xSignatureStream.is())
+    if (aStreamHelper.xSignatureStream.is() && aStreamHelper.nStorageFormat != embed::StorageFormats::OFOPXML)
     {
         // ODF
         uno::Reference< io::XOutputStream > xOutputStream(


More information about the Libreoffice-commits mailing list