[Libreoffice-commits] core.git: cui/source include/sfx2 offapi/com sfx2/source xmlsecurity/inc xmlsecurity/source

Samuel Mehrbrodt Samuel.Mehrbrodt at cib.de
Fri May 18 12:45:45 UTC 2018


 cui/source/dialogs/SignSignatureLineDialog.cxx              |    2 -
 include/sfx2/docfile.hxx                                    |    1 
 include/sfx2/objsh.hxx                                      |    9 ++--
 offapi/com/sun/star/security/XDocumentDigitalSignatures.idl |    3 +
 sfx2/source/doc/docfile.cxx                                 |    9 ++--
 sfx2/source/doc/objserv.cxx                                 |   13 +++----
 xmlsecurity/inc/documentsignaturemanager.hxx                |    3 +
 xmlsecurity/inc/xmlsignaturehelper.hxx                      |    1 
 xmlsecurity/inc/xsecctl.hxx                                 |    1 
 xmlsecurity/source/component/documentdigitalsignatures.cxx  |    9 ++--
 xmlsecurity/source/helper/documentsignaturemanager.cxx      |    6 ++-
 xmlsecurity/source/helper/ooxmlsecexporter.cxx              |    1 
 xmlsecurity/source/helper/xmlsignaturehelper.cxx            |    5 ++
 xmlsecurity/source/helper/xsecctl.cxx                       |   22 ++++++++++++
 xmlsecurity/source/helper/xsecparser.cxx                    |   15 ++++++++
 xmlsecurity/source/helper/xsecparser.hxx                    |    2 +
 xmlsecurity/source/helper/xsecsign.cxx                      |   17 +++++++++
 17 files changed, 97 insertions(+), 22 deletions(-)

New commits:
commit 201321f648e82ecc610e7a3324a46248a19c1704
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Wed May 16 16:34:35 2018 +0200

    tdf#83877 Write SignatureLineId to ODF & OOXML signatures
    
    Change-Id: I483a3b7895cdcb10ef9d6dacf167ed0f8db7e723
    Reviewed-on: https://gerrit.libreoffice.org/54432
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>

diff --git a/cui/source/dialogs/SignSignatureLineDialog.cxx b/cui/source/dialogs/SignSignatureLineDialog.cxx
index 454b6d42ec52..f6ae8b10ae82 100644
--- a/cui/source/dialogs/SignSignatureLineDialog.cxx
+++ b/cui/source/dialogs/SignSignatureLineDialog.cxx
@@ -145,7 +145,7 @@ void SignSignatureLineDialog::Apply()
     }
 
     SfxObjectShell* pShell = SfxObjectShell::Current();
-    pShell->SignDocumentContent(m_xSelectedCertifate);
+    pShell->SignDocumentContent(m_xSelectedCertifate, m_aSignatureLineId);
 
     bool bSuccess = false; // TODO
 
diff --git a/include/sfx2/docfile.hxx b/include/sfx2/docfile.hxx
index dc2c1ba11218..f7e34b957766 100644
--- a/include/sfx2/docfile.hxx
+++ b/include/sfx2/docfile.hxx
@@ -265,6 +265,7 @@ public:
 
     SAL_DLLPRIVATE bool
     SignContents_Impl(const css::uno::Reference<css::security::XCertificate> xCert,
+                      const OUString& aSignatureLineId,
                       bool bScriptingContent, const OUString& aODFVersion,
                       bool bHasValidDocumentSignature);
 
diff --git a/include/sfx2/objsh.hxx b/include/sfx2/objsh.hxx
index 80a14e86bbdb..2f99fa010497 100644
--- a/include/sfx2/objsh.hxx
+++ b/include/sfx2/objsh.hxx
@@ -356,7 +356,8 @@ public:
     // xmlsec05, check with SFX team
     SignatureState              GetDocumentSignatureState();
     void                        SignDocumentContent();
-    void                        SignDocumentContent(css::uno::Reference<css::security::XCertificate> xCert);
+    void                        SignDocumentContent(css::uno::Reference<css::security::XCertificate> xCert,
+                                                    const OUString& aSignatureLineId);
     SignatureState              GetScriptingSignatureState();
     void                        SignScriptingContent();
     DECL_LINK(SignDocumentHandler, Button*, void);
