[Libreoffice-commits] core.git: bin/update_pch compilerplugins/clang offapi/com offapi/UnoApi_offapi.mk postprocess/Rdb_services.mk Repository.mk xmlsecurity/inc xmlsecurity/Library_xmlsecurity.mk xmlsecurity/Library_xsec_gpg.mk xmlsecurity/Module_xmlsecurity.mk xmlsecurity/README xmlsecurity/source xmlsecurity/util
Samuel Mehrbrodt
Samuel.Mehrbrodt at cib.de
Sat Mar 4 10:27:15 UTC 2017
Repository.mk | 1
bin/update_pch | 1
compilerplugins/clang/plugin.cxx | 3
offapi/UnoApi_offapi.mk | 7
offapi/com/sun/star/xml/crypto/gpg/GpgSEInitializer.idl | 28 +
offapi/com/sun/star/xml/crypto/gpg/GpgSecurityEnvironment.idl | 28 +
offapi/com/sun/star/xml/crypto/gpg/GpgXMLEncryption.idl | 34 +
offapi/com/sun/star/xml/crypto/gpg/GpgXMLSecurityContext.idl | 28 +
offapi/com/sun/star/xml/crypto/gpg/GpgXMLSignature.idl | 34 +
postprocess/Rdb_services.mk | 1
xmlsecurity/Library_xmlsecurity.mk | 8
xmlsecurity/Library_xsec_gpg.mk | 58 ++
xmlsecurity/Module_xmlsecurity.mk | 6
xmlsecurity/README | 2
xmlsecurity/inc/certificatechooser.hxx | 15
xmlsecurity/inc/documentsignaturemanager.hxx | 3
xmlsecurity/inc/pch/precompiled_xsec_gpg.cxx | 13
xmlsecurity/inc/pch/precompiled_xsec_gpg.hxx | 35 +
xmlsecurity/source/component/documentdigitalsignatures.cxx | 10
xmlsecurity/source/dialogs/certificatechooser.cxx | 110 ++---
xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx | 6
xmlsecurity/source/dialogs/resourcemanager.cxx | 16
xmlsecurity/source/gpg/CertificateImpl.cxx | 191 +++++++++
xmlsecurity/source/gpg/CertificateImpl.hxx | 107 +++++
xmlsecurity/source/gpg/CipherContext.cxx | 30 +
xmlsecurity/source/gpg/CipherContext.hxx | 33 +
xmlsecurity/source/gpg/DigestContext.cxx | 30 +
xmlsecurity/source/gpg/DigestContext.hxx | 31 +
xmlsecurity/source/gpg/GpgComponentFactory.cxx | 70 +++
xmlsecurity/source/gpg/SEInitializer.cxx | 99 +++++
xmlsecurity/source/gpg/SEInitializer.hxx | 68 +++
xmlsecurity/source/gpg/SecurityEnvironment.cxx | 198 ++++++++++
xmlsecurity/source/gpg/SecurityEnvironment.hxx | 108 +++++
xmlsecurity/source/gpg/XMLEncryption.cxx | 86 ++++
xmlsecurity/source/gpg/XMLEncryption.hxx | 77 +++
xmlsecurity/source/gpg/XMLSecurityContext.cxx | 122 ++++++
xmlsecurity/source/gpg/XMLSecurityContext.hxx | 88 ++++
xmlsecurity/source/gpg/XMLSignature.cxx | 89 ++++
xmlsecurity/source/gpg/XMLSignature.hxx | 77 +++
xmlsecurity/source/helper/documentsignaturemanager.cxx | 21 -
xmlsecurity/util/xsec_gpg.component | 36 +
41 files changed, 1940 insertions(+), 68 deletions(-)
New commits:
commit 88ac77c0bc21accfd6f5c404217c3c2aaef2d674
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date: Thu Feb 2 17:33:30 2017 +0100
gpg4libre: List and view GPG keys
* Add GPG implementation of css::xml::crypto UNO interfaces (part of that is only stub atm)
* List gpg keys along with other certificates
* Viewing gpg certificates: Not all properties are implemented yet
Change-Id: I7f60b26efe949a94bf8fe1b8d4d428002c2995b1
Reviewed-on: https://gerrit.libreoffice.org/33843
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Siegmund Gorr <siegmund.gorr at cib.de>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/Repository.mk b/Repository.mk
index bf5f9a8..6b169bf 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -624,6 +624,7 @@ $(eval $(call gb_Helper_register_libraries_for_install,PLAINLIBS_OOO,ooo, \
xmlsecurity \
xsec_fw \
xsec_xmlsec \
+ $(if $(filter-out MACOSX WNT,$(OS)),xsec_gpg) \
xstor \
$(if $(filter $(OS),MACOSX), \
macab1 \
diff --git a/bin/update_pch b/bin/update_pch
index aba7b24..7e789c1 100755
--- a/bin/update_pch
+++ b/bin/update_pch
@@ -124,6 +124,7 @@ DEFAULTS = \
'xmlsecurity.xmlsecurity' : ( 6, EXCLUDE, INCLUDE, INCLUDE), # 5.1
'xmlsecurity.xsec_fw' : ( 2, EXCLUDE, INCLUDE, EXCLUDE), # 2.7
'xmlsecurity.xsec_xmlsec' : ( 2, EXCLUDE, INCLUDE, INCLUDE), # 4.4
+ 'xmlsecurity.xsec_gpg' : ( 2, EXCLUDE, INCLUDE, INCLUDE), # ?
}
def remove_rare(raw, min_use=-1):
diff --git a/compilerplugins/clang/plugin.cxx b/compilerplugins/clang/plugin.cxx
index d5b2401..85d76cc 100644
--- a/compilerplugins/clang/plugin.cxx
+++ b/compilerplugins/clang/plugin.cxx
@@ -43,7 +43,8 @@ bool Plugin::ignoreLocation( SourceLocation loc )
const char* bufferName = compiler.getSourceManager().getPresumedLoc( expansionLoc ).getFilename();
if (bufferName == NULL
|| strncmp( bufferName, SRCDIR "/external/", strlen( SRCDIR "/external/" )) == 0
- || strcmp( bufferName, SRCDIR "/sdext/source/pdfimport/wrapper/keyword_list" ) == 0 )
+ || strcmp( bufferName, SRCDIR "/sdext/source/pdfimport/wrapper/keyword_list" ) == 0
+ || strncmp( bufferName, SRCDIR "/xmlsecurity/source/gpg", strlen( SRCDIR "/xmlsecurity/source/gpg" )) == 0 )
// workdir/CustomTarget/sdext/pdfimport/hash.cxx is generated from
// sdext/source/pdfimport/wrapper/keyword_list by gperf, which
// inserts various #line directives denoting the latter into the
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index 49602b9..7ae02d6 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -463,6 +463,13 @@ $(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/xml/crypto,\
SEInitializer \
XMLSecurityContext \
))
+$(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/xml/crypto/gpg,\
+ GpgSecurityEnvironment \
+ GpgSEInitializer \
+ GpgXMLEncryption \
+ GpgXMLSecurityContext \
+ GpgXMLSignature \
+))
$(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,com/sun/star/xml/dom,\
DocumentBuilder \
SAXDocumentBuilder \
diff --git a/offapi/com/sun/star/xml/crypto/gpg/GpgSEInitializer.idl b/offapi/com/sun/star/xml/crypto/gpg/GpgSEInitializer.idl
new file mode 100644
index 0000000..ac8fc58
--- /dev/null
+++ b/offapi/com/sun/star/xml/crypto/gpg/GpgSEInitializer.idl
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __com_sun_star_xml_crypto_gpg_GpgSEInitializer_idl_
+#define __com_sun_star_xml_crypto_gpg_GpgSEInitializer_idl_
+
+#include <com/sun/star/xml/crypto/XSEInitializer.idl>
+
+module com { module sun { module star { module xml { module crypto { module gpg {
+
+/**
+ * Service implementing XSEInitializer
+ *
+ * @since LibreOffice 5.4
+ */
+service GpgSEInitializer : XSEInitializer;
+
+} ; } ; } ; } ; } ; } ;
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/offapi/com/sun/star/xml/crypto/gpg/GpgSecurityEnvironment.idl b/offapi/com/sun/star/xml/crypto/gpg/GpgSecurityEnvironment.idl
new file mode 100644
index 0000000..ef82d8d
--- /dev/null
+++ b/offapi/com/sun/star/xml/crypto/gpg/GpgSecurityEnvironment.idl
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __com_sun_star_xml_crypto_gpg_GpgSecurityEnvironment_idl_
+#define __com_sun_star_xml_crypto_gpg_GpgSecurityEnvironment_idl_
+
+#include <com/sun/star/xml/crypto/XSecurityEnvironment.idl>
+
+module com { module sun { module star { module xml { module crypto { module gpg {
+
+/**
+ * Service implementing XSecurityEnvironment
+ *
+ * @since LibreOffice 5.4
+ */
+service GpgSecurityEnvironment : XSecurityEnvironment;
+
+} ; } ; } ; } ; } ; } ;
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/offapi/com/sun/star/xml/crypto/gpg/GpgXMLEncryption.idl b/offapi/com/sun/star/xml/crypto/gpg/GpgXMLEncryption.idl
new file mode 100644
index 0000000..e9d00b2
--- /dev/null
+++ b/offapi/com/sun/star/xml/crypto/gpg/GpgXMLEncryption.idl
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __com_sun_star_xml_crypto_gpg_GpgXMLEncryption_idl_
+#define __com_sun_star_xml_crypto_gpg_GpgXMLEncryption_idl_
+
+#include <com/sun/star/uno/XInterface.idl>
+#include <com/sun/star/uno/Exception.idl>
+#include <com/sun/star/xml/crypto/XXMLEncryption.idl>
+#include <com/sun/star/lang/XInitialization.idl>
+
+module com { module sun { module star { module xml { module crypto { module gpg {
+
+/**
+ * Service implementing XXMLEncryption
+ *
+ * @since LibreOffice 5.4
+ */
+service GpgXMLEncryption {
+ interface com::sun::star::xml::crypto::XXMLEncryption ;
+ interface com::sun::star::lang::XInitialization ;
+} ;
+
+} ; } ; } ; } ; } ; } ;
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/offapi/com/sun/star/xml/crypto/gpg/GpgXMLSecurityContext.idl b/offapi/com/sun/star/xml/crypto/gpg/GpgXMLSecurityContext.idl
new file mode 100644
index 0000000..2ada16f
--- /dev/null
+++ b/offapi/com/sun/star/xml/crypto/gpg/GpgXMLSecurityContext.idl
@@ -0,0 +1,28 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __com_sun_star_xml_crypto_gpg_GpgXMLSecurityContext_idl_
+#define __com_sun_star_xml_crypto_gpg_GpgXMLSecurityContext_idl_
+
+#include <com/sun/star/xml/crypto/XXMLSecurityContext.idl>
+
+module com { module sun { module star { module xml { module crypto { module gpg {
+
+/**
+ * Service implementing XXMLSecurityContext
+ *
+ * @since LibreOffice 5.4
+ */
+service GpgXMLSecurityContext : XXMLSecurityContext;
+
+} ; } ; } ; } ; } ; } ;
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/offapi/com/sun/star/xml/crypto/gpg/GpgXMLSignature.idl b/offapi/com/sun/star/xml/crypto/gpg/GpgXMLSignature.idl
new file mode 100644
index 0000000..eda7318
--- /dev/null
+++ b/offapi/com/sun/star/xml/crypto/gpg/GpgXMLSignature.idl
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef __com_sun_star_xml_crypto_gpg_GpgXmlSignature_idl_
+#define __com_sun_star_xml_crypto_gpg_GpgXmlSignature_idl_
+
+#include <com/sun/star/uno/XInterface.idl>
+#include <com/sun/star/uno/Exception.idl>
+#include <com/sun/star/xml/crypto/XXMLSignature.idl>
+#include <com/sun/star/lang/XInitialization.idl>
+
+module com { module sun { module star { module xml { module crypto { module gpg {
+
+/**
+ * Service implementing XXMLSignature
+ *
+ * @since LibreOffice 5.4
+ */
+service GpgXMLSignature {
+ interface com::sun::star::xml::crypto::XXMLSignature ;
+ interface com::sun::star::lang::XInitialization ;
+} ;
+
+} ; } ; } ; } ; } ; } ;
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/postprocess/Rdb_services.mk b/postprocess/Rdb_services.mk
index a75315a..4e67e89 100644
--- a/postprocess/Rdb_services.mk
+++ b/postprocess/Rdb_services.mk
@@ -109,6 +109,7 @@ $(eval $(call gb_Rdb_add_components,services,\
xmloff/source/transform/xof \
xmloff/util/xo \
xmlscript/util/xmlscript \
+ $(if $(filter-out MACOSX WNT,$(OS)),xmlsecurity/util/xsec_gpg) \
$(if $(ENABLE_NSS), \
xmlsecurity/util/xmlsecurity \
xmlsecurity/util/xsec_xmlsec$(if $(filter WNT,$(OS)),.windows)) \
diff --git a/xmlsecurity/Library_xmlsecurity.mk b/xmlsecurity/Library_xmlsecurity.mk
index b8144353..3add46f 100644
--- a/xmlsecurity/Library_xmlsecurity.mk
+++ b/xmlsecurity/Library_xmlsecurity.mk
@@ -20,7 +20,7 @@ $(eval $(call gb_Library_add_defs,xmlsecurity,\
-DXMLSECURITY_DLLIMPLEMENTATION \
))
-$(eval $(call gb_Library_use_external,xmlsecurity,boost_headers))
+$(eval $(call gb_Library_use_externals,xmlsecurity,boost_headers))
$(eval $(call gb_Library_set_precompiled_header,xmlsecurity,$(SRCDIR)/xmlsecurity/inc/pch/precompiled_xmlsecurity))
@@ -46,6 +46,12 @@ $(eval $(call gb_Library_use_libraries,xmlsecurity,\
$(gb_UWINAPI) \
))
+ifneq ($(filter-out WNT MACOSX,$(OS)),)
+$(eval $(call gb_Library_use_libraries,xmlsecurity,\
+ xsec_gpg \
+))
+endif
+
$(eval $(call gb_Library_add_exception_objects,xmlsecurity,\
xmlsecurity/source/component/certificatecontainer \
xmlsecurity/source/component/documentdigitalsignatures \
diff --git a/xmlsecurity/Library_xsec_gpg.mk b/xmlsecurity/Library_xsec_gpg.mk
new file mode 100644
index 0000000..7f6e814
--- /dev/null
+++ b/xmlsecurity/Library_xsec_gpg.mk
@@ -0,0 +1,58 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_Library_Library,xsec_gpg))
+
+$(eval $(call gb_Library_set_componentfile,xsec_gpg,xmlsecurity/util/xsec_gpg))
+
+$(eval $(call gb_Library_set_include,xsec_gpg,\
+ $$(INCLUDE) \
+ -I$(SRCDIR)/xmlsecurity/inc \
+ -I$(SRCDIR)/xmlsecurity/source/gpg \
+))
+
+$(eval $(call gb_Library_add_defs,xsec_gpg,\
+ -DXSECFW_DLLIMPLEMENTATION \
+ -DXMLSEC_CRYPTO_GPG \
+))
+
+$(eval $(call gb_Library_use_custom_headers,xsec_gpg,\
+ officecfg/registry \
+))
+
+$(eval $(call gb_Library_use_sdk_api,xsec_gpg))
+
+$(eval $(call gb_Library_set_precompiled_header,xsec_gpg,$(SRCDIR)/xmlsecurity/inc/pch/precompiled_xsec_gpg))
+
+$(eval $(call gb_Library_use_externals,xsec_gpg,gpgmepp))
+
+$(eval $(call gb_Library_use_libraries,xsec_gpg,\
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ svl \
+ tl \
+ xo \
+ $(gb_UWINAPI) \
+))
+
+$(eval $(call gb_Library_add_exception_objects,xsec_gpg,\
+ xmlsecurity/source/gpg/CertificateImpl \
+ xmlsecurity/source/gpg/CipherContext \
+ xmlsecurity/source/gpg/DigestContext \
+ xmlsecurity/source/gpg/GpgComponentFactory \
+ xmlsecurity/source/gpg/SecurityEnvironment \
+ xmlsecurity/source/gpg/SEInitializer \
+ xmlsecurity/source/gpg/XMLEncryption \
+ xmlsecurity/source/gpg/XMLSecurityContext \
+ xmlsecurity/source/gpg/XMLSignature \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/xmlsecurity/Module_xmlsecurity.mk b/xmlsecurity/Module_xmlsecurity.mk
index 4fca006..d1642b95 100644
--- a/xmlsecurity/Module_xmlsecurity.mk
+++ b/xmlsecurity/Module_xmlsecurity.mk
@@ -19,6 +19,12 @@ $(eval $(call gb_Module_add_targets,xmlsecurity,\
Library_xsec_xmlsec \
))
+ifneq ($(filter-out WNT MACOSX,$(OS)),)
+$(eval $(call gb_Module_add_targets,xmlsecurity,\
+ Library_xsec_gpg \
+))
+endif
+
$(eval $(call gb_Module_add_slowcheck_targets,xmlsecurity,\
CppunitTest_xmlsecurity_signing \
CppunitTest_xmlsecurity_pdfsigning \
diff --git a/xmlsecurity/README b/xmlsecurity/README
index 5eec54a..52a4790 100644
--- a/xmlsecurity/README
+++ b/xmlsecurity/README
@@ -1,4 +1,4 @@
Stuff for document signing.
-This code provides dialogs, and infrastructure wrapping libxmlsec that
+This code provides dialogs, and infrastructure wrapping libxmlsec and gpgme that
implements document signing.
diff --git a/xmlsecurity/inc/certificatechooser.hxx b/xmlsecurity/inc/certificatechooser.hxx
index 45453b2..efe1f40 100644
--- a/xmlsecurity/inc/certificatechooser.hxx
+++ b/xmlsecurity/inc/certificatechooser.hxx
@@ -40,12 +40,19 @@ namespace xml { namespace crypto {
class HeaderBar;
+struct UserData
+{
+ css::uno::Reference<css::security::XCertificate> xCertificate;
+ css::uno::Reference<css::xml::crypto::XSecurityEnvironment> xSecurityEnvironment;
+};
+
class CertificateChooser : public ModalDialog
{
private:
css::uno::Reference< css::uno::XComponentContext > mxCtx;
- css::uno::Reference< css::xml::crypto::XSecurityEnvironment > mxSecurityEnvironment;
+ std::vector< css::uno::Reference< css::xml::crypto::XSecurityEnvironment > > mxSecurityEnvironments;
css::uno::Sequence< css::uno::Reference< css::security::XCertificate > > maCerts;
+ std::vector<std::shared_ptr<UserData>> mvUserData;
VclPtr<SvSimpleTable> m_pCertLB;
VclPtr<PushButton> m_pViewBtn;
@@ -54,8 +61,6 @@ private:
bool mbInitialized;
- sal_uInt16 GetSelectedEntryPos() const;
-
DECL_LINK(ViewButtonHdl, Button*, void);
DECL_LINK(CertificateHighlightHdl, SvTreeListBox*, void );
DECL_LINK(CertificateSelectHdl, SvTreeListBox*, bool );
@@ -66,7 +71,9 @@ private:
void HandleOneUsageBit(OUString& string, int& bits, int bit, const char *name);
public:
- CertificateChooser(vcl::Window* pParent, css::uno::Reference< css::uno::XComponentContext>& rxCtx, css::uno::Reference< css::xml::crypto::XSecurityEnvironment >& rxSecurityEnvironment);
+ CertificateChooser(vcl::Window* pParent,
+ css::uno::Reference< css::uno::XComponentContext>& rxCtx,
+ std::vector< css::uno::Reference< css::xml::crypto::XSecurityEnvironment > >& rxSecurityEnvironments);
virtual ~CertificateChooser() override;
virtual void dispose() override;
diff --git a/xmlsecurity/inc/documentsignaturemanager.hxx b/xmlsecurity/inc/documentsignaturemanager.hxx
index af34654..2039b7f 100644
--- a/xmlsecurity/inc/documentsignaturemanager.hxx
+++ b/xmlsecurity/inc/documentsignaturemanager.hxx
@@ -49,6 +49,8 @@ public:
css::uno::Reference<css::embed::XStorage> mxTempSignatureStorage;
css::uno::Reference<css::xml::crypto::XSEInitializer> mxSEInitializer;
css::uno::Reference<css::xml::crypto::XXMLSecurityContext> mxSecurityContext;
+ css::uno::Reference<css::xml::crypto::XSEInitializer> mxGpgSEInitializer;
+ css::uno::Reference<css::xml::crypto::XXMLSecurityContext> mxGpgSecurityContext;
DocumentSignatureManager(const css::uno::Reference<css::uno::XComponentContext>& xContext, DocumentSignatureMode eMode);
~DocumentSignatureManager();
@@ -76,6 +78,7 @@ public:
bool init();
/// Get the security environment.
css::uno::Reference<css::xml::crypto::XSecurityEnvironment> getSecurityEnvironment();
+ css::uno::Reference<css::xml::crypto::XSecurityEnvironment> getGpgSecurityEnvironment();
};
#endif // INCLUDED_XMLSECURITY_INC_DOCUMENTSIGNATUREMANAGER_HXX
diff --git a/xmlsecurity/inc/pch/precompiled_xsec_gpg.cxx b/xmlsecurity/inc/pch/precompiled_xsec_gpg.cxx
new file mode 100644
index 0000000..5093ea5
--- /dev/null
+++ b/xmlsecurity/inc/pch/precompiled_xsec_gpg.cxx
@@ -0,0 +1,13 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "precompiled_xsec_gpg.hxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+
diff --git a/xmlsecurity/inc/pch/precompiled_xsec_gpg.hxx b/xmlsecurity/inc/pch/precompiled_xsec_gpg.hxx
new file mode 100644
index 0000000..1c6a9bf
--- /dev/null
+++ b/xmlsecurity/inc/pch/precompiled_xsec_gpg.hxx
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+/*
+ This file has been autogenerated by update_pch.sh. It is possible to edit it
+ manually (such as when an include file has been moved/renamed/removed). All such
+ manual changes will be rewritten by the next run of update_pch.sh (which presumably
+ also fixes all possible problems, so it's usually better to use it).
+
+ Generated on 2017-03-03 09:38:52 using:
+ ./bin/update_pch xmlsecurity/ xsec_gpg --cutoff=1 --exclude:system --include:module --include:local
+
+ If after updating build fails, use the following command to locate conflicting headers:
+ ./bin/update_pch_bisect ./xmlsecurity/inc/pch/precompiled_xsec_gpg.hxx "make xmlsecurity/.build" --find-conflicts
+*/
+
+#include <context.h>
+#include <gpgme.h>
+#include <key.h>
+#include <keylistresult.h>
+#include <list>
+#include <com/sun/star/xml/crypto/gpg/GpgSecurityEnvironment.hpp>
+#include <com/sun/star/xml/crypto/gpg/GpgXMLSecurityContext.hpp>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/component/documentdigitalsignatures.cxx b/xmlsecurity/source/component/documentdigitalsignatures.cxx
index 54b0840..34bce19 100644
--- a/xmlsecurity/source/component/documentdigitalsignatures.cxx
+++ b/xmlsecurity/source/component/documentdigitalsignatures.cxx
@@ -447,14 +447,16 @@ sal_Bool DocumentDigitalSignatures::isAuthorTrusted(
Reference< css::security::XCertificate > DocumentDigitalSignatures::chooseCertificate(OUString& rDescription)
{
- Reference< css::xml::crypto::XSecurityEnvironment > xSecEnv;
+ std::vector< Reference< css::xml::crypto::XSecurityEnvironment > > xSecEnvs;
DocumentSignatureMode eMode{};
DocumentSignatureManager aSignatureManager(mxCtx, eMode);
- if (aSignatureManager.init())
- xSecEnv = aSignatureManager.getSecurityEnvironment();
+ if (aSignatureManager.init()) {
+ xSecEnvs.push_back(aSignatureManager.getSecurityEnvironment());
+ xSecEnvs.push_back(aSignatureManager.getGpgSecurityEnvironment());
+ }
- ScopedVclPtrInstance< CertificateChooser > aChooser(nullptr, mxCtx, xSecEnv);
+ ScopedVclPtrInstance< CertificateChooser > aChooser(nullptr, mxCtx, xSecEnvs);
if (aChooser->Execute() != RET_OK)
return Reference< css::security::XCertificate >(nullptr);
diff --git a/xmlsecurity/source/dialogs/certificatechooser.cxx b/xmlsecurity/source/dialogs/certificatechooser.cxx
index 292f41e..551c863 100644
--- a/xmlsecurity/source/dialogs/certificatechooser.cxx
+++ b/xmlsecurity/source/dialogs/certificatechooser.cxx
@@ -32,23 +32,13 @@
#include <vcl/msgbox.hxx>
#include <svtools/treelistentry.hxx>
-using namespace ::com::sun::star;
+using namespace css;
-#define INVAL_SEL 0xFFFF
-
-sal_uInt16 CertificateChooser::GetSelectedEntryPos() const
-{
- sal_uInt16 nSel = INVAL_SEL;
-
- SvTreeListEntry* pSel = m_pCertLB->FirstSelected();
- if( pSel )
- nSel = (sal_uInt16) reinterpret_cast<sal_uIntPtr>( pSel->GetUserData() );
-
- return (sal_uInt16) nSel;
-}
-
-CertificateChooser::CertificateChooser(vcl::Window* _pParent, uno::Reference<uno::XComponentContext>& _rxCtx, uno::Reference<xml::crypto::XSecurityEnvironment>& _rxSecurityEnvironment)
- : ModalDialog(_pParent, "SelectCertificateDialog", "xmlsec/ui/selectcertificatedialog.ui")
+CertificateChooser::CertificateChooser(vcl::Window* _pParent,
+ uno::Reference<uno::XComponentContext>& _rxCtx,
+ std::vector< css::uno::Reference< css::xml::crypto::XSecurityEnvironment > >& rxSecurityEnvironments)
+ : ModalDialog(_pParent, "SelectCertificateDialog", "xmlsec/ui/selectcertificatedialog.ui"),
+ mvUserData()
{
get(m_pOKBtn, "ok");
get(m_pViewBtn, "viewcert");
@@ -71,7 +61,7 @@ CertificateChooser::CertificateChooser(vcl::Window* _pParent, uno::Reference<uno
m_pViewBtn->SetClickHdl( LINK( this, CertificateChooser, ViewButtonHdl ) );
mxCtx = _rxCtx;
- mxSecurityEnvironment = _rxSecurityEnvironment;
+ mxSecurityEnvironments = rxSecurityEnvironments;
mbInitialized = false;
// disable buttons
@@ -89,6 +79,7 @@ void CertificateChooser::dispose()
m_pViewBtn.clear();
m_pOKBtn.clear();
m_pDescriptionED.clear();
+ mvUserData.clear();
ModalDialog::dispose();
}
@@ -159,36 +150,44 @@ void CertificateChooser::ImplInitialize()
if ( mbInitialized )
return;
- try
+ for (auto &secEnvironment : mxSecurityEnvironments)
{
- maCerts = mxSecurityEnvironment->getPersonalCertificates();
- }
- catch (security::NoPasswordException&)
- {
- }
-
- sal_Int32 nCertificates = maCerts.getLength();
- for( sal_Int32 nCert = nCertificates; nCert; )
- {
- uno::Reference< security::XCertificate > xCert = maCerts[ --nCert ];
- // Check if we have a private key for this...
- long nCertificateCharacters = mxSecurityEnvironment->getCertificateCharacters(xCert);
+ uno::Sequence< uno::Reference< security::XCertificate > > xCerts;
+ try
+ {
+ xCerts = secEnvironment->getPersonalCertificates();
+ }
+ catch (security::NoPasswordException&)
+ {
+ }
- if (!(nCertificateCharacters & security::CertificateCharacters::HAS_PRIVATE_KEY))
+ sal_Int32 nCertificates = xCerts.getLength();
+ for( sal_Int32 nCert = nCertificates; nCert; )
{
- ::comphelper::removeElementAt( maCerts, nCert );
- nCertificates = maCerts.getLength();
+ uno::Reference< security::XCertificate > xCert = xCerts[ --nCert ];
+ // Check if we have a private key for this...
+ long nCertificateCharacters = secEnvironment->getCertificateCharacters(xCert);
+
+ if (!(nCertificateCharacters & security::CertificateCharacters::HAS_PRIVATE_KEY))
+ {
+ ::comphelper::removeElementAt( xCerts, nCert );
+ nCertificates = xCerts.getLength();
+ }
}
- }
- // fill list of certificates; the first entry will be selected
- for ( sal_Int32 nC = 0; nC < nCertificates; ++nC )
- {
- SvTreeListEntry* pEntry = m_pCertLB->InsertEntry( XmlSec::GetContentPart( maCerts[ nC ]->getSubjectName() )
- + "\t" + XmlSec::GetContentPart( maCerts[ nC ]->getIssuerName() )
- + "\t" + UsageInClearText( maCerts[ nC ]->getCertificateUsage() )
- + "\t" + XmlSec::GetDateString( maCerts[ nC ]->getNotValidAfter() ) );
- pEntry->SetUserData( reinterpret_cast<void*>(nC) ); // missuse user data as index
+ // fill list of certificates; the first entry will be selected
+ for ( sal_Int32 nC = 0; nC < nCertificates; ++nC )
+ {
+ std::shared_ptr<UserData> userData = std::make_shared<UserData>();
+ userData->xCertificate = xCerts[ nC ];
+ userData->xSecurityEnvironment = secEnvironment;
+ mvUserData.push_back(userData);
+ SvTreeListEntry* pEntry = m_pCertLB->InsertEntry( XmlSec::GetContentPart( xCerts[ nC ]->getSubjectName() )
+ + "\t" + XmlSec::GetContentPart( xCerts[ nC ]->getIssuerName() )
+ + "\t" + UsageInClearText( xCerts[ nC ]->getCertificateUsage() )
+ + "\t" + XmlSec::GetDateString( xCerts[ nC ]->getNotValidAfter() ) );
+ pEntry->SetUserData( userData.get() );
+ }
}
// enable/disable buttons
@@ -199,10 +198,12 @@ void CertificateChooser::ImplInitialize()
uno::Reference< css::security::XCertificate > CertificateChooser::GetSelectedCertificate()
{
- uno::Reference< css::security::XCertificate > xCert;
- sal_uInt16 nSelected = GetSelectedEntryPos();
- if ( nSelected < maCerts.getLength() )
- xCert = maCerts[ nSelected ];
+ SvTreeListEntry* pSel = m_pCertLB->FirstSelected();
+ if( !pSel )
+ return uno::Reference< css::security::XCertificate >();
+
+ UserData* userData = static_cast<UserData*>(pSel->GetUserData());
+ uno::Reference<security::XCertificate> xCert = userData->xCertificate;
return xCert;
}
@@ -232,12 +233,17 @@ IMPL_LINK_NOARG(CertificateChooser, ViewButtonHdl, Button*, void)
void CertificateChooser::ImplShowCertificateDetails()
{
- uno::Reference< css::security::XCertificate > xCert = GetSelectedCertificate();
- if( xCert.is() )
- {
- ScopedVclPtrInstance< CertificateViewer > aViewer( this, mxSecurityEnvironment, xCert, true );
- aViewer->Execute();
- }
+ SvTreeListEntry* pSel = m_pCertLB->FirstSelected();
+ if( !pSel )
+ return;
+
+ UserData* userData = static_cast<UserData*>(pSel->GetUserData());
+
+ if (!userData->xSecurityEnvironment.is() || !userData->xCertificate.is())
+ return;
+
+ ScopedVclPtrInstance< CertificateViewer > aViewer( this, userData->xSecurityEnvironment, userData->xCertificate, true );
+ aViewer->Execute();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
index 2373fb2..24aeca3 100644
--- a/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
+++ b/xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
@@ -383,9 +383,11 @@ IMPL_LINK_NOARG(DigitalSignaturesDialog, AddButtonHdl, Button*, void)
return;
try
{
- uno::Reference<xml::crypto::XSecurityEnvironment> xSecEnv = maSignatureManager.getSecurityEnvironment();
+ std::vector<uno::Reference<xml::crypto::XSecurityEnvironment>> xSecEnvs;
+ xSecEnvs.push_back(maSignatureManager.getSecurityEnvironment());
+ xSecEnvs.push_back(maSignatureManager.getGpgSecurityEnvironment());
- ScopedVclPtrInstance< CertificateChooser > aChooser( this, mxCtx, xSecEnv );
+ ScopedVclPtrInstance< CertificateChooser > aChooser( this, mxCtx, xSecEnvs );
if ( aChooser->Execute() == RET_OK )
{
sal_Int32 nSecurityId;
diff --git a/xmlsecurity/source/dialogs/resourcemanager.cxx b/xmlsecurity/source/dialogs/resourcemanager.cxx
index 5700619..e989af3 100644
--- a/xmlsecurity/source/dialogs/resourcemanager.cxx
+++ b/xmlsecurity/source/dialogs/resourcemanager.cxx
@@ -289,8 +289,22 @@ vector< pair< OUString, OUString> > parseDN(const OUString& rRawString)
OUString GetContentPart( const OUString& _rRawString )
{
char const * aIDs[] = { "CN", "OU", "O", "E", nullptr };
- OUString retVal;
+ bool shouldBeParsed = false;
int i = 0;
+ while ( aIDs[i] )
+ {
+ if (_rRawString.startsWith(OUString::createFromAscii(aIDs[i++])))
+ {
+ shouldBeParsed = true;
+ break;
+ }
+ }
+
+ if (!shouldBeParsed)
+ return _rRawString;
+
+ OUString retVal;
+ i = 0;
vector< pair< OUString, OUString > > vecAttrValueOfDN = parseDN(_rRawString);
while ( aIDs[i] )
{
diff --git a/xmlsecurity/source/gpg/CertificateImpl.cxx b/xmlsecurity/source/gpg/CertificateImpl.cxx
new file mode 100644
index 0000000..8c12da6
--- /dev/null
+++ b/xmlsecurity/source/gpg/CertificateImpl.cxx
@@ -0,0 +1,191 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "CertificateImpl.hxx"
+
+#include <comphelper/servicehelper.hxx>
+
+using namespace css;
+using namespace css::uno;
+using namespace css::security;
+using namespace css::util;
+
+CertificateImpl::CertificateImpl() :
+ m_pKey(nullptr)
+{
+}
+
+CertificateImpl::~CertificateImpl()
+{
+}
+
+//Methods from XCertificateImpl
+sal_Int16 SAL_CALL CertificateImpl::getVersion()
+ throw ( RuntimeException, std::exception)
+{
+ return 0;
+}
+
+Sequence< sal_Int8 > SAL_CALL CertificateImpl::getSerialNumber()
+ throw ( RuntimeException, std::exception)
+{
+ return Sequence< sal_Int8 > ();
+}
+
+OUString SAL_CALL CertificateImpl::getIssuerName()
+ throw ( RuntimeException, std::exception)
+{
+ return OStringToOUString(m_pKey.userID(0).name(), RTL_TEXTENCODING_UTF8);
+}
+
+OUString SAL_CALL CertificateImpl::getSubjectName()
+ throw ( RuntimeException, std::exception)
+{
+ return OUString("");
+}
+
+namespace {
+ DateTime convertUnixTimeToDateTime(time_t time)
+ {
+ DateTime dateTime;
+ struct tm *timeStruct = gmtime(&time);
+ dateTime.Year = timeStruct->tm_year + 1900;
+ dateTime.Month = timeStruct->tm_mon + 1;
+ dateTime.Day = timeStruct->tm_mday;
+ dateTime.Hours = timeStruct->tm_hour;
+ dateTime.Minutes = timeStruct->tm_min;
+ dateTime.Seconds = timeStruct->tm_sec;
+ return dateTime;
+ }
+}
+
+DateTime SAL_CALL CertificateImpl::getNotValidBefore()
+ throw ( RuntimeException, std::exception)
+{
+ const GpgME::Subkey subkey = m_pKey.subkey(0);
+ if (subkey.isNull())
+ return DateTime();
+
+ return convertUnixTimeToDateTime(m_pKey.subkey(0).creationTime());
+}
+
+DateTime SAL_CALL CertificateImpl::getNotValidAfter()
+ throw ( RuntimeException, std::exception)
+{
+ const GpgME::Subkey subkey = m_pKey.subkey(0);
+ if (subkey.isNull() || subkey.neverExpires())
+ return DateTime();
+
+ return convertUnixTimeToDateTime(m_pKey.subkey(0).expirationTime());
+}
+
+Sequence< sal_Int8 > SAL_CALL CertificateImpl::getIssuerUniqueID()
+ throw ( RuntimeException, std::exception)
+{
+ return Sequence< sal_Int8 > ();
+}
+
+Sequence< sal_Int8 > SAL_CALL CertificateImpl::getSubjectUniqueID()
+ throw ( RuntimeException, std::exception)
+{
+ return Sequence< sal_Int8 > ();
+}
+
+Sequence< Reference< XCertificateExtension > > SAL_CALL CertificateImpl::getExtensions()
+ throw ( RuntimeException, std::exception)
+{
+ return Sequence< Reference< XCertificateExtension > > ();
+}
+
+Reference< XCertificateExtension > SAL_CALL CertificateImpl::findCertificateExtension( const Sequence< sal_Int8 >& /*oid*/ )
+ throw (RuntimeException, std::exception)
+{
+ return Reference< XCertificateExtension > ();
+}
+
+Sequence< sal_Int8 > SAL_CALL CertificateImpl::getEncoded()
+ throw ( RuntimeException, std::exception)
+{
+ return Sequence< sal_Int8 > ();
+}
+
+OUString SAL_CALL CertificateImpl::getSubjectPublicKeyAlgorithm()
+ throw ( RuntimeException, std::exception)
+{
+ return OUString();
+}
+
+Sequence< sal_Int8 > SAL_CALL CertificateImpl::getSubjectPublicKeyValue()
+ throw ( RuntimeException, std::exception)
+{
+ return Sequence< sal_Int8 > ();
+}
+
+OUString SAL_CALL CertificateImpl::getSignatureAlgorithm()
+ throw ( RuntimeException, std::exception)
+{
+ return OUString();
+}
+
+Sequence< sal_Int8 > SAL_CALL CertificateImpl::getSHA1Thumbprint()
+ throw ( RuntimeException, std::exception)
+{
+ return Sequence< sal_Int8 > ();
+}
+
+uno::Sequence<sal_Int8> CertificateImpl::getSHA256Thumbprint()
+ throw (uno::RuntimeException, std::exception)
+{
+ return Sequence< sal_Int8 > ();
+}
+
+Sequence< sal_Int8 > SAL_CALL CertificateImpl::getMD5Thumbprint()
+ throw ( RuntimeException, std::exception)
+{
+ return Sequence< sal_Int8 > ();
+}
+
+sal_Int32 SAL_CALL CertificateImpl::getCertificateUsage()
+ throw ( RuntimeException, std::exception)
+{
+ return 0;
+}
+
+/* XUnoTunnel */
+sal_Int64 SAL_CALL CertificateImpl::getSomething(const Sequence< sal_Int8 >& aIdentifier)
+ throw( RuntimeException, std::exception )
+{
+ if( aIdentifier.getLength() == 16 && 0 == memcmp( getUnoTunnelId().getConstArray(), aIdentifier.getConstArray(), 16 ) ) {
+ return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this));
+ }
+ return 0 ;
+}
+
+/* XUnoTunnel extension */
+
+namespace
+{
+ class CertificateImplUnoTunnelId : public rtl::Static< UnoTunnelIdInit, CertificateImplUnoTunnelId > {};
+}
+
+const Sequence< sal_Int8>& CertificateImpl::getUnoTunnelId() {
+ return CertificateImplUnoTunnelId::get().getSeq();
+}
+
+void CertificateImpl::setCertificate(GpgME::Key key)
+{
+ m_pKey = key;
+}
+
+const GpgME::Key* CertificateImpl::getCertificate() const
+{
+ return &m_pKey;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/CertificateImpl.hxx b/xmlsecurity/source/gpg/CertificateImpl.hxx
new file mode 100644
index 0000000..8d4b08c2
--- /dev/null
+++ b/xmlsecurity/source/gpg/CertificateImpl.hxx
@@ -0,0 +1,107 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_XMLSECURITY_SOURCE_GPG_X509CERTIFICATE_HXX
+#define INCLUDED_XMLSECURITY_SOURCE_GPG_X509CERTIFICATE_HXX
+
+#include <certificate.hxx>
+
+#include <sal/types.h>
+#include <sal/config.h>
+#include <rtl/ustring.hxx>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implbase.hxx>
+
+#include <com/sun/star/uno/Exception.hpp>
+#include <com/sun/star/uno/RuntimeException.hpp>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <com/sun/star/uno/SecurityException.hpp>
+#include <com/sun/star/security/XCertificate.hpp>
+
+#include <key.h>
+
+class CertificateImpl : public cppu::WeakImplHelper< css::security::XCertificate,
+ css::lang::XUnoTunnel >,
+ public xmlsecurity::Certificate
+{
+private:
+ GpgME::Key m_pKey;
+
+public:
+ CertificateImpl();
+ virtual ~CertificateImpl() override;
+
+ //Methods from XCertificate
+ virtual sal_Int16 SAL_CALL getVersion()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getSerialNumber()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual OUString SAL_CALL getIssuerName()
+ throw ( css::uno::RuntimeException, std::exception) override;
+ virtual OUString SAL_CALL getSubjectName()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual css::util::DateTime SAL_CALL getNotValidBefore()
+ throw ( css::uno::RuntimeException, std::exception) override;
+ virtual css::util::DateTime SAL_CALL getNotValidAfter()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getIssuerUniqueID()
+ throw ( css::uno::RuntimeException, std::exception) override;
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getSubjectUniqueID()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Sequence< css::uno::Reference< css::security::XCertificateExtension > > SAL_CALL getExtensions()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Reference< css::security::XCertificateExtension > SAL_CALL findCertificateExtension(const css::uno::Sequence< sal_Int8 >& oid)
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getEncoded()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual OUString SAL_CALL getSubjectPublicKeyAlgorithm()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getSubjectPublicKeyValue()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual OUString SAL_CALL getSignatureAlgorithm()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getSHA1Thumbprint()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Sequence< sal_Int8 > SAL_CALL getMD5Thumbprint()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ virtual sal_Int32 SAL_CALL getCertificateUsage()
+ throw ( css::uno::RuntimeException, std::exception) override;
+
+ //Methods from XUnoTunnel
+ virtual sal_Int64 SAL_CALL getSomething(const css::uno::Sequence< sal_Int8 >& aIdentifier)
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ static const css::uno::Sequence< sal_Int8 >& getUnoTunnelId();
+
+ /// @see xmlsecurity::Certificate::getSHA256Thumbprint().
+ virtual css::uno::Sequence<sal_Int8> getSHA256Thumbprint()
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ // Helper methods
+ void setCertificate(GpgME::Key key);
+ const GpgME::Key* getCertificate() const;
+} ;
+
+#endif // INCLUDED_XMLSECURITY_SOURCE_GPG_X509CERTIFICATE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/CipherContext.cxx b/xmlsecurity/source/gpg/CipherContext.cxx
new file mode 100644
index 0000000..97d27dc
--- /dev/null
+++ b/xmlsecurity/source/gpg/CipherContext.cxx
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "CipherContext.hxx"
+
+using namespace css;
+using namespace css::uno;
+using namespace css::lang;
+
+Sequence< sal_Int8 > SAL_CALL CipherContext::convertWithCipherContext( const Sequence< sal_Int8 >& /*aData*/ )
+ throw ( IllegalArgumentException, DisposedException, RuntimeException, std::exception)
+{
+ Sequence<sal_Int8>* seq = new Sequence< sal_Int8 >(0);
+ return *seq;
+}
+
+uno::Sequence< sal_Int8 > SAL_CALL CipherContext::finalizeCipherContextAndDispose()
+ throw (DisposedException, RuntimeException, std::exception)
+{
+ Sequence<sal_Int8>* seq = new Sequence< sal_Int8 >(0);
+ return *seq;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/CipherContext.hxx b/xmlsecurity/source/gpg/CipherContext.hxx
new file mode 100644
index 0000000..f08d439
--- /dev/null
+++ b/xmlsecurity/source/gpg/CipherContext.hxx
@@ -0,0 +1,33 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_XMLSECURITY_SOURCE_GPG_CIPHERCONTEXT_HXX
+#define INCLUDED_XMLSECURITY_SOURCE_GPG_CIPHERCONTEXT_HXX
+
+#include <com/sun/star/xml/crypto/XCipherContext.hpp>
+#include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+class CipherContext : public cppu::WeakImplHelper< css::xml::crypto::XCipherContext >
+{
+private:
+
+public:
+ // XCipherContext
+ virtual css::uno::Sequence< ::sal_Int8 > SAL_CALL convertWithCipherContext(const css::uno::Sequence< ::sal_Int8 >& aData)
+ throw (css::lang::IllegalArgumentException, css::lang::DisposedException, css::uno::RuntimeException, std::exception) override;
+ virtual css::uno::Sequence< ::sal_Int8 > SAL_CALL finalizeCipherContextAndDispose()
+ throw (css::lang::DisposedException, css::uno::RuntimeException, std::exception) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/DigestContext.cxx b/xmlsecurity/source/gpg/DigestContext.cxx
new file mode 100644
index 0000000..5d86b7c
--- /dev/null
+++ b/xmlsecurity/source/gpg/DigestContext.cxx
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+
+#include "DigestContext.hxx"
+
+using namespace css;
+using namespace css::uno;
+using namespace css::lang;
+
+
+void SAL_CALL DigestContext::updateDigest( const uno::Sequence< ::sal_Int8 >& /*aData*/ )
+ throw (DisposedException, RuntimeException, std::exception)
+{
+}
+
+uno::Sequence< sal_Int8 > SAL_CALL DigestContext::finalizeDigestAndDispose()
+ throw (DisposedException, RuntimeException, std::exception)
+{
+ Sequence<sal_Int8>* seq = new Sequence< sal_Int8 >(0);
+ return *seq;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/DigestContext.hxx b/xmlsecurity/source/gpg/DigestContext.hxx
new file mode 100644
index 0000000..8ed2f03
--- /dev/null
+++ b/xmlsecurity/source/gpg/DigestContext.hxx
@@ -0,0 +1,31 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_XMLSECURITY_SOURCE_GPG_DIGESTCONTEXT_HXX
+#define INCLUDED_XMLSECURITY_SOURCE_GPG_DIGESTCONTEXT_HXX
+
+#include <com/sun/star/xml/crypto/XDigestContext.hpp>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/uno/RuntimeException.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+class DigestContext : public cppu::WeakImplHelper< css::xml::crypto::XDigestContext >
+{
+public:
+ // XDigestContext
+ virtual void SAL_CALL updateDigest( const css::uno::Sequence< ::sal_Int8 >& aData )
+ throw (css::lang::DisposedException, css::uno::RuntimeException, std::exception) override;
+ virtual css::uno::Sequence< ::sal_Int8 > SAL_CALL finalizeDigestAndDispose()
+ throw (css::lang::DisposedException, css::uno::RuntimeException, std::exception) override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/GpgComponentFactory.cxx b/xmlsecurity/source/gpg/GpgComponentFactory.cxx
new file mode 100644
index 0000000..3f0f2d1
--- /dev/null
+++ b/xmlsecurity/source/gpg/GpgComponentFactory.cxx
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "SecurityEnvironment.hxx"
+#include "SEInitializer.hxx"
+#include "XMLSignature.hxx"
+#include "XMLEncryption.hxx"
+#include "XMLSecurityContext.hxx"
+
+#include <cppuhelper/factory.hxx>
+
+using namespace cppu;
+using namespace css::uno;
+using namespace css::lang;
+using namespace css::registry;
+
+extern "C"
+{
+
+SAL_DLLPUBLIC_EXPORT void* SAL_CALL xsec_gpg_component_getFactory( const sal_Char* pImplName , void* pServiceManager , void* /*pRegistryKey*/ )
+{
+ void* pRet = nullptr;
+ Reference< XSingleServiceFactory > xFactory ;
+
+ if( pImplName != nullptr && pServiceManager != nullptr )
+ {
+#ifdef XMLSEC_CRYPTO_GPG
+ if( SEInitializer_getImplementationName().equalsAscii( pImplName ) )
+ {
+ xFactory.set( createSingleFactory(
+ static_cast< XMultiServiceFactory * >( pServiceManager ),
+ OUString::createFromAscii( pImplName ),
+ SEInitializer_createInstance, SEInitializer_getSupportedServiceNames() ) );
+ }
+ else if( XMLSignatureGpg::impl_getImplementationName().equalsAscii( pImplName ) )
+ {
+ xFactory = XMLSignatureGpg::impl_createFactory( static_cast< XMultiServiceFactory* >( pServiceManager ) ) ;
+ }
+ else if( XMLSecurityContextGpg::impl_getImplementationName().equalsAscii( pImplName ) )
+ {
+ xFactory = XMLSecurityContextGpg::impl_createFactory( static_cast< XMultiServiceFactory* >( pServiceManager ) ) ;
+ }
+ else if( SecurityEnvironmentGpg::impl_getImplementationName().equalsAscii( pImplName ) )
+ {
+ xFactory = SecurityEnvironmentGpg::impl_createFactory( static_cast< XMultiServiceFactory* >( pServiceManager ) ) ;
+ }
+ else if( XMLEncryptionGpg::impl_getImplementationName().equalsAscii( pImplName ) )
+ {
+ xFactory = XMLEncryptionGpg::impl_createFactory( static_cast< XMultiServiceFactory* >( pServiceManager ) ) ;
+ }
+#endif
+ }
+
+ if( xFactory.is() ) {
+ xFactory->acquire() ;
+ pRet = xFactory.get() ;
+ }
+
+ return pRet ;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/SEInitializer.cxx b/xmlsecurity/source/gpg/SEInitializer.cxx
new file mode 100644
index 0000000..e620ece
--- /dev/null
+++ b/xmlsecurity/source/gpg/SEInitializer.cxx
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "SEInitializer.hxx"
+#include "SecurityEnvironment.hxx"
+
+#include <comphelper/processfactory.hxx>
+#include <cppuhelper/supportsservice.hxx>
+
+#include <com/sun/star/xml/crypto/gpg/GpgSecurityEnvironment.hpp>
+#include <com/sun/star/xml/crypto/gpg/GpgXMLSecurityContext.hpp>
+
+using namespace css;
+using namespace css::lang;
+using namespace css::uno;
+using namespace css::xml::crypto;
+
+
+SEInitializerGpg::SEInitializerGpg( const css::uno::Reference< css::uno::XComponentContext > &rxContext )
+{
+ m_xContext = rxContext;
+}
+
+SEInitializerGpg::~SEInitializerGpg()
+{
+}
+
+/* XSEInitializer */
+Reference< XXMLSecurityContext > SAL_CALL SEInitializerGpg::createSecurityContext( const OUString& )
+ throw (RuntimeException, std::exception)
+{
+ try
+ {
+ /* Build XML Security Context */
+ Reference< XXMLSecurityContext > xSecCtx = xml::crypto::gpg::GpgXMLSecurityContext::create(m_xContext);
+
+ Reference< XSecurityEnvironment > xSecEnv = xml::crypto::gpg::GpgSecurityEnvironment::create(m_xContext);
+ Reference< XUnoTunnel > xSecEnvTunnel(xSecEnv, uno::UNO_QUERY_THROW);
+
+ sal_Int32 n = xSecCtx->addSecurityEnvironment(xSecEnv);
+ //originally the SecurityEnvironment with the internal slot was set as default
+ xSecCtx->setDefaultSecurityEnvironmentIndex( n );
+ return xSecCtx;
+ }
+ catch( const uno::Exception& )
+ {
+ return nullptr;
+ }
+}
+
+void SAL_CALL SEInitializerGpg::freeSecurityContext( const uno::Reference< XXMLSecurityContext >& )
+ throw (uno::RuntimeException, std::exception)
+{
+}
+
+OUString SEInitializer_getImplementationName()
+ throw (uno::RuntimeException)
+{
+ return OUString("com.sun.star.xml.security.SEInitializer_Gpg");
+}
+
+uno::Sequence< OUString > SAL_CALL SEInitializer_getSupportedServiceNames( )
+ throw (uno::RuntimeException)
+{
+ return {"com.sun.star.xml.crypto.gpg.GpgSEInitializer"};
+}
+
+uno::Reference< uno::XInterface > SAL_CALL SEInitializer_createInstance( const uno::Reference< lang::XMultiServiceFactory > & rxMSF)
+ throw( uno::Exception )
+{
+ return static_cast<cppu::OWeakObject*>(new SEInitializerGpg(comphelper::getComponentContext(rxMSF)));
+}
+
+/* XServiceInfo */
+OUString SAL_CALL SEInitializerGpg::getImplementationName()
+ throw (uno::RuntimeException, std::exception)
+{
+ return SEInitializer_getImplementationName();
+}
+
+sal_Bool SAL_CALL SEInitializerGpg::supportsService( const OUString& rServiceName )
+ throw (uno::RuntimeException, std::exception)
+{
+ return cppu::supportsService(this, rServiceName);
+}
+
+uno::Sequence< OUString > SAL_CALL SEInitializerGpg::getSupportedServiceNames()
+ throw (uno::RuntimeException, std::exception)
+{
+ return SEInitializer_getSupportedServiceNames();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/SEInitializer.hxx b/xmlsecurity/source/gpg/SEInitializer.hxx
new file mode 100644
index 0000000..c087cc7
--- /dev/null
+++ b/xmlsecurity/source/gpg/SEInitializer.hxx
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_XMLSECURITY_SOURCE_GPG_SEINITIALIZER_HXX
+#define INCLUDED_XMLSECURITY_SOURCE_GPG_SEINITIALIZER_HXX
+
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
+#include <com/sun/star/xml/crypto/XSEInitializer.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+
+#include <cppuhelper/implbase.hxx>
+
+class SEInitializerGpg : public cppu::WeakImplHelper< css::xml::crypto::XSEInitializer,
+ css::lang::XServiceInfo >
+{
+protected:
+ css::uno::Reference< css::uno::XComponentContext > m_xContext;
+
+public:
+ explicit SEInitializerGpg(const css::uno::Reference<css::uno::XComponentContext > &rxContext);
+ virtual ~SEInitializerGpg() override;
+
+ /* XSEInitializer */
+ virtual css::uno::Reference< css::xml::crypto::XXMLSecurityContext >
+ SAL_CALL createSecurityContext( const OUString& )
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ virtual void SAL_CALL freeSecurityContext( const css::uno::Reference<
+ css::xml::crypto::XXMLSecurityContext >& securityContext )
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ /* XServiceInfo */
+ virtual OUString SAL_CALL getImplementationName( )
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName )
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( )
+ throw (css::uno::RuntimeException, std::exception) override;
+};
+
+/// @throws css::uno::RuntimeException
+OUString SEInitializer_getImplementationName()
+ throw ( css::uno::RuntimeException );
+
+/// @throws css::uno::RuntimeException
+css::uno::Sequence< OUString > SAL_CALL SEInitializer_getSupportedServiceNames()
+ throw ( css::uno::RuntimeException );
+
+/// @throws css::uno::Exception
+css::uno::Reference< css::uno::XInterface > SAL_CALL SEInitializer_createInstance(
+ const css::uno::Reference< css::lang::XMultiServiceFactory > & rxMSF)
+ throw ( css::uno::Exception );
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/SecurityEnvironment.cxx b/xmlsecurity/source/gpg/SecurityEnvironment.cxx
new file mode 100644
index 0000000..3ea1479
--- /dev/null
+++ b/xmlsecurity/source/gpg/SecurityEnvironment.cxx
@@ -0,0 +1,198 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "SecurityEnvironment.hxx"
+#include "CertificateImpl.hxx"
+
+#include <cppuhelper/supportsservice.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <list>
+
+#include <gpgme.h>
+#include <context.h>
+#include <key.h>
+#include <keylistresult.h>
+
+using namespace css;
+using namespace css::security;
+using namespace css::uno;
+using namespace css::lang;
+
+SecurityEnvironmentGpg::SecurityEnvironmentGpg()
+{
+}
+
+SecurityEnvironmentGpg::~SecurityEnvironmentGpg()
+{
+}
+
+/* XServiceInfo */
+OUString SAL_CALL SecurityEnvironmentGpg::getImplementationName()
+ throw( RuntimeException, std::exception )
+{
+ return impl_getImplementationName();
+}
+
+/* XServiceInfo */
+sal_Bool SAL_CALL SecurityEnvironmentGpg::supportsService( const OUString& serviceName)
+ throw( RuntimeException, std::exception )
+{
+ return cppu::supportsService(this, serviceName);
+}
+
+/* XServiceInfo */
+Sequence< OUString > SAL_CALL SecurityEnvironmentGpg::getSupportedServiceNames()
+ throw( RuntimeException, std::exception )
+{
+ return impl_getSupportedServiceNames() ;
+}
+
+//Helper for XServiceInfo
+Sequence< OUString > SecurityEnvironmentGpg::impl_getSupportedServiceNames()
+{
+ return { "com.sun.star.xml.crypto.gpg.GpgSecurityEnvironment" } ;
+}
+
+OUString SecurityEnvironmentGpg::impl_getImplementationName()
+ throw( RuntimeException )
+{
+ return OUString("com.sun.star.xml.security.SecurityEnvironment_Gpg");
+}
+
+//Helper for registry
+Reference< XInterface > SAL_CALL SecurityEnvironmentGpg::impl_createInstance( const Reference< XMultiServiceFactory >& )
+ throw( RuntimeException )
+{
+ return Reference< XInterface >( *new SecurityEnvironmentGpg ) ;
+}
+
+Reference< XSingleServiceFactory > SecurityEnvironmentGpg::impl_createFactory( const Reference< XMultiServiceFactory >& aServiceManager ) {
+ return ::cppu::createSingleFactory( aServiceManager , impl_getImplementationName() , impl_createInstance , impl_getSupportedServiceNames() ) ;
+}
+
+/* XUnoTunnel */
+sal_Int64 SAL_CALL SecurityEnvironmentGpg::getSomething( const Sequence< sal_Int8 >& aIdentifier )
+ throw( RuntimeException, std::exception )
+{
+ if( aIdentifier.getLength() == 16 && 0 == memcmp( getUnoTunnelId().getConstArray(), aIdentifier.getConstArray(), 16 ) ) {
+ return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this));
+ }
+ return 0 ;
+}
+
+/* XUnoTunnel extension */
+
+namespace
+{
+ class theSecurityEnvironmentUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSecurityEnvironmentUnoTunnelId > {};
+}
+
+const Sequence< sal_Int8>& SecurityEnvironmentGpg::getUnoTunnelId() {
+ return theSecurityEnvironmentUnoTunnelId::get().getSeq();
+}
+
+OUString SecurityEnvironmentGpg::getSecurityEnvironmentInformation()
+ throw( RuntimeException, std::exception )
+{
+ return OUString("");
+}
+
+Sequence< Reference < XCertificate > > SecurityEnvironmentGpg::getPersonalCertificates()
+ throw( SecurityException , RuntimeException, std::exception )
+{
+ GpgME::initializeLibrary();
+ GpgME::Error err = GpgME::checkEngine(GpgME::OpenPGP);
+ if (err)
+ throw RuntimeException("The GpgME library failed to initialize for the OpenPGP protocol.");
+
+ std::shared_ptr<GpgME::Context> ctx(GpgME::Context::createForProtocol(GpgME::OpenPGP));
+ if (ctx == nullptr)
+ throw RuntimeException("The GpgME library failed to initialize for the OpenPGP protocol.");
+
+ CertificateImpl* xCert;
+ std::list< CertificateImpl* > certsList;
+
+ ctx->setKeyListMode(GPGME_KEYLIST_MODE_LOCAL);
+ err = ctx->startKeyListing();
+ while (!err) {
+ GpgME::Key k = ctx->nextKey(err);
+ if (err)
+ break;
+ if (!k.isInvalid() && k.canEncrypt() && (k.ownerTrust() == GpgME::Key::Ultimate)) {
+ xCert = new CertificateImpl();
+ xCert->setCertificate(k);
+ certsList.push_back(xCert);
+ }
+ }
+ ctx->endKeyListing();
+
+ Sequence< Reference< XCertificate > > xCertificateSequence(certsList.size());
+ std::list< CertificateImpl* >::iterator xcertIt;
+ int i;
+ for (i = 0, xcertIt = certsList.begin(); xcertIt != certsList.end(); ++xcertIt, ++i)
+ xCertificateSequence[i] = *xcertIt ;
+
+ return xCertificateSequence;
+}
+
+Reference< XCertificate > SecurityEnvironmentGpg::getCertificate( const OUString& /*issuerName*/, const Sequence< sal_Int8 >& /*serialNumber*/ )
+ throw( SecurityException , RuntimeException, std::exception )
+{
+ return nullptr;
+}
+
+Sequence< Reference < XCertificate > > SecurityEnvironmentGpg::buildCertificatePath( const Reference< XCertificate >& /*begin*/ )
+ throw( SecurityException , RuntimeException, std::exception )
+{
+ return Sequence< Reference < XCertificate > >();
+}
+
+Reference< XCertificate > SecurityEnvironmentGpg::createCertificateFromRaw( const Sequence< sal_Int8 >& /*rawCertificate*/ )
+ throw( SecurityException , RuntimeException, std::exception )
+{
+ return nullptr;
+}
+
+Reference< XCertificate > SecurityEnvironmentGpg::createCertificateFromAscii( const OUString& /*asciiCertificate*/ )
+ throw( SecurityException , RuntimeException, std::exception )
+{
+ return nullptr;
+}
+
+sal_Int32 SecurityEnvironmentGpg::verifyCertificate( const Reference< XCertificate >& /*aCert*/,
+ const Sequence< Reference< XCertificate > >& /*intermediateCerts*/ )
+ throw( SecurityException, RuntimeException, std::exception )
+{
+ return 0;
+}
+
+sal_Int32 SecurityEnvironmentGpg::getCertificateCharacters(
+ const Reference< XCertificate >& /*aCert*/)
+ throw( SecurityException, RuntimeException, std::exception )
+{
+// const CertificateImpl* xCert;
+// const GpgME::Key* key;
+//
+// Reference< XUnoTunnel > xCertTunnel(aCert, UNO_QUERY_THROW) ;
+// xCert = reinterpret_cast<CertificateImpl*>(sal::static_int_cast<sal_uIntPtr>(xCertTunnel->getSomething(CertificateImpl::getUnoTunnelId()))) ;
+// if (xCert == nullptr)
+// throw RuntimeException();
+//
+// key = xCert->getCertificate();
+//
+ sal_Int32 characters = 0x0;
+
+ // TODO There is a bug in gpgme, hasSecret() always returns false. Need to find a workaround.
+ //if (key->hasSecret())
+ characters |= CertificateCharacters::HAS_PRIVATE_KEY;
+
+ return characters;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/SecurityEnvironment.hxx b/xmlsecurity/source/gpg/SecurityEnvironment.hxx
new file mode 100644
index 0000000..db778ab
--- /dev/null
+++ b/xmlsecurity/source/gpg/SecurityEnvironment.hxx
@@ -0,0 +1,108 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_XMLSECURITY_SOURCE_GPG_SECURITYENVIRONMENT_HXX
+#define INCLUDED_XMLSECURITY_SOURCE_GPG_SECURITYENVIRONMENT_HXX
+
+#include <sal/config.h>
+#include <rtl/ustring.hxx>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <com/sun/star/uno/Exception.hpp>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/uno/SecurityException.hpp>
+#include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp>
+#include <com/sun/star/security/XCertificate.hpp>
+#include <com/sun/star/security/CertificateCharacters.hpp>
+#include <com/sun/star/security/CertificateValidity.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+
+
+class SecurityEnvironmentGpg : public cppu::WeakImplHelper< css::xml::crypto::XSecurityEnvironment,
+ css::lang::XServiceInfo,
+ css::lang::XUnoTunnel >
+{
+private:
+ osl::Mutex m_mutex;
+
+public:
+ SecurityEnvironmentGpg();
+ virtual ~SecurityEnvironmentGpg() override;
+
+ //Methods from XSecurityEnvironment
+
+ //Methods from XServiceInfo
+ virtual OUString SAL_CALL getImplementationName()
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName)
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames()
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ //Helper for XServiceInfo
+ static css::uno::Sequence< OUString > impl_getSupportedServiceNames() ;
+
+ /// @throws css::uno::RuntimeException
+ static OUString impl_getImplementationName()
+ throw( css::uno::RuntimeException ) ;
+
+ //Helper for registry
+ /// @throws css::uno::RuntimeException
+ static css::uno::Reference< css::uno::XInterface > SAL_CALL impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& aServiceManager)
+ throw( css::uno::RuntimeException ) ;
+
+ static css::uno::Reference< css::lang::XSingleServiceFactory > impl_createFactory( const css::uno::Reference< css::lang::XMultiServiceFactory >& aServiceManager ) ;
+
+ virtual ::sal_Int32 SAL_CALL verifyCertificate(
+ const css::uno::Reference<
+ css::security::XCertificate >& xCert,
+ const css::uno::Sequence<
+ css::uno::Reference< css::security::XCertificate > > &
+ intermediateCerts)
+ throw (css::uno::SecurityException, css::uno::RuntimeException, std::exception) override;
+
+ virtual ::sal_Int32 SAL_CALL getCertificateCharacters( const css::uno::Reference< css::security::XCertificate >& xCert )
+ throw (css::uno::SecurityException, css::uno::RuntimeException, std::exception) override;
+
+ virtual OUString SAL_CALL getSecurityEnvironmentInformation()
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ //Methods from XUnoTunnel
+ virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& aIdentifier )
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ static const css::uno::Sequence< sal_Int8 >& getUnoTunnelId() ;
+
+ virtual css::uno::Sequence< css::uno::Reference< css::security::XCertificate > > SAL_CALL getPersonalCertificates()
+ throw( css::uno::SecurityException , css::uno::RuntimeException, std::exception ) override;
+
+ virtual css::uno::Reference< css::security::XCertificate > SAL_CALL getCertificate( const OUString& issuerName, const css::uno::Sequence< sal_Int8 >& serialNumber )
+ throw( css::uno::SecurityException , css::uno::RuntimeException, std::exception ) override;
+
+ virtual css::uno::Sequence< css::uno::Reference< css::security::XCertificate > > SAL_CALL buildCertificatePath(
+ const css::uno::Reference< css::security::XCertificate >& beginCert )
+ throw( css::uno::SecurityException , css::uno::RuntimeException, std::exception ) override;
+
+ virtual css::uno::Reference< css::security::XCertificate > SAL_CALL createCertificateFromRaw(
+ const css::uno::Sequence< sal_Int8 >& rawCertificate )
+ throw( css::uno::SecurityException , css::uno::RuntimeException, std::exception ) override;
+ virtual css::uno::Reference< css::security::XCertificate > SAL_CALL createCertificateFromAscii(
+ const OUString& asciiCertificate )
+ throw( css::uno::SecurityException , css::uno::RuntimeException, std::exception ) override;
+
+} ;
+
+#endif // INCLUDED_XMLSECURITY_SOURCE_GPG_SECURITYENVIRONMENT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/XMLEncryption.cxx b/xmlsecurity/source/gpg/XMLEncryption.cxx
new file mode 100644
index 0000000..e40de51
--- /dev/null
+++ b/xmlsecurity/source/gpg/XMLEncryption.cxx
@@ -0,0 +1,86 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "XMLEncryption.hxx"
+
+#include <cppuhelper/supportsservice.hxx>
+
+using namespace css::uno;
+using namespace css::lang;
+using namespace css::xml::wrapper;
+using namespace css::xml::crypto;
+
+XMLEncryptionGpg::XMLEncryptionGpg() {
+}
+
+XMLEncryptionGpg::~XMLEncryptionGpg() {
+}
+
+/* XXMLEncryption */
+Reference< XXMLEncryptionTemplate > SAL_CALL XMLEncryptionGpg::encrypt(const Reference< XXMLEncryptionTemplate >& /*aTemplate*/,
+ const Reference< XSecurityEnvironment >& /*aEnvironment*/)
+ throw (XMLEncryptionException, SecurityException, RuntimeException, std::exception)
+{
+ return nullptr;
+}
+
+/* XXMLEncryption */
+Reference< XXMLEncryptionTemplate > SAL_CALL XMLEncryptionGpg::decrypt(const Reference< XXMLEncryptionTemplate >& /*aTemplate*/,
+ const Reference< XXMLSecurityContext >& /*aSecurityCtx*/)
+ throw (XMLEncryptionException, SecurityException, RuntimeException, std::exception)
+{
+ return nullptr;
+}
+
+/* XServiceInfo */
+OUString SAL_CALL XMLEncryptionGpg::getImplementationName()
+ throw( RuntimeException, std::exception )
+{
+ return impl_getImplementationName() ;
+}
+
+/* XServiceInfo */
+sal_Bool SAL_CALL XMLEncryptionGpg::supportsService( const OUString& serviceName)
+ throw( RuntimeException, std::exception )
+{
+ return cppu::supportsService(this, serviceName);
+}
+
+/* XServiceInfo */
+Sequence< OUString > SAL_CALL XMLEncryptionGpg::getSupportedServiceNames()
+ throw( RuntimeException, std::exception )
+{
+ return impl_getSupportedServiceNames() ;
+}
+
+//Helper for XServiceInfo
+Sequence< OUString > XMLEncryptionGpg::impl_getSupportedServiceNames()
+{
+ return {"com.sun.star.xml.crypto.gpg.GpgXMLEncryption"};
+}
+
+OUString XMLEncryptionGpg::impl_getImplementationName()
+ throw( RuntimeException )
+{
+ return OUString("com.sun.star.xml.security.XMLEncryption_Gpg");
+}
+
+//Helper for registry
+Reference< XInterface > SAL_CALL XMLEncryptionGpg::impl_createInstance( const Reference< XMultiServiceFactory >& )
+ throw( RuntimeException )
+{
+ return Reference< XInterface >(*new XMLEncryptionGpg);
+}
+
+Reference< XSingleServiceFactory > XMLEncryptionGpg::impl_createFactory( const Reference< XMultiServiceFactory >& aServiceManager )
+{
+ return ::cppu::createSingleFactory(aServiceManager, impl_getImplementationName(), impl_createInstance, impl_getSupportedServiceNames());
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/XMLEncryption.hxx b/xmlsecurity/source/gpg/XMLEncryption.hxx
new file mode 100644
index 0000000..ff78e4b
--- /dev/null
+++ b/xmlsecurity/source/gpg/XMLEncryption.hxx
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_XMLSECURITY_SOURCE_GPG_XMLENCRYPTION_HXX
+#define INCLUDED_XMLSECURITY_SOURCE_GPG_XMLENCRYPTION_HXX
+
+#include <sal/config.h>
+#include <rtl/ustring.hxx>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <com/sun/star/uno/Exception.hpp>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/xml/crypto/XXMLEncryption.hpp>
+#include <com/sun/star/xml/crypto/XXMLEncryptionTemplate.hpp>
+#include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
+#include <com/sun/star/xml/crypto/XMLEncryptionException.hpp>
+
+class XMLEncryptionGpg : public cppu::WeakImplHelper< css::xml::crypto::XXMLEncryption,
+ css::lang::XServiceInfo >
+{
+public:
+ explicit XMLEncryptionGpg();
+ virtual ~XMLEncryptionGpg() override;
+
+ // XXMLEncryption
+ virtual css::uno::Reference< css::xml::crypto::XXMLEncryptionTemplate > SAL_CALL encrypt(
+ const css::uno::Reference< css::xml::crypto::XXMLEncryptionTemplate >& aTemplate ,
+ const css::uno::Reference< css::xml::crypto::XSecurityEnvironment >& aEnvironment)
+ // ) throw( css::uno::Exception , css::uno::RuntimeException ) ;
+ throw (css::xml::crypto::XMLEncryptionException ,
+ css::uno::SecurityException,
+ css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Reference< css::xml::crypto::XXMLEncryptionTemplate > SAL_CALL decrypt(
+ const css::uno::Reference< css::xml::crypto::XXMLEncryptionTemplate >& aTemplate ,
+ const css::uno::Reference< css::xml::crypto::XXMLSecurityContext >& aContext
+ ) throw (css::xml::crypto::XMLEncryptionException ,
+ css::uno::SecurityException,
+ css::uno::RuntimeException, std::exception) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() throw( css::uno::RuntimeException, std::exception ) override;
+
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName)
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames()
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ // Helper for XServiceInfo
+ static css::uno::Sequence< OUString > impl_getSupportedServiceNames() ;
+
+ /// @throws css::uno::RuntimeException
+ static OUString impl_getImplementationName() throw( css::uno::RuntimeException ) ;
+
+ // Helper for registry
+ /// @throws css::uno::RuntimeException
+ static css::uno::Reference< css::uno::XInterface > SAL_CALL impl_createInstance(
+ const css::uno::Reference< css::lang::XMultiServiceFactory >& aServiceManager )
+ throw( css::uno::RuntimeException ) ;
+
+ static css::uno::Reference< css::lang::XSingleServiceFactory > impl_createFactory(
+ const css::uno::Reference< css::lang::XMultiServiceFactory >& aServiceManager ) ;
+} ;
+
+#endif // INCLUDED_XMLSECURITY_SOURCE_GPG_XMLENCRYPTION_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/XMLSecurityContext.cxx b/xmlsecurity/source/gpg/XMLSecurityContext.cxx
new file mode 100644
index 0000000..8f9baf0
--- /dev/null
+++ b/xmlsecurity/source/gpg/XMLSecurityContext.cxx
@@ -0,0 +1,122 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "XMLSecurityContext.hxx"
+#include "SecurityEnvironment.hxx"
+
+#include <cppuhelper/supportsservice.hxx>
+
+using namespace css::uno;
+using namespace css::lang;
+using namespace css::xml::crypto;
+
+XMLSecurityContextGpg::XMLSecurityContextGpg()
+ : m_nDefaultEnvIndex(-1)
+{
+}
+
+XMLSecurityContextGpg::~XMLSecurityContextGpg()
+{
+}
+
+sal_Int32 SAL_CALL XMLSecurityContextGpg::addSecurityEnvironment(
+ const Reference< XSecurityEnvironment >& aSecurityEnvironment)
+ throw (css::security::SecurityInfrastructureException, RuntimeException, std::exception)
+{
+ if(!aSecurityEnvironment.is())
+ throw RuntimeException("Invalid SecurityEnvironment given!");
+
+ m_vSecurityEnvironments.push_back(aSecurityEnvironment);
+ return m_vSecurityEnvironments.size() - 1 ;
+}
+
+
+sal_Int32 SAL_CALL XMLSecurityContextGpg::getSecurityEnvironmentNumber()
+ throw (RuntimeException, std::exception)
+{
+ return m_vSecurityEnvironments.size();
+}
+
+Reference< XSecurityEnvironment > SAL_CALL XMLSecurityContextGpg::getSecurityEnvironmentByIndex(sal_Int32 index)
+ throw (RuntimeException, std::exception)
+{
+ if (index < 0 || index >= ( sal_Int32 )m_vSecurityEnvironments.size())
+ throw RuntimeException("Invalid index");
+
+ return m_vSecurityEnvironments[index];
+}
+
+Reference< XSecurityEnvironment > SAL_CALL XMLSecurityContextGpg::getSecurityEnvironment()
+ throw (RuntimeException, std::exception)
+{
+ if (m_nDefaultEnvIndex < 0 || m_nDefaultEnvIndex >= (sal_Int32) m_vSecurityEnvironments.size())
+ throw RuntimeException("Invalid index");
+
+ return getSecurityEnvironmentByIndex(m_nDefaultEnvIndex);
+}
+
+sal_Int32 SAL_CALL XMLSecurityContextGpg::getDefaultSecurityEnvironmentIndex()
+ throw (RuntimeException, std::exception)
+{
+ return m_nDefaultEnvIndex ;
+}
+
+void SAL_CALL XMLSecurityContextGpg::setDefaultSecurityEnvironmentIndex(sal_Int32 nDefaultEnvIndex)
+ throw (RuntimeException, std::exception)
+{
+ m_nDefaultEnvIndex = nDefaultEnvIndex;
+}
+
+/* XServiceInfo */
+OUString SAL_CALL XMLSecurityContextGpg::getImplementationName()
+ throw( RuntimeException, std::exception )
+{
+ return impl_getImplementationName() ;
+}
+
+/* XServiceInfo */
+sal_Bool SAL_CALL XMLSecurityContextGpg::supportsService( const OUString& serviceName)
+ throw( RuntimeException, std::exception )
+{
+ return cppu::supportsService(this, serviceName);
+}
+
+/* XServiceInfo */
+Sequence< OUString > SAL_CALL XMLSecurityContextGpg::getSupportedServiceNames()
+ throw( RuntimeException, std::exception )
+{
+ return impl_getSupportedServiceNames() ;
+}
+
+//Helper for XServiceInfo
+Sequence< OUString > XMLSecurityContextGpg::impl_getSupportedServiceNames()
+{
+ return {"com.sun.star.xml.crypto.gpg.GpgXMLSecurityContext"};
+}
+
+OUString XMLSecurityContextGpg::impl_getImplementationName()
+ throw( RuntimeException )
+{
+ return OUString("com.sun.star.xml.security.XMLSecurityContext_Gpg");
+}
+
+//Helper for registry
+Reference< XInterface > SAL_CALL XMLSecurityContextGpg::impl_createInstance( const Reference< XMultiServiceFactory >& )
+ throw( RuntimeException )
+{
+ return Reference< XInterface >( *new XMLSecurityContextGpg ) ;
+}
+
+Reference< XSingleServiceFactory > XMLSecurityContextGpg::impl_createFactory( const Reference< XMultiServiceFactory >& aServiceManager )
+{
+ return ::cppu::createSingleFactory( aServiceManager , impl_getImplementationName() , impl_createInstance , impl_getSupportedServiceNames() ) ;
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/XMLSecurityContext.hxx b/xmlsecurity/source/gpg/XMLSecurityContext.hxx
new file mode 100644
index 0000000..9d761d6
--- /dev/null
+++ b/xmlsecurity/source/gpg/XMLSecurityContext.hxx
@@ -0,0 +1,88 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_XMLSECURITY_SOURCE_GPG_XMLSECURITYCONTEXT_HXX
+#define INCLUDED_XMLSECURITY_SOURCE_GPG_XMLSECURITYCONTEXT_HXX
+
+#include <sal/config.h>
+#include <rtl/ustring.hxx>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <com/sun/star/uno/Exception.hpp>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp>
+#include <com/sun/star/security/SecurityInfrastructureException.hpp>
+#include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
+
+#include <vector>
+
+class XMLSecurityContextGpg : public cppu::WeakImplHelper< css::xml::crypto::XXMLSecurityContext,
+ css::lang::XServiceInfo >
+{
+private:
+ std::vector< css::uno::Reference< css::xml::crypto::XSecurityEnvironment > > m_vSecurityEnvironments;
+
+ sal_Int32 m_nDefaultEnvIndex;
+
+public:
+ XMLSecurityContextGpg() ;
+ virtual ~XMLSecurityContextGpg() override;
+
+ // XXMLSecurityContext
+ virtual sal_Int32 SAL_CALL addSecurityEnvironment(
+ const css::uno::Reference< css::xml::crypto::XSecurityEnvironment >& aSecurityEnvironment
+ ) throw (css::security::SecurityInfrastructureException, css::uno::RuntimeException, std::exception) override;
+
+ virtual ::sal_Int32 SAL_CALL getSecurityEnvironmentNumber( )
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Reference<css::xml::crypto::XSecurityEnvironment > SAL_CALL getSecurityEnvironmentByIndex(sal_Int32 index)
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Reference<css::xml::crypto::XSecurityEnvironment > SAL_CALL getSecurityEnvironment()
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ virtual sal_Int32 SAL_CALL getDefaultSecurityEnvironmentIndex( )
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ virtual void SAL_CALL setDefaultSecurityEnvironmentIndex( sal_Int32 nDefaultEnvIndex )
+ throw (css::uno::RuntimeException, std::exception) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() throw( css::uno::RuntimeException, std::exception ) override;
+
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName)
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames()
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ // XServiceInfo
+ static css::uno::Sequence< OUString > impl_getSupportedServiceNames() ;
+
+ /// @throws css::uno::RuntimeException
+ static OUString impl_getImplementationName() throw( css::uno::RuntimeException ) ;
+
+ //Helper for registry
+ /// @throws css::uno::RuntimeException
+ static css::uno::Reference< css::uno::XInterface > SAL_CALL impl_createInstance(
+ const css::uno::Reference< css::lang::XMultiServiceFactory >& aServiceManager )
+ throw( css::uno::RuntimeException ) ;
+
+ static css::uno::Reference< css::lang::XSingleServiceFactory > impl_createFactory(
+ const css::uno::Reference< css::lang::XMultiServiceFactory >& aServiceManager ) ;
+} ;
+
+#endif // INCLUDED_XMLSECURITY_SOURCE_GPG_XMLSECURITYCONTEXT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/XMLSignature.cxx b/xmlsecurity/source/gpg/XMLSignature.cxx
new file mode 100644
index 0000000..abc955d
--- /dev/null
+++ b/xmlsecurity/source/gpg/XMLSignature.cxx
@@ -0,0 +1,89 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "XMLSignature.hxx"
+#include "SecurityEnvironment.hxx"
+#include "XMLSecurityContext.hxx"
+
+#include <cppuhelper/supportsservice.hxx>
+
+using namespace css::uno;
+using namespace css::lang;
+using namespace css::xml::wrapper;
+using namespace css::xml::crypto;
+
+XMLSignatureGpg::XMLSignatureGpg()
+{
+}
+
+XMLSignatureGpg::~XMLSignatureGpg()
+{
+}
+
+/* XXMLSignature */
+Reference< XXMLSignatureTemplate > SAL_CALL XMLSignatureGpg::generate(const Reference< XXMLSignatureTemplate >& /*aTemplate*/,
+ const Reference< XSecurityEnvironment >& /*aEnvironment*/)
+ throw( css::xml::crypto::XMLSignatureException, css::uno::SecurityException, css::uno::RuntimeException, std::exception )
+{
+ return nullptr;
+}
+
+/* XXMLSignature */
+Reference< XXMLSignatureTemplate > SAL_CALL XMLSignatureGpg::validate(const Reference< XXMLSignatureTemplate >& /*aTemplate*/,
+ const Reference< XXMLSecurityContext >& /*aSecurityCtx*/)
+ throw(css::uno::RuntimeException, css::uno::SecurityException, css::xml::crypto::XMLSignatureException, std::exception)
+{
+ return nullptr;
+}
+
+/* XServiceInfo */
+OUString SAL_CALL XMLSignatureGpg::getImplementationName()
+ throw( RuntimeException, std::exception )
+{
+ return impl_getImplementationName() ;
+}
+
+/* XServiceInfo */
+sal_Bool SAL_CALL XMLSignatureGpg::supportsService( const OUString& serviceName)
+ throw( RuntimeException, std::exception )
+{
+ return cppu::supportsService(this, serviceName);
+}
+
+/* XServiceInfo */
+Sequence< OUString > SAL_CALL XMLSignatureGpg::getSupportedServiceNames() throw( RuntimeException, std::exception )
+{
+ return impl_getSupportedServiceNames() ;
+}
+
+//Helper for XServiceInfo
+Sequence< OUString > XMLSignatureGpg::impl_getSupportedServiceNames()
+{
+ return {"com.sun.star.xml.crypto.gpg.GpgXMLSignature"};
+}
+
+OUString XMLSignatureGpg::impl_getImplementationName()
+ throw( RuntimeException )
+{
+ return OUString("com.sun.star.xml.security.XMLSignature_Gpg");
+}
+
+//Helper for registry
+Reference< XInterface > SAL_CALL XMLSignatureGpg::impl_createInstance( const Reference< XMultiServiceFactory >& )
+ throw( RuntimeException )
+{
+ return Reference< XInterface >( *new XMLSignatureGpg ) ;
+}
+
+Reference< XSingleServiceFactory > XMLSignatureGpg::impl_createFactory( const Reference< XMultiServiceFactory >& aServiceManager )
+{
+ return cppu::createSingleFactory( aServiceManager , impl_getImplementationName() , impl_createInstance , impl_getSupportedServiceNames() ) ;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/gpg/XMLSignature.hxx b/xmlsecurity/source/gpg/XMLSignature.hxx
new file mode 100644
index 0000000..119b5cb
--- /dev/null
+++ b/xmlsecurity/source/gpg/XMLSignature.hxx
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_XMLSECURITY_SOURCE_XMLSEC_GPG_XMLSIGNATURE_HXX
+#define INCLUDED_XMLSECURITY_SOURCE_XMLSEC_GPG_XMLSIGNATURE_HXX
+
+#include <sal/config.h>
+#include <rtl/ustring.hxx>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implbase.hxx>
+#include <com/sun/star/uno/Exception.hpp>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/xml/crypto/XXMLSignature.hpp>
+#include <com/sun/star/xml/crypto/XXMLSignatureTemplate.hpp>
+#include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp>
+#include <com/sun/star/xml/crypto/XMLSignatureException.hpp>
+
+class XMLSignatureGpg : public cppu::WeakImplHelper< css::xml::crypto::XXMLSignature,
+ css::lang::XServiceInfo >
+{
+public:
+ explicit XMLSignatureGpg();
+ virtual ~XMLSignatureGpg() override;
+
+ // XXMLSignature
+ virtual css::uno::Reference< css::xml::crypto::XXMLSignatureTemplate > SAL_CALL generate(
+ const css::uno::Reference< css::xml::crypto::XXMLSignatureTemplate >& aTemplate ,
+ const css::uno::Reference< css::xml::crypto::XSecurityEnvironment >& aEnvironment
+ ) throw (css::xml::crypto::XMLSignatureException,
+ css::uno::SecurityException,
+ css::uno::RuntimeException, std::exception) override;
+
+ virtual css::uno::Reference< css::xml::crypto::XXMLSignatureTemplate > SAL_CALL validate(
+ const css::uno::Reference< css::xml::crypto::XXMLSignatureTemplate >& aTemplate ,
+ const css::uno::Reference< css::xml::crypto::XXMLSecurityContext >& aContext
+ ) throw(css::uno::RuntimeException,
+ css::uno::SecurityException,
+ css::xml::crypto::XMLSignatureException, std::exception) override;
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName()
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName)
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames()
+ throw( css::uno::RuntimeException, std::exception ) override;
+
+ // Helper for XServiceInfo
+ static css::uno::Sequence< OUString > impl_getSupportedServiceNames() ;
+
+ /// @throws css::uno::RuntimeException
+ static OUString impl_getImplementationName() throw( css::uno::RuntimeException ) ;
+
+ //Helper for registry
+ /// @throws css::uno::RuntimeException
+ static css::uno::Reference< css::uno::XInterface > SAL_CALL impl_createInstance(
+ const css::uno::Reference< css::lang::XMultiServiceFactory >& aServiceManager )
+ throw( css::uno::RuntimeException ) ;
+
+ static css::uno::Reference< css::lang::XSingleServiceFactory > impl_createFactory(
+ const css::uno::Reference< css::lang::XMultiServiceFactory >& aServiceManager ) ;
+} ;
+
+#endif // INCLUDED_XMLSECURITY_SOURCE_XMLSEC_GPG_XMLSIGNATURE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/source/helper/documentsignaturemanager.cxx b/xmlsecurity/source/helper/documentsignaturemanager.cxx
index d97b1d1..e0a61e2 100644
--- a/xmlsecurity/source/helper/documentsignaturemanager.cxx
+++ b/xmlsecurity/source/helper/documentsignaturemanager.cxx
@@ -25,6 +25,7 @@
#include <com/sun/star/io/XTruncate.hpp>
#include <com/sun/star/embed/XTransactedObject.hpp>
#include <com/sun/star/xml/crypto/SEInitializer.hpp>
+#include <com/sun/star/xml/crypto/gpg/GpgSEInitializer.hpp>
#include <comphelper/storagehelper.hxx>
#include <rtl/ustrbuf.hxx>
@@ -36,7 +37,7 @@
#include <certificate.hxx>
#include <biginteger.hxx>
-using namespace com::sun::star;
+using namespace css;
DocumentSignatureManager::DocumentSignatureManager(const uno::Reference<uno::XComponentContext>& xContext, DocumentSignatureMode eMode)
: mxContext(xContext),
@@ -51,13 +52,24 @@ bool DocumentSignatureManager::init()
{
SAL_WARN_IF(mxSEInitializer.is(), "xmlsecurity.helper", "DocumentSignatureManager::Init - mxSEInitializer already set!");
SAL_WARN_IF(mxSecurityContext.is(), "xmlsecurity.helper", "DocumentSignatureManager::Init - mxSecurityContext already set!");
+ SAL_WARN_IF(mxGpgSEInitializer.is(), "xmlsecurity.helper", "DocumentSignatureManager::Init - mxGpgSEInitializer already set!");
- mxSEInitializer = css::xml::crypto::SEInitializer::create(mxContext);
+ mxSEInitializer = xml::crypto::SEInitializer::create(mxContext);
+#if !defined(MACOSX) && !defined(WNT)
+ mxGpgSEInitializer = xml::crypto::gpg::GpgSEInitializer::create(mxContext);
+#endif
if (mxSEInitializer.is())
mxSecurityContext = mxSEInitializer->createSecurityContext(OUString());
+#if !defined(MACOSX) && !defined(WNT)
+ if (mxGpgSEInitializer.is())
+ mxGpgSecurityContext = mxGpgSEInitializer->createSecurityContext(OUString());
+
+ return mxSecurityContext.is() && mxGpgSecurityContext.is();
+#else
return mxSecurityContext.is();
+#endif
}
PDFSignatureHelper& DocumentSignatureManager::getPDFSignatureHelper()
@@ -504,4 +516,9 @@ uno::Reference<xml::crypto::XSecurityEnvironment> DocumentSignatureManager::getS
return mxSecurityContext.is() ? mxSecurityContext->getSecurityEnvironment() : uno::Reference<xml::crypto::XSecurityEnvironment>();
}
+uno::Reference<xml::crypto::XSecurityEnvironment> DocumentSignatureManager::getGpgSecurityEnvironment()
+{
+ return mxGpgSecurityContext.is() ? mxGpgSecurityContext->getSecurityEnvironment() : uno::Reference<xml::crypto::XSecurityEnvironment>();
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmlsecurity/util/xsec_gpg.component b/xmlsecurity/util/xsec_gpg.component
new file mode 100644
index 0000000..0a684d1
--- /dev/null
+++ b/xmlsecurity/util/xsec_gpg.component
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+-->
+
+<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
+ prefix="xsec_gpg" xmlns="http://openoffice.org/2010/uno-components">
+ <implementation name="com.sun.star.xml.security.SEInitializer_Gpg">
+ <service name="com.sun.star.xml.crypto.gpg.GpgSEInitializer"/>
+ </implementation>
+ <implementation name="com.sun.star.xml.security.SecurityEnvironment_Gpg">
+ <service name="com.sun.star.xml.crypto.gpg.GpgSecurityEnvironment"/>
+ </implementation>
+ <!-- TODO Not implemented yet
+ <implementation name="com.sun.star.xml.security.XMLDocumentWrapper_Gpg">
+ <service name="com.sun.star.xml.wrapper.XMLDocumentWrapper"/>
+ </implementation>
+ <implementation name="com.sun.star.xml.security.XMLElementWrapper_Gpg">
+ <service name="com.sun.star.xml.wrapper.XMLElementWrapper"/>
+ </implementation>-->
+ <implementation name="com.sun.star.xml.security.XMLEncryption_Gpg">
+ <service name="com.sun.star.xml.crypto.gpg.GpgXMLEncryption"/>
+ </implementation>
+ <implementation name="com.sun.star.xml.security.XMLSecurityContext_Gpg">
+ <service name="com.sun.star.xml.crypto.gpg.GpgXMLSecurityContext"/>
+ </implementation>
+ <implementation name="com.sun.star.xml.security.XMLSignature_Gpg">
+ <service name="com.sun.star.xml.crypto.gpg.GpgXMLSignature"/>
+ </implementation>-->
+</component>
+
More information about the Libreoffice-commits
mailing list