diff --git a/configure.ac b/configure.ac index 315b39ac..0d90e2bb 100644 --- a/configure.ac +++ b/configure.ac @@ -896,6 +896,7 @@ AC_CONFIG_FILES(Makefile src/Makefile src/gpgme.h) AC_CONFIG_FILES(src/gpgme-config, chmod +x src/gpgme-config) AC_CONFIG_FILES(lang/cpp/Makefile lang/cpp/src/Makefile) +AC_CONFIG_FILES(lang/cpp/tests/Makefile) AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfig-w32.cmake.in) AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfig.cmake.in) AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfigVersion.cmake) diff --git a/lang/cpp/Makefile.am b/lang/cpp/Makefile.am index 026ca008..acfa0f9b 100644 --- a/lang/cpp/Makefile.am +++ b/lang/cpp/Makefile.am @@ -19,6 +19,6 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA -SUBDIRS = src +SUBDIRS = src tests EXTRA_DIST = README diff --git a/lang/cpp/tests/Makefile.am b/lang/cpp/tests/Makefile.am new file mode 100644 index 00000000..2b6e8fb6 --- /dev/null +++ b/lang/cpp/tests/Makefile.am @@ -0,0 +1,35 @@ +# Makefile.am - Makefile for GPGME Cpp tests. +# Copyright (C) 2018 Intevation GmbH +# +# This file is part of GPGME. +# +# GPGME is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# GPGME is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General +# Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, see . + +## Process this file with automake to produce Makefile.in + +AM_LDFLAGS = -no-install + +LDADD = ../../cpp/src/libgpgmepp.la \ + ../../../src/libgpgme.la @GPG_ERROR_LIBS@ \ + -lstdc++ + +AM_CPPFLAGS = -I$(top_srcdir)/lang/cpp/src -I$(top_builddir)/src \ + @GPG_ERROR_CFLAGS@ @GPG_ERROR_CFLAGS@ \ + @LIBASSUAN_CFLAGS@ -DBUILDING_GPGMEPP \ + -DTOP_SRCDIR="$(top_srcdir)" + +run_getkey_SOURCES = run-getkey.cpp +run_keylist_SOURCES = run-keylist.cpp + +noinst_PROGRAMS = run-getkey run-keylist diff --git a/lang/cpp/tests/README b/lang/cpp/tests/README new file mode 100644 index 00000000..ac74ab00 --- /dev/null +++ b/lang/cpp/tests/README @@ -0,0 +1,4 @@ +Tests for the C++ bindings. + +Most autotests for the C++ bindings use the QTest framework +and live in lang/qt/tests. diff --git a/lang/cpp/tests/run-getkey.cpp b/lang/cpp/tests/run-getkey.cpp new file mode 100644 index 00000000..35b15eb2 --- /dev/null +++ b/lang/cpp/tests/run-getkey.cpp @@ -0,0 +1,144 @@ +/* + run-getkey.cpp + + This file is part of GpgMEpp's test suite. + Copyright (c) 2018 Intevation GmbH + + QGpgME is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License, + version 2, as published by the Free Software Foundation. + + QGpgME is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include "context.h" +#include "key.h" + +#include +#include +#include + +using namespace GpgME; + +static int +show_usage (int ex) +{ + fputs ("usage: run-getkey [options] [keyIdOrFingerprint]\n\n" + "Options:\n" + " --verbose run in verbose mode\n" + " --openpgp use the OpenPGP protocol (default)\n" + " --cms use the CMS protocol\n" + " --secret list only secret keys\n" + " --with-secret list pubkeys with secret info filled\n" + " --local use GPGME_KEYLIST_MODE_LOCAL\n" + " --extern use GPGME_KEYLIST_MODE_EXTERN\n" + " --sigs use GPGME_KEYLIST_MODE_SIGS\n" + " --tofu use GPGME_KEYLIST_MODE_TOFU\n" + " --sig-notations use GPGME_KEYLIST_MODE_SIG_NOTATIONS\n" + " --ephemeral use GPGME_KEYLIST_MODE_EPHEMERAL\n" + " --validate use GPGME_KEYLIST_MODE_VALIDATE\n" + " --locate use GPGME_KEYLIST_MODE_LOCATE\n" + , stderr); + exit (ex); +} + +int +main (int argc, char **argv) +{ + int last_argc = -1; + Protocol protocol = OpenPGP; + unsigned int mode = 0; + bool only_secret = false; + + if (argc) { + argc--; argv++; + } + + while (argc && last_argc != argc ) { + last_argc = argc; + if (!strcmp (*argv, "--")) { + argc--; argv++; + break; + } else if (!strcmp (*argv, "--help")) { + show_usage (0); + } else if (!strcmp (*argv, "--openpgp")) { + protocol = OpenPGP; + argc--; argv++; + } else if (!strcmp (*argv, "--cms")) { + protocol = CMS; + argc--; argv++; + } else if (!strcmp (*argv, "--secret")) { + only_secret = true; + argc--; argv++; + } else if (!strcmp (*argv, "--local")) { + mode |= KeyListMode::Local; + argc--; argv++; + } else if (!strcmp (*argv, "--extern")) { + mode |= KeyListMode::Extern; + argc--; argv++; + }else if (!strcmp (*argv, "--tofu")) { + mode |= KeyListMode::WithTofu; + argc--; argv++; + } else if (!strcmp (*argv, "--sigs")) { + mode |= KeyListMode::Signatures; + argc--; argv++; + } else if (!strcmp (*argv, "--sig-notations")) { + mode |= KeyListMode::SignatureNotations; + argc--; argv++; + } else if (!strcmp (*argv, "--ephemeral")) { + mode |= KeyListMode::Ephemeral; + argc--; argv++; + } else if (!strcmp (*argv, "--validate")) { + mode |= KeyListMode::Validate; + argc--; argv++; + } else if (!strcmp (*argv, "--locate")) { + argc--; argv++; + mode |= KeyListMode::Locate; + } else if (!strncmp (*argv, "--", 2)) { + show_usage (1); + } + } + + if (argc != 1) { + show_usage (1); + } + + GpgME::initializeLibrary(); + auto ctx = std::unique_ptr (Context::createForProtocol(protocol)); + if (!ctx) { + std::cerr << "Failed to get Context"; + return -1; + } + ctx->setKeyListMode (mode); + Error err; + const GpgME::Key key = ctx->key (*argv, err, only_secret); + std::stringstream ss; + + ss << "Key " << key << " Err: " << err.asString() << "\n"; + + std::cout << ss.str(); + + return 0; +} diff --git a/lang/cpp/tests/run-keylist.cpp b/lang/cpp/tests/run-keylist.cpp new file mode 100644 index 00000000..54577396 --- /dev/null +++ b/lang/cpp/tests/run-keylist.cpp @@ -0,0 +1,151 @@ +/* + run-keylist.cpp + + This file is part of GpgMEpp's test suite. + Copyright (c) 2018 Intevation GmbH + + QGpgME is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License, + version 2, as published by the Free Software Foundation. + + QGpgME is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include "context.h" +#include "key.h" +#include "keylistresult.h" + +#include +#include +#include + +using namespace GpgME; + +static int +show_usage (int ex) +{ + fputs ("usage: run-keylist [options] [pattern]\n\n" + "Options:\n" + " --verbose run in verbose mode\n" + " --openpgp use the OpenPGP protocol (default)\n" + " --cms use the CMS protocol\n" + " --secret list only secret keys\n" + " --with-secret list pubkeys with secret info filled\n" + " --local use GPGME_KEYLIST_MODE_LOCAL\n" + " --extern use GPGME_KEYLIST_MODE_EXTERN\n" + " --sigs use GPGME_KEYLIST_MODE_SIGS\n" + " --tofu use GPGME_KEYLIST_MODE_TOFU\n" + " --sig-notations use GPGME_KEYLIST_MODE_SIG_NOTATIONS\n" + " --ephemeral use GPGME_KEYLIST_MODE_EPHEMERAL\n" + " --validate use GPGME_KEYLIST_MODE_VALIDATE\n" + " --locate use GPGME_KEYLIST_MODE_LOCATE\n" + , stderr); + exit (ex); +} + +int +main (int argc, char **argv) +{ + int last_argc = -1; + Protocol protocol = OpenPGP; + unsigned int mode = 0; + bool only_secret = false; + + if (argc) { + argc--; argv++; + } + + while (argc && last_argc != argc ) { + last_argc = argc; + if (!strcmp (*argv, "--")) { + argc--; argv++; + break; + } else if (!strcmp (*argv, "--help")) { + show_usage (0); + } else if (!strcmp (*argv, "--openpgp")) { + protocol = OpenPGP; + argc--; argv++; + } else if (!strcmp (*argv, "--cms")) { + protocol = CMS; + argc--; argv++; + } else if (!strcmp (*argv, "--secret")) { + only_secret = true; + argc--; argv++; + } else if (!strcmp (*argv, "--local")) { + mode |= KeyListMode::Local; + argc--; argv++; + } else if (!strcmp (*argv, "--extern")) { + mode |= KeyListMode::Extern; + argc--; argv++; + }else if (!strcmp (*argv, "--tofu")) { + mode |= KeyListMode::WithTofu; + argc--; argv++; + } else if (!strcmp (*argv, "--sigs")) { + mode |= KeyListMode::Signatures; + argc--; argv++; + } else if (!strcmp (*argv, "--sig-notations")) { + mode |= KeyListMode::SignatureNotations; + argc--; argv++; + } else if (!strcmp (*argv, "--ephemeral")) { + mode |= KeyListMode::Ephemeral; + argc--; argv++; + } else if (!strcmp (*argv, "--validate")) { + mode |= KeyListMode::Validate; + argc--; argv++; + } else if (!strcmp (*argv, "--locate")) { + argc--; argv++; + mode |= KeyListMode::Locate; + } else if (!strncmp (*argv, "--", 2)) { + show_usage (1); + } + } + + if (argc > 1) { + show_usage (1); + } + + GpgME::initializeLibrary(); + auto ctx = std::unique_ptr (Context::createForProtocol(protocol)); + if (!ctx) { + std::cerr << "Failed to get Context"; + return -1; + } + ctx->setKeyListMode (mode); + Error err = ctx->startKeyListing (*argv, only_secret); + if (err) { + std::cout << "Error: " << err.asString() << "\n"; + return -1; + } + GpgME::Key key; + std::stringstream ss; + do { + key = ctx->nextKey(err); + ss << key << "\n\n"; + } while (!err && !key.isNull()); + + std::cout << ss.str(); + + return 0; +}