@@ -739,9 +740,9 @@ public:
             const css::uno::Reference< css::security::XDocumentDigitalSignatures >& xSigner
                 = css::uno::Reference< css::security::XDocumentDigitalSignatures >() );
 
-    SAL_DLLPRIVATE void
-    ImplSign(const css::uno::Reference<css::security::XCertificate> xCert,
-             bool bScriptingContent = false);
+    SAL_DLLPRIVATE void ImplSign(const css::uno::Reference<css::security::XCertificate> xCert
+                                 = css::uno::Reference<css::security::XCertificate>(),
+                                 const OUString& aSignatureLineId = OUString(), bool bScriptingContent = false);
 
     SAL_DLLPRIVATE bool QuerySaveSizeExceededModules_Impl( const css::uno::Reference< css::task::XInteractionHandler >& xHandler );
     SAL_DLLPRIVATE bool QueryAllowExoticFormat_Impl( const css::uno::Reference< css::task::XInteractionHandler >& xHandler,
diff --git a/offapi/com/sun/star/security/XDocumentDigitalSignatures.idl b/offapi/com/sun/star/security/XDocumentDigitalSignatures.idl
index 671ded681d17..c31af5e176fd 100644
--- a/offapi/com/sun/star/security/XDocumentDigitalSignatures.idl
+++ b/offapi/com/sun/star/security/XDocumentDigitalSignatures.idl
@@ -55,7 +55,8 @@ interface XDocumentDigitalSignatures : com::sun::star::uno::XInterface
      */
     boolean signDocumentContentWithCertificate( [in] ::com::sun::star::embed::XStorage xStorage,
                                                 [in] ::com::sun::star::io::XStream xSignStream,
-                                                [in] ::com::sun::star::security::XCertificate xCertificate);
+                                                [in] ::com::sun::star::security::XCertificate xCertificate,
+                                                [in] string signatureLineId);
 
     /** checks for digital signatures and their status.
 
diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx
index 9de896d77a62..14a5f6aa61f0 100644
--- a/sfx2/source/doc/docfile.cxx
+++ b/sfx2/source/doc/docfile.cxx
@@ -3661,8 +3661,9 @@ void SfxMedium::CreateTempFileNoCopy()
     CloseStorage();
 }
 
-bool SfxMedium::SignContents_Impl(const Reference<XCertificate> xCert, bool bScriptingContent,
-                                  const OUString& aODFVersion, bool bHasValidDocumentSignature)
+bool SfxMedium::SignContents_Impl(const Reference<XCertificate> xCert, const OUString& aSignatureLineId,
+                                  bool bScriptingContent, const OUString& aODFVersion,
+                                  bool bHasValidDocumentSignature)
 {
     bool bChanges = false;
 
@@ -3753,7 +3754,7 @@ bool SfxMedium::SignContents_Impl(const Reference<XCertificate> xCert, bool bScr
                         bool bSuccess = false;
                         if (xCert.is())
                             bSuccess = xSigner->signDocumentContentWithCertificate(
-                                GetZipStorageToSign_Impl(), xStream, xCert);
+                                GetZipStorageToSign_Impl(), xStream, xCert, aSignatureLineId);
                         else
                             bSuccess = xSigner->signDocumentContent(GetZipStorageToSign_Impl(),
                                                                     xStream);
@@ -3779,7 +3780,7 @@ bool SfxMedium::SignContents_Impl(const Reference<XCertificate> xCert, bool bScr
                         if (xCert.is())
                         {
                             bSuccess = xSigner->signDocumentContentWithCertificate(
-                                GetZipStorageToSign_Impl(), xStream, xCert);
+                                GetZipStorageToSign_Impl(/*bReadOnly=*/false), xStream, xCert, aSignatureLineId);
                         }
                         else
                         {
diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx
index edac57aeceee..46865cf1107a 100644
--- a/sfx2/source/doc/objserv.cxx
+++ b/sfx2/source/doc/objserv.cxx
@@ -1361,7 +1361,7 @@ SignatureState SfxObjectShell::ImplGetSignatureState( bool bScriptingContent )
     return *pState;
 }
 
