Kaydet (Commit) f0305ec0 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Fix creation/removal of GPG socketdir

<https://gerrit.libreoffice.org/#/c/50978/> "gpg4libre: fix failing gpg test due
to over-long filenames" had introduced the gb_CppunitTest_run_gpgconf target in
xmlsecurity/CppunitTest_xmlsecurity_signing.mk, calling `gpgconf
--craete-socketdir`.  A 2018-03-18 comment there notes that "Stephan's last
comment: (and `gpgconf --remove-sockedir` be called after the test?) is not
addressed yet, will do in follow-up commit".

Follow-up d7ecf4a4 "properly check for gpgconf
(and --create-socketdir) working" makes gb_CppunitTest_run_gpgconf conditional.
However, in configure.ac,

  HAVE_GPGCONF_SOCKETDIR=TRUE

is missing, so even after follow-up 7a95ee8d
"actually add HAVE_GPGCONF_SOCKETDIR to config_host.mk.in...", config_host.mk
will always contain

  export HAVE_GPGCONF_SOCKETDIR=

so gb_CppunitTest_run_gpgconf will never be executed (and `pgconf
--crate-socketdir` will never called).

But even if it were executed, it would not create the socket dir that the test
code in xmlsecurity/qa/unit/signing/signing.cxx is actually using, as
gb_CppunitTest_run_gpgconf sets

  GNUPGHOME=.../workdir/CppunitTest/xmlsecurity_signing.test.user

while xmlsecurity/qa/unit/signing/signing.cxx's SigningTest::setUp sets

  GNUPGHOME=.../workdir//CppunitTest/xmlsecurity_signing.test.user/

and the GPG software is apparently picky about extra slashes when computing the
socket dir name from the GNUPGHOME env var.

(That `gpgconf --create-socketdir` was never executed with the current setup
shows that calling it explicitly is probably not really needed, as the GPG
software apparently creates it automatically on demand.)

However, what is still missing is to remove the socket dir again (see the
comment quoted above), and, probably more importantly, to exit any gpg-agent
daemon operating on that socket dir that has (indirectly) been started by the
tests in xmlsecurity/qa/unit/signing/signing.cxx.  At least with Fedora 29
gpgconf from gnupg2-2.2.9-1.fc29.x86_64, that daemon is successfully terminated
by calling `gpgconf --remove-socket`.

So move the call to `gpgconf --create-socketdir` from the makefile to the test
setup code (which makes it easier to guarantee that a single GNUPGHOME value,
and thus a single socket dir, is used), and add a corresponding `gpgconf
--remove-socketdir` call to the test shutdown code.  (As argued above, the
`gpgconf --create-socketdir` call shouldn't be stricktly necessary, but it looks
cleaner to do it explicitly anyway.)

