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

Miklos Vajna vmiklos at collabora.co.uk
Fri Feb 5 15:25:50 UTC 2016


 xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx     |    4 +
 xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx |    8 ++-
 xmlsecurity/source/helper/xmlsignaturehelper.cxx       |   43 ++++++++++++++++-
 3 files changed, 50 insertions(+), 5 deletions(-)

New commits:
commit b79ab2835681e0e44f8a41d8f442ca6601b87191
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri Feb 5 16:09:44 2016 +0100

    xmlsecurity: write initial OOXML signature streams
    
    It's just the root element so far.
    
    Change-Id: If32e9e5bf339f639a20fa88d85e826e14f65dac2

diff --git a/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx b/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx
index a7947ed..031c4b0 100644
--- a/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx
+++ b/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx
@@ -186,6 +186,8 @@ public:
     void EnsureSignaturesRelation(css::uno::Reference<css::embed::XStorage> xStorage);
     /// Given that xStorage is an OOXML _xmlsignatures storage, create origin.sigs and its relations.
     void ExportSignatureRelations(css::uno::Reference<css::embed::XStorage> xStorage, int nSignatureCount);
+    /// Given that xStorage is an OOXML _xmlsignatures storage, create and write a new signature.
+    bool CreateAndWriteOOXMLSignature(css::uno::Reference<css::embed::XStorage> xStorage, int nSignatureIndex);
 };
 
 #endif // INCLUDED_XMLSECURITY_INC_XMLSECURITY_XMLSIGNATUREHELPER_HXX
diff --git a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
index fa3f377..58fb01f 100644
--- a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
+++ b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
@@ -522,6 +522,9 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, AddButtonHdl, Button*, void)
                 int nSignatureCount = maCurrentSignatureInformations.size() + 1;
                 maSignatureHelper.ExportSignatureRelations(aStreamHelper.xSignatureStorage, nSignatureCount);
 
+                // Create a new signature.
+                maSignatureHelper.CreateAndWriteOOXMLSignature(aStreamHelper.xSignatureStorage, nSignatureCount);
+
                 // Flush objects.
                 uno::Reference<embed::XTransactedObject> xTransact(aStreamHelper.xSignatureStorage, uno::UNO_QUERY);
                 xTransact->commit();
diff --git a/xmlsecurity/source/helper/xmlsignaturehelper.cxx b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
index 43afcdc..bea6ed7 100644
--- a/xmlsecurity/source/helper/xmlsignaturehelper.cxx
+++ b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
@@ -492,4 +492,25 @@ void XMLSignatureHelper::ExportSignatureRelations(css::uno::Reference<css::embed
     xTransact->commit();
 }
 
+bool XMLSignatureHelper::CreateAndWriteOOXMLSignature(css::uno::Reference<css::embed::XStorage> xStorage, int nSignatureIndex)
+{
+    sal_Int32 nOpenMode = embed::ElementModes::READWRITE;
+    uno::Reference<io::XOutputStream> xOutputStream(xStorage->openStreamElement("sig" + OUString::number(nSignatureIndex) + ".xml", nOpenMode), uno::UNO_QUERY);
+    uno::Reference<xml::sax::XWriter> xSaxWriter = xml::sax::Writer::create(mxCtx);
+    xSaxWriter->setOutputStream(xOutputStream);
+    xSaxWriter->startDocument();
+
+    SvXMLAttributeList* pAttributeList = new SvXMLAttributeList();
+    pAttributeList->AddAttribute(ATTR_XMLNS, NS_XMLDSIG);
+    pAttributeList->AddAttribute(ATTR_ID, "idPackageSignature");
+    xSaxWriter->startElement(TAG_SIGNATURE, uno::Reference<xml::sax::XAttributeList>(pAttributeList));
+
+    mbError = false;
+
+    xSaxWriter->endElement(TAG_SIGNATURE);
+    xSaxWriter->endDocument();
+
+    return !mbError;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit f26019532bb03ea1a3d276be90adbecca6759a77
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri Feb 5 15:21:02 2016 +0100

    xmlsecurity: write OOXML signature relations on export
    
    _rels/origin.sigs.rels of the _xmlsignatures temporary storage now
    contains references to the individual signature streams.
    
    Change-Id: I619bd81989e3b62fc4282e0e72fbfa780d1fb8bd

diff --git a/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx b/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx
index 4cb3002..a7947ed 100644
--- a/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx
+++ b/xmlsecurity/inc/xmlsecurity/xmlsignaturehelper.hxx
@@ -185,7 +185,7 @@ public:
     /// Adds an OOXML digital signature relation to _rels/.rels if there wasn't any before.
     void EnsureSignaturesRelation(css::uno::Reference<css::embed::XStorage> xStorage);
     /// Given that xStorage is an OOXML _xmlsignatures storage, create origin.sigs and its relations.
-    static void ExportSignatureRelations(css::uno::Reference<css::embed::XStorage> xStorage, int nSignatureCount);
+    void ExportSignatureRelations(css::uno::Reference<css::embed::XStorage> xStorage, int nSignatureCount);
 };
 
 #endif // INCLUDED_XMLSECURITY_INC_XMLSECURITY_XMLSIGNATUREHELPER_HXX