-void SfxObjectShell::ImplSign(Reference<XCertificate> xCert,
+void SfxObjectShell::ImplSign(Reference<XCertificate> xCert, const OUString& aSignatureLineId,
                               bool bScriptingContent)
 {
     // Check if it is stored in OASIS format...
@@ -1488,7 +1488,7 @@ void SfxObjectShell::ImplSign(Reference<XCertificate> xCert,
             || pImpl->nDocumentSignatureState == SignatureState::PARTIAL_OK;
 
         bool bSignSuccess = GetMedium()->SignContents_Impl(
-            xCert, bScriptingContent, aODFVersion, bHasValidSignatures);
+            xCert, aSignatureLineId, bScriptingContent, aODFVersion, bHasValidSignatures);
 
         pImpl->m_bSavingForSigning = true;
         DoSaveCompleted( GetMedium() );
@@ -1523,12 +1523,13 @@ SignatureState SfxObjectShell::GetDocumentSignatureState()
 
 void SfxObjectShell::SignDocumentContent()
 {
-    ImplSign(Reference<XCertificate>());
+    ImplSign();
 }
 
-void SfxObjectShell::SignDocumentContent(const Reference<XCertificate> xCert)
+void SfxObjectShell::SignDocumentContent(const Reference<XCertificate> xCert,
+                                         const OUString& aSignatureLineId)
 {
-    ImplSign(xCert);
+    ImplSign(xCert, aSignatureLineId);
 }
 
 SignatureState SfxObjectShell::GetScriptingSignatureState()
@@ -1538,7 +1539,7 @@ SignatureState SfxObjectShell::GetScriptingSignatureState()
 
 void SfxObjectShell::SignScriptingContent()
 {
-    ImplSign( Reference<XCertificate>(), true );
+    ImplSign( Reference<XCertificate>(), OUString(), true );
 }
 
 namespace
diff --git a/xmlsecurity/inc/documentsignaturemanager.hxx b/xmlsecurity/inc/documentsignaturemanager.hxx
index 3abe91a727b2..542a9af6a8a9 100644
--- a/xmlsecurity/inc/documentsignaturemanager.hxx
+++ b/xmlsecurity/inc/documentsignaturemanager.hxx
@@ -65,7 +65,8 @@ public:
     /// Add a new signature, using xCert as a signing certificate, and rDescription as description.
     bool add(const css::uno::Reference<css::security::XCertificate>& xCert,
              const css::uno::Reference<css::xml::crypto::XXMLSecurityContext>& xSecurityContext,
-             const OUString& rDescription, sal_Int32& nSecurityId, bool bAdESCompliant);
+             const OUString& rDescription, sal_Int32& nSecurityId, bool bAdESCompliant,
+             const OUString& rSignatureLineId = OUString());
     /// Remove signature at nPosition.
     void remove(sal_uInt16 nPosition);
     /// Read signatures from either a temp stream or the real storage.
diff --git a/xmlsecurity/inc/xmlsignaturehelper.hxx b/xmlsecurity/inc/xmlsignaturehelper.hxx
index 8e4bd48d8af8..f4de3b01b56e 100644
--- a/xmlsecurity/inc/xmlsignaturehelper.hxx
+++ b/xmlsecurity/inc/xmlsignaturehelper.hxx
@@ -129,6 +129,7 @@ public:
 
     void        SetDateTime( sal_Int32 nSecurityId, const Date& rDate, const tools::Time& rTime );
     void SetDescription(sal_Int32 nSecurityId, const OUString& rDescription);
+    void SetSignatureLineId(sal_Int32 nSecurityId, const OUString& rSignatureLineId);
 
     void        AddForSigning( sal_Int32 securityId, const OUString& uri, bool bBinary, bool bXAdESCompliantIfODF );
     void        CreateAndWriteSignature( const css::uno::Reference< css::xml::sax::XDocumentHandler >& xDocumentHandler, bool bXAdESCompliantIfODF );
diff --git a/xmlsecurity/inc/xsecctl.hxx b/xmlsecurity/inc/xsecctl.hxx
index c01284bea6e7..750bb5b63348 100644
--- a/xmlsecurity/inc/xsecctl.hxx
+++ b/xmlsecurity/inc/xsecctl.hxx
@@ -359,6 +359,7 @@ public:
         sal_Int32 nSecurityId,
         const css::util::DateTime& rDateTime );
     void setDescription(sal_Int32 nSecurityId, const OUString& rDescription);
