32#include <com/sun/star/embed/XStorage.hpp>
33#include <com/sun/star/embed/StorageFormats.hpp>
34#include <com/sun/star/embed/XTransactedObject.hpp>
35#include <com/sun/star/embed/ElementModes.hpp>
36#include <com/sun/star/lang/XInitialization.hpp>
37#include <com/sun/star/lang/XServiceInfo.hpp>
38#include <com/sun/star/ucb/XContent.hpp>
39#include <com/sun/star/ucb/XContentIdentifierFactory.hpp>
40#include <com/sun/star/ucb/XCommandEnvironment.hpp>
41#include <com/sun/star/ucb/XCommandProcessor.hpp>
42#include <com/sun/star/ucb/Command.hpp>
43#include <com/sun/star/uno/SecurityException.hpp>
49#include <com/sun/star/security/CertificateValidity.hpp>
50#include <com/sun/star/security/CertificateKind.hpp>
59#include <com/sun/star/lang/IllegalArgumentException.hpp>
60#include <com/sun/star/security/XDocumentDigitalSignatures.hpp>
61#include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
67using namespace css::uno;
68using namespace css::lang;
69using namespace css::security;
70using namespace css::xml::crypto;
73class DocumentDigitalSignatures
74 :
public cppu::WeakImplHelper<css::security::XDocumentDigitalSignatures,
75 css::lang::XInitialization, css::lang::XServiceInfo>,
76 public sfx2::DigitalSignatures
79 css::uno::Reference<css::uno::XComponentContext>
mxCtx;
80 css::uno::Reference<css::awt::XWindow> mxParentWindow;
85 OUString m_sODFVersion;
87 int m_nArgumentsCount;
89 bool m_bHasDocumentSignature;
92 bool ImplViewSignatures(
const css::uno::Reference<css::embed::XStorage>& rxStorage,
93 const css::uno::Reference<css::io::XStream>& xSignStream,
96 void ImplViewSignatures(
const css::uno::Reference<css::embed::XStorage>& rxStorage,
97 const css::uno::Reference<css::io::XInputStream>& xSignStream,
100 css::uno::Sequence<css::security::DocumentSignatureInformation>
101 ImplVerifySignatures(
const css::uno::Reference<css::embed::XStorage>& rxStorage,
102 const ::com::sun::star::uno::Reference<css::io::XInputStream>& xSignStream,
105 css::uno::Sequence<css::uno::Reference<css::security::XCertificate>>
106 chooseCertificatesImpl(std::map<OUString, OUString>& rProperties,
const UserAction eAction,
107 const CertificateKind certificateKind=CertificateKind_NONE);
110 signWithCertificateImpl(
const uno::Reference<frame::XModel>& ,
111 css::uno::Reference<css::security::XCertificate>
const& xCertificate,
112 css::uno::Reference<css::embed::XStorage>
const& xStorage,
113 css::uno::Reference<css::io::XStream>
const& xStream,
117 explicit DocumentDigitalSignatures(
118 const css::uno::Reference<css::uno::XComponentContext>& rxCtx);
121 void SAL_CALL initialize(
const css::uno::Sequence<css::uno::Any>& aArguments)
override;
131 signDocumentContent(
const css::uno::Reference<css::embed::XStorage>& xStorage,
132 const css::uno::Reference<css::io::XStream>& xSignStream)
override;
133 sal_Bool SAL_CALL signSignatureLine(
134 const css::uno::Reference<css::embed::XStorage>& Storage,
135 const css::uno::Reference<css::io::XStream>& xSignStream,
const OUString& aSignatureLineId,
136 const Reference<css::security::XCertificate>& xCertificate,
137 const Reference<css::graphic::XGraphic>& xValidGraphic,
138 const Reference<css::graphic::XGraphic>& xInvalidGraphic,
139 const OUString& aComment)
override;
140 css::uno::Sequence<css::security::DocumentSignatureInformation>
141 SAL_CALL verifyDocumentContentSignatures(
142 const css::uno::Reference<css::embed::XStorage>& xStorage,
143 const css::uno::Reference<css::io::XInputStream>& xSignInStream)
override;
144 void SAL_CALL showDocumentContentSignatures(
145 const css::uno::Reference<css::embed::XStorage>& xStorage,
146 const css::uno::Reference<css::io::XInputStream>& xSignInStream)
override;
147 OUString SAL_CALL getDocumentContentSignatureDefaultStreamName()
override;
149 signScriptingContent(
const css::uno::Reference<css::embed::XStorage>& xStorage,
150 const css::uno::Reference<css::io::XStream>& xSignStream)
override;
151 css::uno::Sequence<css::security::DocumentSignatureInformation>
152 SAL_CALL verifyScriptingContentSignatures(
153 const css::uno::Reference<css::embed::XStorage>& xStorage,
154 const css::uno::Reference<css::io::XInputStream>& xSignInStream)
override;
155 void SAL_CALL showScriptingContentSignatures(
156 const css::uno::Reference<css::embed::XStorage>& xStorage,
157 const css::uno::Reference<css::io::XInputStream>& xSignInStream)
override;
158 OUString SAL_CALL getScriptingContentSignatureDefaultStreamName()
override;
160 signPackage(
const css::uno::Reference<css::embed::XStorage>& Storage,
161 const css::uno::Reference<css::io::XStream>& xSignStream)
override;
162 css::uno::Sequence<css::security::DocumentSignatureInformation>
163 SAL_CALL verifyPackageSignatures(
164 const css::uno::Reference<css::embed::XStorage>& Storage,
165 const css::uno::Reference<css::io::XInputStream>& xSignInStream)
override;
167 showPackageSignatures(
const css::uno::Reference<css::embed::XStorage>& xStorage,
168 const css::uno::Reference<css::io::XInputStream>& xSignInStream)
override;
169 OUString SAL_CALL getPackageSignatureDefaultStreamName()
override;
171 showCertificate(
const css::uno::Reference<css::security::XCertificate>& Certificate)
override;
172 void SAL_CALL manageTrustedSources()
override;
174 isAuthorTrusted(
const css::uno::Reference<css::security::XCertificate>& Author)
override;
175 sal_Bool SAL_CALL isLocationTrusted(
const OUString& Location)
override;
176 void SAL_CALL addAuthorToTrustedSources(
177 const css::uno::Reference<css::security::XCertificate>& Author)
override;
178 void SAL_CALL addLocationToTrustedSources(
const OUString& Location)
override;
180 css::uno::Reference<css::security::XCertificate>
181 SAL_CALL chooseCertificate(OUString& rDescription)
override;
182 css::uno::Reference<css::security::XCertificate>
183 SAL_CALL chooseSigningCertificate(OUString& rDescription)
override;
184 css::uno::Reference<css::security::XCertificate>
185 SAL_CALL selectSigningCertificate(OUString& rDescription)
override;
186 css::uno::Reference<css::security::XCertificate>
187 SAL_CALL selectSigningCertificateWithType(
const CertificateKind certificateKind,
188 OUString& rDescription)
override;
189 css::uno::Sequence<css::uno::Reference<css::security::XCertificate>>
190 SAL_CALL chooseEncryptionCertificate()
override;
191 css::uno::Reference<css::security::XCertificate> SAL_CALL chooseCertificateWithProps(
192 css::uno::Sequence<::com::sun::star::beans::PropertyValue>& Properties)
override;
194 sal_Bool SAL_CALL signDocumentWithCertificate(
195 css::uno::Reference<css::security::XCertificate>
const & xCertificate,
196 css::uno::Reference<css::embed::XStorage>
const & xStoragexStorage,
197 css::uno::Reference<css::io::XStream>
const & xStream)
override;
199 sal_Bool SAL_CALL signPackageWithCertificate(
200 css::uno::Reference<css::security::XCertificate>
const& xCertificate,
201 css::uno::Reference<css::embed::XStorage>
const& xStoragexStorage,
202 css::uno::Reference<css::io::XStream>
const& xStream)
override;
204 sal_Bool SAL_CALL signScriptingContentWithCertificate(
205 css::uno::Reference<css::security::XCertificate>
const& xCertificate,
206 css::uno::Reference<css::embed::XStorage>
const& xStoragexStorage,
207 css::uno::Reference<css::io::XStream>
const& xStream)
override;
209 void SAL_CALL setParentWindow(
const css::uno::Reference<css::awt::XWindow>& rParentwindow)
override
211 mxParentWindow = rParentwindow;
216 SignModelWithCertificate(
const css::uno::Reference<css::frame::XModel>& xModel,
217 const css::uno::Reference<css::security::XCertificate>& xCertificate,
218 const css::uno::Reference<css::embed::XStorage>& xStorage,
219 const css::uno::Reference<css::io::XStream>& xStream)
override;
224DocumentDigitalSignatures::DocumentDigitalSignatures(
const Reference< XComponentContext >& rxCtx ):
227 m_nArgumentsCount(0),
228 m_bHasDocumentSignature(false)
232void DocumentDigitalSignatures::initialize(
const Sequence< Any >& aArguments)
235 throw css::lang::IllegalArgumentException(
236 "DocumentDigitalSignatures::initialize requires zero, one, or two arguments",
237 static_cast<XInitialization*
>(
this), 0);
244 if (!(aArguments[0] >>= m_sODFVersion))
245 throw css::lang::IllegalArgumentException(
246 "DocumentDigitalSignatures::initialize: the first arguments must be a string",
247 static_cast<XInitialization*
>(
this), 0);
250 && !(aArguments[1] >>= m_bHasDocumentSignature))
251 throw css::lang::IllegalArgumentException(
252 "DocumentDigitalSignatures::initialize: the second arguments must be a bool",
253 static_cast<XInitialization*
>(
this), 1);
258 if (m_sODFVersion.isEmpty())
262OUString DocumentDigitalSignatures::getImplementationName()
264 return "com.sun.star.security.DocumentDigitalSignatures";
267sal_Bool DocumentDigitalSignatures::supportsService(
268 OUString
const & ServiceName)
273css::uno::Sequence<OUString>
274DocumentDigitalSignatures::getSupportedServiceNames()
276 Sequence<OUString> aRet{
"com.sun.star.security.DocumentDigitalSignatures" };
280sal_Bool DocumentDigitalSignatures::signDocumentContent(
281 const Reference< css::embed::XStorage >& rxStorage,
282 const Reference< css::io::XStream >& xSignStream)
284 OSL_ENSURE(!m_sODFVersion.isEmpty(),
"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
288sal_Bool DocumentDigitalSignatures::signSignatureLine(
289 const Reference<css::embed::XStorage>& rxStorage,
290 const Reference<css::io::XStream>& xSignStream,
291 const OUString& aSignatureLineId,
292 const Reference<css::security::XCertificate>& xCertificate,
293 const Reference<css::graphic::XGraphic>& xValidGraphic,
294 const Reference<css::graphic::XGraphic>& xInvalidGraphic,
295 const OUString& aComment)
297 OSL_ENSURE(!m_sODFVersion.isEmpty(),
298 "DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
302 if (!aSignatureManager.init())
305 aSignatureManager.setStore(rxStorage);
306 aSignatureManager.getSignatureHelper().SetStorage(rxStorage, m_sODFVersion);
307 aSignatureManager.setSignatureStream(xSignStream);
309 Reference<XXMLSecurityContext> xSecurityContext;
310 Reference<XServiceInfo> xServiceInfo(xCertificate, UNO_QUERY);
311 if (xServiceInfo->getImplementationName()
312 ==
"com.sun.star.xml.security.gpg.XCertificate_GpgImpl")
313 xSecurityContext = aSignatureManager.getGpgSecurityContext();
315 xSecurityContext = aSignatureManager.getSecurityContext();
317 sal_Int32 nSecurityId;
318 bool bSuccess = aSignatureManager.add(xCertificate, xSecurityContext, aComment, nSecurityId,
319 true, aSignatureLineId, xValidGraphic, xInvalidGraphic);
324 aSignatureManager.read(
true,
false);
325 aSignatureManager.write(
true);
327 if (rxStorage.is() && !xSignStream.is())
329 uno::Reference<embed::XTransactedObject> xTrans(rxStorage, uno::UNO_QUERY);
336Sequence< css::security::DocumentSignatureInformation >
337DocumentDigitalSignatures::verifyDocumentContentSignatures(
338 const Reference< css::embed::XStorage >& rxStorage,
339 const Reference< css::io::XInputStream >& xSignInStream )
341 OSL_ENSURE(!m_sODFVersion.isEmpty(),
"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
345void DocumentDigitalSignatures::showDocumentContentSignatures(
346 const Reference< css::embed::XStorage >& rxStorage,
347 const Reference< css::io::XInputStream >& xSignInStream )
349 OSL_ENSURE(!m_sODFVersion.isEmpty(),
"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
353OUString DocumentDigitalSignatures::getDocumentContentSignatureDefaultStreamName()
358sal_Bool DocumentDigitalSignatures::signScriptingContent(
359 const Reference< css::embed::XStorage >& rxStorage,
360 const Reference< css::io::XStream >& xSignStream )
362 OSL_ENSURE(!m_sODFVersion.isEmpty(),
"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
363 OSL_ENSURE(m_nArgumentsCount == 2,
"DocumentDigitalSignatures: Service was not initialized properly");
367Sequence< css::security::DocumentSignatureInformation >
368DocumentDigitalSignatures::verifyScriptingContentSignatures(
369 const Reference< css::embed::XStorage >& rxStorage,
370 const Reference< css::io::XInputStream >& xSignInStream )
372 OSL_ENSURE(!m_sODFVersion.isEmpty(),
"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
376void DocumentDigitalSignatures::showScriptingContentSignatures(
377 const Reference< css::embed::XStorage >& rxStorage,
378 const Reference< css::io::XInputStream >& xSignInStream )
380 OSL_ENSURE(!m_sODFVersion.isEmpty(),
"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
384OUString DocumentDigitalSignatures::getScriptingContentSignatureDefaultStreamName()
390sal_Bool DocumentDigitalSignatures::signPackage(
391 const Reference< css::embed::XStorage >& rxStorage,
392 const Reference< css::io::XStream >& xSignStream )
394 OSL_ENSURE(!m_sODFVersion.isEmpty(),
"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
398Sequence< css::security::DocumentSignatureInformation >
399DocumentDigitalSignatures::verifyPackageSignatures(
400 const Reference< css::embed::XStorage >& rxStorage,
401 const Reference< css::io::XInputStream >& xSignInStream )
403 OSL_ENSURE(!m_sODFVersion.isEmpty(),
"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
407void DocumentDigitalSignatures::showPackageSignatures(
408 const Reference< css::embed::XStorage >& rxStorage,
409 const Reference< css::io::XInputStream >& xSignInStream )
411 OSL_ENSURE(!m_sODFVersion.isEmpty(),
"DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
415OUString DocumentDigitalSignatures::getPackageSignatureDefaultStreamName( )
421void DocumentDigitalSignatures::ImplViewSignatures(
422 const Reference< css::embed::XStorage >& rxStorage,
423 const Reference< css::io::XInputStream >& xSignStream,
426 Reference< io::XStream >
xStream;
427 if ( xSignStream.is() )
428 xStream.set( xSignStream, UNO_QUERY );
429 ImplViewSignatures( rxStorage, xStream, eMode, bReadOnly );
432bool DocumentDigitalSignatures::ImplViewSignatures(
433 const Reference< css::embed::XStorage >& rxStorage,
const Reference< css::io::XStream >& xSignStream,
436 bool bChanges =
false;
437 auto xSignaturesDialog = std::make_shared<DigitalSignaturesDialog>(
439 m_bHasDocumentSignature);
440 bool bInit = xSignaturesDialog->Init();
441 SAL_WARN_IF( !bInit,
"xmlsecurity.comp",
"Error initializing security context!" );
444 xSignaturesDialog->SetStorage(rxStorage);
446 xSignaturesDialog->SetSignatureStream( xSignStream );
450 xSignaturesDialog->beforeRun();
454 else if (xSignaturesDialog->run() == RET_OK)
456 if (xSignaturesDialog->SignaturesChanged())
460 if ( rxStorage.is() && !xSignStream.is() )
462 uno::Reference< embed::XTransactedObject > xTrans( rxStorage, uno::UNO_QUERY );
471 VclMessageType::Warning, VclButtonsType::Ok,
472 XsResId(RID_XMLSECWB_NO_MOZILLA_PROFILE)));
479Sequence< css::security::DocumentSignatureInformation >
480DocumentDigitalSignatures::ImplVerifySignatures(
481 const Reference< css::embed::XStorage >& rxStorage,
486 bool bInit = aSignatureManager.init();
488 SAL_WARN_IF(!bInit,
"xmlsecurity.comp",
"Error initializing security context!");
495 if (xSignStream.is())
503 SAL_WARN(
"xmlsecurity.comp",
"Error, no XStorage provided");
504 return Sequence<css::security::DocumentSignatureInformation>();
508 Reference< io::XInputStream > xInputStream = xSignStream;
510 if ( !xInputStream.is() )
517 if (!xInputStream.is() && aStreamHelper.
nStorageFormat != embed::StorageFormats::OFOPXML)
522 rSignatureHelper.
SetStorage(rxStorage, m_sODFVersion);
524 rSignatureHelper.
StartMission(aSignatureManager.getSecurityContext());
526 if (xInputStream.is())
528 else if (aStreamHelper.
nStorageFormat == embed::StorageFormats::OFOPXML)
533 uno::Reference<xml::crypto::XSecurityEnvironment> xSecEnv = aSignatureManager.getSecurityEnvironment();
534 uno::Reference<xml::crypto::XSecurityEnvironment> xGpgSecEnv = aSignatureManager.getGpgSecurityEnvironment();
537 int nInfos = aSignInfos.size();
538 Sequence< css::security::DocumentSignatureInformation >
aInfos(nInfos);
539 css::security::DocumentSignatureInformation* arInfos =
aInfos.getArray();
541 for (
int n = 0;
n < nInfos; ++
n)
545 const std::vector<OUString> aElementsToBeVerified
549 css::security::DocumentSignatureInformation& rSigInfo = arInfos[
n];
553 std::vector<uno::Reference<XCertificate>> certs(
558 rSigInfo.CertificateStatus = css::security::CertificateValidity::INVALID;
562 rSigInfo.Signer = certs.back();
570 rSigInfo.CertificateStatus = xSecEnv->verifyCertificate(
573 catch (SecurityException&)
575 SAL_WARN(
"xmlsecurity.comp",
"Verification of certificate failed");
576 rSigInfo.CertificateStatus = css::security::CertificateValidity::INVALID;
585 rSigInfo.Signer = xGpgSecEnv->getCertificate(
587 rSigInfo.CertificateStatus = xGpgSecEnv->verifyCertificate(
588 rSigInfo.Signer, Sequence<Reference<css::security::XCertificate>>());
595 rSigInfo.SignatureDate = aDate.GetDate();
598 rSigInfo.SignatureIsValid
599 = (rInfo.
nStatus == css::xml::crypto::SecurityOperationStatus_OPERATION_SUCCEEDED);
612 if (rSigInfo.SignatureIsValid
613 && aStreamHelper.
nStorageFormat != embed::StorageFormats::OFOPXML)
616 aElementsToBeVerified, rInfo, mode);
620 if (aStreamHelper.
nStorageFormat == embed::StorageFormats::OFOPXML)
621 rSigInfo.PartialDocumentSignature =
true;
623 rSigInfo.PartialDocumentSignature
632void DocumentDigitalSignatures::manageTrustedSources( )
639 Reference< css::xml::crypto::XSecurityEnvironment > xSecEnv;
642 if (aSignatureManager.init())
649void DocumentDigitalSignatures::showCertificate(
650 const Reference< css::security::XCertificate >& Certificate )
654 bool bInit = aSignatureManager.
init();
656 SAL_WARN_IF( !bInit,
"xmlsecurity.comp",
"Error initializing security context!" );
665sal_Bool DocumentDigitalSignatures::isAuthorTrusted(
666 const Reference<css::security::XCertificate>& xAuthor)
676 return std::any_of(aTrustedAuthors.begin(), aTrustedAuthors.end(),
678 if (!xmlsecurity::EqualDistinguishedNames(rAuthor.SubjectName, xAuthor->getIssuerName(), xmlsecurity::NOCOMPAT))
680 if (rAuthor.SerialNumber != sSerialNum)
683 DocumentSignatureManager aSignatureManager(mxCtx, {});
684 if (!aSignatureManager.init())
686 uno::Reference<css::security::XCertificate> xCert = aSignatureManager.getSecurityEnvironment()->createCertificateFromAscii(rAuthor.RawData);
688 auto pAuthor =
dynamic_cast<xmlsecurity::Certificate*
>(xAuthor.get());
689 auto pCert =
dynamic_cast<xmlsecurity::Certificate*
>(xCert.get());
690 if (pAuthor && pCert)
691 return pCert->getSHA256Thumbprint() == pAuthor->getSHA256Thumbprint();
693 return xCert->getSHA1Thumbprint() == xAuthor->getSHA1Thumbprint();
697uno::Sequence<Reference<css::security::XCertificate>>
698DocumentDigitalSignatures::chooseCertificatesImpl(std::map<OUString, OUString>& rProperties,
700 const CertificateKind certificateKind)
702 std::vector< Reference< css::xml::crypto::XXMLSecurityContext > > xSecContexts;
705 if (aSignatureManager.init()) {
706 xSecContexts.push_back(aSignatureManager.getSecurityContext());
708 if (certificateKind == CertificateKind_NONE || certificateKind == CertificateKind_OPENPGP)
709 xSecContexts.push_back(aSignatureManager.getGpgSecurityContext());
714 if (aChooser.run() != RET_OK)
715 return { Reference< css::security::XCertificate >(
nullptr) };
717 uno::Sequence< Reference< css::security::XCertificate > > xCerts = aChooser.GetSelectedCertificates();
718 rProperties[
"Description"] = aChooser.GetDescription();
719 rProperties[
"Usage"] = aChooser.GetUsageText();
724Reference< css::security::XCertificate > DocumentDigitalSignatures::chooseCertificate(OUString& rDescription)
726 return chooseSigningCertificate( rDescription );
729Reference< css::security::XCertificate > DocumentDigitalSignatures::chooseSigningCertificate(OUString& rDescription)
732 Reference< css::security::XCertificate > xCert = chooseCertificatesImpl( aProperties,
UserAction::Sign )[0];
737Reference< css::security::XCertificate > DocumentDigitalSignatures::selectSigningCertificate(OUString& rDescription)
740 Reference< css::security::XCertificate > xCert = chooseCertificatesImpl( aProperties,
UserAction::SelectSign )[0];
745Reference<css::security::XCertificate>
746DocumentDigitalSignatures::selectSigningCertificateWithType(
const CertificateKind certificateKind,
747 OUString& rDescription)
750 Reference<css::security::XCertificate> xCert
756css::uno::Sequence< Reference< css::security::XCertificate > > DocumentDigitalSignatures::chooseEncryptionCertificate()
759 uno::Sequence< Reference< css::security::XCertificate > > aCerts=
761 if (aCerts.getLength() == 1 && !aCerts[0].is())
763 return uno::Sequence< Reference< css::security::XCertificate > >();
768css::uno::Reference< css::security::XCertificate > DocumentDigitalSignatures::chooseCertificateWithProps(Sequence<::com::sun::star::beans::PropertyValue>& rProperties)
773 std::vector<css::beans::PropertyValue> vec;
775 for (
const auto& pair : aProperties)
784sal_Bool DocumentDigitalSignatures::isLocationTrusted(
const OUString& Location )
789void DocumentDigitalSignatures::addAuthorToTrustedSources(
790 const Reference< css::security::XCertificate >& Author )
796 OUStringBuffer aStrBuffer;
798 aNewCert.
RawData = aStrBuffer.makeStringAndClear();
801 aTrustedAuthors.push_back( aNewCert );
805void DocumentDigitalSignatures::addLocationToTrustedSources(
const OUString& Location )
808 aSecURLs.push_back(Location);
813sal_Bool DocumentDigitalSignatures::signDocumentWithCertificate(
814 css::uno::Reference<css::security::XCertificate>
const & xCertificate,
815 css::uno::Reference<css::embed::XStorage>
const & xStorage,
816 css::uno::Reference<css::io::XStream>
const & xStream)
818 uno::Reference<frame::XModel>
xModel;
819 return signWithCertificateImpl(xModel, xCertificate, xStorage, xStream,
823bool DocumentDigitalSignatures::SignModelWithCertificate(
824 const uno::Reference<frame::XModel>& xModel,
825 const css::uno::Reference<css::security::XCertificate>& xCertificate,
826 const css::uno::Reference<css::embed::XStorage>& xStorage,
827 const css::uno::Reference<css::io::XStream>& xStream)
829 return signWithCertificateImpl(xModel, xCertificate, xStorage, xStream,
833sal_Bool DocumentDigitalSignatures::signPackageWithCertificate(
834 css::uno::Reference<css::security::XCertificate>
const& xCertificate,
835 css::uno::Reference<css::embed::XStorage>
const& xStorage,
836 css::uno::Reference<css::io::XStream>
const& xStream)
838 uno::Reference<frame::XModel>
xModel;
839 return signWithCertificateImpl(xModel, xCertificate, xStorage, xStream,
843sal_Bool DocumentDigitalSignatures::signScriptingContentWithCertificate(
844 css::uno::Reference<css::security::XCertificate>
const& xCertificate,
845 css::uno::Reference<css::embed::XStorage>
const& xStorage,
846 css::uno::Reference<css::io::XStream>
const& xStream)
848 uno::Reference<frame::XModel>
xModel;
849 return signWithCertificateImpl(xModel, xCertificate, xStorage, xStream,
853bool DocumentDigitalSignatures::signWithCertificateImpl(
854 const uno::Reference<frame::XModel>& xModel,
855 css::uno::Reference<css::security::XCertificate>
const& xCertificate,
856 css::uno::Reference<css::embed::XStorage>
const& xStorage,
859 OSL_ENSURE(!m_sODFVersion.isEmpty(),
860 "DocumentDigitalSignatures: ODF Version not set, assuming minimum 1.2");
864 if (!aSignatureManager.init())
867 aSignatureManager.setStore(xStorage);
868 aSignatureManager.getSignatureHelper().SetStorage(xStorage, m_sODFVersion);
869 aSignatureManager.setSignatureStream(xStream);
870 aSignatureManager.setModel(xModel);
872 Reference<XXMLSecurityContext> xSecurityContext;
873 Reference<XServiceInfo> xServiceInfo(xCertificate, UNO_QUERY);
874 if (xServiceInfo->getImplementationName()
875 ==
"com.sun.star.xml.security.gpg.XCertificate_GpgImpl")
876 xSecurityContext = aSignatureManager.getGpgSecurityContext();
878 xSecurityContext = aSignatureManager.getSecurityContext();
880 sal_Int32 nSecurityId;
882 bool bSuccess = aSignatureManager.add(xCertificate, xSecurityContext,
"", nSecurityId,
true);
886 aSignatureManager.read(
true,
false);
887 aSignatureManager.write(
true);
889 if (xStorage.is() && !
xStream.is())
891 uno::Reference<embed::XTransactedObject> xTransaction(xStorage, uno::UNO_QUERY);
892 xTransaction->commit();
898extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface*
900 uno::XComponentContext* pCtx, uno::Sequence<uno::Any>
const& )
902 return cppu::acquire(
903 new DocumentDigitalSignatures(uno::Reference<uno::XComponentContext>(pCtx)));
PropertiesInfo aProperties
static weld::Window * GetFrameWeld(const css::uno::Reference< css::awt::XWindow > &rWindow)
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage, const ILibreOfficeKitNotifier *pNotifier=nullptr)
Manages signatures (addition, removal), used by DigitalSignaturesDialog.
bool init()
Attempts to initialize the platform-specific crypto.
css::uno::Reference< css::xml::crypto::XSecurityEnvironment > getSecurityEnvironment()
Get the security environment.
Handles signatures of a PDF file.
bool ReadAndVerifySignature(const css::uno::Reference< css::io::XInputStream > &xInputStream)
css::uno::Sequence< css::security::DocumentSignatureInformation > GetDocumentSignatureInformations(const css::uno::Reference< css::xml::crypto::XSecurityEnvironment > &xSecEnv) const
bool ReadAndVerifySignatureStorage(const css::uno::Reference< css::embed::XStorage > &xStorage, bool bCacheLastSignature=true)
Read and verify OOXML signatures.
SignatureInformations GetSignatureInformations() const
bool ReadAndVerifySignature(const css::uno::Reference< css::io::XInputStream > &xInputStream)
void StartMission(const css::uno::Reference< css::xml::crypto::XXMLSecurityContext > &xSecurityContext)
void SetStorage(const css::uno::Reference< css::embed::XStorage > &rxStorage, std::u16string_view sODFVersion)
std::vector< css::uno::Reference< css::security::XCertificate > > CheckAndUpdateSignatureInformation(css::uno::Reference< css::xml::crypto::XSecurityEnvironment > const &xSecEnv, SignatureInformation const &rInfo)
ImplVerifySignature calls this to figure out which X509Data is the signing certificate and update the...
static void encode(OUStringBuffer &aStrBuffer, const css::uno::Sequence< sal_Int8 > &aPass)
static bool runAsync(const std::shared_ptr< DialogController > &rController, const std::function< void(sal_Int32)> &)
constexpr OUStringLiteral ODFVER_010_TEXT
constexpr OUStringLiteral ODFVER_013_TEXT
SAL_DLLPUBLIC_EXPORT uno::XInterface * com_sun_star_security_DocumentDigitalSignatures_get_implementation(uno::XComponentContext *pCtx, uno::Sequence< uno::Any > const &)
DocumentSignatureAlgorithm
Sequence< PropertyValue > aArguments
Reference< XComponentContext > mxCtx
#define SAL_WARN_IF(condition, area, stream)
#define SAL_WARN(area, stream)
if(aStr !=aBuf) UpdateName_Impl(m_xFollowLb.get()
OUString GetPackageSignatureDefaultStreamName()
SignatureStreamHelper OpenSignatureStream(const css::uno::Reference< css::embed::XStorage > &rxStore, sal_Int32 nOpenMode, DocumentSignatureMode eDocSigMode)
bool checkIfAllFilesAreSigned(const ::std::vector< OUString > &sElementList, const SignatureInformation &sigInfo, const DocumentSignatureAlgorithm alg)
OUString GetDocumentContentSignatureDefaultStreamName()
DocumentSignatureAlgorithm getDocumentAlgorithm(std::u16string_view sODFVersion, const SignatureInformation &sigInfo)
bool isOOo3_2_Signature(const SignatureInformation &sigInfo)
std::vector< OUString > CreateElementList(const css::uno::Reference< css::embed::XStorage > &rxStore, DocumentSignatureMode eMode, const DocumentSignatureAlgorithm mode)
OUString GetScriptingContentSignatureDefaultStreamName()
bool isTrustedLocationUri(OUString const &uri)
void SetSecureURLs(std::vector< OUString > &&urlList)
void SetTrustedAuthors(const std::vector< Certificate > &rAuthors)
std::vector< SvtSecurityOptions::Certificate > GetTrustedAuthors()
std::vector< OUString > GetSecureURLs()
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
OUString bigIntegerToNumericString(const Sequence< sal_Int8 > &integer)
Sequence< sal_Int8 > numericStringToBigInteger(std::u16string_view numeral)
Sequence< Property > aInfos
OUString XsResId(TranslateId aId)
::std::vector< SignatureInformation > SignatureInformations
css::uno::Reference< css::io::XStream > xSignatureStream
css::uno::Reference< css::embed::XStorage > xSignatureStorage
sal_Int32 nStorageFormat
If this is embed::StorageFormats::OFOPXML, then it's expected that xSignatureStream is an empty refer...
Reference< XModel > xModel