Change-Id: I2ec8f08943ed63ec27f8507461588ee7cdadf372
Reviewed-on: https://gerrit.libreoffice.org/63181Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
Tested-by: Jenkins
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst eadba44a
......@@ -211,7 +211,6 @@ export EPOXY_LIBS=$(gb_SPACE)@EPOXY_LIBS@
export GLM_CFLAGS=$(gb_SPACE)@GLM_CFLAGS@
export GPG_ERROR_CFLAGS=$(gb_SPACE)@GPG_ERROR_CFLAGS@
export GPG_ERROR_LIBS=$(gb_SPACE)@GPG_ERROR_LIBS@
export GPGCONF=@GPGCONF@
export GPGMEPP_CFLAGS=$(gb_SPACE)@GPGMEPP_CFLAGS@
export GPGMEPP_LIBS=$(gb_SPACE)@GPGMEPP_LIBS@
export GNUTLS_CFLAGS=$(gb_SPACE)@GNUTLS_CFLAGS@
......@@ -256,7 +255,6 @@ export HAVE_GCC_FNO_SIZED_DEALLOCATION=@HAVE_GCC_FNO_SIZED_DEALLOCATION@
export HAVE_GCC_GGDB2=@HAVE_GCC_GGDB2@
export HAVE_GCC_SPLIT_DWARF=@HAVE_GCC_SPLIT_DWARF@
export HAVE_GNUMAKE_FILE_FUNC=@HAVE_GNUMAKE_FILE_FUNC@
export HAVE_GPGCONF_SOCKETDIR=@HAVE_GPGCONF_SOCKETDIR@
export HAVE_LD_BSYMBOLIC_FUNCTIONS=@HAVE_LD_BSYMBOLIC_FUNCTIONS@
export HAVE_LD_HASH_STYLE=@HAVE_LD_HASH_STYLE@
export HAVE_POSIX_FALLOCATE=@HAVE_POSIX_FALLOCATE@
......
......@@ -29,6 +29,8 @@
// Defined if gpgme supports exporting minimal key.
#define GPGME_CAN_EXPORT_MINIMAL_KEY 0
#undef GPGME_GPGCONF
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -10563,6 +10563,7 @@ elif test "$_os" = "Linux" -o "$_os" = "Darwin" -o "$_os" = "WINNT" ; then
if $GPGCONF --dump-options | grep -q create-socketdir ; then
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_GPGCONF_SOCKETDIR])
AC_DEFINE_UNQUOTED([GPGME_GPGCONF], ["$GPGCONF"])
else
AC_MSG_RESULT([no])
fi
......@@ -10582,8 +10583,6 @@ AC_SUBST(LIBASSUAN_CFLAGS)
AC_SUBST(LIBASSUAN_LIBS)
AC_SUBST(GPGMEPP_CFLAGS)
AC_SUBST(GPGMEPP_LIBS)
AC_SUBST(GPGCONF)
AC_SUBST(HAVE_GPGCONF_SOCKETDIR)
AC_MSG_CHECKING([whether to build the Wiki Publisher extension])
if test "x$enable_ext_wiki_publisher" = "xyes" -a "x$enable_extension_integration" != "xno" -a "$with_java" != "no"; then
......
......@@ -58,17 +58,6 @@ ifeq ($(OS),LINUX)
$(call gb_CppunitTest_get_target,xmlsecurity_signing): \
EXTRA_ENV_VARS := \
LIBO_LD_PATH=$$LD_LIBRARY_PATH
ifneq (,$(HAVE_GPGCONF_SOCKETDIR))
# create socket dir below /run/user/ instead of in workdir
.PHONY : gb_CppunitTest_run_gpgconf
gb_CppunitTest_run_gpgconf:
GNUPGHOME=$(WORKDIR)/CppunitTest/xmlsecurity_signing.test.user \
$(GPGCONF) --create-socketdir
$(call gb_CppunitTest_get_target,xmlsecurity_signing): \
gb_CppunitTest_run_gpgconf
endif
endif
# vim: set noet sw=4 ts=4:
......@@ -12,6 +12,7 @@
#include <sal/config.h>
#include <cstdlib>
#include <type_traits>
#include <test/bootstrapfixture.hxx>
......@@ -59,6 +60,10 @@ class SigningTest : public test::BootstrapFixture, public unotest::MacrosTest, p
uno::Reference<xml::crypto::XSEInitializer> mxSEInitializer;
uno::Reference<xml::crypto::XXMLSecurityContext> mxSecurityContext;
#if HAVE_GPGCONF_SOCKETDIR
OString m_gpgconfCommandPrefix;
#endif
public:
SigningTest();
virtual void setUp() override;
......@@ -188,6 +193,22 @@ void SigningTest::setUp()
OUString gpgHomeVar("GNUPGHOME");
osl_setEnvironment(gpgHomeVar.pData, aTargetPath.pData);
#if HAVE_GPGCONF_SOCKETDIR
OString path;
bool ok = aTargetPath.convertToString(
&path, osl_getThreadTextEncoding(),
RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR);
CPPUNIT_ASSERT_MESSAGE(OUStringToOString(aTargetPath, RTL_TEXTENCODING_UTF8).getStr(), ok);
// if conversion fails, at least provide a best-effort conversion in the message here, for
// context
m_gpgconfCommandPrefix = "GNUPGHOME=" + path + " " GPGME_GPGCONF;
// HAVE_GPGCONF_SOCKETDIR is only defined in configure.ac for Linux for now, so (a) std::system
// behavior will conform to POSIX, and (b) gpgconf --create-socketdir should return zero:
OString cmd = m_gpgconfCommandPrefix + " --create-socketdir";
int res = std::system(cmd.getStr());
CPPUNIT_ASSERT_EQUAL_MESSAGE(cmd.getStr(), 0, res);
#endif
// Initialize crypto after setting up the environment variables.
mxComponentContext.set(comphelper::getComponentContext(getMultiServiceFactory()));
mxDesktop.set(frame::Desktop::create(mxComponentContext));
......@@ -200,6 +221,14 @@ void SigningTest::tearDown()
if (mxComponent.is())
mxComponent->dispose();
#if HAVE_GPGCONF_SOCKETDIR
// HAVE_GPGCONF_SOCKETDIR is only defined in configure.ac for Linux for now, so (a) std::system
// behavior will conform to POSIX, and (b) gpgconf --remove-socketdir should return zero:
OString cmd = m_gpgconfCommandPrefix + " --remove-socketdir";
int res = std::system(cmd.getStr());
CPPUNIT_ASSERT_EQUAL_MESSAGE(cmd.getStr(), 0, res);
#endif
test::BootstrapFixture::tearDown();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment