diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2024-09-12 15:29:33 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2024-09-12 16:53:06 +0200 |
commit | e5a0209d4b1e1f09191a442e04d626b21c49b9df (patch) | |
tree | cac121f5c796aed978ddeb9513519c97b5acb816 /xmlsecurity/source/component | |
parent | 4b399dbfc4c3081174be1703a0c98fec1afd761f (diff) |
cool#9992 lok doc sign: allow sign of macros & the document itself in one step
Sign a document with macros (via file -> digital signatures -> digital
signatures), realize that you still get a warning on file open, sign the
macros in the document (via tools -> macros -> digital signature),
realize that you did this in the wrong order, so now you have to re-sign
the doc content.
The reason for this is that the macro signature only signs the macro
parts of the document (so you can still edit the document and the
signature is valid, as long as you don't touch macros), while the doc
content signature signs everything, including the macro signature, so
the order of the two matters.
Solve this trouble by adding a new setting that allows doing the two
signatures in one step. Do this by extending the doc content signing
code with an optional pre-step that first signs the document macros.
This is a bit tricky to do, since xmlsecurity/ gets an RW signature
stream and a RO document storage from sfx2/, but transferring one more
signature stream can solve this trouble.
Other tricky parts of the change:
1) The crypto signing is always done by libxmlsec, so
DigitalSignaturesDialog::SetScriptingSignatureStream() has to update
the storage of the sign manager's sign helper, otherwise, the hashes in
the macro signature will be empty.
2) Signing reads the RO storage, so normally the macro signature
would not be part of the doc signature when creating both signatures
inside a single dialog. (The storage is only committed after the
dialog ends.) Fix this problem by extending
DocumentSignatureManager::add() and UriBindingHelper::OpenInputStream()
to provide kind of an overlay when xmlsecurity/ gets a script signature
stream: this way the macro signature will be part of the doc signature
while the dialog is in progress. No overlay is needed later, once both
streams are committed to the storage on dialog end.
Change-Id: Ic2728689997165595991d5ec59c7a2683286e22d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173263
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'xmlsecurity/source/component')
-rw-r--r-- | xmlsecurity/source/component/documentdigitalsignatures.cxx | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/xmlsecurity/source/component/documentdigitalsignatures.cxx b/xmlsecurity/source/component/documentdigitalsignatures.cxx index 5cd2e6e5bb44..9c89b293bb39 100644 --- a/xmlsecurity/source/component/documentdigitalsignatures.cxx +++ b/xmlsecurity/source/component/documentdigitalsignatures.cxx @@ -70,6 +70,7 @@ class DocumentDigitalSignatures private: css::uno::Reference<css::uno::XComponentContext> mxCtx; css::uno::Reference<css::awt::XWindow> mxParentWindow; + uno::Reference<io::XStream> mxScriptingSignStream; /// will be set by XInitialization. If not we assume true. false means an earlier version (whatever that means, /// this is a string, not a boolean). @@ -221,6 +222,10 @@ public: void SignScriptingContentAsync(const css::uno::Reference<css::embed::XStorage>& xStorage, const css::uno::Reference<css::io::XStream>& xSignStream, const std::function<void(bool)>& rCallback) override; + + /// See sfx2::DigitalSignatures::SetSignScriptingContent(). + void SetSignScriptingContent( + const css::uno::Reference<css::io::XStream>& xScriptingSignStream) override; }; } @@ -444,6 +449,7 @@ void DocumentDigitalSignatures::ImplViewSignatures( xSignaturesDialog->SetStorage(rxStorage); xSignaturesDialog->SetSignatureStream( xSignStream ); + xSignaturesDialog->SetScriptingSignatureStream( mxScriptingSignStream ); xSignaturesDialog->beforeRun(); weld::DialogController::runAsync(xSignaturesDialog, [xSignaturesDialog, rxStorage, xSignStream, rCallback] (sal_Int32 nRet) { @@ -849,6 +855,12 @@ void DocumentDigitalSignatures::SignScriptingContentAsync( ImplViewSignatures( rxStorage, xSignStream, DocumentSignatureMode::Macros, false, rCallback ); } +void DocumentDigitalSignatures::SetSignScriptingContent( + const css::uno::Reference<css::io::XStream>& xScriptingSignStream) +{ + mxScriptingSignStream = xScriptingSignStream; +} + sal_Bool DocumentDigitalSignatures::signPackageWithCertificate( css::uno::Reference<css::security::XCertificate> const& xCertificate, css::uno::Reference<css::embed::XStorage> const& xStorage, |