diff --git a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
index 6f39501..fa3f377 100644
--- a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
+++ b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
@@ -515,11 +515,12 @@ IMPL_LINK_NOARG_TYPED(DigitalSignaturesDialog, AddButtonHdl, Button*, void)
             else
             {
                 // OOXML
-                maSignatureHelper.EnsureSignaturesRelation(mxStore);
 
+                // Handle relations.
+                maSignatureHelper.EnsureSignaturesRelation(mxStore);
                 // Old signatures + the new one.
                 int nSignatureCount = maCurrentSignatureInformations.size() + 1;
-                XMLSignatureHelper::ExportSignatureRelations(aStreamHelper.xSignatureStorage, nSignatureCount);
+                maSignatureHelper.ExportSignatureRelations(aStreamHelper.xSignatureStorage, nSignatureCount);
 
                 // Flush objects.
                 uno::Reference<embed::XTransactedObject> xTransact(aStreamHelper.xSignatureStorage, uno::UNO_QUERY);
diff --git a/xmlsecurity/source/helper/xmlsignaturehelper.cxx b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
index cfd0c62..43afcdc 100644
--- a/xmlsecurity/source/helper/xmlsignaturehelper.cxx
+++ b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
@@ -54,6 +54,7 @@
 #define NS_DOCUMENTSIGNATURES   "http://openoffice.org/2004/documentsignatures"
 #define NS_DOCUMENTSIGNATURES_ODF_1_2 "urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0"
 #define OOXML_SIGNATURE_ORIGIN "http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/origin"
+#define OOXML_SIGNATURE_SIGNATURE "http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/signature"
 
 using namespace ::com::sun::star;
 using namespace ::com::sun::star::uno;
@@ -352,7 +353,7 @@ namespace
 {
 bool lcl_isSignatureType(const beans::StringPair& rPair)
 {
-    return rPair.First == "Type" && rPair.Second == "http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/signature";
+    return rPair.First == "Type" && rPair.Second == OOXML_SIGNATURE_SIGNATURE;
 }
 bool lcl_isSignatureOriginType(const beans::StringPair& rPair)
 {
@@ -465,13 +466,30 @@ void XMLSignatureHelper::EnsureSignaturesRelation(css::uno::Reference<css::embed
     xTransact->commit();
 }
 
-void XMLSignatureHelper::ExportSignatureRelations(css::uno::Reference<css::embed::XStorage> xStorage, int /*nSignatureCount*/)
+void XMLSignatureHelper::ExportSignatureRelations(css::uno::Reference<css::embed::XStorage> xStorage, int nSignatureCount)
 {
+    // Write the empty file, its relations will be the signatures.
     sal_Int32 nOpenMode = embed::ElementModes::READWRITE;
     uno::Reference<io::XOutputStream> xOriginStream(xStorage->openStreamElement("origin.sigs", nOpenMode), uno::UNO_QUERY);
     uno::Reference<io::XTruncate> xTruncate(xOriginStream, uno::UNO_QUERY);
     xTruncate->truncate();
     xOriginStream->closeOutput();
+
+    // Write the relations.
+    uno::Reference<embed::XStorage> xSubStorage(xStorage->openStorageElement("_rels", nOpenMode), uno::UNO_QUERY);
+    uno::Reference<io::XOutputStream> xRelStream(xSubStorage->openStreamElement("origin.sigs.rels", nOpenMode), uno::UNO_QUERY);
+    std::vector< uno::Sequence<beans::StringPair> > aRelations;
+    for (int i = 0; i < nSignatureCount; ++i)
+    {
+        std::vector<beans::StringPair> aRelation;
+        aRelation.push_back(beans::StringPair("Id", "rId" + OUString::number(i + 1)));
+        aRelation.push_back(beans::StringPair("Type", OOXML_SIGNATURE_SIGNATURE));
+        aRelation.push_back(beans::StringPair("Target", "sig" + OUString::number(i + 1) + ".xml"));
+        aRelations.push_back(comphelper::containerToSequence(aRelation));
+    }
+    comphelper::OFOPXMLHelper::WriteRelationsInfoSequence(xRelStream, comphelper::containerToSequence(aRelations), mxCtx);
+    uno::Reference<embed::XTransactedObject> xTransact(xSubStorage, uno::UNO_QUERY);
+    xTransact->commit();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list