+    void setSignatureLineId(sal_Int32 nSecurityId, const OUString& rSignatureLineId);
 
     bool WriteSignature(
         const css::uno::Reference< css::xml::sax::XDocumentHandler >& xDocumentHandler,
diff --git a/xmlsecurity/source/component/documentdigitalsignatures.cxx b/xmlsecurity/source/component/documentdigitalsignatures.cxx
index bd09970348c4..87e9b8bb3759 100644
--- a/xmlsecurity/source/component/documentdigitalsignatures.cxx
+++ b/xmlsecurity/source/component/documentdigitalsignatures.cxx
@@ -107,7 +107,8 @@ public:
     sal_Bool SAL_CALL signDocumentContentWithCertificate(
         const css::uno::Reference<css::embed::XStorage>& Storage,
         const css::uno::Reference<css::io::XStream>& xSignStream,
-        const css::uno::Reference<css::security::XCertificate>& xCertificate) override;
+        const css::uno::Reference<css::security::XCertificate>& xCertificate,
+        const OUString& rSignatureLineId) override;
     css::uno::Sequence<css::security::DocumentSignatureInformation>
         SAL_CALL verifyDocumentContentSignatures(
             const css::uno::Reference<css::embed::XStorage>& xStorage,
@@ -225,7 +226,7 @@ sal_Bool DocumentDigitalSignatures::signDocumentContent(
 sal_Bool DocumentDigitalSignatures::signDocumentContentWithCertificate(
     const Reference<css::embed::XStorage>& rxStorage,
     const Reference<css::io::XStream>& xSignStream,
-    const Reference<css::security::XCertificate>& xCertificate)
+    const Reference<css::security::XCertificate>& xCertificate, const OUString& aSignatureLineId)
 {
     OSL_ENSURE(!m_sODFVersion.isEmpty(),
                "DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
@@ -249,8 +250,8 @@ sal_Bool DocumentDigitalSignatures::signDocumentContentWithCertificate(
 
     sal_Int32 nSecurityId;
     OUString aDescription("");
-    bool bSuccess
-        = aSignatureManager.add(xCertificate, xSecurityContext, aDescription, nSecurityId, true);
+    bool bSuccess = aSignatureManager.add(xCertificate, xSecurityContext, aDescription, nSecurityId,
+                                          true, aSignatureLineId);
     if (!bSuccess)
         return false;
 
diff --git a/xmlsecurity/source/helper/documentsignaturemanager.cxx b/xmlsecurity/source/helper/documentsignaturemanager.cxx
index af93c2e90fb3..bb78c62272e4 100644
--- a/xmlsecurity/source/helper/documentsignaturemanager.cxx
+++ b/xmlsecurity/source/helper/documentsignaturemanager.cxx
@@ -265,7 +265,8 @@ SignatureStreamHelper DocumentSignatureManager::ImplOpenSignatureStream(sal_Int3
 bool DocumentSignatureManager::add(
     const uno::Reference<security::XCertificate>& xCert,
     const uno::Reference<xml::crypto::XXMLSecurityContext>& xSecurityContext,
-    const OUString& rDescription, sal_Int32& nSecurityId, bool bAdESCompliant)
+    const OUString& rDescription, sal_Int32& nSecurityId, bool bAdESCompliant,
+    const OUString& rSignatureLineId)
 {
     if (!xCert.is())
     {
@@ -384,6 +385,9 @@ bool DocumentSignatureManager::add(
                                   tools::Time(tools::Time::SYSTEM));
     maSignatureHelper.SetDescription(nSecurityId, rDescription);
 
+    if (!rSignatureLineId.isEmpty())
+        maSignatureHelper.SetSignatureLineId(nSecurityId, rSignatureLineId);
+
     // We open a signature stream in which the existing and the new
     //signature is written. ImplGetSignatureInformation (later in this function) will
     //then read the stream and fill maCurrentSignatureInformations. The final signature
diff --git a/xmlsecurity/source/helper/ooxmlsecexporter.cxx b/xmlsecurity/source/helper/ooxmlsecexporter.cxx
index bd8111aed6a6..7d177c8dda15 100644
--- a/xmlsecurity/source/helper/ooxmlsecexporter.cxx
+++ b/xmlsecurity/source/helper/ooxmlsecexporter.cxx
@@ -350,6 +350,7 @@ void OOXMLSecExporter::Impl::writeSignatureInfo()
     m_xDocumentHandler->startElement("SignatureInfoV1", uno::Reference<xml::sax::XAttributeList>(pAttributeList.get()));
 
     m_xDocumentHandler->startElement("SetupId", uno::Reference<xml::sax::XAttributeList>(new SvXMLAttributeList()));
+    m_xDocumentHandler->characters(m_rInformation.ouSignatureLineId);
     m_xDocumentHandler->endElement("SetupId");
     m_xDocumentHandler->startElement("SignatureText", uno::Reference<xml::sax::XAttributeList>(new SvXMLAttributeList()));
     m_xDocumentHandler->endElement("SignatureText");
diff --git a/xmlsecurity/source/helper/xmlsignaturehelper.cxx b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
index 1767b897c7ff..0ae2c9524f28 100644
--- a/xmlsecurity/source/helper/xmlsignaturehelper.cxx
+++ b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
@@ -149,6 +149,11 @@ void XMLSignatureHelper::SetDescription(sal_Int32 nSecurityId, const OUString& r
     mpXSecController->setDescription(nSecurityId, rDescription);
 }
 
+void XMLSignatureHelper::SetSignatureLineId(sal_Int32 nSecurityId, const OUString& rSignatureLineId)
+{
+    mpXSecController->setSignatureLineId(nSecurityId, rSignatureLineId);
+}
+
 void XMLSignatureHelper::AddForSigning( sal_Int32 nSecurityId, const OUString& uri, bool bBinary, bool bXAdESCompliantIfODF )
 {
     mpXSecController->signAStream( nSecurityId, uri, bBinary, bXAdESCompliantIfODF );
diff --git a/xmlsecurity/source/helper/xsecctl.cxx b/xmlsecurity/source/helper/xsecctl.cxx
index c10e9f0d3c50..0d97dd3456fb 100644
--- a/xmlsecurity/source/helper/xsecctl.cxx
+++ b/xmlsecurity/source/helper/xsecctl.cxx
@@ -856,6 +856,28 @@ void XSecController::exportSignature(
                         "dc:date");
                 }
                 xDocumentHandler->endElement( "SignatureProperty" );
+
+                if (!signatureInfo.ouSignatureLineId.isEmpty())
+                {
+                    pAttributeList = new SvXMLAttributeList();
+                    pAttributeList->AddAttribute(
+                        "xmlns:loext",
+                        "urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0");
+                    pAttributeList->AddAttribute("Target", "#" + signatureInfo.ouSignatureId);
+
+                    xDocumentHandler->startElement(
+                        "SignatureProperty",
+                        cssu::Reference<cssxs::XAttributeList>(pAttributeList));
+                    {
+                        // Write SignatureLineId element
+                        xDocumentHandler->startElement(
+                            "loext:SignatureLineId",
+                            cssu::Reference<cssxs::XAttributeList>(new SvXMLAttributeList()));
+                        xDocumentHandler->characters(signatureInfo.ouSignatureLineId);
+                        xDocumentHandler->endElement("loext:SignatureLineId");
+                    }
+                    xDocumentHandler->endElement("SignatureProperty");
+                }
             }
 
             // Write signature description.
diff --git a/xmlsecurity/source/helper/xsecparser.cxx b/xmlsecurity/source/helper/xsecparser.cxx
index 2ec9c4082576..4218ab571f53 100644
--- a/xmlsecurity/source/helper/xsecparser.cxx
+++ b/xmlsecurity/source/helper/xsecparser.cxx
@@ -44,6 +44,7 @@ XSecParser::XSecParser(XMLSignatureHelper& rXMLSignatureHelper,
     , m_bInSignatureValue(false)
     , m_bInDate(false)
     , m_bInDescription(false)
+    , m_bInSignatureLineId(false)
     , m_pXSecController(pXSecController)
     , m_bReferenceUnresolved(false)
     , m_nReferenceDigestID(cssxc::DigestID::SHA1)
@@ -259,6 +260,11 @@ void SAL_CALL XSecParser::startElement(
             m_ouDescription.clear();
             m_bInDescription = true;
         }
+        else if (aName == "loext:SignatureLineId")
+        {
+            m_ouSignatureLineId.clear();
+            m_bInSignatureLineId = true;
+        }
 
         if (m_xNextHandler.is())
         {
@@ -368,6 +374,11 @@ void SAL_CALL XSecParser::endElement( const OUString& aName )
             m_pXSecController->setDescription( m_ouDescription );
             m_bInDescription = false;
         }
+        else if (aName == "loext:SignatureLineId")
+        {
+            m_pXSecController->setSignatureLineId( m_ouSignatureLineId );
+            m_bInSignatureLineId = false;
+        }
 
         if (m_xNextHandler.is())
         {
@@ -443,6 +454,10 @@ void SAL_CALL XSecParser::characters( const OUString& aChars )
     {
         m_ouDate += aChars;
     }
+    else if (m_bInSignatureLineId)
+    {
+        m_ouSignatureLineId += aChars;
+    }
 
     if (m_xNextHandler.is())
     {
diff --git a/xmlsecurity/source/helper/xsecparser.hxx b/xmlsecurity/source/helper/xsecparser.hxx
index 8376a48b69cd..e1c4515ce941 100644
--- a/xmlsecurity/source/helper/xsecparser.hxx
+++ b/xmlsecurity/source/helper/xsecparser.hxx
@@ -67,6 +67,7 @@ private:
     OUString m_ouDate;
     /// Characters of a <dc:description> element, as just read from XML.
     OUString m_ouDescription;
+    OUString m_ouSignatureLineId;
 
     /*
      * whether inside a particular element
@@ -84,6 +85,7 @@ private:
     bool m_bInSignatureValue;
     bool m_bInDate;
     bool m_bInDescription;
+    bool m_bInSignatureLineId;
 
     /*
      * the XSecController collaborating with XSecParser
diff --git a/xmlsecurity/source/helper/xsecsign.cxx b/xmlsecurity/source/helper/xsecsign.cxx
index bd1873b4ddf7..3202c4c4a1c1 100644
--- a/xmlsecurity/source/helper/xsecsign.cxx
+++ b/xmlsecurity/source/helper/xsecsign.cxx
@@ -291,6 +291,23 @@ void XSecController::setDescription(sal_Int32 nSecurityId, const OUString& rDesc
     }
 }
 
+void XSecController::setSignatureLineId(sal_Int32 nSecurityId, const OUString& rSignatureLineId)
+{
+    int nIndex = findSignatureInfor(nSecurityId);
+
+    if (nIndex == -1)
+    {
+        InternalSignatureInformation aInformation(nSecurityId, nullptr);
+        aInformation.signatureInfor.ouSignatureLineId = rSignatureLineId;
+        m_vInternalSignatureInformations.push_back(aInformation);
+    }
+    else
+    {
+        SignatureInformation& rInformation = m_vInternalSignatureInformations[nIndex].signatureInfor;
+        rInformation.ouSignatureLineId = rSignatureLineId;
+    }
+}
+
 bool XSecController::WriteSignature(
     const cssu::Reference<cssxs::XDocumentHandler>& xDocumentHandler,
     bool bXAdESCompliantIfODF )


More information about the Libreoffice-commits mailing list