Imported Upstream version 1.14.0 upstream/1.14.0
authorJinWang An <jinwang.an@samsung.com>
Wed, 1 Dec 2021 07:54:38 +0000 (16:54 +0900)
committerJinWang An <jinwang.an@samsung.com>
Wed, 1 Dec 2021 07:54:38 +0000 (16:54 +0900)
142 files changed:
ChangeLog
Makefile.in
NEWS
VERSION
aclocal.m4
configure
configure.ac
doc/Makefile.in
doc/defsincdate
doc/gpgme.info
doc/gpgme.info-1
doc/gpgme.info-2
doc/gpgme.texi
gpgme.spec
lang/Makefile.in
lang/cl/Makefile.in
lang/cl/gpgme.asd
lang/cpp/Makefile.in
lang/cpp/src/Makefile.in
lang/cpp/src/context.cpp
lang/cpp/src/context.h
lang/cpp/src/editinteractor.cpp
lang/cpp/src/global.h
lang/cpp/src/gpgsignkeyeditinteractor.cpp
lang/cpp/src/gpgsignkeyeditinteractor.h
lang/cpp/src/key.cpp
lang/cpp/src/key.h
lang/cpp/src/util.h
lang/cpp/src/verificationresult.cpp
lang/cpp/tests/Makefile.in
lang/js/BrowserTestExtension/Makefile.in
lang/js/BrowserTestExtension/tests/startup.js
lang/js/DemoExtension/Makefile.in
lang/js/Makefile.in
lang/js/src/Connection.js
lang/js/src/Errors.js
lang/js/src/Makefile.in
lang/js/src/index.js
lang/js/unittests.js
lang/python/Makefile.in
lang/python/doc/Makefile.am
lang/python/doc/Makefile.in
lang/python/doc/meta/TODO.org [deleted file]
lang/python/doc/meta/old-commits.log [deleted file]
lang/python/doc/rst/gpgme-python-howto.rst [deleted file]
lang/python/doc/rst/index.rst [deleted file]
lang/python/doc/rst/maintenance-mode.rst [deleted file]
lang/python/doc/rst/short-history.rst [deleted file]
lang/python/doc/rst/what-is-new.rst [deleted file]
lang/python/doc/rst/what-was-new.rst [deleted file]
lang/python/doc/src/gpgme-python-howto.org [moved from lang/python/doc/src/gpgme-python-howto with 99% similarity]
lang/python/doc/src/gpgme-python-howto.tex~ [moved from lang/python/doc/texinfo/gpgme-python-howto.texi with 64% similarity]
lang/python/doc/src/index.org [moved from lang/python/doc/src/index with 100% similarity]
lang/python/doc/src/maintenance-mode.org [moved from lang/python/doc/src/maintenance-mode with 100% similarity]
lang/python/doc/src/short-history.org [moved from lang/python/doc/src/short-history with 100% similarity]
lang/python/doc/src/what-is-new.org [moved from lang/python/doc/src/what-is-new with 100% similarity]
lang/python/doc/src/what-was-new.org [moved from lang/python/doc/src/what-was-new with 100% similarity]
lang/python/doc/texinfo/index.texi [deleted file]
lang/python/doc/texinfo/maintenance-mode.texi [deleted file]
lang/python/doc/texinfo/short-history.texi [deleted file]
lang/python/doc/texinfo/what-is-new.texi [deleted file]
lang/python/doc/texinfo/what-was-new.texi [deleted file]
lang/python/examples/Makefile.in
lang/python/src/Makefile.in
lang/python/tests/Makefile.am
lang/python/tests/Makefile.in
lang/python/tests/support.py
lang/python/tests/t-encrypt-sym.py
lang/python/tests/t-trustlist.py [deleted file]
lang/qt/Makefile.in
lang/qt/doc/Makefile.in
lang/qt/src/GpgCardJob [new file with mode: 0644]
lang/qt/src/Makefile.am
lang/qt/src/Makefile.in
lang/qt/src/exportjob.h
lang/qt/src/gpgcardjob.h [new file with mode: 0644]
lang/qt/src/gpgme_backend_debug.cpp [deleted file]
lang/qt/src/gpgme_backend_debug.h [deleted file]
lang/qt/src/job.cpp
lang/qt/src/protocol.h
lang/qt/src/qgpgme_debug.cpp [new file with mode: 0644]
lang/qt/src/qgpgme_debug.h [new file with mode: 0644]
lang/qt/src/qgpgmebackend.cpp
lang/qt/src/qgpgmebackend.h
lang/qt/src/qgpgmedecryptverifyjob.cpp
lang/qt/src/qgpgmeexportjob.cpp
lang/qt/src/qgpgmeexportjob.h
lang/qt/src/qgpgmegpgcardjob.cpp [new file with mode: 0644]
lang/qt/src/qgpgmegpgcardjob.h [new file with mode: 0644]
lang/qt/src/qgpgmenewcryptoconfig.cpp
lang/qt/src/qgpgmerefreshkeysjob.cpp
lang/qt/src/qgpgmesecretkeyexportjob.cpp
lang/qt/src/qgpgmesignkeyjob.cpp
lang/qt/src/qgpgmesignkeyjob.h
lang/qt/src/signkeyjob.h
lang/qt/tests/Makefile.am
lang/qt/tests/Makefile.in
lang/qt/tests/t-config.cpp
lang/qt/tests/t-encrypt.cpp
lang/qt/tests/t-remarks.cpp [new file with mode: 0644]
lang/qt/tests/t-support.cpp
lang/qt/tests/t-support.h
m4/python.m4
src/Makefile.am
src/Makefile.in
src/context.h
src/engine-assuan.c
src/engine-backend.h
src/engine-g13.c
src/engine-gpg.c
src/engine-gpgconf.c
src/engine-gpgsm.c
src/engine-spawn.c
src/engine-uiserver.c
src/engine.c
src/export.c
src/gpgme-json.c
src/gpgme-tool.c
src/gpgme.c
src/gpgme.h.in
src/key.c
src/keylist.c
src/posix-util.c
src/verify.c
src/w32-io.c
src/w32-util.c
tests/Makefile.in
tests/gpg/Makefile.am
tests/gpg/Makefile.in
tests/gpg/t-gpgconf.c
tests/gpg/t-trustlist.c [deleted file]
tests/gpgsm/Makefile.in
tests/gpgsm/t-genkey.c
tests/gpgsm/t-support.h
tests/json/Makefile.in
tests/json/t-decrypt-verify.out.json
tests/json/t-keylist-secret.out.json
tests/opassuan/Makefile.in
tests/run-export.c
tests/run-keylist.c
tests/run-sign.c
tests/run-verify.c

index f5df68b..a9f764d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,411 @@
+2020-07-16  Werner Koch  <wk@gnupg.org>
+
+       Release 1.14.0.
+       + commit 6d7bf78ca5af35b0860aa20b12f799ab03752190
+       * configure.ac: Bump LT versions to c=C34/A23/R0 cpp=C17/A11/R0
+       qt=C11/A4/R0.
+
+2020-07-16  Andre Heinecke  <aheinecke@gnupg.org>
+
+       qt, cpp: Support export modes.
+       + commit 690d967196d9f888e2b7c12d8c77ad752d7e15bf
+       * lang/cpp/context.cpp, lang/cpp/context.h
+       (Context::startPublicKeyExport, Context::exportPublicKeys): Extend
+       with flags paramenter.
+       (Context::ExportMode): New.
+       * lang/qt/src/exportjob.h (ExportJob::setExportMode): New.
+       * lang/qt/src/qgpgmeexportjob.cpp, lang/qt/src/qgpgmeexportjob.h:
+       Update accordingly.
+
+2020-07-16  Werner Koch  <wk@gnupg.org>
+
+       core: Also allow GPGME_EXPORT_MODE_SSH for gpgme_op_export.
+       + commit dfeedcc28d0406f5ad8ff8ad397e1ef930676535
+       * src/export.c (export_start): Allow that mode.
+
+       core: New export mode to export as OpenSSH public key.
+       + commit 7f9e0ca57b29cc96bd1ca717d891c11db7435c5a
+       * src/gpgme.h.in (GPGME_EXPORT_MODE_SSH): New.
+       * src/export.c (export_ext_start): Allow for new mode.
+       * src/engine-gpg.c (export_common): Implement.
+       * tests/run-export.c (status_cb): New.
+       (main): New options --status and --ssh.
+
+2020-07-15  Werner Koch  <wk@gnupg.org>
+
+       core: Deprecate the non-working trustlist functions.
+       + commit 858909168298e8c6fb6f9f9009be2ee2d0d9f0ec
+       * src/gpgme.h.in: Clarify that the trustlist function should not be
+       used.
+       * src/engine.c (_gpgme_engine_op_trustlist): Always return an error.
+       * src/engine-backend.h (struct engine_ops): Remove trustlist member.
+       * src/engine-gpg.c (gpg_trustlist): Remove.
+       (struct engine_ops): Remove that member.  Also in all other engines.
+       * tests/gpg/t-trustlist.c: Remove.
+       * lang/python/tests/t-trustlist.py: Remove.
+
+       core: New keylist mode GPGME_KEYLIST_MODE_WITH_KEYGRIP.
+       + commit c8048bf8eb988f22b20215197f4739bedafc4264
+       * src/gpgme.h.in (GPGME_KEYLIST_MODE_WITH_KEYGRIP): New.
+       * src/gpgme-json.c (op_keylist): New flag "keygrip".
+       * src/engine-gpg.c (gpg_keylist_build_options): Pass the options.
+
+       * lang/cpp/src/global.h (WithKeygrip): New.
+       * lang/cpp/src/context.cpp: Add check.
+       * lang/cpp/src/key.cpp (Key::update): Handle WithKeygrip.
+       * lang/cpp/src/verificationresult.cpp: Ditto.
+       * lang/cpp/src/util.h (add_to_gpgme_keylist_mode_t): Ditto.
+
+2020-07-14  Werner Koch  <wk@gnupg.org>
+
+       python: Workaround for a regression in GnuPG 2.2.21.
+       + commit 32b80cf3c7d278ddf27117617a3e95e4a12c28c8
+       * lang/python/tests/support.py (is_gpg_version): New.
+       * lang/python/tests/t-encrypt-sym.py: Add workaround.
+
+2020-06-09  Andre Heinecke  <aheinecke@gnupg.org>
+
+       doc: Explain verify_result_t.status == 0 more.
+       + commit 88f3202521d422d94bfd79e61bde00707d6f28c9
+       * doc/gpgme.texi (gpgme_verify_result_t): Explain
+       GPGME_STATUS_NO_ERROR more clearly.
+
+2020-06-05  Werner Koch  <wk@gnupg.org>
+
+       core: Fix setting of the chain_model signature result.
+       + commit 728ead8ebd426307c6b3f1e3794b3a7ab585eebd
+       * src/verify.c (parse_trust): Fix detection of "chain" keyword.
+
+2020-05-11  NIIBE Yutaka  <gniibe@fsij.org>
+
+       tests: Remove/change tests for GnuPG 2.3 with no gpg.keyserver.
+       + commit 0cc040e82f9943792a58e73dbc97e20d312858fb
+       * lang/qt/tests/t-config.cpp (testKeyserver): Remove.
+       * tests/gpg/t-gpgconf.c (main): Test with dirmngr.keyserver.
+
+2020-05-08  Andre Heinecke  <aheinecke@gnupg.org>
+
+       w32: Explicitly link ws2_32.
+       + commit 52f930c1ed7eee6336a41598c90ef3605b7ed02b
+       * src/Makefile.am (gpgme_w32_extra_libs): New.
+       (libgpgme_la_LIBADD, libgpgme_glib_la_LIBADD): Use it.
+
+2020-05-08  dupgit  <olivier.delhomme@free.fr>
+
+       GPGME_CREATE_NOEXPIRE is only available since 1.9.0.
+       + commit 49c13854f3bf49bc0bf18c6ae6bbf9d66b6625c2
+        * doc/gpgme.texi: Fixes version number from 1.8.0 to
+          1.9.0 for GPGME_CREATE_NOEXPIRE.
+
+       GnuPG-Bug-Id: T4922
+
+2020-05-08  Werner Koch  <wk@gnupg.org>
+
+       core: Make sure the keygrip is available in WITH_SECRET mode.
+       + commit 004fdf61c8b94f646409f4d5855adf8e43b29627
+       * src/engine-gpg.c (gpg_keylist_build_options): Send --with-keygrip
+       if --with-secret is used.
+
+2020-05-08  Andre Heinecke  <aheinecke@gnupg.org>
+
+       tests, json: Do not check for keygrip of pubkeys.
+       + commit 5c0d1c7f76c95bad8bce4ad3bafd121ec5101d3c
+       * tests/json/t-keylist-secret.out.json: Do not check for keygrip
+       of bravo key.
+
+2020-03-27  NIIBE Yutaka  <gniibe@fsij.org>
+
+       tests: Add ECC key generation for tests/gpgsm.
+       + commit 3658e2df65d321e334a8c96b4d252a4be20354bd
+       * tests/gpgsm/t-genkey.c (check_result): New.
+
+       build: Fix library dependency.
+       + commit 71ef398bfd72d505290376d82575eb4f3aece035
+       * src/Makefile.am (gpgme_tool_LDADD): Add @GPG_ERROR_LIBS@.
+
+2020-03-17  Werner Koch  <wk@gnupg.org>
+
+       core: New context flags "include-key-block" and "auto-key-import".
+       + commit 3afa534645e3826c95e7c70d7ae61ffa2d63acec
+       * src/gpgme.c (gpgme_set_ctx_flag): Add flags "include-key-block" and
+       "auto-key-import".
+       (gpgme_get_ctx_flag): Ditto.
+       * src/context.h (struct gpgme_context): Add flags include_key_block
+       and auto_key_import.
+       * src/engine-gpg.c (struct engine_gpg): Likewise.
+       (gpg_set_engine_flags): Set the flags for gpg versions >= 2.2.20.
+       (gpg_decrypt): Set option according to the new flags.
+       (gpg_encrypt): Ditto.
+       (gpg_encrypt_sign): Ditto.
+       (gpg_sign): Ditto.
+       (gpg_verify): Ditto.
+
+       tests/run-verify: Add option --auto-key-import.
+       tests/run-sign: add option --include-key-block.
+
+2020-03-03  Bernhard Reiter  <bernhard@intevation.de>
+
+       python: fix minor typo in howto.
+       + commit 11edc073a3d2bf72e49827e97349cb364612f300
+
+
+2020-02-19  Andre Heinecke  <aheinecke@gnupg.org>
+
+       qt: Change logging category.
+       + commit ec9690cf5ce85f43997ac2a3abd3e728012aee4a
+       * lang/qt/src/*: Change logging category to macro to QGPGME_LOG.
+
+       qt: Log execution args of gpg-card.
+       + commit ba08aadfa7d254f459f51470a7331c6cc2de5199
+       * lang/qt/src/qgpgmegpgcardjob.cpp (do_work): Log call.
+
+2020-02-12  Andre Heinecke  <aheinecke@gnupg.org>
+
+       qt: Add dummy context to make mixin happy.
+       + commit 9ca679c15054fbc1cc20e428a6ddf6a67dd0491e
+       * lang/qt/qgpgmegpgcardjob.cpp (QGpgMEGpgCardJob): Add context.
+
+       qt: Add GpgCardJob following the job pattern.
+       + commit 77feaa451074741c2d07051915bc23d8b8377242
+       * lang/qt/src/Makefile.am: Add new files.
+       * lang/qt/src/job.cpp (GpgCardJob): Add impl stuff.
+       * lang/qt/src/protocol.h (gpgCardJob): Get one.
+       * lang/qt/src/qgpgmebackend.cpp,
+       lang/qt/src/qgpgmebackend.h: Add helpers to get the job.
+       * lang/qt/src/qgpgmegpgcardjob.cpp,
+       lang/qt/src/gpgcardjob.h,
+       lang/qt/src/qgpgmegpgcardjob.h: New.
+
+2020-01-29  Andre Heinecke  <aheinecke@gnupg.org>
+
+       Do not test for a bug in older GnuPG versions.
+       + commit cff600f1f65a2164ab25ff2b039cba008776ce62
+       * tests/json/t-keylist-secret.out.json
+
+2020-01-24  Daniel Kahn Gillmor  <dkg@fifthhorseman.net>
+
+       m4/python: Scan for python 3.8 as well.
+       + commit 414938cfedbdb97b83d00e8619dec9502096be22
+       * m4/python.m4: Scan for python 3.8 as well.
+
+2020-01-17  Andre Heinecke  <aheinecke@gnupg.org>
+
+       core: Add MacOS fallbacks to look for binaries.
+       + commit 39052913f2154fa8e9575727e27d4101ef8b6460
+       * src/posix-util.c (find_executable): New.
+       (walk_path_str): Factored out from walk_path.
+       (walk_path): Replaced by find_executable.
+       (_gpgme_get_gpg_path, _gpgme_get_gpgconf_path): Use find_executable.
+
+2019-12-13  Andre Heinecke  <aheinecke@gnupg.org>
+
+       cpp, qt: Use uidhash to select uids for signing.
+       + commit 194272dbc3e326cc32c1464bc6fda0c0d10b5559
+       * lang/cpp/src/gpgsignkeyeditinteractor.cpp (action):
+       Use uidhash instead of number.
+       (GpgSignKeyEditInteractor::setKey): New.
+       * lang/cpp/src/gpgsignkeyeditinteractor.h: Update accordingly.
+       * lang/cpp/src/key.h, lang/cpp/src/key.cpp: Wrap uidhash.
+       * lang/qt/src/qgpgmesignkeyjob.cpp: Set the key.
+
+2019-12-13  Werner Koch  <wk@gnupg.org>
+
+       core: Extend gpgme_user_id_t with uidhash member.
+       + commit 5eeae535ee0df981d8ae8b758b5bb0d190c7fd89
+       * src/gpgme.h.in (struct _gpgme_user_id): Add field 'uidhash'.
+       * src/key.c (gpgme_key_unref): Free it.
+       * src/keylist.c (keylist_colon_handler): Set it.
+       * tests/run-keylist.c (main): Print it.
+
+2019-12-11  Andre Heinecke  <aheinecke@gnupg.org>
+
+       Revert "doc: Remove UI Server documentation"
+       + commit 7e7eaf43424556c3c25edc7b67e760ab60de55ce
+       This reverts commit 1b2ad3b73c37d0583b8e438b4707dca60e26ae7e.
+
+2019-12-06  Daniel Kahn Gillmor  <dkg@fifthhorseman.net>
+
+       gpg: Avoid error diagnostics with --override-session-key when verifying.
+       + commit ae4d7761a15b82eb98b0bcc72af2ae2e8973e1f9
+       * src/engine-gpg.c (gpg_decrypt): only send --no-keyring when we are
+       not verifying.
+
+2019-12-04  Daniel Kahn Gillmor  <dkg@fifthhorseman.net>
+
+       gpgme-tool: Fix help text for INCLUDE_CERTS.
+       + commit c0c97dbbe6e08d338ba56abec023bd57287e3239
+       * src/gpgme-tool.c (hlp_include_certs): added missing newline.
+
+2019-11-27  Werner Koch  <wk@gnupg.org>
+
+       core,w32: Silence compiler warnings.
+       + commit d480a3c8f3a3fff867b84fd8feca9f111ae4adc7
+       * src/w32-util.c (_gpgme_w32_cancel_synchronous_io): Add some casts.
+
+2019-11-12  Andre Heinecke  <aheinecke@gnupg.org>
+
+       doc: Remove UI Server documentation.
+       + commit 1b2ad3b73c37d0583b8e438b4707dca60e26ae7e
+       * doc/Makefile.am: Remove uiserver.texi
+       * doc/gpgme.texi: Remove UI-Server mentions.
+       * doc/uiserver.texi: Removed.
+
+2019-11-08  NIIBE Yutaka  <gniibe@fsij.org>
+
+       qt,tests: Take care for old DSA key using deprecated digest algo.
+       + commit c49324200734e8ee8524bc096195e24e8aae87cb
+       * lang/qt/tests/t-remarks.cpp (initTestCase): Supply
+       allow-weak-key-signatures flag for GnuPG 2.3, which
+       normally rejects use of SHA1 digest.
+
+2019-11-06  Andre Heinecke  <aheinecke@gnupg.org>
+
+       qt, tests: Add check for supported versions.
+       + commit e7b5c6405da515101f62acce2837e6c0cc115b76
+       * lang/qt/tests/t-encrypt.cpp (decryptSupported): Moved to
+       t-support as loopbackSupported.
+       * lang/qt/tests/t-remarks.cpp: Check for loopbackSupported.
+       * lang/qt/tests/t-support.cpp, lang/qt/tests/t-support.h
+       (loopbackSupported): New.
+
+       qt, tests: Replace accidentally commited assert.
+       + commit 024edbbd3c0059654e13c1c6acf78456450469ab
+       * lang/qt/test/t-remarks.cpp (testRemarkReplaceSingleUIDExportable):
+       Use QVERIFY instead of assert.
+
+       qt,tests: Add test to add an exportable certify.
+       + commit a56f6015e9518180237a70b8abc5ab9804212986
+       * lang/qt/test/t-remarks.cpp (testRemarkReplaceSingleUIDExportable):
+       New.
+
+2019-11-06  NIIBE Yutaka  <gniibe@fsij.org>
+
+       python: Fix how to generate documentation.
+       + commit 1b840a151ad7f9680ec5144da5efb0ee6c1dcf1f
+       * lang/python/doc/Makefile.am: Explicitly write rules to generate rst
+       and texinfo files.
+
+2019-11-04  Andre Heinecke  <aheinecke@gnupg.org>
+
+       qt, tests: Add testcase for multiple remarsk.
+       + commit 9cf4db1e5271ae1dd6f7ecb11513203cec368bc6
+       * lang/qt/tests/t-remarks.cpp (testMultipleRemarks): New.
+
+       cpp: Add API to obtain mutliple remarks.
+       + commit cb7668caeb71429afce1aded9128334182b233e1
+       * lang/cpp/src/key.cpp, lang/cpp/src/key.h (UserID::remarks): New.
+       * NEWS: Mention this.
+
+       qt,tests: Move remarks test out and extend it.
+       + commit db888b1cc05723423a3154fe89e6191812c9c869
+       * lang/qt/tests/t-various.cpp (testRemarks): Move out.
+       * lang/qt/tests/t-remarks.cpp: New.
+       * lang/qt/tests/Makefile.am: Update accordingly.
+
+       cpp: Fix dupe_ok state for single uid.
+       + commit 08933c183a4c299eb4696092d6d229f607fce985
+       * lang/cpp/src/gpgsignkeyeditinteractor.cpp (makeTable):
+       Add transition from command to dupe_ok
+
+2019-11-01  Andre Heinecke  <aheinecke@gnupg.org>
+
+       qt: Allow adding empty remarks.
+       + commit d61491dd25d86a2bee54e4be29b715d97840be67
+       * lang/qt/src/qgpgmesignkeyjob.cpp (sign_key): Allow empty
+       remarks.
+
+       cpp: Minor optimization in remark lookup.
+       + commit 174caaa6f53e1125724a47dad3a5c991298aee6d
+       * lang/cpp/src/key.cpp (UserID::remark): Use C-API.
+
+       cpp: Fix adding duplicated sigs on multiple uids.
+       + commit 266e05eee859b83d97079c2fbbd2f1da010fa412
+       * lang/cpp/src/gpgsignkeyeditinteractor.cpp: Add another
+       state DUPE_OK2 to allow gpg looping over all uids.
+
+       cpp: Add env var to control editinteractor debug.
+       + commit a4d5394b4607382d846e8c156439ac182f9945d7
+       * lang/cpp/src/editinteractor.cpp (EditInteractor::Private::Private):
+       Read "GPGMEPP_INTERACTOR_DEBUG" env var.
+       (EditInteractor::Private::~Private): Close debug file.
+
+2019-10-29  Andre Heinecke  <aheinecke@gnupg.org>
+
+       core: Fix parsing of userid sigs after a subpkg.
+       + commit 1242c6c93ac63383f648dd84cff847b86f4925f9
+       * src/keylist.c (keylist_colon_handler): Do not clear
+       out the tmp_uid when a subpacket line is encountered.
+
+       qt,tests: Add test for remarks.
+       + commit 1f3ca698f16465761649d402b999f0e2c9184344
+       * lang/qt/tests/t-various.cpp (testRemark): New.
+
+       qt: Extend signkeyjob to handle remarks and dups.
+       + commit 373acd6923f2fc968fb870d2a8a9b49398cb652f
+       * lang/qt/src/qgpgmesignkeyjob.cpp: Handle remarks and
+       dupeOK.
+       * lang/qt/src/signkeyjob.h (SignKeyJob::setDupeOk),
+       (SignKeyJob::setRemark): New.
+
+       cpp: Add support for multiple keysigs in edit.
+       + commit 36f7f7a478228a64d3d51a4901a264c8f55f90bb
+       * lang/cpp/src/gpgsignkeyeditinteractor.cpp
+       (GpgSignKeyEditInteractor::setDupeOk): New.
+       (makeTable): Add new tansitions.
+       (SignKeyState): Add DUPE_OK Status.
+       (GpgSignKeyEditInteractor::action): Handle DUPE_OK.
+       (GpgSignKeyEditInteractor::Private::Private): Carry flag.
+
+       cpp: Add convenience API to obtain remarks.
+       + commit 83ecf1686a9a4e7de3a7b176cf272d9f9f640445
+       * lang/cpp/src/key.h, lang/cpp/src/key.cpp (UserID::remark): New.
+
+       core: Add cert-notation support and extended-edit.
+       + commit 0224408c6332648461bdbba562f1a61c947c8ed3
+       * src/context.h (gpgme_context): Add new flag for extended-edit.
+       * src/engine-gpg.c (append_args_from_sig_notations): Add flags to
+       control the kind of notations.
+       (gpg_edit): Respect extended-edit and notations.
+       (gpg_encrypt_sign, gpg_sign): Update call to
+       append_args_from_sig_notations.
+       * src/gpgme.c (gpgme_set_ctx_flag, gpgme_get_ctx_flag): Support
+       extended-edit.
+       * NEWS, doc/gpgme.texi: Mention extended-edit.
+
+2019-10-28  Andre Heinecke  <aheinecke@gnupg.org>
+
+       core,w32: Initialize dbg_help for socket debugging.
+       + commit fe2892618c20cd40c342cce26ffb6ac4644fd3c3
+       * src/w32-io.c (_gpgme_io_select): Initialize dbg_help.
+
+2019-08-06  NIIBE Yutaka  <gniibe@fsij.org>
+
+       json: Fix t-decrypt-verify.out for GnuPG >= 2.3.
+       + commit b97434fbf087f3176daf39699ff579d38d265317
+       * tests/json/t-decrypt-verify.out.json: Remove check with key of
+       04071FB807287134.
+
+2019-07-16  Andre Heinecke  <aheinecke@gnupg.org>
+
+       core: Fix arg counting in enginge-gpg.
+       + commit 6f4a886b30caaac3a30fcf30a7525d656d7e25ce
+       * src/engine-gpg.c (build_argv): Properly check for all
+       arguments and allocate memory for them.
+
+2019-07-12  NIIBE Yutaka  <gniibe@fsij.org>
+
+       python: doc: Remove generated files, put rules in Makefile.
+       + commit 36428d8cf153a33faac6a951752cdc76e23f9737
+       * lang/python/doc/Makefile.am (EXTRA_DIST): Remove files not
+       distributed like files under meta.
+       * Add rules to generate .rst and .texi files.
+       * lang/python/doc/rst: Remove .rst files to be generated.
+       * lang/python/doc/texinfo: Remove .texi files to be generated.
+
+       python: doc: Add suffix for org files.
+       + commit d9387650ffb159bbd04db74c4a1dba6f94e83116
+
+
 2019-06-13  Werner Koch  <wk@gnupg.org>
 
        Release 1.13.1.
index 6790f8c..cd83421 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -164,7 +164,7 @@ am__recursive_targets = \
   $(RECURSIVE_CLEAN_TARGETS) \
   $(am__extra_recursive_targets)
 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       cscope distdir dist dist-all distcheck
+       cscope distdir distdir-am dist dist-all distcheck
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -431,6 +431,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -487,8 +488,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' $(SHELL) ./config.status'; \
            $(SHELL) ./config.status;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -630,7 +631,10 @@ distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
        -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        $(am__remove_distdir)
        test -d "$(distdir)" || mkdir "$(distdir)"
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -698,7 +702,7 @@ distdir: $(DISTFILES)
          ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
        || chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
        $(am__post_remove_distdir)
 dist-bzip2: distdir
        tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
@@ -723,7 +727,7 @@ dist-shar: distdir
        @echo WARNING: "Support for shar distribution archives is" \
                       "deprecated." >&2
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
        $(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -741,7 +745,7 @@ dist dist-all:
 distcheck: dist
        case '$(DIST_ARCHIVES)' in \
        *.tar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
        *.tar.bz2*) \
          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
        *.tar.lz*) \
@@ -751,7 +755,7 @@ distcheck: dist
        *.tar.Z*) \
          uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
        *.shar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
diff --git a/NEWS b/NEWS
index 9a7eac0..6dfb4e1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,48 @@
+Noteworthy changes in version 1.14.0 (2020-07-16)
+-------------------------------------------------
+
+ * New keylist mode to force the engine to return the keygrip. [#4820]
+
+ * New export mode to export as OpenSSH public key.  [#4310]
+
+ * New context flag "extended-edit" to enable expert key edit. [#4734]
+
+ * Deprecate the anyway non working trustlist functions.  [#4834]
+
+ * cpp: Add convenience API to obtain remarks. [#4734]
+
+ * cpp: The sign key edit-interactor now supports multiple signatures
+   from the same key. [#4734]
+
+ * qt: Extended signkeyjob to handle remarks and multiple signatures.
+   [#4734]
+
+ * qt: Added job API for gpg-card.
+
+ * qt: The logging category has been changed to gpg.qgpgme to be more
+       consistent with other qt logging categories.
+
+ * Interface changes relative to the 1.13.1 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GPGME_KEYLIST_MODE_WITH_KEYGRIP              NEW.
+ GPGME_EXPORT_MODE_SSH                        NEW.
+ gpgme_user_id_t                         EXTENDED: New field 'uidhash'.
+ cpp: UserID::remark                          NEW.
+ cpp: UserID::remarks                         NEW.
+ cpp: GpgSignKeyEditInteractor::setDupeOk     NEW.
+ cpp: Context::exportPublicKeys          EXTENDED: New param 'flags'.
+ cpp: Context::startPublicKeyExport      EXTENDED: New param 'flags'.
+ cpp: Context::ExportMode                     NEW.
+ qt: SignKeyJob::setDupeOk                    NEW.
+ qt: SignKeyJob::setRemark                    NEW.
+ qt: GpgCardJob                               NEW.
+ qt: ExportJob::setExportFlags                NEW.
+
+ [c=C34/A23/R0 cpp=C17/A11/R0 qt=C11/A4/R0]
+
+ Release-info: https://dev.gnupg.org/T4996
+
+
 Noteworthy changes in version 1.13.1 (2019-06-13)
 -------------------------------------------------
 
diff --git a/VERSION b/VERSION
index b50dd27..850e742 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.13.1
+1.14.0
index 868a164..fe217a1 100644 (file)
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+# Copyright (C) 2002-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.15'
+[am__api_version='1.16'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.15], [],
+m4_if([$1], [1.16.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.15])dnl
+[AM_AUTOMAKE_VERSION([1.16.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 # AM_COND_IF                                            -*- Autoconf -*-
 
-# Copyright (C) 2008-2014 Free Software Foundation, Inc.
+# Copyright (C) 2008-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -147,7 +147,7 @@ fi[]dnl
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -178,7 +178,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -369,13 +369,12 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
 AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
@@ -383,49 +382,41 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
   # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  AS_CASE([$CONFIG_FILES],
+          [*\'*], [eval set x "$CONFIG_FILES"],
+          [*], [set x $CONFIG_FILES])
   shift
-  for mf
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
   do
     # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named 'Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
+    am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
     # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running 'make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "$am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`AS_DIRNAME(["$am_mf"])`
+    am_filepart=`AS_BASENAME(["$am_mf"])`
+    AM_RUN_LOG([cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles]) || am_rc=$?
   done
+  if test $am_rc -ne 0; then
+    AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).])
+  fi
+  AS_UNSET([am_dirpart])
+  AS_UNSET([am_filepart])
+  AS_UNSET([am_mf])
+  AS_UNSET([am_rc])
+  rm -f conftest-deps.mk
 }
 ])# _AM_OUTPUT_DEPENDENCY_COMMANDS
 
@@ -434,18 +425,17 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 # -----------------------------
 # This macro should only be invoked once -- use via AC_REQUIRE.
 #
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each '.P' file that we will
-# need in order to bootstrap the dependency handling code.
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
 AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 [AC_CONFIG_COMMANDS([depfiles],
      [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
+     [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -532,8 +522,8 @@ AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
 AC_REQUIRE([AC_PROG_MKDIR_P])dnl
 # For better backward compatibility.  To be removed once Automake 1.9.x
 # dies out for good.  For more background, see:
-# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
-# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
 # We need awk for the "check" target (and possibly the TAP driver).  The
 # system "awk" is bad on some platforms.
@@ -600,7 +590,7 @@ END
 Aborting the configuration process, to ensure you take notice of the issue.
 
 You can download and install GNU coreutils to get an 'rm' implementation
-that behaves properly: <http://www.gnu.org/software/coreutils/>.
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
 
 If you want to complete the configuration process using your problematic
 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
@@ -642,7 +632,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -663,7 +653,7 @@ if test x"${install_sh+set}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2014 Free Software Foundation, Inc.
+# Copyright (C) 2003-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -685,7 +675,7 @@ AC_SUBST([am__leading_dot])])
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -720,7 +710,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -728,49 +718,42 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
 
 # AM_MAKE_INCLUDE()
 # -----------------
-# Check to see how make treats includes.
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
 AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
 am__doit:
-       @echo this is the am__doit target
+       @echo this is the am__doit target >confinc.out
 .PHONY: am__doit
 END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
 am__include="#"
 am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from 'make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+  AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+      ['0:this is the am__doit target'],
+      [AS_CASE([$s],
+          [BSD], [am__include='.include' am__quote='"'],
+          [am__include='include' am__quote=''])])
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -809,7 +792,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -838,7 +821,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -885,7 +868,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -904,7 +887,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -985,7 +968,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+# Copyright (C) 2009-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1045,7 +1028,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1073,7 +1056,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2014 Free Software Foundation, Inc.
+# Copyright (C) 2006-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1092,7 +1075,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+# Copyright (C) 2004-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
index e2318a3..e14fecd 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for gpgme 1.13.1.
+# Generated by GNU Autoconf 2.69 for gpgme 1.14.0.
 #
 # Report bugs to <https://bugs.gnupg.org>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='gpgme'
 PACKAGE_TARNAME='gpgme'
-PACKAGE_VERSION='1.13.1'
-PACKAGE_STRING='gpgme 1.13.1'
+PACKAGE_VERSION='1.14.0'
+PACKAGE_STRING='gpgme 1.14.0'
 PACKAGE_BUGREPORT='https://bugs.gnupg.org'
 PACKAGE_URL=''
 
@@ -771,7 +771,6 @@ am__nodep
 AMDEPBACKSLASH
 AMDEP_FALSE
 AMDEP_TRUE
-am__quote
 am__include
 DEPDIR
 OBJEXT
@@ -848,6 +847,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -866,7 +866,8 @@ PACKAGE_VERSION
 PACKAGE_TARNAME
 PACKAGE_NAME
 PATH_SEPARATOR
-SHELL'
+SHELL
+am__quote'
 ac_subst_files=''
 ac_user_opts='
 enable_option_checking
@@ -956,6 +957,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1208,6 +1210,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1345,7 +1356,7 @@ fi
 for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
                datadir sysconfdir sharedstatedir localstatedir includedir \
                oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-               libdir localedir mandir
+               libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1458,7 +1469,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures gpgme 1.13.1 to adapt to many kinds of systems.
+\`configure' configures gpgme 1.14.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1498,6 +1509,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1528,7 +1540,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of gpgme 1.13.1:";;
+     short | recursive ) echo "Configuration of gpgme 1.14.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1678,7 +1690,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-gpgme configure 1.13.1
+gpgme configure 1.14.0
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2508,7 +2520,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by gpgme $as_me 1.13.1, which was
+It was created by gpgme $as_me 1.14.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2872,20 +2884,20 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 #   (Interfaces added:                 AGE++)
 #   (Interfaces removed:               AGE=0)
 #
-LIBGPGME_LT_CURRENT=33
-LIBGPGME_LT_AGE=22
-LIBGPGME_LT_REVISION=1
+LIBGPGME_LT_CURRENT=34
+LIBGPGME_LT_AGE=23
+LIBGPGME_LT_REVISION=0
 
 # If there is an ABI break in gpgmepp or qgpgme also bump the
 # version in IMPORTED_LOCATION in the GpgmeppConfig-w32.cmake.in.in
 
-LIBGPGMEPP_LT_CURRENT=16
-LIBGPGMEPP_LT_AGE=10
+LIBGPGMEPP_LT_CURRENT=17
+LIBGPGMEPP_LT_AGE=11
 LIBGPGMEPP_LT_REVISION=0
 
-LIBQGPGME_LT_CURRENT=10
-LIBQGPGME_LT_AGE=3
-LIBQGPGME_LT_REVISION=4
+LIBQGPGME_LT_CURRENT=11
+LIBQGPGME_LT_AGE=4
+LIBQGPGME_LT_REVISION=0
 ################################################
 
 
@@ -2910,8 +2922,8 @@ NEED_LIBASSUAN_VERSION=2.4.2
 
 
 VERSION_MAJOR=1
-VERSION_MINOR=13
-VERSION_MICRO=1
+VERSION_MINOR=14
+VERSION_MICRO=0
 
 ac_aux_dir=
 for ac_dir in build-aux "$srcdir"/build-aux; do
@@ -2946,7 +2958,7 @@ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 
 ac_config_headers="$ac_config_headers conf/config.h"
 
-am__api_version='1.15'
+am__api_version='1.16'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -3432,7 +3444,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='gpgme'
- VERSION='1.13.1'
+ VERSION='1.14.0'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3462,8 +3474,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
 # For better backward compatibility.  To be removed once Automake 1.9.x
 # dies out for good.  For more background, see:
-# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
-# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
 # We need awk for the "check" target (and possibly the TAP driver).  The
@@ -3514,7 +3526,7 @@ END
 Aborting the configuration process, to ensure you take notice of the issue.
 
 You can download and install GNU coreutils to get an 'rm' implementation
-that behaves properly: <http://www.gnu.org/software/coreutils/>.
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
 
 If you want to complete the configuration process using your problematic
 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
@@ -3665,45 +3677,45 @@ DEPDIR="${am__leading_dot}deps"
 
 ac_config_commands="$ac_config_commands depfiles"
 
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
 am__doit:
-       @echo this is the am__doit target
+       @echo this is the am__doit target >confinc.out
 .PHONY: am__doit
 END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
 am__include="#"
 am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from 'make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+   (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+  case $?:`cat confinc.out 2>/dev/null` in #(
+  '0:this is the am__doit target') :
+    case $s in #(
+  BSD) :
+    am__include='.include' am__quote='"' ;; #(
+  *) :
+    am__include='include' am__quote='' ;;
+esac ;; #(
+  *) :
      ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
+esac
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
 
 # Check whether --enable-dependency-tracking was given.
 if test "${enable_dependency_tracking+set}" = set; then :
@@ -6493,7 +6505,7 @@ test -n "$GITLOG_TO_CHANGELOG" || GITLOG_TO_CHANGELOG="gitlog-to-changelog"
 
 
 
-VERSION_NUMBER=0x010d01
+VERSION_NUMBER=0x010e00
 
 
 # We need to compile and run a program on the build machine.  A
@@ -23239,13 +23251,13 @@ $as_echo "$as_me: WARNING:
 
         if test -n "$PYTHON"; then
       # If the user set $PYTHON, use it and don't search something else.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= all" >&5
-$as_echo_n "checking whether $PYTHON version is >= all... " >&6; }
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 3.9" >&5
+$as_echo_n "checking whether $PYTHON version is >= 3.9... " >&6; }
       prog="import sys
 # split strings by '.' and convert to numeric.  Append some zeros
 # because we need at least 4 digits for the hex conversion.
 # map returns an iterator in Python 3.0 and a list in 2.x
-minver = list(map(int, 'all'.split('.'))) + [0, 0, 0]
+minver = list(map(int, '3.9'.split('.'))) + [0, 0, 0]
 minverhex = 0
 # xrange is not present in Python 3.0 and range returns an iterator
 for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
     else
       # Otherwise, try each interpreter until we find one that satisfies
       # VERSION.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= all" >&5
-$as_echo_n "checking for a Python interpreter with version >= all... " >&6; }
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 3.9" >&5
+$as_echo_n "checking for a Python interpreter with version >= 3.9... " >&6; }
 if ${am_cv_pathless_PYTHON+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-       for am_cv_pathless_PYTHON           in pythonall none; do
+       for am_cv_pathless_PYTHON           in python3.9 none; do
          test "$am_cv_pathless_PYTHON" = none && break
          prog="import sys
 # split strings by '.' and convert to numeric.  Append some zeros
 # because we need at least 4 digits for the hex conversion.
 # map returns an iterator in Python 3.0 and a list in 2.x
-minver = list(map(int, 'all'.split('.'))) + [0, 0, 0]
+minver = list(map(int, '3.9'.split('.'))) + [0, 0, 0]
 minverhex = 0
 # xrange is not present in Python 3.0 and range returns an iterator
 for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
@@ -23848,139 +23860,769 @@ $as_echo "$as_me: WARNING:
   fi
 
 
+           unset PYTHON
+           unset PYTHON_VERSION
+           unset PYTHON_CPPFLAGS
+           unset PYTHON_LDFLAGS
+           unset PYTHON_SITE_PKG
+           unset PYTHON_EXTRA_LIBS
+           unset PYTHON_EXTRA_LDFLAGS
+           unset ac_cv_path_PYTHON
+           unset am_cv_pathless_PYTHON
+           unset am_cv_python_version
+           unset am_cv_python_platform
+           unset am_cv_python_pythondir
+           unset am_cv_python_pyexecdir
 
-       fi
 
-       # Recover some values lost in the second attempt to find Python.
-       PYTHON="$(echo $PYTHONS | cut -d ' ' -f 1)"
-       PYTHON_VERSION="$(echo $PYTHON_VERSIONS | cut -d ' ' -f 1)"
 
-       # Remove duplicates.
-       PYTHONS="$(echo $PYTHONS | tr '[:space:]' '\n' | sort | uniq | tr '\n' ' ' | sed -e 's/ $//')"
-       PYTHON_VERSIONS="$(echo $PYTHON_VERSIONS | tr '[:space:]' '\n' | sort | uniq | tr '\n' ' ' | sed -e 's/ $//')"
 
-       if test "$PYTHON_VERSIONS"; then
-          enabled_languages_v=$(echo $enabled_languages | sed -Ee "s/python[23]?/python ($PYTHON_VERSIONS)/")
-          enabled_languages=$(echo $enabled_languages | sed -Ee "s/python[23]?/python/")
-       else
-            if test "$explicit_languages" = "1"; then
-                as_fn_error $? "
-***
-*** Please install the python development packages.
-***" "$LINENO" 5
-           else
-                enabled_languages=$(echo $enabled_languages | sed 's/python//')
-            fi
-       fi
 
-       PYTHONS=$PYTHONS
 
-    fi
+        if test -n "$PYTHON"; then
+      # If the user set $PYTHON, use it and don't search something else.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= all" >&5
+$as_echo_n "checking whether $PYTHON version is >= all... " >&6; }
+      prog="import sys
+# split strings by '.' and convert to numeric.  Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, 'all'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+  if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5
+   ($PYTHON -c "$prog") >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                              as_fn_error $? "Python interpreter is too old" "$LINENO" 5
 fi
+      am_display_PYTHON=$PYTHON
+    else
+      # Otherwise, try each interpreter until we find one that satisfies
+      # VERSION.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= all" >&5
+$as_echo_n "checking for a Python interpreter with version >= all... " >&6; }
+if ${am_cv_pathless_PYTHON+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
 
-ENABLED_LANGUAGES=$enabled_languages
-
-
-#
-# Provide information about the build.
-#
-BUILD_REVISION="ea11c2a1"
-
-
-cat >>confdefs.h <<_ACEOF
-#define BUILD_REVISION "$BUILD_REVISION"
-_ACEOF
-
-
-BUILD_VERSION=`echo "$PACKAGE_VERSION" | sed 's/\([0-9.]*\).*/\1./'`
-BUILD_VERSION="${BUILD_VERSION}59921"
-BUILD_FILEVERSION=`echo "${BUILD_VERSION}" | tr . ,`
-
-
-
-# Check whether --enable-build-timestamp was given.
-if test "${enable_build_timestamp+set}" = set; then :
-  enableval=$enable_build_timestamp; if test "$enableval" = "yes"; then
-        BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date`
+       for am_cv_pathless_PYTHON           in pythonall none; do
+         test "$am_cv_pathless_PYTHON" = none && break
+         prog="import sys
+# split strings by '.' and convert to numeric.  Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, 'all'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+  if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5
+   ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }; then :
+  break
+fi
+       done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5
+$as_echo "$am_cv_pathless_PYTHON" >&6; }
+      # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+      if test "$am_cv_pathless_PYTHON" = none; then
+       PYTHON=:
       else
-        BUILD_TIMESTAMP="$enableval"
-      fi
+        # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args.
+set dummy $am_cv_pathless_PYTHON; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  BUILD_TIMESTAMP="<none>"
-fi
+  case $PYTHON in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
+  ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
 
-cat >>confdefs.h <<_ACEOF
-#define BUILD_TIMESTAMP "$BUILD_TIMESTAMP"
-_ACEOF
+      fi
+      am_display_PYTHON=$am_cv_pathless_PYTHON
+    fi
 
 
+  if test "$PYTHON" = :; then
+      :
+  else
 
-#
-# Options to disable some regression tests
-#
-run_gpgconf_test="yes"
-# Check whether --enable-gpgconf-test was given.
-if test "${enable_gpgconf_test+set}" = set; then :
-  enableval=$enable_gpgconf_test; run_gpgconf_test=$enableval
-fi
 
- if test "$run_gpgconf_test" = "yes"; then
-  RUN_GPGCONF_TESTS_TRUE=
-  RUN_GPGCONF_TESTS_FALSE='#'
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5
+$as_echo_n "checking for $am_display_PYTHON version... " >&6; }
+if ${am_cv_python_version+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  RUN_GPGCONF_TESTS_TRUE='#'
-  RUN_GPGCONF_TESTS_FALSE=
-fi
-
-
-run_gpg_test="yes"
-# Check whether --enable-gpg-test was given.
-if test "${enable_gpg_test+set}" = set; then :
-  enableval=$enable_gpg_test; run_gpg_test=$enableval
+  am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"`
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5
+$as_echo "$am_cv_python_version" >&6; }
+  PYTHON_VERSION=$am_cv_python_version
 
- if test "$run_gpg_test" = "yes"; then
-  RUN_GPG_TESTS_TRUE=
-  RUN_GPG_TESTS_FALSE='#'
-else
-  RUN_GPG_TESTS_TRUE='#'
-  RUN_GPG_TESTS_FALSE=
-fi
 
 
-run_gpgsm_test="yes"
-# Check whether --enable-gpgsm-test was given.
-if test "${enable_gpgsm_test+set}" = set; then :
-  enableval=$enable_gpgsm_test; run_gpgsm_test=$enableval
-fi
+  PYTHON_PREFIX='${prefix}'
 
- if test "$run_gpgsm_test" = "yes"; then
-  RUN_GPGSM_TESTS_TRUE=
-  RUN_GPGSM_TESTS_FALSE='#'
-else
-  RUN_GPGSM_TESTS_TRUE='#'
-  RUN_GPGSM_TESTS_FALSE=
-fi
+  PYTHON_EXEC_PREFIX='${exec_prefix}'
 
 
-run_g13_test="yes"
-# Check whether --enable-g13-test was given.
-if test "${enable_g13_test+set}" = set; then :
-  enableval=$enable_g13_test; run_g13_test=$enableval
-fi
 
- if test "$run_g13_test" = "yes"; then
-  RUN_G13_TESTS_TRUE=
-  RUN_G13_TESTS_FALSE='#'
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5
+$as_echo_n "checking for $am_display_PYTHON platform... " >&6; }
+if ${am_cv_python_platform+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  RUN_G13_TESTS_TRUE='#'
-  RUN_G13_TESTS_FALSE=
+  am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5
+$as_echo "$am_cv_python_platform" >&6; }
+  PYTHON_PLATFORM=$am_cv_python_platform
+
+
+  # Just factor out some code duplication.
+  am_python_setup_sysconfig="\
+import sys
+# Prefer sysconfig over distutils.sysconfig, for better compatibility
+# with python 3.x.  See automake bug#10227.
+try:
+    import sysconfig
+except ImportError:
+    can_use_sysconfig = 0
+else:
+    can_use_sysconfig = 1
+# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
+# <https://github.com/pypa/virtualenv/issues/118>
+try:
+    from platform import python_implementation
+    if python_implementation() == 'CPython' and sys.version[:3] == '2.7':
+        can_use_sysconfig = 0
+except ImportError:
+    pass"
+
+
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5
+$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; }
+if ${am_cv_python_pythondir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$prefix" = xNONE
+     then
+       am_py_prefix=$ac_default_prefix
+     else
+       am_py_prefix=$prefix
+     fi
+     am_cv_python_pythondir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+    sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'})
+else:
+    from distutils import sysconfig
+    sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+     case $am_cv_python_pythondir in
+     $am_py_prefix*)
+       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+       ;;
+     *)
+       case $am_py_prefix in
+         /usr|/System*) ;;
+         *)
+         am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
+         ;;
+       esac
+       ;;
+     esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5
+$as_echo "$am_cv_python_pythondir" >&6; }
+  pythondir=$am_cv_python_pythondir
+
+
+
+  pkgpythondir=\${pythondir}/$PACKAGE
+
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5
+$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; }
+if ${am_cv_python_pyexecdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$exec_prefix" = xNONE
+     then
+       am_py_exec_prefix=$am_py_prefix
+     else
+       am_py_exec_prefix=$exec_prefix
+     fi
+     am_cv_python_pyexecdir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+    sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'})
+else:
+    from distutils import sysconfig
+    sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+     case $am_cv_python_pyexecdir in
+     $am_py_exec_prefix*)
+       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+       ;;
+     *)
+       case $am_py_exec_prefix in
+         /usr|/System*) ;;
+         *)
+          am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
+          ;;
+       esac
+       ;;
+     esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5
+$as_echo "$am_cv_python_pyexecdir" >&6; }
+  pyexecdir=$am_cv_python_pyexecdir
+
+
+
+  pkgpyexecdir=\${pyexecdir}/$PACKAGE
+
+
+
+
+       #
+       # Allow the use of a (user set) custom python version
+       #
+
+
+       # Extract the first word of "python[$PYTHON_VERSION]", so it can be a program name with args.
+set dummy python$PYTHON_VERSION; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PYTHON in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+       if test -z "$PYTHON"; then
+          as_fn_error $? "Cannot find python$PYTHON_VERSION in your system path" "$LINENO" 5
+          PYTHON_VERSION=""
+       fi
+
+       #
+       # Check for a version of Python >= 2.1.0
+       #
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a version of Python >= '2.1.0'" >&5
+$as_echo_n "checking for a version of Python >= '2.1.0'... " >&6; }
+       ac_supports_python_ver=`$PYTHON -c "import sys; \
+               ver = sys.version.split ()[0]; \
+               print (ver >= '2.1.0')"`
+       if test "$ac_supports_python_ver" != "True"; then
+               if test -z "$PYTHON_NOVERSIONCHECK"; then
+                       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "
+This version of the AC_PYTHON_DEVEL macro
+doesn't work properly with versions of Python before
+2.1.0. You may need to re-run configure, setting the
+variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG,
+PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand.
+Moreover, to disable this check, set PYTHON_NOVERSIONCHECK
+to something else than an empty string.
+
+See \`config.log' for more details" "$LINENO" 5; }
+               else
+                       { $as_echo "$as_me:${as_lineno-$LINENO}: result: skip at user request" >&5
+$as_echo "skip at user request" >&6; }
+               fi
+       else
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       fi
+
+       #
+       # if the macro parameter ``version'' is set, honour it
+       #
+       if test -n ""; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a version of Python " >&5
+$as_echo_n "checking for a version of Python ... " >&6; }
+               ac_supports_python_ver=`$PYTHON -c "import sys; \
+                       ver = sys.version.split ()[0]; \
+                       print (ver )"`
+               if test "$ac_supports_python_ver" = "True"; then
+                  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+               else
+                       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                       as_fn_error $? "this package requires Python .
+If you have it installed, but it isn't the default Python
+interpreter in your system path, please pass the PYTHON_VERSION
+variable to configure. See \`\`configure --help'' for reference.
+" "$LINENO" 5
+                       PYTHON_VERSION=""
+               fi
+       fi
+
+       #
+       # Check if you have distutils, else fail
+       #
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the distutils Python package" >&5
+$as_echo_n "checking for the distutils Python package... " >&6; }
+       ac_distutils_result=`$PYTHON -c "import distutils" 2>&1`
+       if test -z "$ac_distutils_result"; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+               as_fn_error $? "cannot import Python module \"distutils\".
+Please check your Python installation. The error was:
+$ac_distutils_result" "$LINENO" 5
+               PYTHON_VERSION=""
+       fi
+
+       #
+       # Check for Python include path
+       #
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python include path" >&5
+$as_echo_n "checking for Python include path... " >&6; }
+       if test -z "$PYTHON_CPPFLAGS"; then
+               python_path=`$PYTHON -c "import distutils.sysconfig; \
+                       print (distutils.sysconfig.get_python_inc ());"`
+               plat_python_path=`$PYTHON -c "import distutils.sysconfig; \
+                       print (distutils.sysconfig.get_python_inc (plat_specific=1));"`
+               if test -n "${python_path}"; then
+                       if test "${plat_python_path}" != "${python_path}"; then
+                               python_path="-I$python_path -I$plat_python_path"
+                       else
+                               python_path="-I$python_path"
+                       fi
+               fi
+               PYTHON_CPPFLAGS=$python_path
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CPPFLAGS" >&5
+$as_echo "$PYTHON_CPPFLAGS" >&6; }
+
+
+       #
+       # Check for Python library path
+       #
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library path" >&5
+$as_echo_n "checking for Python library path... " >&6; }
+       if test -z "$PYTHON_LDFLAGS"; then
+               # (makes two attempts to ensure we've got a version number
+               # from the interpreter)
+               ac_python_version=`cat<<EOD | $PYTHON -
+
+# join all versioning strings, on some systems
+# major/minor numbers could be in different list elements
+from distutils.sysconfig import *
+e = get_config_var('VERSION')
+if e is not None:
+       print(e)
+EOD`
+
+               if test -z "$ac_python_version"; then
+                       if test -n "$PYTHON_VERSION"; then
+                               ac_python_version=$PYTHON_VERSION
+                       else
+                               ac_python_version=`$PYTHON -c "import sys; \
+                                       print (sys.version[:3])"`
+                       fi
+               fi
+
+               # Make the versioning information available to the compiler
+
+               # JW: We don't need it and it interferes with the hack
+               # to detect multiple Pyhton versions
+               #AC_DEFINE_UNQUOTED([HAVE_PYTHON], ["$ac_python_version"],
+                #                  [If available, contains the Python version number currently in use.])
+
+               # First, the library directory:
+               ac_python_libdir=`cat<<EOD | $PYTHON -
+
+# There should be only one
+import distutils.sysconfig
+e = distutils.sysconfig.get_config_var('LIBDIR')
+if e is not None:
+       print (e)
+EOD`
+
+               # Now, for the library:
+               ac_python_library=`cat<<EOD | $PYTHON -
+
+import distutils.sysconfig
+c = distutils.sysconfig.get_config_vars()
+if 'LDVERSION' in c:
+       print ('python'+c['LDVERSION'])
+else:
+       print ('python'+c['VERSION'])
+EOD`
+
+               # This small piece shamelessly adapted from PostgreSQL python macro;
+               # credits goes to momjian, I think. I'd like to put the right name
+               # in the credits, if someone can point me in the right direction... ?
+               #
+               if test -n "$ac_python_libdir" -a -n "$ac_python_library"
+               then
+                       # use the official shared library
+                       ac_python_library=`echo "$ac_python_library" | sed "s/^lib//"`
+                       PYTHON_LDFLAGS="-L$ac_python_libdir -l$ac_python_library"
+               else
+                       # old way: use libpython from python_configdir
+                       ac_python_libdir=`$PYTHON -c \
+                         "from distutils.sysconfig import get_python_lib as f; \
+                         import os; \
+                         print (os.path.join(f(plat_specific=1, standard_lib=1), 'config'));"`
+                       PYTHON_LDFLAGS="-L$ac_python_libdir -lpython$ac_python_version"
+               fi
+
+               if test -z "PYTHON_LDFLAGS"; then
+                       as_fn_error $? "
+  Cannot determine location of your Python DSO. Please check it was installed with
+  dynamic libraries enabled, or try setting PYTHON_LDFLAGS by hand.
+                       " "$LINENO" 5
+               fi
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_LDFLAGS" >&5
+$as_echo "$PYTHON_LDFLAGS" >&6; }
+
+
+       #
+       # Check for site packages
+       #
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python site-packages path" >&5
+$as_echo_n "checking for Python site-packages path... " >&6; }
+       if test -z "$PYTHON_SITE_PKG"; then
+               PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \
+                       print (distutils.sysconfig.get_python_lib(0,0));"`
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SITE_PKG" >&5
+$as_echo "$PYTHON_SITE_PKG" >&6; }
+
+
+       #
+       # libraries which must be linked in when embedding
+       #
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking python extra libraries" >&5
+$as_echo_n "checking python extra libraries... " >&6; }
+       if test -z "$PYTHON_EXTRA_LIBS"; then
+          PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \
+                conf = distutils.sysconfig.get_config_var; \
+                print (conf('LIBS') + ' ' + conf('SYSLIBS'))"`
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LIBS" >&5
+$as_echo "$PYTHON_EXTRA_LIBS" >&6; }
+
+
+       #
+       # linking flags needed when embedding
+       #
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking python extra linking flags" >&5
+$as_echo_n "checking python extra linking flags... " >&6; }
+       if test -z "$PYTHON_EXTRA_LDFLAGS"; then
+               PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import distutils.sysconfig; \
+                       conf = distutils.sysconfig.get_config_var; \
+                       print (conf('LINKFORSHARED'))"`
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LDFLAGS" >&5
+$as_echo "$PYTHON_EXTRA_LDFLAGS" >&6; }
+
+
+       #
+       # final check to see if everything compiles alright
+       #
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking consistency of all components of python development environment" >&5
+$as_echo_n "checking consistency of all components of python development environment... " >&6; }
+       # save current global flags
+       ac_save_LIBS="$LIBS"
+       ac_save_CPPFLAGS="$CPPFLAGS"
+       LIBS="$ac_save_LIBS $PYTHON_LDFLAGS $PYTHON_EXTRA_LDFLAGS $PYTHON_EXTRA_LIBS"
+       CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS"
+       ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+               #include <Python.h>
+int
+main ()
+{
+Py_Initialize();
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  pythonexists=yes
+else
+  pythonexists=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+       ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+       # turn back to default flags
+       CPPFLAGS="$ac_save_CPPFLAGS"
+       LIBS="$ac_save_LIBS"
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pythonexists" >&5
+$as_echo "$pythonexists" >&6; }
+
+        if test ! "x$pythonexists" = "xyes"; then
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+  Could not link test program to Python. Maybe the main Python library has been
+  installed in some non-standard library path. If so, pass it to configure,
+  via the LDFLAGS environment variable.
+  Example: ./configure LDFLAGS=\"-L/usr/non-standard-path/python/lib\"
+  ============================================================================
+   You probably have to install the development version of the Python package
+   for your distribution.  The exact name of this package varies among them.
+  ============================================================================
+          " >&5
+$as_echo "$as_me: WARNING:
+  Could not link test program to Python. Maybe the main Python library has been
+  installed in some non-standard library path. If so, pass it to configure,
+  via the LDFLAGS environment variable.
+  Example: ./configure LDFLAGS=\"-L/usr/non-standard-path/python/lib\"
+  ============================================================================
+   You probably have to install the development version of the Python package
+   for your distribution.  The exact name of this package varies among them.
+  ============================================================================
+          " >&2;}
+         PYTHON_VERSION=""
+       fi
+
+       #
+       # all done!
+       #
+
+               if test "$PYTHON_VERSION"; then
+                       PYTHONS="$(echo $PYTHONS $PYTHON)"
+                       PYTHON_VERSIONS="$(echo $PYTHON_VERSIONS $PYTHON_VERSION)"
+               fi
+
+  fi
+
+
+
+       fi
+
+       # Recover some values lost in the second attempt to find Python.
+       PYTHON="$(echo $PYTHONS | cut -d ' ' -f 1)"
+       PYTHON_VERSION="$(echo $PYTHON_VERSIONS | cut -d ' ' -f 1)"
+
+       # Remove duplicates.
+       PYTHONS="$(echo $PYTHONS | tr '[:space:]' '\n' | sort | uniq | tr '\n' ' ' | sed -e 's/ $//')"
+       PYTHON_VERSIONS="$(echo $PYTHON_VERSIONS | tr '[:space:]' '\n' | sort | uniq | tr '\n' ' ' | sed -e 's/ $//')"
+
+       if test "$PYTHON_VERSIONS"; then
+          enabled_languages_v=$(echo $enabled_languages | sed -Ee "s/python[23]?/python ($PYTHON_VERSIONS)/")
+          enabled_languages=$(echo $enabled_languages | sed -Ee "s/python[23]?/python/")
+       else
+            if test "$explicit_languages" = "1"; then
+                as_fn_error $? "
+***
+*** Please install the python development packages.
+***" "$LINENO" 5
+           else
+                enabled_languages=$(echo $enabled_languages | sed 's/python//')
+            fi
+       fi
+
+       PYTHONS=$PYTHONS
+
+    fi
+fi
+
+ENABLED_LANGUAGES=$enabled_languages
+
+
+#
+# Provide information about the build.
+#
+BUILD_REVISION="6d7bf78c"
+
+
+cat >>confdefs.h <<_ACEOF
+#define BUILD_REVISION "$BUILD_REVISION"
+_ACEOF
+
+
+BUILD_VERSION=`echo "$PACKAGE_VERSION" | sed 's/\([0-9.]*\).*/\1./'`
+BUILD_VERSION="${BUILD_VERSION}28027"
+BUILD_FILEVERSION=`echo "${BUILD_VERSION}" | tr . ,`
+
+
+
+# Check whether --enable-build-timestamp was given.
+if test "${enable_build_timestamp+set}" = set; then :
+  enableval=$enable_build_timestamp; if test "$enableval" = "yes"; then
+        BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date`
+      else
+        BUILD_TIMESTAMP="$enableval"
+      fi
+else
+  BUILD_TIMESTAMP="<none>"
+fi
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define BUILD_TIMESTAMP "$BUILD_TIMESTAMP"
+_ACEOF
+
+
+
+#
+# Options to disable some regression tests
+#
+run_gpgconf_test="yes"
+# Check whether --enable-gpgconf-test was given.
+if test "${enable_gpgconf_test+set}" = set; then :
+  enableval=$enable_gpgconf_test; run_gpgconf_test=$enableval
+fi
+
+ if test "$run_gpgconf_test" = "yes"; then
+  RUN_GPGCONF_TESTS_TRUE=
+  RUN_GPGCONF_TESTS_FALSE='#'
+else
+  RUN_GPGCONF_TESTS_TRUE='#'
+  RUN_GPGCONF_TESTS_FALSE=
+fi
+
+
+run_gpg_test="yes"
+# Check whether --enable-gpg-test was given.
+if test "${enable_gpg_test+set}" = set; then :
+  enableval=$enable_gpg_test; run_gpg_test=$enableval
+fi
+
+ if test "$run_gpg_test" = "yes"; then
+  RUN_GPG_TESTS_TRUE=
+  RUN_GPG_TESTS_FALSE='#'
+else
+  RUN_GPG_TESTS_TRUE='#'
+  RUN_GPG_TESTS_FALSE=
+fi
+
+
+run_gpgsm_test="yes"
+# Check whether --enable-gpgsm-test was given.
+if test "${enable_gpgsm_test+set}" = set; then :
+  enableval=$enable_gpgsm_test; run_gpgsm_test=$enableval
+fi
+
+ if test "$run_gpgsm_test" = "yes"; then
+  RUN_GPGSM_TESTS_TRUE=
+  RUN_GPGSM_TESTS_FALSE='#'
+else
+  RUN_GPGSM_TESTS_TRUE='#'
+  RUN_GPGSM_TESTS_FALSE=
+fi
+
+
+run_g13_test="yes"
+# Check whether --enable-g13-test was given.
+if test "${enable_g13_test+set}" = set; then :
+  enableval=$enable_g13_test; run_g13_test=$enableval
+fi
+
+ if test "$run_g13_test" = "yes"; then
+  RUN_G13_TESTS_TRUE=
+  RUN_G13_TESTS_FALSE='#'
+else
+  RUN_G13_TESTS_TRUE='#'
+  RUN_G13_TESTS_FALSE=
+fi
+
 
 
-
 # Checks for header files.
 
 
@@ -26268,7 +26910,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by gpgme $as_me 1.13.1, which was
+This file was extended by gpgme $as_me 1.14.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -26334,7 +26976,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-gpgme config.status 1.13.1
+gpgme config.status 1.14.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -26453,7 +27095,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 #
 # INIT-COMMANDS
 #
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
 
 
 # The HP-UX ksh and POSIX shell print the target directory to stdout
@@ -27571,29 +28213,35 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
   # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  case $CONFIG_FILES in #(
+  *\'*) :
+    eval set x "$CONFIG_FILES" ;; #(
+  *) :
+    set x $CONFIG_FILES ;; #(
+  *) :
+     ;;
+esac
   shift
-  for mf
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
   do
     # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named 'Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
+    am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
     # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-        X"$mf" : 'X\(//\)[^/]' \| \
-        X"$mf" : 'X\(//\)$' \| \
-        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$am_mf" : 'X\(//\)[^/]' \| \
+        X"$am_mf" : 'X\(//\)$' \| \
+        X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$am_mf" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
            s//\1/
            q
@@ -27611,53 +28259,48 @@ $as_echo X"$mf" |
            q
          }
          s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running 'make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "$am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-        X"$file" : 'X\(//\)[^/]' \| \
-        X"$file" : 'X\(//\)$' \| \
-        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-           s//\1/
-           q
-         }
-         /^X\(\/\/\)[^/].*/{
+    am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$am_mf" : 'X\(//\)$' \| \
+        X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$am_mf" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
            s//\1/
            q
          }
-         /^X\(\/\/\)$/{
+         /^X\/\(\/\/\)$/{
            s//\1/
            q
          }
-         /^X\(\/\).*/{
+         /^X\/\(\/\).*/{
            s//\1/
            q
          }
          s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
+    { echo "$as_me:$LINENO: cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles" >&5
+   (cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } || am_rc=$?
   done
+  if test $am_rc -ne 0; then
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+  { am_dirpart=; unset am_dirpart;}
+  { am_filepart=; unset am_filepart;}
+  { am_mf=; unset am_mf;}
+  { am_rc=; unset am_rc;}
+  rm -f conftest-deps.mk
 }
  ;;
     "libtool":C)
@@ -28657,7 +29300,7 @@ fi
 echo "
         GPGME v${VERSION} has been configured as follows:
 
-        Revision:          ea11c2a1  (59921)
+        Revision:          6d7bf78c  (28027)
         Platform:          $host
 
         UI Server:         $uiserver
index 7bc0604..86eb248 100644 (file)
@@ -23,14 +23,16 @@ AC_PREREQ(2.59)
 min_automake_version="1.14"
 
 # To build a release you need to create a tag with the version number
-# (git tag -s gpgme-n.m.k) and run "./autogen.sh --force".  Please
-# bump the version number immediately after the release and do another
-# commit and push so that the git magic is able to work.  See below
+# "gpgme-n.m.k" and run "./autogen.sh --force".  Please bump the
+# version number immediately after the release and do another commit
+# and push so that the git magic is able to work.  If you start a new
+# series by bumping the minor (m) remember to also create a tag named
+# "gpgme-n.m-base" as the start point for beta numbering.  See below
 # for the LT versions.
 m4_define([mym4_package],[gpgme])
 m4_define([mym4_major], [1])
-m4_define([mym4_minor], [13])
-m4_define([mym4_micro], [1])
+m4_define([mym4_minor], [14])
+m4_define([mym4_micro], [0])
 
 # Below is m4 magic to extract and compute the git revision number,
 # the decimalized short revision number, a beta version string and a
@@ -51,20 +53,20 @@ AC_INIT([mym4_package],[mym4_version], [https://bugs.gnupg.org])
 #   (Interfaces added:                 AGE++)
 #   (Interfaces removed:               AGE=0)
 #
-LIBGPGME_LT_CURRENT=33
-LIBGPGME_LT_AGE=22
-LIBGPGME_LT_REVISION=1
+LIBGPGME_LT_CURRENT=34
+LIBGPGME_LT_AGE=23
+LIBGPGME_LT_REVISION=0
 
 # If there is an ABI break in gpgmepp or qgpgme also bump the
 # version in IMPORTED_LOCATION in the GpgmeppConfig-w32.cmake.in.in
 
-LIBGPGMEPP_LT_CURRENT=16
-LIBGPGMEPP_LT_AGE=10
+LIBGPGMEPP_LT_CURRENT=17
+LIBGPGMEPP_LT_AGE=11
 LIBGPGMEPP_LT_REVISION=0
 
-LIBQGPGME_LT_CURRENT=10
-LIBQGPGME_LT_AGE=3
-LIBQGPGME_LT_REVISION=4
+LIBQGPGME_LT_CURRENT=11
+LIBQGPGME_LT_AGE=4
+LIBQGPGME_LT_REVISION=0
 ################################################
 
 AC_SUBST(LIBGPGME_LT_CURRENT)
@@ -423,7 +425,7 @@ if test "$found_py" = "1"; then
        if test "$found_py" = "1" -o "$found_py3" = "1"; then
          # Reset everything, so that we can look for another Python.
           m4_foreach([mym4pythonver],
-                     [[2.7],[3.4],[3.5],[3.6],[3.7],[3.8],[all]],
+                     [[2.7],[3.4],[3.5],[3.6],[3.7],[3.8],[3.9],[all]],
            [unset PYTHON
            unset PYTHON_VERSION
            unset PYTHON_CPPFLAGS
index c107e8d..f9e1bec 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -408,6 +408,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -447,8 +448,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -613,7 +614,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 730557d..2b780bd 100644 (file)
@@ -1 +1 @@
-1543830060
+1594893646
index af49f31..8aa9bf8 100644 (file)
@@ -1,4 +1,4 @@
-This is gpgme.info, produced by makeinfo version 6.3 from gpgme.texi.
+This is gpgme.info, produced by makeinfo version 6.5 from gpgme.texi.
 
 Copyright © 2002–2008, 2010, 2012–2018 g10 Code GmbH.
 
@@ -19,8 +19,8 @@ END-INFO-DIR-ENTRY
 
    This file documents the GPGME library.
 
-   This is Edition 1.12.1-beta100, last updated 3 December 2018, of ‘The
-‘GnuPG Made Easy’ Reference Manual’, for Version 1.12.1-beta100.
+   This is Edition 1.14.0-beta56, last updated 13 December 2019, of ‘The
+‘GnuPG Made Easy’ Reference Manual’, for Version 1.14.0-beta56.
 
    Copyright © 2002–2008, 2010, 2012–2018 g10 Code GmbH.
 
@@ -37,132 +37,129 @@ Public License for more details.
 
 \1f
 Indirect:
-gpgme.info-1: 1689
-gpgme.info-2: 301885
+gpgme.info-1: 1688
+gpgme.info-2: 302769
 \1f
 Tag Table:
 (Indirect)
-Node: Top\7f1689
-Node: Introduction\7f9299
-Node: Getting Started\7f10089
-Node: Features\7f11550
-Node: Overview\7f12862
-Node: Preparation\7f13971
-Node: Header\7f14968
-Node: Building the Source\7f15715
-Node: Largefile Support (LFS)\7f17859
-Node: Using Automake\7f23275
-Node: Using Libtool\7f25828
-Node: Library Version Check\7f26190
-Node: Signal Handling\7f32250
-Node: Multi-Threading\7f33520
-Ref: Multi-Threading-Footnote-1\7f34936
-Node: Protocols and Engines\7f35359
-Node: Engine Version Check\7f38110
-Node: Engine Information\7f40633
-Node: Engine Configuration\7f44493
-Node: OpenPGP\7f45797
-Node: Cryptographic Message Syntax\7f46137
-Node: Assuan\7f46450
-Node: Algorithms\7f46824
-Ref: Algorithms-Footnote-1\7f47303
-Node: Public Key Algorithms\7f47431
-Node: Hash Algorithms\7f50033
-Node: Error Handling\7f51247
-Node: Error Values\7f53121
-Node: Error Sources\7f58324
-Node: Error Codes\7f60764
-Node: Error Strings\7f65557
-Node: Exchanging Data\7f67364
-Node: Creating Data Buffers\7f69249
-Node: Memory Based Data Buffers\7f69765
-Node: File Based Data Buffers\7f73198
-Node: Callback Based Data Buffers\7f76311
-Node: Destroying Data Buffers\7f80502
-Node: Manipulating Data Buffers\7f82009
-Node: Data Buffer I/O Operations\7f82501
-Node: Data Buffer Meta-Data\7f84874
-Node: Data Buffer Convenience\7f89393
-Node: Contexts\7f91613
-Node: Creating Contexts\7f92799
-Node: Destroying Contexts\7f93646
-Node: Result Management\7f93985
-Node: Context Attributes\7f95566
-Node: Protocol Selection\7f96733
-Node: Crypto Engine\7f97779
-Node: Setting the Sender\7f99668
-Node: ASCII Armor\7f101181
-Node: Text Mode\7f101810
-Node: Offline Mode\7f102744
-Node: Pinentry Mode\7f104242
-Node: Included Certificates\7f106136
-Node: Key Listing Mode\7f107582
-Node: Passphrase Callback\7f112323
-Node: Progress Meter Callback\7f115885
-Node: Status Message Callback\7f117870
-Node: Context Flags\7f119635
-Node: Locale\7f125684
-Node: Additional Logs\7f127276
-Node: Key Management\7f129474
-Node: Key objects\7f130702
-Node: Listing Keys\7f144926
-Node: Information About Keys\7f153579
-Node: Manipulating Keys\7f154887
-Node: Generating Keys\7f155457
-Node: Signing Keys\7f173777
-Node: Exporting Keys\7f177410
-Node: Importing Keys\7f184349
-Ref: Importing Keys-Footnote-1\7f191752
-Node: Deleting Keys\7f191880
-Node: Changing Passphrases\7f194160
-Node: Changing TOFU Data\7f195487
-Node: Advanced Key Editing\7f197595
-Node: Trust Item Management\7f200328
-Node: Listing Trust Items\7f201364
-Node: Manipulating Trust Items\7f203725
-Node: Crypto Operations\7f204368
-Node: Decrypt\7f205632
-Node: Verify\7f212946
-Node: Decrypt and Verify\7f225666
-Node: Sign\7f228521
-Node: Selecting Signers\7f229085
-Node: Creating a Signature\7f230491
-Node: Signature Notation Data\7f235261
-Node: Encrypt\7f237546
-Node: Encrypting a Plaintext\7f237902
-Node: Miscellaneous\7f252314
-Node: Running other Programs\7f252726
-Node: Using the Assuan protocol\7f254889
-Node: Checking for updates\7f257687
-Node: Run Control\7f262504
-Node: Waiting For Completion\7f263248
-Node: Using External Event Loops\7f265373
-Node: I/O Callback Interface\7f267345
-Node: Registering I/O Callbacks\7f272585
-Node: I/O Callback Example\7f274624
-Node: I/O Callback Example GTK+\7f281249
-Node: I/O Callback Example GDK\7f283038
-Node: I/O Callback Example Qt\7f284680
-Node: Cancellation\7f286968
-Node: UI Server Protocol\7f289276
-Ref: UI Server Protocol-Footnote-1\7f290711
-Node: UI Server Encrypt\7f290830
-Node: UI Server Sign\7f296188
-Node: UI Server Decrypt\7f298541
-Node: UI Server Verify\7f301885
-Node: UI Server Set Input Files\7f305457
-Node: UI Server Sign/Encrypt Files\7f306527
-Node: UI Server Verify/Decrypt Files\7f308335
-Node: UI Server Import/Export Keys\7f310211
-Node: UI Server Checksum Files\7f311273
-Node: Miscellaneous UI Server Commands\7f313491
-Ref: command SENDER\7f315422
-Node: Debugging\7f317124
-Node: Deprecated Functions\7f318873
-Node: Library Copying\7f344090
-Node: Copying\7f372310
-Node: Concept Index\7f410060
-Node: Function and Data Index\7f425058
+Node: Top\7f1688
+Node: Introduction\7f9067
+Node: Getting Started\7f9857
+Node: Features\7f11318
+Node: Overview\7f12630
+Node: Preparation\7f13739
+Node: Header\7f14736
+Node: Building the Source\7f15483
+Node: Largefile Support (LFS)\7f17627
+Node: Using Automake\7f23043
+Node: Using Libtool\7f25596
+Node: Library Version Check\7f25958
+Node: Signal Handling\7f32018
+Node: Multi-Threading\7f33288
+Ref: Multi-Threading-Footnote-1\7f34704
+Node: Protocols and Engines\7f35127
+Node: Engine Version Check\7f37878
+Node: Engine Information\7f40401
+Node: Engine Configuration\7f44261
+Node: OpenPGP\7f45565
+Node: Cryptographic Message Syntax\7f45905
+Node: Assuan\7f46218
+Node: Algorithms\7f46592
+Ref: Algorithms-Footnote-1\7f47071
+Node: Public Key Algorithms\7f47199
+Node: Hash Algorithms\7f49801
+Node: Error Handling\7f51015
+Node: Error Values\7f52889
+Node: Error Sources\7f58092
+Node: Error Codes\7f60532
+Node: Error Strings\7f65325
+Node: Exchanging Data\7f67132
+Node: Creating Data Buffers\7f69017
+Node: Memory Based Data Buffers\7f69533
+Node: File Based Data Buffers\7f72966
+Node: Callback Based Data Buffers\7f76079
+Node: Destroying Data Buffers\7f80270
+Node: Manipulating Data Buffers\7f81777
+Node: Data Buffer I/O Operations\7f82269
+Node: Data Buffer Meta-Data\7f84642
+Node: Data Buffer Convenience\7f89161
+Node: Contexts\7f91381
+Node: Creating Contexts\7f92500
+Node: Destroying Contexts\7f93347
+Node: Result Management\7f93686
+Node: Context Attributes\7f95267
+Node: Protocol Selection\7f96434
+Node: Crypto Engine\7f97480
+Node: Setting the Sender\7f99369
+Node: ASCII Armor\7f100882
+Node: Text Mode\7f101511
+Node: Offline Mode\7f102445
+Node: Pinentry Mode\7f103943
+Node: Included Certificates\7f105837
+Node: Key Listing Mode\7f107283
+Node: Passphrase Callback\7f112407
+Node: Progress Meter Callback\7f115969
+Node: Status Message Callback\7f117954
+Node: Context Flags\7f119719
+Node: Locale\7f126330
+Node: Additional Logs\7f127922
+Node: Key Management\7f130120
+Node: Key objects\7f131344
+Node: Listing Keys\7f145918
+Node: Information About Keys\7f154571
+Node: Manipulating Keys\7f155879
+Node: Generating Keys\7f156449
+Node: Signing Keys\7f174769
+Node: Exporting Keys\7f178402
+Node: Importing Keys\7f185682
+Ref: Importing Keys-Footnote-1\7f193085
+Node: Deleting Keys\7f193213
+Node: Changing Passphrases\7f195493
+Node: Changing TOFU Data\7f196820
+Node: Advanced Key Editing\7f198928
+Node: Crypto Operations\7f201661
+Node: Decrypt\7f202918
+Node: Verify\7f210198
+Node: Decrypt and Verify\7f223291
+Node: Sign\7f226146
+Node: Selecting Signers\7f226710
+Node: Creating a Signature\7f228116
+Node: Signature Notation Data\7f232886
+Node: Encrypt\7f235171
+Node: Encrypting a Plaintext\7f235527
+Node: Miscellaneous\7f249939
+Node: Running other Programs\7f250351
+Node: Using the Assuan protocol\7f252514
+Node: Checking for updates\7f255312
+Node: Run Control\7f260129
+Node: Waiting For Completion\7f260873
+Node: Using External Event Loops\7f262998
+Node: I/O Callback Interface\7f264970
+Node: Registering I/O Callbacks\7f269898
+Node: I/O Callback Example\7f271937
+Node: I/O Callback Example GTK+\7f278562
+Node: I/O Callback Example GDK\7f280351
+Node: I/O Callback Example Qt\7f281993
+Node: Cancellation\7f284281
+Node: UI Server Protocol\7f286589
+Ref: UI Server Protocol-Footnote-1\7f288024
+Node: UI Server Encrypt\7f288143
+Node: UI Server Sign\7f293501
+Node: UI Server Decrypt\7f295854
+Node: UI Server Verify\7f297509
+Node: UI Server Set Input Files\7f302769
+Node: UI Server Sign/Encrypt Files\7f303839
+Node: UI Server Verify/Decrypt Files\7f305647
+Node: UI Server Import/Export Keys\7f307523
+Node: UI Server Checksum Files\7f308585
+Node: Miscellaneous UI Server Commands\7f310803
+Ref: command SENDER\7f312734
+Node: Debugging\7f314436
+Node: Deprecated Functions\7f316185
+Node: Library Copying\7f339194
+Node: Copying\7f367414
+Node: Concept Index\7f405164
+Node: Function and Data Index\7f419876
 \1f
 End Tag Table
 
index 8910bc6..b437bbe 100644 (file)
@@ -1,4 +1,4 @@
-This is gpgme.info, produced by makeinfo version 6.3 from gpgme.texi.
+This is gpgme.info, produced by makeinfo version 6.5 from gpgme.texi.
 
 Copyright © 2002–2008, 2010, 2012–2018 g10 Code GmbH.
 
@@ -19,8 +19,8 @@ END-INFO-DIR-ENTRY
 
    This file documents the GPGME library.
 
-   This is Edition 1.12.1-beta100, last updated 3 December 2018, of ‘The
-‘GnuPG Made Easy’ Reference Manual’, for Version 1.12.1-beta100.
+   This is Edition 1.14.0-beta56, last updated 13 December 2019, of ‘The
+‘GnuPG Made Easy’ Reference Manual’, for Version 1.14.0-beta56.
 
    Copyright © 2002–2008, 2010, 2012–2018 g10 Code GmbH.
 
@@ -41,8 +41,8 @@ File: gpgme.info,  Node: Top,  Next: Introduction,  Up: (dir)
 Main Menu
 *********
 
-This is Edition 1.12.1-beta100, last updated 3 December 2018, of ‘The
-‘GnuPG Made Easy’ Reference Manual’, for Version 1.12.1-beta100 of the
+This is Edition 1.14.0-beta56, last updated 13 December 2019, of ‘The
+‘GnuPG Made Easy’ Reference Manual’, for Version 1.14.0-beta56 of the
 GPGME library.
 
 * Menu:
@@ -135,7 +135,6 @@ Contexts
 * Result Management::             Managing the result of crypto operations.
 * Context Attributes::            Setting properties of a context.
 * Key Management::                Managing keys with GPGME.
-* Trust Item Management::         Managing trust items with GPGME.
 * Crypto Operations::             Using a context for cryptography.
 * Miscellaneous::                 Miscellaneous operations.
 * Run Control::                   Controlling how operations are run.
@@ -170,11 +169,6 @@ Key Management
 * Changing TOFU Data::            Changing data pertaining to TOFU.
 * Advanced Key Editing::          Advanced key edit operation.
 
-Trust Item Management
-
-* Listing Trust Items::           Browsing the list of available trust items.
-* Manipulating Trust Items::      Operations on trust items.
-
 Crypto Operations
 
 * Decrypt::                       Decrypting a ciphertext.
@@ -2189,7 +2183,6 @@ cryptographic operations in parallel, with different configuration.
 * Result Management::             Managing the result of crypto operations.
 * Context Attributes::            Setting properties of a context.
 * Key Management::                Managing keys with GPGME.
-* Trust Item Management::         Managing trust items with GPGME.
 * Crypto Operations::             Using a context for cryptography.
 * Miscellaneous::                 Miscellaneous operations
 * Run Control::                   Controlling how operations are run.
@@ -2630,6 +2623,13 @@ File: gpgme.info,  Node: Key Listing Mode,  Next: Passphrase Callback,  Prev: In
           information pertaining to the TOFU trust model should be
           included in the listed keys.
 
+     ‘GPGME_KEYLIST_MODE_WITH_KEYGRIP’
+          SINCE: 1.14.0
+
+          The ‘GPGME_KEYLIST_MODE_WITH_KEYRIP’ symbol specifies that the
+          keygrip is always included in the listing.  The default
+          depends on the version of the backend and the used protocol.
+
      ‘GPGME_KEYLIST_MODE_WITH_SECRET’
           SINCE: 1.5.1
 
@@ -2638,7 +2638,8 @@ File: gpgme.info,  Node: Key Listing Mode,  Next: Passphrase Callback,  Prev: In
           listing.  A public key listing with this mode is slower than a
           standard listing but can be used instead of a second run to
           list the secret keys.  This is only supported for GnuPG
-          versions >= 2.1.
+          versions >= 2.1.  Note that using this option also makes sure
+          that the keygrip is available in the output.
 
      ‘GPGME_KEYLIST_MODE_EPHEMERAL’
           SINCE: 1.2.0
@@ -2907,6 +2908,16 @@ File: gpgme.info,  Node: Context Flags,  Next: Locale,  Prev: Status Message Cal
           the operator can tell both your IP address and the time when
           you verified the signature.
 
+     ‘"auto-key-import"’
+          Setting the VALUE to "1" forces the GPG backend to
+          automatically import a missing key for signature verification
+          from the signature.
+
+     ‘"include-key-block"’
+          Setting the VALUE to "1" forces the GPG backend to embed the
+          signing key as well as an encryption subkey into the the
+          signature.
+
      ‘"request-origin"’
           The string given in VALUE is passed to the GnuPG engines to
           request restrictions based on the origin of the request.
@@ -2954,6 +2965,10 @@ File: gpgme.info,  Node: Context Flags,  Next: Locale,  Prev: Status Message Cal
           operations.  A change in the trust-model also can have
           unintended side effects, like rebuilding the trust-db.
 
+     ‘"extended-edit"’
+          This flag passes the option ‘--expert’ to gpg key edit.  This
+          can be used to get additional callbacks in ‘gpgme_op_edit’.
+
      This function returns ‘0’ on success.
 
  -- Function: const char * gpgme_get_ctx_flag (gpgme_ctx_t CTX,
@@ -3067,7 +3082,7 @@ specific and can be be obtained with ‘gpgme_op_getauditlog’.
      This is the asynchronous variant of ‘gpgme_op_getauditlog’.
 
 \1f
-File: gpgme.info,  Node: Key Management,  Next: Trust Item Management,  Prev: Context Attributes,  Up: Contexts
+File: gpgme.info,  Node: Key Management,  Next: Crypto Operations,  Prev: Context Attributes,  Up: Contexts
 
 7.5 Key Management
 ==================
@@ -3286,7 +3301,7 @@ long as the key object itself is valid.
           SINCE: 1.7.0
 
           The keygrip of the subkey in hex digit form or ‘NULL’ if not
-          availabale.
+          available.
 
      ‘long int timestamp’
           This is the creation timestamp of the subkey.  This is -1 if
@@ -3367,6 +3382,13 @@ long as the key object itself is valid.
 
           Reserved for the time of the last update of this user ID.
 
+     ‘char *uidhash;’
+          A string used by gpg to identify a user ID. This string can be
+          used at certain prompts of ‘gpgme_op_edit’ to select a user
+          ID. Users must be prepared to see a ‘NULL’ value here.  The
+          format of the value is not specified and may depend on the
+          GPGME or GnuPG version.
+
  -- Data type: gpgme_tofu_info_t
 
      SINCE: 1.7.0
@@ -3858,7 +3880,7 @@ provide a fallback to the old function if the error code
           used to override this check.
 
      ‘GPGME_CREATE_NOEXPIRE’
-          SINCE: 1.8.0
+          SINCE: 1.9.0
 
           Request generation of keys that do not expire.
 
@@ -4286,6 +4308,15 @@ or-ed together.
      OpenPGP keys it removes all signatures except for the latest
      self-signatures.  For X.509 keys it has no effect.
 
+‘GPGME_EXPORT_MODE_SSH’
+     SINCE: 1.4.0
+
+     If this bit is set, the latest authentication key of the requested
+     OpenPGP key is exported in the OpenSSH public key format.  This
+     accepts just a single key; to force the export of a specific subkey
+     a fingerprint pattern with an appended exclamation mark may be
+     used.
+
 ‘GPGME_EXPORT_MODE_SECRET’
      SINCE: 1.6.0
 
@@ -4816,114 +4847,9 @@ File: gpgme.info,  Node: Advanced Key Editing,  Prev: Changing TOFU Data,  Up: K
      and ‘GPG_ERR_INV_VALUE’ if CTX or KEY is not a valid pointer.
 
 \1f
-File: gpgme.info,  Node: Trust Item Management,  Next: Crypto Operations,  Prev: Key Management,  Up: Contexts
-
-7.6 Trust Item Management
-=========================
-
-*Caution:* The trust items interface is experimental.
-
- -- Data type: gpgme_trust_item_t
-     The ‘gpgme_trust_item_t’ type is a pointer to a trust item object.
-     It has the following members:
-
-     ‘char *keyid’
-          This is a string describing the key to which this trust items
-          belongs.
-
-     ‘int type’
-          This is the type of the trust item.  A value of 1 refers to a
-          key, a value of 2 refers to a user ID.
-
-     ‘int level’
-          This is the trust level.
-
-     ‘char *owner_trust’
-          The owner trust if ‘type’ is 1.
-
-     ‘char *validity’
-          The calculated validity.
-
-     ‘char *name’
-          The user name if ‘type’ is 2.
-
-* Menu:
-
-* Listing Trust Items::           Browsing the list of available trust items.
-* Manipulating Trust Items::      Operations on trust items.
-
-\1f
-File: gpgme.info,  Node: Listing Trust Items,  Next: Manipulating Trust Items,  Up: Trust Item Management
-
-7.6.1 Listing Trust Items
--------------------------
-
- -- Function: gpgme_error_t gpgme_op_trustlist_start (gpgme_ctx_t CTX,
-          const char *PATTERN, int MAX_LEVEL)
-     The function ‘gpgme_op_trustlist_start’ initiates a trust item
-     listing operation inside the context CTX.  It sets everything up so
-     that subsequent invocations of ‘gpgme_op_trustlist_next’ return the
-     trust items in the list.
-
-     The string PATTERN contains an engine specific expression that is
-     used to limit the list to all trust items matching the pattern.  It
-     can not be the empty string.
-
-     The argument MAX_LEVEL is currently ignored.
-
-     The context will be busy until either all trust items are received
-     (and ‘gpgme_op_trustlist_next’ returns ‘GPG_ERR_EOF’), or
-     ‘gpgme_op_trustlist_end’ is called to finish the operation.
-
-     The function returns the error code ‘GPG_ERR_INV_VALUE’ if CTX is
-     not a valid pointer, and passes through any errors that are
-     reported by the crypto engine support routines.
-
- -- Function: gpgme_error_t gpgme_op_trustlist_next (gpgme_ctx_t CTX,
-          gpgme_trust_item_t *R_ITEM)
-     The function ‘gpgme_op_trustlist_next’ returns the next trust item
-     in the list created by a previous ‘gpgme_op_trustlist_start’
-     operation in the context CTX.  The trust item can be destroyed with
-     ‘gpgme_trust_item_release’.  *Note Manipulating Trust Items::.
+File: gpgme.info,  Node: Crypto Operations,  Next: Miscellaneous,  Prev: Key Management,  Up: Contexts
 
-     This is the only way to get at ‘gpgme_trust_item_t’ objects in
-     GPGME.
-
-     If the last trust item in the list has already been returned,
-     ‘gpgme_op_trustlist_next’ returns ‘GPG_ERR_EOF’.
-
-     The function returns the error code ‘GPG_ERR_INV_VALUE’ if CTX or
-     R_ITEM is not a valid pointer, and ‘GPG_ERR_ENOMEM’ if there is not
-     enough memory for the operation.
-
- -- Function: gpgme_error_t gpgme_op_trustlist_end (gpgme_ctx_t CTX)
-     The function ‘gpgme_op_trustlist_end’ ends a pending trust list
-     operation in the context CTX.
-
-     The function returns the error code ‘GPG_ERR_INV_VALUE’ if CTX is
-     not a valid pointer, and ‘GPG_ERR_ENOMEM’ if at some time during
-     the operation there was not enough memory available.
-
-\1f
-File: gpgme.info,  Node: Manipulating Trust Items,  Prev: Listing Trust Items,  Up: Trust Item Management
-
-7.6.2 Manipulating Trust Items
-------------------------------
-
- -- Function: void gpgme_trust_item_ref (gpgme_trust_item_t ITEM)
-     The function ‘gpgme_trust_item_ref’ acquires an additional
-     reference for the trust item ITEM.
-
- -- Function: void gpgme_trust_item_unref (gpgme_trust_item_t ITEM)
-     The function ‘gpgme_trust_item_unref’ releases a reference for the
-     trust item ITEM.  If this was the last reference, the trust item
-     will be destroyed and all resources associated to it will be
-     released.
-
-\1f
-File: gpgme.info,  Node: Crypto Operations,  Next: Miscellaneous,  Prev: Trust Item Management,  Up: Contexts
-
-7.7 Crypto Operations
+7.6 Crypto Operations
 =====================
 
 Sometimes, the result of a crypto operation returns a list of invalid
@@ -4957,7 +4883,7 @@ used to hold information about such a key.
 \1f
 File: gpgme.info,  Node: Decrypt,  Next: Verify,  Up: Crypto Operations
 
-7.7.1 Decrypt
+7.6.1 Decrypt
 -------------
 
  -- Function: gpgme_error_t gpgme_op_decrypt (gpgme_ctx_t CTX,
@@ -5012,7 +4938,7 @@ File: gpgme.info,  Node: Decrypt,  Next: Verify,  Up: Crypto Operations
           OpenPGP. This is the counterpart to ‘GPGME_ENCRYPT_WRAP’.
 
      The function returns the error codes as described for
-     ‘gpgme_op_decrypt’ respective ‘gpgme_op_encrypt’.
+     ‘gpgme_op_decrypt’.
 
  -- Function: gpgme_error_t gpgme_op_decrypt_ext_start (
           gpgme_ctx_t CTX, gpgme_decrypt_flags_t FLAGS,
@@ -5130,7 +5056,7 @@ File: gpgme.info,  Node: Decrypt,  Next: Verify,  Up: Crypto Operations
 \1f
 File: gpgme.info,  Node: Verify,  Next: Decrypt and Verify,  Prev: Decrypt,  Up: Crypto Operations
 
-7.7.2 Verify
+7.6.2 Verify
 ------------
 
  -- Function: gpgme_error_t gpgme_op_verify (gpgme_ctx_t CTX,
@@ -5296,9 +5222,17 @@ File: gpgme.info,  Node: Verify,  Next: Decrypt and Verify,  Prev: Decrypt,  Up:
           following status codes are of interest:
 
           ‘GPG_ERR_NO_ERROR’
-               This status indicates that the signature is valid.  For
-               the combined result this status means that all signatures
-               are valid.
+               This status indicates that the signature could be
+               verified or that there is no signature.  For the combined
+               result this status means that all signatures could be
+               verified.
+
+               Note: This does not mean that a valid signature could be
+               found.  Check the ‘summary’ field for that.
+
+               For example a ‘gpgme_op_decrypt_verify’ returns a
+               verification result with GPG_ERR_NO_ERROR for encrypted
+               but unsigned data.
 
           ‘GPG_ERR_SIG_EXPIRED’
                This status indicates that the signature is valid but
@@ -5433,7 +5367,7 @@ File: gpgme.info,  Node: Verify,  Next: Decrypt and Verify,  Prev: Decrypt,  Up:
 \1f
 File: gpgme.info,  Node: Decrypt and Verify,  Next: Sign,  Prev: Verify,  Up: Crypto Operations
 
-7.7.3 Decrypt and Verify
+7.6.3 Decrypt and Verify
 ------------------------
 
  -- Function: gpgme_error_t gpgme_op_decrypt_verify (gpgme_ctx_t CTX,
@@ -5492,7 +5426,7 @@ in GPGME and GnuPG:
 \1f
 File: gpgme.info,  Node: Sign,  Next: Encrypt,  Prev: Decrypt and Verify,  Up: Crypto Operations
 
-7.7.4 Sign
+7.6.4 Sign
 ----------
 
 A signature can contain signatures by one or more keys.  The set of keys
@@ -5509,7 +5443,7 @@ changed).
 \1f
 File: gpgme.info,  Node: Selecting Signers,  Next: Creating a Signature,  Up: Sign
 
-7.7.4.1 Selecting Signers
+7.6.4.1 Selecting Signers
 .........................
 
 The key or the keys used to create a signature are stored in the
@@ -5548,7 +5482,7 @@ signing.
 \1f
 File: gpgme.info,  Node: Creating a Signature,  Next: Signature Notation Data,  Prev: Selecting Signers,  Up: Sign
 
-7.7.4.2 Creating a Signature
+7.6.4.2 Creating a Signature
 ............................
 
  -- Data type: enum gpgme_sig_mode_t
@@ -5657,7 +5591,7 @@ File: gpgme.info,  Node: Creating a Signature,  Next: Signature Notation Data,
 \1f
 File: gpgme.info,  Node: Signature Notation Data,  Prev: Creating a Signature,  Up: Sign
 
-7.7.4.3 Signature Notation Data
+7.6.4.3 Signature Notation Data
 ...............................
 
 Using the following functions, you can attach arbitrary notation data to
@@ -5712,7 +5646,7 @@ signature is verified.
 \1f
 File: gpgme.info,  Node: Encrypt,  Prev: Sign,  Up: Crypto Operations
 
-7.7.5 Encrypt
+7.6.5 Encrypt
 -------------
 
 One plaintext can be encrypted for several recipients at the same time.
@@ -5726,7 +5660,7 @@ passed to the encryption operation.
 \1f
 File: gpgme.info,  Node: Encrypting a Plaintext,  Up: Encrypt
 
-7.7.5.1 Encrypting a Plaintext
+7.6.5.1 Encrypting a Plaintext
 ..............................
 
  -- Function: gpgme_error_t gpgme_op_encrypt (gpgme_ctx_t CTX,
@@ -6036,7 +5970,7 @@ File: gpgme.info,  Node: Encrypting a Plaintext,  Up: Encrypt
 \1f
 File: gpgme.info,  Node: Miscellaneous,  Next: Run Control,  Prev: Crypto Operations,  Up: Contexts
 
-7.8 Miscellaneous operations
+7.7 Miscellaneous operations
 ============================
 
 Here are some support functions which are sometimes useful.
@@ -6050,7 +5984,7 @@ Here are some support functions which are sometimes useful.
 \1f
 File: gpgme.info,  Node: Running other Programs,  Next: Using the Assuan protocol,  Up: Miscellaneous
 
-7.8.1 Running other Programs
+7.7.1 Running other Programs
 ----------------------------
 
 GPGME features an internal subsystem to run the actual backend engines.
@@ -6104,7 +6038,7 @@ GPGME API.
 \1f
 File: gpgme.info,  Node: Using the Assuan protocol,  Next: Checking for updates,  Prev: Running other Programs,  Up: Miscellaneous
 
-7.8.2 Using the Assuan protocol
+7.7.2 Using the Assuan protocol
 -------------------------------
 
 The Assuan protocol can be used to talk to arbitrary Assuan servers.  By
@@ -6176,7 +6110,7 @@ transfer data:
 \1f
 File: gpgme.info,  Node: Checking for updates,  Prev: Using the Assuan protocol,  Up: Miscellaneous
 
-7.8.3 How to check for software updates
+7.7.3 How to check for software updates
 ---------------------------------------
 
 The GnuPG Project operates a server to query the current versions of
@@ -6310,7 +6244,7 @@ Here is an example on how to check whether GnuPG is current:
 \1f
 File: gpgme.info,  Node: Run Control,  Prev: Miscellaneous,  Up: Contexts
 
-7.9 Run Control
+7.8 Run Control
 ===============
 
 GPGME supports running operations synchronously and asynchronously.  You
@@ -6330,7 +6264,7 @@ also prevents it from blocking for a long time.
 \1f
 File: gpgme.info,  Node: Waiting For Completion,  Next: Using External Event Loops,  Up: Run Control
 
-7.9.1 Waiting For Completion
+7.8.1 Waiting For Completion
 ----------------------------
 
  -- Function: gpgme_ctx_t gpgme_wait (gpgme_ctx_t CTX,
@@ -6373,7 +6307,7 @@ File: gpgme.info,  Node: Waiting For Completion,  Next: Using External Event Loo
 \1f
 File: gpgme.info,  Node: Using External Event Loops,  Next: Cancellation,  Prev: Waiting For Completion,  Up: Run Control
 
-7.9.2 Using External Event Loops
+7.8.2 Using External Event Loops
 --------------------------------
 
 GPGME hides the complexity of the communication between the library and
@@ -6411,7 +6345,7 @@ into GUI toolkits like GTK+ even for single-threaded programs.
 \1f
 File: gpgme.info,  Node: I/O Callback Interface,  Next: Registering I/O Callbacks,  Up: Using External Event Loops
 
-7.9.2.1 I/O Callback Interface
+7.8.2.1 I/O Callback Interface
 ..............................
 
  -- Data type: gpgme_error_t (*gpgme_io_cb_t) (void *DATA, int FD)
@@ -6490,12 +6424,6 @@ File: gpgme.info,  Node: I/O Callback Interface,  Next: Registering I/O Callback
           is a ‘gpgme_key_t’ variable that contains the key with one
           reference for the user.
 
-     ‘GPGME_EVENT_NEXT_TRUSTITEM’
-          In a ‘gpgme_op_trustlist_start’ operation, the next trust item
-          was received from the crypto engine.  The accompanying
-          TYPE_DATA is a ‘gpgme_trust_item_t’ variable that contains the
-          trust item with one reference for the user.
-
  -- Data type: void (*gpgme_event_io_cb_t) (void *DATA,
           gpgme_event_io_t TYPE, void *TYPE_DATA)
      The ‘gpgme_event_io_cb_t’ type is the type of functions which can
@@ -6517,7 +6445,7 @@ File: gpgme.info,  Node: I/O Callback Interface,  Next: Registering I/O Callback
 \1f
 File: gpgme.info,  Node: Registering I/O Callbacks,  Next: I/O Callback Example,  Prev: I/O Callback Interface,  Up: Using External Event Loops
 
-7.9.2.2 Registering I/O Callbacks
+7.8.2.2 Registering I/O Callbacks
 .................................
 
  -- Data type: struct gpgme_io_cbs
@@ -6566,7 +6494,7 @@ File: gpgme.info,  Node: Registering I/O Callbacks,  Next: I/O Callback Example,
 \1f
 File: gpgme.info,  Node: I/O Callback Example,  Next: I/O Callback Example GTK+,  Prev: Registering I/O Callbacks,  Up: Using External Event Loops
 
-7.9.2.3 I/O Callback Example
+7.8.2.3 I/O Callback Example
 ............................
 
 To actually use an external event loop, you have to implement the I/O
@@ -6628,14 +6556,14 @@ GPGME is not predictable.
        for (i = 0; i < MAX_FDS; i++)
          {
            if (fds[i].fd == -1)
-            {
+       {
          fds[i].fd = fd;
          fds[i].dir = dir;
          fds[i].fnc = fnc;
          fds[i].fnc_data = fnc_data;
          fds[i].loop = loop;
          break;
-            }
+       }
          }
        pthread_mutex_unlock (&loop->lock);
        if (i == MAX_FDS)
@@ -6705,9 +6633,9 @@ next.  We only support waiting for the success of a single operation.
        for (i = 0; i < MAX_FDS && n; i++)
          {
            if (fdlist[i].fd != -1)
-            {
+       {
          if (FD_ISSET (fdlist[i].fd, fdlist[i].dir ? &rfds : &wfds))
-                {
+           {
              assert (n);
              n--;
              any = 1;
@@ -6716,8 +6644,8 @@ next.  We only support waiting for the success of a single operation.
                    pthread_mutex_unlock (&loop->lock);
              (*fdlist[i].fnc) (fdlist[i].fnc_data, fdlist[i].fd);
                    pthread_mutex_lock (&loop->lock);
-                }
-            }
+           }
+       }
          }
        pthread_mutex_unlock (&loop->lock);
        return any;
@@ -6810,7 +6738,7 @@ next.  We only support waiting for the success of a single operation.
 \1f
 File: gpgme.info,  Node: I/O Callback Example GTK+,  Next: I/O Callback Example GDK,  Prev: I/O Callback Example,  Up: Using External Event Loops
 
-7.9.2.4 I/O Callback Example GTK+
+7.8.2.4 I/O Callback Example GTK+
 .................................
 
 The I/O callback interface can be used to integrate GPGME with the GTK+
@@ -6862,7 +6790,7 @@ any GTK+ specific setup.
 \1f
 File: gpgme.info,  Node: I/O Callback Example GDK,  Next: I/O Callback Example Qt,  Prev: I/O Callback Example GTK+,  Up: Using External Event Loops
 
-7.9.2.5 I/O Callback Example GDK
+7.8.2.5 I/O Callback Example GDK
 ................................
 
 The I/O callback interface can also be used to integrate GPGME with the
@@ -6913,7 +6841,7 @@ any GDK specific setup.
 \1f
 File: gpgme.info,  Node: I/O Callback Example Qt,  Prev: I/O Callback Example GDK,  Up: Using External Event Loops
 
-7.9.2.6 I/O Callback Example Qt
+7.8.2.6 I/O Callback Example Qt
 ...............................
 
 The I/O callback interface can also be used to integrate GPGME with the
@@ -6980,7 +6908,7 @@ any Qt specific setup.
 \1f
 File: gpgme.info,  Node: Cancellation,  Prev: Using External Event Loops,  Up: Run Control
 
-7.9.3 Cancellation
+7.8.3 Cancellation
 ------------------
 
 Sometimes you do not want to wait for an operation to finish.  GPGME
@@ -7272,3 +7200,87 @@ The decryption is started with the command:
      ‘--export-session-key’ is given and the underlying engine knows how
      to export the session key, it will appear on a status line
 
+\1f
+File: gpgme.info,  Node: UI Server Verify,  Next: UI Server Set Input Files,  Prev: UI Server Decrypt,  Up: UI Server Protocol
+
+A.4 UI Server: Verify a Message
+===============================
+
+The server needs to support the verification of opaque signatures as
+well as detached signatures.  The kind of input sources controls what
+kind message is to be verified.
+
+ -- Command: MESSAGE FD=N
+     This command is used with detached signatures to set the file
+     descriptor for the signed data to N.  The data is binary encoded
+     (used verbatim).  For details on the file descriptor, see the
+     description of ‘INPUT’ in the ‘ENCRYPT’ section.
+
+ -- Command: INPUT FD=N
+     Set the file descriptor for the opaque message or the signature
+     part of a detached signature to N.  The message send to the server
+     is either binary encoded or – in the case of OpenPGP – ASCII
+     armored.  For details on the file descriptor, see the description
+     of ‘INPUT’ in the ‘ENCRYPT’ section.
+
+ -- Command: OUTPUT FD=N
+     Set the file descriptor to be used for the output.  The output is
+     binary encoded and only used for opaque signatures.  For details on
+     the file descriptor, see the description of ‘INPUT’ in the
+     ‘ENCRYPT’ section.
+
+The verification is then started using:
+
+ -- Command: VERIFY --protocol=NAME [--silent]
+     NAME is the signing protocol used for the message.  For a
+     description of the allowed protocols see the ‘ENCRYPT’ command.
+     This argument is mandatory.  Depending on the combination of
+     ‘MESSAGE’ ‘INPUT’ and ‘OUTPUT’ commands, the server needs to select
+     the appropriate verification mode:
+
+     MESSAGE and INPUT
+          This indicates a detached signature.  Output data is not
+          applicable.
+     INPUT
+          This indicates an opaque signature.  As no output command has
+          been given, the server is only required to check the
+          signature.
+     INPUT and OUTPUT
+          This indicates an opaque signature.  The server shall write
+          the signed data to the file descriptor set by the output
+          command.  This data shall even be written if the signatures
+          can’t be verified.
+
+   With ‘--silent’ the server shall not display any dialog; this is for
+example used by the client to get the content of opaque signed messages.
+The client expects the server to send at least this status information
+before the final OK response:
+
+ -- Status line: SIGSTATUS FLAG DISPLAYSTRING
+     Returns the status for the signature and a short string explaining
+     the status.  Valid values for FLAG are:
+
+     ‘none’
+          The message has a signature but it could not not be verified
+          due to a missing key.
+     ‘green’
+          The signature is fully valid.
+     ‘yellow’
+          The signature is valid but additional information was shown
+          regarding the validity of the key.
+     ‘red’
+          The signature is not valid.
+
+     DISPLAYSTRING is a percent-and-plus-encoded string with a short
+     human readable description of the status.  For example
+
+          S SIGSTATUS green Good+signature+from+Keith+Moon+<keith@example.net>
+
+     Note that this string needs to fit into an Assuan line and should
+     be short enough to be displayed as short one-liner on the clients
+     window.  As usual the encoding of this string is UTF-8 and it
+     should be send in its translated form.
+
+     The server shall send one status line for every signature found on
+     the message.
+
index a97e21e..aed9971 100644 (file)
@@ -1,4 +1,4 @@
-This is gpgme.info, produced by makeinfo version 6.3 from gpgme.texi.
+This is gpgme.info, produced by makeinfo version 6.5 from gpgme.texi.
 
 Copyright © 2002–2008, 2010, 2012–2018 g10 Code GmbH.
 
@@ -19,8 +19,8 @@ END-INFO-DIR-ENTRY
 
    This file documents the GPGME library.
 
-   This is Edition 1.12.1-beta100, last updated 3 December 2018, of ‘The
-‘GnuPG Made Easy’ Reference Manual’, for Version 1.12.1-beta100.
+   This is Edition 1.14.0-beta56, last updated 13 December 2019, of ‘The
+‘GnuPG Made Easy’ Reference Manual’, for Version 1.14.0-beta56.
 
    Copyright © 2002–2008, 2010, 2012–2018 g10 Code GmbH.
 
@@ -36,90 +36,6 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 Public License for more details.
 
 \1f
-File: gpgme.info,  Node: UI Server Verify,  Next: UI Server Set Input Files,  Prev: UI Server Decrypt,  Up: UI Server Protocol
-
-A.4 UI Server: Verify a Message
-===============================
-
-The server needs to support the verification of opaque signatures as
-well as detached signatures.  The kind of input sources controls what
-kind message is to be verified.
-
- -- Command: MESSAGE FD=N
-     This command is used with detached signatures to set the file
-     descriptor for the signed data to N.  The data is binary encoded
-     (used verbatim).  For details on the file descriptor, see the
-     description of ‘INPUT’ in the ‘ENCRYPT’ section.
-
- -- Command: INPUT FD=N
-     Set the file descriptor for the opaque message or the signature
-     part of a detached signature to N.  The message send to the server
-     is either binary encoded or – in the case of OpenPGP – ASCII
-     armored.  For details on the file descriptor, see the description
-     of ‘INPUT’ in the ‘ENCRYPT’ section.
-
- -- Command: OUTPUT FD=N
-     Set the file descriptor to be used for the output.  The output is
-     binary encoded and only used for opaque signatures.  For details on
-     the file descriptor, see the description of ‘INPUT’ in the
-     ‘ENCRYPT’ section.
-
-The verification is then started using:
-
- -- Command: VERIFY --protocol=NAME [--silent]
-     NAME is the signing protocol used for the message.  For a
-     description of the allowed protocols see the ‘ENCRYPT’ command.
-     This argument is mandatory.  Depending on the combination of
-     ‘MESSAGE’ ‘INPUT’ and ‘OUTPUT’ commands, the server needs to select
-     the appropriate verification mode:
-
-     MESSAGE and INPUT
-          This indicates a detached signature.  Output data is not
-          applicable.
-     INPUT
-          This indicates an opaque signature.  As no output command has
-          been given, the server is only required to check the
-          signature.
-     INPUT and OUTPUT
-          This indicates an opaque signature.  The server shall write
-          the signed data to the file descriptor set by the output
-          command.  This data shall even be written if the signatures
-          can’t be verified.
-
-   With ‘--silent’ the server shall not display any dialog; this is for
-example used by the client to get the content of opaque signed messages.
-The client expects the server to send at least this status information
-before the final OK response:
-
- -- Status line: SIGSTATUS FLAG DISPLAYSTRING
-     Returns the status for the signature and a short string explaining
-     the status.  Valid values for FLAG are:
-
-     ‘none’
-          The message has a signature but it could not not be verified
-          due to a missing key.
-     ‘green’
-          The signature is fully valid.
-     ‘yellow’
-          The signature is valid but additional information was shown
-          regarding the validity of the key.
-     ‘red’
-          The signature is not valid.
-
-     DISPLAYSTRING is a percent-and-plus-encoded string with a short
-     human readable description of the status.  For example
-
-          S SIGSTATUS green Good+signature+from+Keith+Moon+<keith@example.net>
-
-     Note that this string needs to fit into an Assuan line and should
-     be short enough to be displayed as short one-liner on the clients
-     window.  As usual the encoding of this string is UTF-8 and it
-     should be send in its translated form.
-
-     The server shall send one status line for every signature found on
-     the message.
-
-\1f
 File: gpgme.info,  Node: UI Server Set Input Files,  Next: UI Server Sign/Encrypt Files,  Prev: UI Server Verify,  Up: UI Server Protocol
 
 A.5 UI Server: Specifying the input files to operate on.
@@ -415,10 +331,6 @@ GPGME.
      The function ‘gpgme_key_release’ is equivalent to
      ‘gpgme_key_unref’.
 
- -- Function: void gpgme_trust_item_release (gpgme_trust_item_t ITEM)
-     The function ‘gpgme_trust_item_release’ is an alias for
-     ‘gpgme_trust_item_unref’.
-
  -- Function: gpgme_error_t gpgme_op_import_ext (gpgme_ctx_t CTX,
           gpgme_data_t KEYDATA, int *NR)
      SINCE: 0.3.9
@@ -547,9 +459,6 @@ GPGME.
           This is the key ID of a sub key.  It is representable as a
           string.
 
-          For trust items, the trust item refers to the key with this
-          ID.
-
      ‘GPGME_ATTR_FPR’
           This is the fingerprint of a sub key.  It is representable as
           a string.
@@ -572,17 +481,11 @@ GPGME.
           This is the expiration time of a sub key.  It is representable
           as a number.
 
-     ‘GPGME_ATTR_OTRUST’
-          XXX FIXME (also for trust items)
-
      ‘GPGME_ATTR_USERID’
           This is a user ID. There can be more than one user IDs in a
           GPGME_KEY_T object.  The first one (with index 0) is the
           primary user ID. The user ID is representable as a number.
 
-          For trust items, this is the user ID associated with this
-          trust item.
-
      ‘GPGME_ATTR_NAME’
           This is the name belonging to a user ID. It is representable
           as a string.
@@ -600,9 +503,6 @@ GPGME.
           representable as a string and as a number.  See below for a
           list of available validities.
 
-          For trust items, this is the validity that is associated with
-          this trust item.
-
      ‘GPGME_ATTR_UID_REVOKED’
           This specifies if a user ID is revoked.  It is representable
           as a number, and is ‘1’ if the user ID is revoked, and ‘0’
@@ -613,14 +513,10 @@ GPGME.
           as a number, and is ‘1’ if the user ID is invalid, and ‘0’
           otherwise.
 
-     ‘GPGME_ATTR_LEVEL’
-          This is the trust level of a trust item.
-
      ‘GPGME_ATTR_TYPE’
           This returns information about the type of key.  For the
           string function this will eother be "PGP" or "X.509".  The
-          integer function returns 0 for PGP and 1 for X.509.  It is
-          also used for the type of a trust item.
+          integer function returns 0 for PGP and 1 for X.509.
 
      ‘GPGME_ATTR_IS_SECRET’
           This specifies if the key is a secret key.  It is
@@ -798,38 +694,6 @@ function ‘gpgme_get_key’.
      string, KEY is not a valid pointer, UID_IDX or IDX out of range, or
      RESERVED not ‘NULL’.
 
-   Trust items have attributes which can be queried using the interfaces
-below.  The attribute identifiers are shared with those for key
-attributes.  *Note Information About Keys::.
-
- -- Function: const char * gpgme_trust_item_get_string_attr
-          (gpgme_trust_item_t ITEM, gpgme_attr_t WHAT,
-          const void *RESERVED, int IDX)
-     The function ‘gpgme_trust_item_get_string_attr’ returns the value
-     of the string-representable attribute WHAT of trust item ITEM.  The
-     arguments IDX and RESERVED are reserved for later use and should be
-     ‘0’ and ‘NULL’ respectively.
-
-     The string returned is only valid as long as the key is valid.
-
-     The function returns ‘0’ if an attribute can’t be returned as a
-     string, KEY is not a valid pointer, IDX out of range, or RESERVED
-     not ‘NULL’.
-
- -- Function: int gpgme_trust_item_get_int_attr
-          (gpgme_trust_item_t ITEM, gpgme_attr_t WHAT,
-          const void *RESERVED, int IDX)
-     The function ‘gpgme_trust_item_get_int_attr’ returns the value of
-     the number-representable attribute WHAT of trust item ITEM.  If the
-     attribute occurs more than once in the trust item, the index is
-     specified by IDX.  However, currently no such attribute exists, so
-     IDX should be ‘0’.  The argument RESERVED is reserved for later use
-     and should be ‘NULL’.
-
-     The function returns ‘0’ if the attribute can’t be returned as a
-     number, KEY is not a valid pointer, IDX out of range, or RESERVED
-     not ‘NULL’.
-
  -- Data type: enum gpgme_sig_stat_t
      The ‘gpgme_sig_stat_t’ type holds the result of a signature check,
      or the combined result of all signatures.  The following results
@@ -899,7 +763,7 @@ attributes.  *Note Information About Keys::.
             if (r_stat)
               {
                 switch (gpg_err_code (sig->status))
-                 {
+               {
                case GPG_ERR_NO_ERROR:
                  *r_stat = GPGME_SIG_STAT_GOOD;
                  break;
@@ -927,7 +791,7 @@ attributes.  *Note Information About Keys::.
                default:
                  *r_stat = GPGME_SIG_STAT_ERROR;
                  break;
-                 }
+               }
               }
             if (r_created)
               *r_created = sig->timestamp;
@@ -998,7 +862,7 @@ attributes.  *Note Information About Keys::.
 
               case GPGME_ATTR_SIG_STATUS:
                 switch (sig->status)
-                 {
+               {
                case GPG_ERR_NO_ERROR:
                  return GPGME_SIG_STAT_GOOD;
 
@@ -1019,7 +883,7 @@ attributes.  *Note Information About Keys::.
 
                default:
                  return GPGME_SIG_STAT_ERROR;
-                 }
+               }
 
               case GPGME_ATTR_SIG_SUMMARY:
                 return sig->summary;
@@ -2487,10 +2351,6 @@ Concept Index
                                                                 (line 6)
 * text mode:                             Text Mode.             (line 6)
 * thread-safeness:                       Multi-Threading.       (line 6)
-* trust item:                            Trust Item Management. (line 6)
-* trust item list:                       Listing Trust Items.   (line 6)
-* trust item, manipulation:              Manipulating Trust Items.
-                                                                (line 6)
 * type of data:                          Data Buffer Convenience.
                                                                 (line 6)
 * UI server:                             UI Server Protocol.    (line 6)
@@ -2544,7 +2404,7 @@ Function and Data Index
 * enum gpgme_sig_mode_t:                 Creating a Signature.
                                                               (line   6)
 * enum gpgme_sig_stat_t:                 Deprecated Functions.
-                                                              (line 441)
+                                                              (line 387)
 * enum gpgme_tofu_policy_t:              Changing TOFU Data.  (line  10)
 * FILE:                                  UI Server Set Input Files.
                                                               (line   9)
@@ -2552,9 +2412,9 @@ Function and Data Index
                                                               (line   9)
 * gpgme_addrspec_from_uid:               Decrypt and Verify.  (line  48)
 * gpgme_attr_t:                          Deprecated Functions.
-                                                              (line 144)
+                                                              (line 140)
 * gpgme_attr_t <1>:                      Deprecated Functions.
-                                                              (line 321)
+                                                              (line 301)
 * gpgme_cancel:                          Cancellation.        (line  16)
 * gpgme_cancel_async:                    Cancellation.        (line  38)
 * gpgme_check_version:                   Library Version Check.
@@ -2587,7 +2447,7 @@ Function and Data Index
 * gpgme_data_new_from_stream:            File Based Data Buffers.
                                                               (line  29)
 * gpgme_data_new_with_read_cb:           Deprecated Functions.
-                                                              (line 114)
+                                                              (line 110)
 * gpgme_data_read:                       Data Buffer I/O Operations.
                                                               (line   6)
 * gpgme_data_read_cb_t:                  Callback Based Data Buffers.
@@ -2599,7 +2459,7 @@ Function and Data Index
 * gpgme_data_release_cb_t:               Callback Based Data Buffers.
                                                               (line  55)
 * gpgme_data_rewind:                     Deprecated Functions.
-                                                              (line 138)
+                                                              (line 134)
 * gpgme_data_seek:                       Data Buffer I/O Operations.
                                                               (line  26)
 * gpgme_data_seek_cb_t:                  Callback Based Data Buffers.
@@ -2619,7 +2479,7 @@ Function and Data Index
                                                               (line  29)
 * gpgme_decrypt_result_t:                Decrypt.             (line 101)
 * gpgme_edit_cb_t:                       Deprecated Functions.
-                                                              (line  37)
+                                                              (line  33)
 * gpgme_encrypt_result_t:                Encrypting a Plaintext.
                                                               (line 241)
 * gpgme_engine_check_version:            Engine Version Check.
@@ -2635,7 +2495,7 @@ Function and Data Index
 * gpgme_error_t (*gpgme_assuan_status_cb_t) (void *OPAQUE, const char *STATUS, const char *ARGS): Using the Assuan protocol.
                                                               (line  38)
 * gpgme_error_t (*gpgme_edit_cb_t) (void *HANDLE, gpgme_status_code_t STATUS, const char *ARGS, int FD): Deprecated Functions.
-                                                              (line  35)
+                                                              (line  31)
 * gpgme_error_t (*gpgme_interact_cb_t) (void *HANDLE, const char *STATUS, const char *ARGS, int FD): Advanced Key Editing.
                                                               (line   6)
 * gpgme_error_t (*gpgme_io_cb_t) (void *DATA, int FD): I/O Callback Interface.
@@ -2662,7 +2522,7 @@ Function and Data Index
                                                               (line  25)
 * gpgme_genkey_result_t:                 Generating Keys.     (line 381)
 * gpgme_get_armor:                       ASCII Armor.         (line  13)
-* gpgme_get_ctx_flag:                    Context Flags.       (line 121)
+* gpgme_get_ctx_flag:                    Context Flags.       (line 135)
 * gpgme_get_dirinfo:                     Engine Version Check.
                                                               (line   6)
 * gpgme_get_engine_info:                 Engine Information.  (line  46)
@@ -2671,7 +2531,7 @@ Function and Data Index
 * gpgme_get_io_cbs:                      Registering I/O Callbacks.
                                                               (line  44)
 * gpgme_get_key:                         Listing Keys.        (line 178)
-* gpgme_get_keylist_mode:                Key Listing Mode.    (line  95)
+* gpgme_get_keylist_mode:                Key Listing Mode.    (line 103)
 * gpgme_get_offline:                     Offline Mode.        (line  31)
 * gpgme_get_passphrase_cb:               Passphrase Callback. (line  63)
 * gpgme_get_pinentry_mode:               Pinentry Mode.       (line  18)
@@ -2682,13 +2542,13 @@ Function and Data Index
                                                               (line  58)
 * gpgme_get_sender:                      Setting the Sender.  (line  29)
 * gpgme_get_sig_key:                     Deprecated Functions.
-                                                              (line 641)
+                                                              (line 587)
 * gpgme_get_sig_status:                  Deprecated Functions.
-                                                              (line 489)
+                                                              (line 435)
 * gpgme_get_sig_string_attr:             Deprecated Functions.
-                                                              (line 545)
+                                                              (line 491)
 * gpgme_get_sig_ulong_attr:              Deprecated Functions.
-                                                              (line 579)
+                                                              (line 525)
 * gpgme_get_status_cb:                   Status Message Callback.
                                                               (line  31)
 * gpgme_get_textmode:                    Text Mode.           (line  20)
@@ -2703,17 +2563,17 @@ Function and Data Index
                                                               (line   7)
 * gpgme_keylist_result_t:                Listing Keys.        (line 155)
 * gpgme_key_get_string_attr:             Deprecated Functions.
-                                                              (line 286)
+                                                              (line 266)
 * gpgme_key_get_ulong_attr:              Deprecated Functions.
-                                                              (line 300)
+                                                              (line 280)
 * gpgme_key_ref:                         Manipulating Keys.   (line   6)
 * gpgme_key_release:                     Deprecated Functions.
                                                               (line  14)
 * gpgme_key_sig_get_string_attr:         Deprecated Functions.
-                                                              (line 377)
+                                                              (line 357)
 * gpgme_key_sig_get_ulong_attr:          Deprecated Functions.
-                                                              (line 393)
-* gpgme_key_sig_t:                       Key objects.         (line 339)
+                                                              (line 373)
+* gpgme_key_sig_t:                       Key objects.         (line 346)
 * gpgme_key_t:                           Key objects.         (line  10)
 * gpgme_key_unref:                       Manipulating Keys.   (line  10)
 * gpgme_new:                             Creating Contexts.   (line   6)
@@ -2727,9 +2587,9 @@ Function and Data Index
 * gpgme_op_assuan_transact_start:        Using the Assuan protocol.
                                                               (line  47)
 * gpgme_op_card_edit:                    Deprecated Functions.
-                                                              (line  89)
+                                                              (line  85)
 * gpgme_op_card_edit_start:              Deprecated Functions.
-                                                              (line  99)
+                                                              (line  95)
 * gpgme_op_createkey:                    Generating Keys.     (line  14)
 * gpgme_op_createkey_start:              Generating Keys.     (line 119)
 * gpgme_op_createsubkey:                 Generating Keys.     (line 132)
@@ -2746,9 +2606,9 @@ Function and Data Index
 * gpgme_op_delete_ext_start:             Deleting Keys.       (line  33)
 * gpgme_op_delete_start:                 Deleting Keys.       (line  52)
 * gpgme_op_edit:                         Deprecated Functions.
-                                                              (line  48)
+                                                              (line  44)
 * gpgme_op_edit_start:                   Deprecated Functions.
-                                                              (line  72)
+                                                              (line  68)
 * gpgme_op_encrypt:                      Encrypting a Plaintext.
                                                               (line   6)
 * gpgme_op_encrypt_ext:                  Encrypting a Plaintext.
@@ -2767,12 +2627,12 @@ Function and Data Index
                                                               (line 274)
 * gpgme_op_encrypt_start:                Encrypting a Plaintext.
                                                               (line 113)
-* gpgme_op_export:                       Exporting Keys.      (line  50)
-* gpgme_op_export_ext:                   Exporting Keys.      (line  83)
-* gpgme_op_export_ext_start:             Exporting Keys.      (line 105)
-* gpgme_op_export_keys:                  Exporting Keys.      (line 117)
-* gpgme_op_export_keys_start:            Exporting Keys.      (line 144)
-* gpgme_op_export_start:                 Exporting Keys.      (line  71)
+* gpgme_op_export:                       Exporting Keys.      (line  59)
+* gpgme_op_export_ext:                   Exporting Keys.      (line  92)
+* gpgme_op_export_ext_start:             Exporting Keys.      (line 114)
+* gpgme_op_export_keys:                  Exporting Keys.      (line 126)
+* gpgme_op_export_keys_start:            Exporting Keys.      (line 153)
+* gpgme_op_export_start:                 Exporting Keys.      (line  80)
 * gpgme_op_genkey:                       Generating Keys.     (line 304)
 * gpgme_op_genkey_result:                Generating Keys.     (line 418)
 * gpgme_op_genkey_start:                 Generating Keys.     (line 369)
@@ -2780,7 +2640,7 @@ Function and Data Index
 * gpgme_op_getauditlog_start:            Additional Logs.     (line  54)
 * gpgme_op_import:                       Importing Keys.      (line   9)
 * gpgme_op_import_ext:                   Deprecated Functions.
-                                                              (line  22)
+                                                              (line  18)
 * gpgme_op_import_keys:                  Importing Keys.      (line  35)
 * gpgme_op_import_keys_start:            Importing Keys.      (line  65)
 * gpgme_op_import_result:                Importing Keys.      (line 174)
@@ -2821,11 +2681,8 @@ Function and Data Index
                                                               (line  45)
 * gpgme_op_tofu_policy:                  Changing TOFU Data.  (line  29)
 * gpgme_op_tofu_policy_start:            Changing TOFU Data.  (line  43)
-* gpgme_op_trustlist_end:                Listing Trust Items. (line  44)
-* gpgme_op_trustlist_next:               Listing Trust Items. (line  27)
-* gpgme_op_trustlist_start:              Listing Trust Items. (line   6)
 * gpgme_op_verify:                       Verify.              (line   6)
-* gpgme_op_verify_result:                Verify.              (line 290)
+* gpgme_op_verify_result:                Verify.              (line 298)
 * gpgme_op_verify_start:                 Verify.              (line  26)
 * gpgme_passphrase_cb_t:                 Passphrase Callback. (line  10)
 * gpgme_pinentry_mode_t:                 Pinentry Mode.       (line  26)
@@ -2887,7 +2744,7 @@ Function and Data Index
                                                               (line  45)
 * gpgme_sig_notation_t:                  Verify.              (line  38)
 * gpgme_sig_stat_t:                      Deprecated Functions.
-                                                              (line 442)
+                                                              (line 388)
 * gpgme_ssize_t:                         Exchanging Data.     (line  32)
 * gpgme_status_cb_t:                     Status Message Callback.
                                                               (line   8)
@@ -2895,24 +2752,12 @@ Function and Data Index
 * gpgme_strerror_r:                      Error Strings.       (line  15)
 * gpgme_strsource:                       Error Strings.       (line  26)
 * gpgme_subkey_t:                        Key objects.         (line 112)
-* gpgme_tofu_info_t:                     Key objects.         (line 275)
+* gpgme_tofu_info_t:                     Key objects.         (line 282)
 * gpgme_tofu_policy_t:                   Changing TOFU Data.  (line  13)
-* gpgme_trust_item_get_int_attr:         Deprecated Functions.
-                                                              (line 426)
-* gpgme_trust_item_get_string_attr:      Deprecated Functions.
-                                                              (line 411)
-* gpgme_trust_item_ref:                  Manipulating Trust Items.
-                                                              (line   6)
-* gpgme_trust_item_release:              Deprecated Functions.
-                                                              (line  18)
-* gpgme_trust_item_t:                    Trust Item Management.
-                                                              (line   8)
-* gpgme_trust_item_unref:                Manipulating Trust Items.
-                                                              (line  10)
 * gpgme_user_id_t:                       Key objects.         (line 217)
 * gpgme_validity_t:                      Information About Keys.
                                                               (line   9)
-* gpgme_verify_result_t:                 Verify.              (line 268)
+* gpgme_verify_result_t:                 Verify.              (line 276)
 * gpgme_wait:                            Waiting For Completion.
                                                               (line   6)
 * IMPORT_FILES:                          UI Server Import/Export Keys.
@@ -2958,7 +2803,7 @@ Function and Data Index
 * void (*gpgme_data_release_cb_t) (void *HANDLE): Callback Based Data Buffers.
                                                               (line  54)
 * void (*gpgme_event_io_cb_t) (void *DATA, gpgme_event_io_t TYPE, void *TYPE_DATA): I/O Callback Interface.
-                                                              (line  89)
+                                                              (line  83)
 * void (*gpgme_progress_cb_t)(void *HOOK, const char *WHAT, int TYPE, int CURRENT, int TOTAL): Progress Meter Callback.
                                                               (line   6)
 * void (*gpgme_remove_io_cb_t) (void *TAG): I/O Callback Interface.
index e04c301..6c1d062 100644 (file)
@@ -182,7 +182,6 @@ Contexts
 * Result Management::             Managing the result of crypto operations.
 * Context Attributes::            Setting properties of a context.
 * Key Management::                Managing keys with @acronym{GPGME}.
-* Trust Item Management::         Managing trust items with @acronym{GPGME}.
 * Crypto Operations::             Using a context for cryptography.
 * Miscellaneous::                 Miscellaneous operations.
 * Run Control::                   Controlling how operations are run.
@@ -217,11 +216,6 @@ Key Management
 * Changing TOFU Data::            Changing data pertaining to TOFU.
 * Advanced Key Editing::          Advanced key edit operation.
 
-Trust Item Management
-
-* Listing Trust Items::           Browsing the list of available trust items.
-* Manipulating Trust Items::      Operations on trust items.
-
 Crypto Operations
 
 * Decrypt::                       Decrypting a ciphertext.
@@ -2353,7 +2347,6 @@ cryptographic operations.
 * Result Management::             Managing the result of crypto operations.
 * Context Attributes::            Setting properties of a context.
 * Key Management::                Managing keys with @acronym{GPGME}.
-* Trust Item Management::         Managing trust items with @acronym{GPGME}.
 * Crypto Operations::             Using a context for cryptography.
 * Miscellaneous::                 Miscellaneous operations
 * Run Control::                   Controlling how operations are run.
@@ -2820,6 +2813,13 @@ The @code{GPGME_KEYLIST_MODE_WITH_TOFU} symbol specifies that
 information pertaining to the TOFU trust model should be included in
 the listed keys.
 
+@item GPGME_KEYLIST_MODE_WITH_KEYGRIP
+@since{1.14.0}
+
+The @code{GPGME_KEYLIST_MODE_WITH_KEYRIP} symbol specifies that the
+keygrip is always included in the listing.  The default depends on the
+version of the backend and the used protocol.
+
 @item GPGME_KEYLIST_MODE_WITH_SECRET
 @since{1.5.1}
 
@@ -2827,7 +2827,8 @@ The @code{GPGME_KEYLIST_MODE_WITH_SECRET} returns information about
 the presence of a corresponding secret key in a public key listing.  A
 public key listing with this mode is slower than a standard listing
 but can be used instead of a second run to list the secret keys.  This
-is only supported for GnuPG versions >= 2.1.
+is only supported for GnuPG versions >= 2.1.  Note that using this
+option also makes sure that the keygrip is available in the output.
 
 @item GPGME_KEYLIST_MODE_EPHEMERAL
 @since{1.2.0}
@@ -3105,6 +3106,14 @@ a message signed by a brand new key (which you naturally will not have
 on your local keyring), the operator can tell both your IP address and
 the time when you verified the signature.
 
+@item "auto-key-import"
+Setting the @var{value} to "1" forces the GPG backend to automatically
+import a missing key for signature verification from the signature.
+
+@item "include-key-block"
+Setting the @var{value} to "1" forces the GPG backend to embed the
+signing key as well as an encryption subkey into the the signature.
+
 @item "request-origin"
 The string given in @var{value} is passed to the GnuPG engines to
 request restrictions based on the origin of the request.  Valid values
@@ -3150,6 +3159,10 @@ trust-model changes the default trust-model for future operations.
 A change in the trust-model also can have unintended side effects, like
 rebuilding the trust-db.
 
+@item "extended-edit"
+This flag passes the option @option{--expert} to gpg key edit.  This
+can be used to get additional callbacks in @code{gpgme_op_edit}.
+
 @end table
 
 This function returns @code{0} on success.
@@ -3492,7 +3505,7 @@ available.
 @since{1.7.0}
 
 The keygrip of the subkey in hex digit form or @code{NULL} if not
-availabale.
+available.
 
 @item long int timestamp
 This is the creation timestamp of the subkey.  This is -1 if the
@@ -3577,6 +3590,12 @@ Reserved for the origin of this user ID.
 
 Reserved for the time of the last update of this user ID.
 
+@item char *uidhash;
+A string used by gpg to identify a user ID.  This string can be used
+at certain prompts of @code{gpgme_op_edit} to select a user ID.  Users
+must be prepared to see a @code{NULL} value here.  The format of the
+value is not specified and may depend on the GPGME or GnuPG version.
+
 @end table
 @end deftp
 
@@ -4112,7 +4131,7 @@ already existing in the local key database.  This flag can be used to
 override this check.
 
 @item GPGME_CREATE_NOEXPIRE
-@since{1.8.0}
+@since{1.9.0}
 
 Request generation of keys that do not expire.
 
@@ -4660,6 +4679,14 @@ If this bit is set, the smallest possible key is exported.  For OpenPGP
 keys it removes all signatures except for the latest self-signatures.
 For X.509 keys it has no effect.
 
+@item GPGME_EXPORT_MODE_SSH
+@since{1.4.0}
+
+If this bit is set, the latest authentication key of the requested
+OpenPGP key is exported in the OpenSSH public key format.  This
+accepts just a single key; to force the export of a specific subkey
+a fingerprint pattern with an appended exclamation mark may be used.
+
 
 @item GPGME_EXPORT_MODE_SECRET
 @since{1.6.0}
@@ -5237,114 +5264,6 @@ is not a valid pointer.
 @end deftypefun
 
 
-
-@node Trust Item Management
-@section Trust Item Management
-@cindex trust item
-
-@strong{Caution:} The trust items interface is experimental.
-
-@deftp {Data type} gpgme_trust_item_t
-The @code{gpgme_trust_item_t} type is a pointer to a trust item object.
-It has the following members:
-
-@table @code
-@item char *keyid
-This is a string describing the key to which this trust items belongs.
-
-@item int type
-This is the type of the trust item.  A value of 1 refers to a key, a
-value of 2 refers to a user ID.
-
-@item int level
-This is the trust level.
-
-@item char *owner_trust
-The owner trust if @code{type} is 1.
-
-@item char *validity
-The calculated validity.
-
-@item char *name
-The user name if @code{type} is 2.
-@end table
-@end deftp
-
-@menu
-* Listing Trust Items::           Browsing the list of available trust items.
-* Manipulating Trust Items::      Operations on trust items.
-@end menu
-
-
-@node Listing Trust Items
-@subsection Listing Trust Items
-@cindex trust item list
-
-@deftypefun gpgme_error_t gpgme_op_trustlist_start (@w{gpgme_ctx_t @var{ctx}}, @w{const char *@var{pattern}}, @w{int @var{max_level}})
-The function @code{gpgme_op_trustlist_start} initiates a trust item
-listing operation inside the context @var{ctx}.  It sets everything up
-so that subsequent invocations of @code{gpgme_op_trustlist_next} return
-the trust items in the list.
-
-The string @var{pattern} contains an engine specific expression that
-is used to limit the list to all trust items matching the pattern.  It
-can not be the empty string.
-
-The argument @var{max_level} is currently ignored.
-
-The context will be busy until either all trust items are received
-(and @code{gpgme_op_trustlist_next} returns @code{GPG_ERR_EOF}), or
-@code{gpgme_op_trustlist_end} is called to finish the operation.
-
-The function returns the error code @code{GPG_ERR_INV_VALUE} if
-@var{ctx} is not a valid pointer, and passes through any errors that
-are reported by the crypto engine support routines.
-@end deftypefun
-
-@deftypefun gpgme_error_t gpgme_op_trustlist_next (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_trust_item_t *@var{r_item}})
-The function @code{gpgme_op_trustlist_next} returns the next trust
-item in the list created by a previous @code{gpgme_op_trustlist_start}
-operation in the context @var{ctx}.  The trust item can be destroyed
-with @code{gpgme_trust_item_release}.  @xref{Manipulating Trust Items}.
-
-This is the only way to get at @code{gpgme_trust_item_t} objects in
-@acronym{GPGME}.
-
-If the last trust item in the list has already been returned,
-@code{gpgme_op_trustlist_next} returns @code{GPG_ERR_EOF}.
-
-The function returns the error code @code{GPG_ERR_INV_VALUE} if @var{ctx} or
-@var{r_item} is not a valid pointer, and @code{GPG_ERR_ENOMEM} if
-there is not enough memory for the operation.
-@end deftypefun
-
-@deftypefun gpgme_error_t gpgme_op_trustlist_end (@w{gpgme_ctx_t @var{ctx}})
-The function @code{gpgme_op_trustlist_end} ends a pending trust list
-operation in the context @var{ctx}.
-
-The function returns the error code @code{GPG_ERR_INV_VALUE} if
-@var{ctx} is not a valid pointer, and @code{GPG_ERR_ENOMEM} if at some
-time during the operation there was not enough memory available.
-@end deftypefun
-
-
-@node Manipulating Trust Items
-@subsection Manipulating Trust Items
-@cindex trust item, manipulation
-
-@deftypefun void gpgme_trust_item_ref (@w{gpgme_trust_item_t @var{item}})
-The function @code{gpgme_trust_item_ref} acquires an additional
-reference for the trust item @var{item}.
-@end deftypefun
-
-@deftypefun void gpgme_trust_item_unref (@w{gpgme_trust_item_t @var{item}})
-The function @code{gpgme_trust_item_unref} releases a reference for
-the trust item @var{item}.  If this was the last reference, the trust
-item will be destroyed and all resources associated to it will be
-released.
-@end deftypefun
-
-
 @node Crypto Operations
 @section Crypto Operations
 @cindex cryptographic operation
@@ -5445,7 +5364,7 @@ counterpart to @code{GPGME_ENCRYPT_WRAP}.
 @end table
 
 The function returns the error codes as described for
-@code{gpgme_op_decrypt} respective @code{gpgme_op_encrypt}.
+@code{gpgme_op_decrypt}.
 @end deftypefun
 
 @deftypefun gpgme_error_t gpgme_op_decrypt_ext_start ( @
@@ -5754,8 +5673,15 @@ status codes are of interest:
 
   @table @code
   @item GPG_ERR_NO_ERROR
-  This status indicates that the signature is valid.  For the combined
-  result this status means that all signatures are valid.
+  This status indicates that the signature could be verified or that
+  there is no signature.  For the combined result this status
+  means that all signatures could be verified.
+
+  Note: This does not mean that a valid signature could be found.  Check
+  the @code{summary} field for that.
+
+  For example a @code{gpgme_op_decrypt_verify} returns a verification
+  result with GPG_ERR_NO_ERROR for encrypted but unsigned data.
 
   @item GPG_ERR_SIG_EXPIRED
   This status indicates that the signature is valid but expired.  For
@@ -7034,11 +6960,6 @@ received from the crypto engine.  The accompanying @var{type_data} is
 a @code{gpgme_key_t} variable that contains the key with one reference
 for the user.
 
-@item GPGME_EVENT_NEXT_TRUSTITEM
-In a @code{gpgme_op_trustlist_start} operation, the next trust item
-was received from the crypto engine.  The accompanying @var{type_data}
-is a @code{gpgme_trust_item_t} variable that contains the trust item with
-one reference for the user.
 @end table
 @end deftp
 
@@ -7653,12 +7574,6 @@ The function @code{gpgme_key_release} is equivalent to
 @code{gpgme_key_unref}.
 @end deftypefun
 
-@deftypefun void gpgme_trust_item_release (@w{gpgme_trust_item_t @var{item}})
-The function @code{gpgme_trust_item_release} is an alias for
-@code{gpgme_trust_item_unref}.
-@end deftypefun
-
-
 @deftypefun gpgme_error_t gpgme_op_import_ext (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_data_t @var{keydata}}, @w{int *@var{nr}})
 @since{0.3.9}
 
@@ -7797,8 +7712,6 @@ attribute.  The following attributes are defined:
 @item GPGME_ATTR_KEYID
 This is the key ID of a sub key.  It is representable as a string.
 
-For trust items, the trust item refers to the key with this ID.
-
 @item GPGME_ATTR_FPR
 This is the fingerprint of a sub key.  It is representable as a
 string.
@@ -7820,16 +7733,11 @@ representable as a number.
 This is the expiration time of a sub key.  It is representable as a
 number.
 
-@item GPGME_ATTR_OTRUST
-XXX FIXME  (also for trust items)
-
 @item GPGME_ATTR_USERID
 This is a user ID.  There can be more than one user IDs in a
 @var{gpgme_key_t} object.  The first one (with index 0) is the primary
 user ID.  The user ID is representable as a number.
 
-For trust items, this is the user ID associated with this trust item.
-
 @item GPGME_ATTR_NAME
 This is the name belonging to a user ID.  It is representable as a string.
 
@@ -7845,9 +7753,6 @@ string.
 This is the validity belonging to a user ID.  It is representable as a
 string and as a number.  See below for a list of available validities.
 
-For trust items, this is the validity that is associated with this
-trust item.
-
 @item GPGME_ATTR_UID_REVOKED
 This specifies if a user ID is revoked.  It is representable as a
 number, and is @code{1} if the user ID is revoked, and @code{0}
@@ -7858,13 +7763,10 @@ This specifies if a user ID is invalid.  It is representable as a
 number, and is @code{1} if the user ID is invalid, and @code{0}
 otherwise.
 
-@item GPGME_ATTR_LEVEL
-This is the trust level of a trust item.
-
 @item GPGME_ATTR_TYPE
 This returns information about the type of key.  For the string function
 this will eother be "PGP" or "X.509".  The integer function returns 0
-for PGP and 1 for X.509.  It is also used for the type of a trust item.
+for PGP and 1 for X.509.
 
 @item GPGME_ATTR_IS_SECRET
 This specifies if the key is a secret key.  It is representable as a
@@ -8051,43 +7953,6 @@ out of range, or @var{reserved} not @code{NULL}.
 @end deftypefun
 
 
-@c node Information About Trust Items
-@c subsection Information About Trust Items
-@c cindex trust item, information about
-@c cindex trust item, attributes
-@c cindex attributes, of a trust item
-
-Trust items have attributes which can be queried using the interfaces
-below.  The attribute identifiers are shared with those for key
-attributes.  @xref{Information About Keys}.
-
-@deftypefun {const char *} gpgme_trust_item_get_string_attr (@w{gpgme_trust_item_t @var{item}}, @w{gpgme_attr_t @var{what}}, @w{const void *@var{reserved}}, @w{int @var{idx}})
-The function @code{gpgme_trust_item_get_string_attr} returns the value
-of the string-representable attribute @var{what} of trust item
-@var{item}.  The arguments @var{idx} and @var{reserved} are reserved
-for later use and should be @code{0} and @code{NULL} respectively.
-
-The string returned is only valid as long as the key is valid.
-
-The function returns @code{0} if an attribute can't be returned as a
-string, @var{key} is not a valid pointer, @var{idx} out of range,
-or @var{reserved} not @code{NULL}.
-@end deftypefun
-
-@deftypefun int gpgme_trust_item_get_int_attr (@w{gpgme_trust_item_t @var{item}}, @w{gpgme_attr_t @var{what}}, @w{const void *@var{reserved}}, @w{int @var{idx}})
-The function @code{gpgme_trust_item_get_int_attr} returns the value of
-the number-representable attribute @var{what} of trust item
-@var{item}.  If the attribute occurs more than once in the trust item,
-the index is specified by @var{idx}.  However, currently no such
-attribute exists, so @var{idx} should be @code{0}.  The argument
-@var{reserved} is reserved for later use and should be @code{NULL}.
-
-The function returns @code{0} if the attribute can't be returned as a
-number, @var{key} is not a valid pointer, @var{idx} out of range,
-or @var{reserved} not @code{NULL}.
-@end deftypefun
-
-
 @deftp {Data type} {enum gpgme_sig_stat_t}
 @tindex gpgme_sig_stat_t
 The @code{gpgme_sig_stat_t} type holds the result of a signature check, or
index 9ae2e39..2225b78 100644 (file)
@@ -1,7 +1,7 @@
 # This is a template.  The dist target uses it to create the real file.
 Summary: GPGME - GnuPG Made Easy
 Name: gpgme
-Version: 1.13.1
+Version: 1.14.0
 Release: 1
 URL: https://gnupg.org/gpgme.html
 Source: https://www.gnupg.org/ftp/gcrypt/gpgme/%{name}-%{version}.tar.gz
index 92f34df..3e27eae 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -160,7 +160,7 @@ am__recursive_targets = \
   $(RECURSIVE_CLEAN_TARGETS) \
   $(am__extra_recursive_targets)
 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir
+       distdir distdir-am
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -397,6 +397,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -428,8 +429,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -546,7 +547,10 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 2604047..d30c361 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -369,6 +369,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -403,8 +404,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -451,7 +452,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 43c4744..da9eb93 100644 (file)
@@ -27,7 +27,7 @@
 (defsystem gpgme
   :description "GnuPG Made Easy."
   :author "g10 Code GmbH"
-  :version "1.13.1"
+  :version "1.14.0"
   :licence "GPL"
   :defsystem-depends-on ("cffi-grovel")
   :depends-on ("cffi" "gpg-error" "trivial-garbage")
index 801dfb0..628f808 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -161,7 +161,7 @@ am__recursive_targets = \
   $(RECURSIVE_CLEAN_TARGETS) \
   $(am__extra_recursive_targets)
 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir
+       distdir distdir-am
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -399,6 +399,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -429,8 +430,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -547,7 +548,10 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 7ae2d5e..eb08ad9 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -202,7 +202,29 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/callbacks.Plo \
+       ./$(DEPDIR)/configuration.Plo ./$(DEPDIR)/context.Plo \
+       ./$(DEPDIR)/context_vanilla.Plo ./$(DEPDIR)/data.Plo \
+       ./$(DEPDIR)/decryptionresult.Plo \
+       ./$(DEPDIR)/defaultassuantransaction.Plo \
+       ./$(DEPDIR)/editinteractor.Plo \
+       ./$(DEPDIR)/encryptionresult.Plo ./$(DEPDIR)/engineinfo.Plo \
+       ./$(DEPDIR)/eventloopinteractor.Plo ./$(DEPDIR)/exception.Plo \
+       ./$(DEPDIR)/gpgadduserideditinteractor.Plo \
+       ./$(DEPDIR)/gpgagentgetinfoassuantransaction.Plo \
+       ./$(DEPDIR)/gpggencardkeyinteractor.Plo \
+       ./$(DEPDIR)/gpgsetexpirytimeeditinteractor.Plo \
+       ./$(DEPDIR)/gpgsetownertrusteditinteractor.Plo \
+       ./$(DEPDIR)/gpgsignkeyeditinteractor.Plo \
+       ./$(DEPDIR)/importresult.Plo ./$(DEPDIR)/key.Plo \
+       ./$(DEPDIR)/keygenerationresult.Plo \
+       ./$(DEPDIR)/keylistresult.Plo \
+       ./$(DEPDIR)/scdgetinfoassuantransaction.Plo \
+       ./$(DEPDIR)/signingresult.Plo ./$(DEPDIR)/swdbresult.Plo \
+       ./$(DEPDIR)/tofuinfo.Plo ./$(DEPDIR)/trustitem.Plo \
+       ./$(DEPDIR)/verificationresult.Plo \
+       ./$(DEPDIR)/vfsmountresult.Plo
 am__mv = mv -f
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
@@ -463,6 +485,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -549,8 +572,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -614,35 +637,41 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/configuration.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/context.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/context_vanilla.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decryptionresult.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/defaultassuantransaction.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/editinteractor.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encryptionresult.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engineinfo.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eventloopinteractor.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exception.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgadduserideditinteractor.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgagentgetinfoassuantransaction.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpggencardkeyinteractor.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgsetexpirytimeeditinteractor.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgsetownertrusteditinteractor.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgsignkeyeditinteractor.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/importresult.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/key.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keygenerationresult.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keylistresult.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scdgetinfoassuantransaction.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signingresult.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swdbresult.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tofuinfo.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trustitem.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verificationresult.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfsmountresult.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/configuration.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/context.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/context_vanilla.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decryptionresult.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/defaultassuantransaction.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/editinteractor.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encryptionresult.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engineinfo.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eventloopinteractor.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exception.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgadduserideditinteractor.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgagentgetinfoassuantransaction.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpggencardkeyinteractor.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgsetexpirytimeeditinteractor.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgsetownertrusteditinteractor.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgsignkeyeditinteractor.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/importresult.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/key.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keygenerationresult.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keylistresult.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scdgetinfoassuantransaction.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signingresult.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swdbresult.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tofuinfo.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trustitem.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verificationresult.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfsmountresult.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .cpp.o:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -789,7 +818,10 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -863,7 +895,35 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
        mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/callbacks.Plo
+       -rm -f ./$(DEPDIR)/configuration.Plo
+       -rm -f ./$(DEPDIR)/context.Plo
+       -rm -f ./$(DEPDIR)/context_vanilla.Plo
+       -rm -f ./$(DEPDIR)/data.Plo
+       -rm -f ./$(DEPDIR)/decryptionresult.Plo
+       -rm -f ./$(DEPDIR)/defaultassuantransaction.Plo
+       -rm -f ./$(DEPDIR)/editinteractor.Plo
+       -rm -f ./$(DEPDIR)/encryptionresult.Plo
+       -rm -f ./$(DEPDIR)/engineinfo.Plo
+       -rm -f ./$(DEPDIR)/eventloopinteractor.Plo
+       -rm -f ./$(DEPDIR)/exception.Plo
+       -rm -f ./$(DEPDIR)/gpgadduserideditinteractor.Plo
+       -rm -f ./$(DEPDIR)/gpgagentgetinfoassuantransaction.Plo
+       -rm -f ./$(DEPDIR)/gpggencardkeyinteractor.Plo
+       -rm -f ./$(DEPDIR)/gpgsetexpirytimeeditinteractor.Plo
+       -rm -f ./$(DEPDIR)/gpgsetownertrusteditinteractor.Plo
+       -rm -f ./$(DEPDIR)/gpgsignkeyeditinteractor.Plo
+       -rm -f ./$(DEPDIR)/importresult.Plo
+       -rm -f ./$(DEPDIR)/key.Plo
+       -rm -f ./$(DEPDIR)/keygenerationresult.Plo
+       -rm -f ./$(DEPDIR)/keylistresult.Plo
+       -rm -f ./$(DEPDIR)/scdgetinfoassuantransaction.Plo
+       -rm -f ./$(DEPDIR)/signingresult.Plo
+       -rm -f ./$(DEPDIR)/swdbresult.Plo
+       -rm -f ./$(DEPDIR)/tofuinfo.Plo
+       -rm -f ./$(DEPDIR)/trustitem.Plo
+       -rm -f ./$(DEPDIR)/verificationresult.Plo
+       -rm -f ./$(DEPDIR)/vfsmountresult.Plo
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -911,7 +971,35 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/callbacks.Plo
+       -rm -f ./$(DEPDIR)/configuration.Plo
+       -rm -f ./$(DEPDIR)/context.Plo
+       -rm -f ./$(DEPDIR)/context_vanilla.Plo
+       -rm -f ./$(DEPDIR)/data.Plo
+       -rm -f ./$(DEPDIR)/decryptionresult.Plo
+       -rm -f ./$(DEPDIR)/defaultassuantransaction.Plo
+       -rm -f ./$(DEPDIR)/editinteractor.Plo
+       -rm -f ./$(DEPDIR)/encryptionresult.Plo
+       -rm -f ./$(DEPDIR)/engineinfo.Plo
+       -rm -f ./$(DEPDIR)/eventloopinteractor.Plo
+       -rm -f ./$(DEPDIR)/exception.Plo
+       -rm -f ./$(DEPDIR)/gpgadduserideditinteractor.Plo
+       -rm -f ./$(DEPDIR)/gpgagentgetinfoassuantransaction.Plo
+       -rm -f ./$(DEPDIR)/gpggencardkeyinteractor.Plo
+       -rm -f ./$(DEPDIR)/gpgsetexpirytimeeditinteractor.Plo
+       -rm -f ./$(DEPDIR)/gpgsetownertrusteditinteractor.Plo
+       -rm -f ./$(DEPDIR)/gpgsignkeyeditinteractor.Plo
+       -rm -f ./$(DEPDIR)/importresult.Plo
+       -rm -f ./$(DEPDIR)/key.Plo
+       -rm -f ./$(DEPDIR)/keygenerationresult.Plo
+       -rm -f ./$(DEPDIR)/keylistresult.Plo
+       -rm -f ./$(DEPDIR)/scdgetinfoassuantransaction.Plo
+       -rm -f ./$(DEPDIR)/signingresult.Plo
+       -rm -f ./$(DEPDIR)/swdbresult.Plo
+       -rm -f ./$(DEPDIR)/tofuinfo.Plo
+       -rm -f ./$(DEPDIR)/trustitem.Plo
+       -rm -f ./$(DEPDIR)/verificationresult.Plo
+       -rm -f ./$(DEPDIR)/vfsmountresult.Plo
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -934,9 +1022,9 @@ uninstall-am: uninstall-gpgmeppincludeHEADERS uninstall-libLTLIBRARIES \
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-       clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \
-       ctags-am distclean distclean-compile distclean-generic \
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+       clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \
+       ctags ctags-am distclean distclean-compile distclean-generic \
        distclean-libtool distclean-tags distdir dvi dvi-am html \
        html-am info info-am install install-am install-data \
        install-data-am install-data-local install-dvi install-dvi-am \
index c0a1dc2..2560a33 100644 (file)
@@ -563,44 +563,66 @@ KeyGenerationResult Context::keyGenerationResult() const
     }
 }
 
-Error Context::exportPublicKeys(const char *pattern, Data &keyData)
+Error Context::exportPublicKeys(const char *pattern, Data &keyData, unsigned int flags)
 {
     d->lastop = Private::Export;
     Data::Private *const dp = keyData.impl();
-    return Error(d->lasterr = gpgme_op_export(d->ctx, pattern, 0, dp ? dp->data : nullptr));
+    return Error(d->lasterr = gpgme_op_export(d->ctx, pattern, flags, dp ? dp->data : nullptr));
 }
 
-Error Context::exportPublicKeys(const char *patterns[], Data &keyData)
+Error Context::exportPublicKeys(const char *patterns[], Data &keyData, unsigned int flags)
 {
     d->lastop = Private::Export;
 #ifndef HAVE_GPGME_EXT_KEYLIST_MODE_EXTERNAL_NONBROKEN
     if (!patterns || !patterns[0] || !patterns[1]) {
         // max. one pattern -> use the non-ext version
-        return exportPublicKeys(patterns ? patterns[0] : nullptr, keyData);
+        return exportPublicKeys(patterns ? patterns[0] : nullptr, keyData, flags);
     }
 #endif
     Data::Private *const dp = keyData.impl();
-    return Error(d->lasterr = gpgme_op_export_ext(d->ctx, patterns, 0, dp ? dp->data : nullptr));
+    return Error(d->lasterr = gpgme_op_export_ext(d->ctx, patterns, flags, dp ? dp->data : nullptr));
 }
 
-Error Context::startPublicKeyExport(const char *pattern, Data &keyData)
+Error Context::startPublicKeyExport(const char *pattern, Data &keyData, unsigned int flags)
 {
     d->lastop = Private::Export;
     Data::Private *const dp = keyData.impl();
-    return Error(d->lasterr = gpgme_op_export_start(d->ctx, pattern, 0, dp ? dp->data : nullptr));
+    return Error(d->lasterr = gpgme_op_export_start(d->ctx, pattern, flags, dp ? dp->data : nullptr));
 }
 
-Error Context::startPublicKeyExport(const char *patterns[], Data &keyData)
+Error Context::startPublicKeyExport(const char *patterns[], Data &keyData, unsigned int flags)
 {
     d->lastop = Private::Export;
 #ifndef HAVE_GPGME_EXT_KEYLIST_MODE_EXTERNAL_NONBROKEN
     if (!patterns || !patterns[0] || !patterns[1]) {
         // max. one pattern -> use the non-ext version
-        return startPublicKeyExport(patterns ? patterns[0] : nullptr, keyData);
+        return startPublicKeyExport(patterns ? patterns[0] : nullptr, keyData, flags);
     }
 #endif
     Data::Private *const dp = keyData.impl();
-    return Error(d->lasterr = gpgme_op_export_ext_start(d->ctx, patterns, 0, dp ? dp->data : nullptr));
+    return Error(d->lasterr = gpgme_op_export_ext_start(d->ctx, patterns, flags, dp ? dp->data : nullptr));
+}
+
+
+/* Same as above but without flags  */
+Error Context::exportPublicKeys(const char *pattern, Data &keyData)
+{
+    return exportPublicKeys(pattern, keyData, 0);
+}
+
+Error Context::exportPublicKeys(const char *patterns[], Data &keyData)
+{
+    return exportPublicKeys(patterns, keyData, 0);
+}
+
+Error Context::startPublicKeyExport(const char *pattern, Data &keyData)
+{
+    return startPublicKeyExport(pattern, keyData, 0);
+}
+
+Error Context::startPublicKeyExport(const char *patterns[], Data &keyData)
+{
+    return startPublicKeyExport(patterns, keyData, 0);
 }
 
 ImportResult Context::importKeys(const Data &data)
@@ -1615,6 +1637,7 @@ std::ostream &operator<<(std::ostream &os, KeyListMode mode)
     CHECK(Validate);
     CHECK(Ephemeral);
     CHECK(WithTofu);
+    CHECK(WithKeygrip);
 #undef CHECK
     return os << ')';
 }
index b6b902a..70f1c42 100644 (file)
@@ -182,11 +182,25 @@ public:
     //
     // Key Export
     //
+    enum ExportMode {
+        ExportDefault = 0,
+        ExportExtern = 2,
+        ExportMinimal = 4,
+        ExportSecret = 16,
+        ExportRaw = 32,
+        ExportPKCS12 = 64,
+        ExportNoUID = 128,
+        ExportSSH = 256,
+    };
 
     GpgME::Error exportPublicKeys(const char *pattern, Data &keyData);
+    GpgME::Error exportPublicKeys(const char *pattern, Data &keyData, unsigned int flags);
     GpgME::Error exportPublicKeys(const char *pattern[], Data &keyData);
+    GpgME::Error exportPublicKeys(const char *pattern[], Data &keyData, unsigned int export_mode);
     GpgME::Error startPublicKeyExport(const char *pattern, Data &keyData);
+    GpgME::Error startPublicKeyExport(const char *pattern, Data &keyData, unsigned int flags);
     GpgME::Error startPublicKeyExport(const char *pattern[], Data &keyData);
+    GpgME::Error startPublicKeyExport(const char *pattern[], Data &keyData, unsigned int export_mode);
 
     //
     // Key Import
index f7c994a..36d1be6 100644 (file)
@@ -178,10 +178,25 @@ EditInteractor::Private::Private(EditInteractor *qq)
       error(),
       debug(nullptr)
 {
-
+    const char *debug_env = getenv("GPGMEPP_INTERACTOR_DEBUG");
+    if (!debug_env) {
+        return;
+    }
+    if (!strcmp(debug_env, "stdout")) {
+        debug = stdout;
+    } else if (!strcmp(debug_env, "stderr")) {
+        debug = stderr;
+    } else if (debug_env) {
+        debug = std::fopen(debug_env, "a+");
+    }
 }
 
-EditInteractor::Private::~Private() {}
+EditInteractor::Private::~Private()
+{
+    if (debug) {
+        std::fclose(debug);
+    }
+}
 
 EditInteractor::EditInteractor()
     : d(new Private(this))
index d5c2e13..7a88dc3 100644 (file)
@@ -65,7 +65,8 @@ enum KeyListMode {
     SignatureNotations = 0x8,
     Validate = 0x10,
     Ephemeral = 0x20,
-    WithTofu = 0x40
+    WithTofu = 0x40,
+    WithKeygrip = 0x80
 };
 
 enum SignatureMode { NormalSignatureMode, Detached, Clearsigned };
index 295802d..33ffbcf 100644 (file)
@@ -64,6 +64,8 @@ public:
     std::vector<unsigned int> userIDs;
     std::vector<unsigned int>::const_iterator currentId, nextId;
     unsigned int checkLevel;
+    bool dupeOk;
+    Key key;
 
     const char *command() const
     {
@@ -126,7 +128,8 @@ GpgSignKeyEditInteractor::Private::Private()
     userIDs(),
     currentId(),
     nextId(),
-    checkLevel(0)
+    checkLevel(0),
+    dupeOk(false)
 {
 }
 
@@ -159,6 +162,8 @@ enum SignKeyState {
     SET_TRUST_REGEXP,
     CONFIRM,
     CONFIRM2,
+    DUPE_OK,
+    DUPE_OK2,
     QUIT,
     SAVE,
     ERROR = EditInteractor::ErrorState
@@ -184,6 +189,7 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
     addEntry(COMMAND, GET_BOOL, "keyedit.sign_all.okay", UIDS_ANSWER_SIGN_ALL);
     addEntry(COMMAND, GET_BOOL, "sign_uid.okay", CONFIRM);
     addEntry(COMMAND, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM2);
+    addEntry(COMMAND, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
     addEntry(UIDS_ANSWER_SIGN_ALL, GET_BOOL, "sign_uid.okay", CONFIRM);
     addEntry(UIDS_ANSWER_SIGN_ALL, GET_LINE, "sign_uid.expire", SET_EXPIRE);
     addEntry(UIDS_ANSWER_SIGN_ALL, GET_LINE, "sign_uid.class", SET_CHECK_LEVEL);
@@ -193,6 +199,8 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
     addEntry(SET_CHECK_LEVEL, GET_BOOL, "sign_uid.okay", CONFIRM);
     addEntry(SET_EXPIRE, GET_BOOL, "sign_uid.class", SET_CHECK_LEVEL);
     addEntry(CONFIRM, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM);
+    addEntry(DUPE_OK, GET_BOOL, "sign_uid.okay", CONFIRM);
+    addEntry(DUPE_OK2, GET_BOOL, "sign_uid.okay", CONFIRM);
     addEntry(CONFIRM, GET_BOOL, "sign_uid.okay", CONFIRM);
     addEntry(CONFIRM2, GET_BOOL, "sign_uid.okay", CONFIRM);
     addEntry(CONFIRM, GET_LINE, "keyedit.prompt", COMMAND);
@@ -205,6 +213,9 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
     addEntry(UIDS_LIST_SEPARATELY_DONE, GET_LINE, "sign_uid.expire", SET_EXPIRE);
     addEntry(UIDS_LIST_SEPARATELY_DONE, GET_LINE, "sign_uid.class", SET_CHECK_LEVEL);
     addEntry(UIDS_LIST_SEPARATELY_DONE, GET_BOOL, "sign_uid.okay", CONFIRM);
+    addEntry(UIDS_LIST_SEPARATELY_DONE, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
+    addEntry(DUPE_OK, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK2);
+    addEntry(DUPE_OK2, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
     addEntry(CONFIRM, GET_LINE, "keyedit.prompt", QUIT);
     addEntry(ERROR, GET_LINE, "keyedit.prompt", QUIT);
     addEntry(QUIT, GET_BOOL, "keyedit.save.okay", SAVE);
@@ -236,6 +247,9 @@ const char *GpgSignKeyEditInteractor::action(Error &err) const
         return nullptr;
     case SET_CHECK_LEVEL:
         return check_level_strings[d->checkLevel];
+    case DUPE_OK:
+    case DUPE_OK2:
+        return answer(d->dupeOk);
     case CONFIRM2:
     case CONFIRM:
         return answer(true);
@@ -246,7 +260,17 @@ const char *GpgSignKeyEditInteractor::action(Error &err) const
     default:
         if (st >= UIDS_LIST_SEPARATELY && st < UIDS_LIST_SEPARATELY_DONE) {
             std::stringstream ss;
-            ss << d->nextUserID();
+            auto nextID = d->nextUserID();
+            const char *hash;
+            assert (nextID);
+            if (!d->key.isNull() && (hash = d->key.userID(nextID - 1).uidhash())) {
+                /* Prefer uidhash if it is available as it might happen
+                 * that uidattrs break the ordering of the uids in the
+                 * edit-key interface */
+                ss << "uid " << hash;
+            } else {
+                ss << nextID;
+            }
             d->scratch = ss.str();
             return d->scratch.c_str();
         }
@@ -305,6 +329,10 @@ unsigned int GpgSignKeyEditInteractor::nextState(unsigned int status, const char
     err = GENERAL_ERROR;
     return ERROR;
 }
+void GpgSignKeyEditInteractor::setKey(const Key &key)
+{
+    d->key = key;
+}
 
 void GpgSignKeyEditInteractor::setCheckLevel(unsigned int checkLevel)
 {
@@ -326,3 +354,9 @@ void GpgSignKeyEditInteractor::setSigningOptions(int options)
     assert(!d->started);
     d->options = options;
 }
+
+void GpgSignKeyEditInteractor::setDupeOk(bool value)
+{
+    assert(!d->started);
+    d->dupeOk = value;
+}
index 34b1f06..d459687 100644 (file)
@@ -50,8 +50,14 @@ public:
 
     void setCheckLevel(unsigned int checkLevel);
     void setUserIDsToSign(const std::vector<unsigned int> &userIDsToSign);
+    void setKey(const Key &key);
     void setSigningOptions(int options);
 
+    /* Set this if it is ok to overwrite an existing signature. In that
+     * case the context has to have the flag "extended-edit" set to 1 through
+     * Context::setFlag before calling edit.*/
+    void setDupeOk(bool value);
+
 private:
     const char *action(Error &err) const override;
     unsigned int nextState(unsigned int statusCode, const char *args, Error &err) const override;
index 4638fd8..c422fcc 100644 (file)
@@ -358,14 +358,14 @@ void Key::update()
                         KeyListMode::Signatures |
                         KeyListMode::SignatureNotations |
                         KeyListMode::Validate |
-                        KeyListMode::WithTofu);
+                        KeyListMode::WithTofu |
+                        KeyListMode::WithKeygrip);
     Error err;
     auto newKey = ctx->key(primaryFingerprint(), err, true);
     // Not secret so we get the information from the pubring.
-    if (newKey.isNull())
-      {
+    if (newKey.isNull()) {
         newKey = ctx->key(primaryFingerprint(), err, false);
-      }
+    }
     delete ctx;
     if (err) {
         return;
@@ -674,6 +674,11 @@ const char *UserID::comment() const
     return uid ? uid->comment : nullptr ;
 }
 
+const char *UserID::uidhash() const
+{
+    return uid ? uid->uidhash : nullptr ;
+}
+
 UserID::Validity UserID::validity() const
 {
     if (!uid) {
@@ -724,6 +729,76 @@ TofuInfo UserID::tofuInfo() const
     return TofuInfo(uid->tofu);
 }
 
+static gpgme_key_sig_t find_last_valid_sig_for_keyid (gpgme_user_id_t uid,
+                                                      const char *keyid)
+{
+    if (!keyid) {
+        return nullptr;
+    }
+    gpgme_key_sig_t ret = NULL;
+    for (gpgme_key_sig_t s = uid->signatures ; s ; s = s->next) {
+        if (s->keyid && !strcmp(keyid, s->keyid)) {
+            if (!s->expired && !s->revoked && !s->invalid && !s->status) {
+                if (!ret) {
+                    ret = s;
+                } else if (ret && ret->timestamp <= s->timestamp) {
+                    /* Equals because when the timestamps are the same we prefer
+                       the last in the list */
+                    ret = s;
+                }
+            }
+        }
+    }
+    return ret;
+}
+
+const char *UserID::remark(const Key &remarker, Error &err) const
+{
+    if (!uid || remarker.isNull()) {
+        err = Error::fromCode(GPG_ERR_GENERAL);
+        return nullptr;
+    }
+
+    if (key->protocol != GPGME_PROTOCOL_OpenPGP) {
+        return nullptr;
+    }
+
+    if (!(key->keylist_mode & GPGME_KEYLIST_MODE_SIG_NOTATIONS) ||
+        !(key->keylist_mode & GPGME_KEYLIST_MODE_SIGS)) {
+        err = Error::fromCode(GPG_ERR_NO_DATA);
+        return nullptr;
+    }
+
+    gpgme_key_sig_t s = find_last_valid_sig_for_keyid(uid, remarker.keyID());
+
+    if (!s) {
+        return nullptr;
+    }
+
+    for (gpgme_sig_notation_t n = s->notations; n ; n = n->next) {
+        if (n->name && !strcmp(n->name, "rem@gnupg.org")) {
+            return n->value;
+        }
+    }
+    return nullptr;
+}
+
+std::vector<std::string> UserID::remarks(std::vector<Key> keys, Error &err) const
+{
+    std::vector<std::string> ret;
+
+    for (const auto &key: keys) {
+        const char *rem = remark(key, err);
+        if (err) {
+            return ret;
+        }
+        if (rem) {
+            ret.push_back(rem);
+        }
+    }
+    return ret;
+}
+
 //
 //
 // class Signature
index dd855ae..fc5e67e 100644 (file)
@@ -363,6 +363,7 @@ public:
     const char *name() const;
     const char *email() const;
     const char *comment() const;
+    const char *uidhash() const;
 
     enum Validity { Unknown = 0, Undefined = 1, Never = 2,
                     Marginal = 3, Full = 4, Ultimate = 5
@@ -413,6 +414,27 @@ public:
      *
      * @returns the last update time. */
     time_t lastUpdate() const;
+
+    /*! Get a remark made by the key provided.
+     * A remark is a signature notation on
+     * this user id made by the key with the
+     * name "rem@gnupg.org". Returns an error if the
+     * parent key of this user id was not listed with the
+     * keylist mode flags for signatures and signature notations.
+     *
+     * @param key The key for which comments should be searched.
+     * @param error Set to GPG_ERR_NO_DATA if the keylist did
+     *              not include signature notations.
+     *
+     * @returns The value of the comment or NULL if none exists.
+     **/
+    const char *remark(const Key &key,
+                       Error &error) const;
+
+    /*! Get multiple remarks made by potentially multiple keys. */
+    std::vector <std::string> remarks(std::vector<GpgME::Key> remarkers,
+                                      Error &error) const;
+
 private:
     shared_gpgme_key_t key;
     gpgme_user_id_t uid;
index 4495cc0..1c0477f 100644 (file)
@@ -81,6 +81,9 @@ static inline gpgme_keylist_mode_t add_to_gpgme_keylist_mode_t(unsigned int oldm
     if (newmodes & GpgME::WithTofu) {
         oldmode |= GPGME_KEYLIST_MODE_WITH_TOFU;
     }
+    if (newmodes & GpgME::WithKeygrip) {
+        oldmode |= GPGME_KEYLIST_MODE_WITH_KEYGRIP;
+    }
 #ifndef NDEBUG
     if (newmodes & ~(GpgME::Local | GpgME::Extern | GpgME::Signatures | GpgME::SignatureNotations | GpgME::Ephemeral | GpgME::Validate)) {
         //std::cerr << "GpgME::Context: keylist mode must be one of Local, "
index 1e9f81f..bfe82e3 100644 (file)
@@ -413,7 +413,8 @@ GpgME::Key GpgME::Signature::key(bool search, bool update) const
                         KeyListMode::Signatures |
                         KeyListMode::SignatureNotations |
                         KeyListMode::Validate |
-                        KeyListMode::WithTofu);
+                        KeyListMode::WithTofu |
+                        KeyListMode::WithKeygrip);
             Error e;
             ret = d->keys[idx] = ctx->key(fingerprint(), e, false);
             delete ctx;
index 334d379..b065f61 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -162,7 +162,9 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/run-getkey.Po \
+       ./$(DEPDIR)/run-keylist.Po ./$(DEPDIR)/run-verify.Po
 am__mv = mv -f
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
@@ -403,6 +405,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -445,8 +448,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -485,9 +488,15 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-getkey.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-keylist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-verify.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-getkey.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-keylist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-verify.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .cpp.o:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -568,7 +577,10 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -638,7 +650,9 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
        mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/run-getkey.Po
+       -rm -f ./$(DEPDIR)/run-keylist.Po
+       -rm -f ./$(DEPDIR)/run-verify.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -684,7 +698,9 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/run-getkey.Po
+       -rm -f ./$(DEPDIR)/run-keylist.Po
+       -rm -f ./$(DEPDIR)/run-verify.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -705,9 +721,9 @@ uninstall-am:
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-       clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
-       ctags-am distclean distclean-compile distclean-generic \
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+       clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \
+       ctags ctags-am distclean distclean-compile distclean-generic \
        distclean-libtool distclean-tags distdir dvi dvi-am html \
        html-am info info-am install install-am install-data \
        install-data-am install-dvi install-dvi-am install-exec \
index 329ec20..057f9e5 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -339,6 +339,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -393,8 +394,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -418,7 +419,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 34333e6..c1c576c 100644 (file)
@@ -44,4 +44,16 @@ describe('GPGME context', function (){
                 done();
             });
     });
+
+    it('Error message on unsuccessful connection (timeout)', function (done) {
+        let prm = Gpgmejs.init({ timeout: 1 });
+        prm.then(
+            null,
+            function (error){
+                expect(error).to.be.an('error');
+                expect(error.code).to.equal('CONN_TIMEOUT');
+                done();
+            }
+        );
+    });
 });
\ No newline at end of file
index 80cd9e4..4290886 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -339,6 +339,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -375,8 +376,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -400,7 +401,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index b9c8c1e..15383e2 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -160,7 +160,7 @@ am__recursive_targets = \
   $(RECURSIVE_CLEAN_TARGETS) \
   $(am__extra_recursive_targets)
 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir
+       distdir distdir-am
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -398,6 +398,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -438,8 +439,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -556,7 +557,10 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 8a96547..e9ab3b1 100644 (file)
@@ -40,7 +40,15 @@ import { decode, atobArray, Utf8ArrayToStr } from './Helpers';
 export class Connection{
 
     constructor (){
+        this._connectionError = null;
         this._connection = chrome.runtime.connectNative('gpgmejson');
+        this._connection.onDisconnect.addListener(() => {
+            if (chrome.runtime.lastError) {
+                this._connectionError = chrome.runtime.lastError.message;
+            } else {
+                this._connectionError = 'Disconnected without error message';
+            }
+        });
     }
 
     /**
@@ -50,9 +58,16 @@ export class Connection{
         if (this._connection){
             this._connection.disconnect();
             this._connection = null;
+            this._connectionError = 'Disconnect requested by gpgmejs';
         }
     }
 
+    /**
+     * Checks if the connection terminated with an error state
+     */
+    get isDisconnected (){
+        return this._connectionError !== null;
+    }
 
     /**
     * @typedef {Object} backEndDetails
@@ -84,25 +99,29 @@ export class Connection{
             timeout = 1000;
         }
         const msg = createMessage('version');
-        if (details === true) {
-            return this.post(msg);
-        } else {
-            let me = this;
-            return new Promise(function (resolve) {
-                Promise.race([
-                    me.post(msg),
-                    new Promise(function (resolve, reject){
-                        setTimeout(function (){
-                            reject(gpgme_error('CONN_TIMEOUT'));
-                        }, timeout);
-                    })
-                ]).then(function (){ // success
+        const prm = Promise.race([
+            this.post(msg),
+            new Promise(function (resolve, reject){
+                setTimeout(function (){
+                    reject(gpgme_error('CONN_TIMEOUT'));
+                }, timeout);
+            })
+        ]);
+        return new Promise( function (resolve, reject) {
+            prm.then(function (success){
+                if (details === true ) {
+                    resolve(success);
+                } else {
                     resolve(true);
-                }, function (){ // failure
+                }
+            }, function (error) {
+                if (details === true ) {
+                    reject(error);
+                } else {
                     resolve(false);
-                });
+                }
             });
-        }
+        });
     }
 
     /**
@@ -128,7 +147,7 @@ export class Connection{
         }
         let chunksize = message.chunksize;
         const me = this;
-        return new Promise(function (resolve, reject){
+        const nativeCommunication = new Promise(function (resolve, reject){
             let answer = new Answer(message);
             let listener = function (msg) {
                 if (!msg){
@@ -161,29 +180,35 @@ export class Connection{
                 }
             };
             me._connection.onMessage.addListener(listener);
-            if (permittedOperations[message.operation].pinentry){
-                return me._connection.postMessage(message.message);
-            } else {
-                return Promise.race([
-                    me._connection.postMessage(message.message),
-                    function (resolve, reject){
-                        setTimeout(function (){
-                            me._connection.disconnect();
-                            reject(gpgme_error('CONN_TIMEOUT'));
-                        }, 5000);
-                    }
-                ]).then(function (result){
-                    return result;
-                }, function (reject){
-                    if (!(reject instanceof Error)) {
-                        me._connection.disconnect();
-                        return gpgme_error('GNUPG_ERROR', reject);
+            me._connection.postMessage(message.message);
+
+            // check for browser messaging errors after a while
+            // (browsers' extension permission checks take some time)
+            setTimeout( () => {
+                if (me.isDisconnected) {
+                    if ( me.isNativeHostUnknown === true) {
+                        return reject(gpgme_error('CONN_NO_CONFIG'));
                     } else {
-                        return reject;
+                        return reject(gpgme_error(
+                            'CONN_NO_CONNECT', me._connectionError));
                     }
-                });
-            }
+                }
+            }, 25);
+
         });
+        if (permittedOperations[message.operation].pinentry === true) {
+            return nativeCommunication;
+        } else {
+            return Promise.race([
+                nativeCommunication,
+                new Promise(function (resolve, reject){
+                    setTimeout(function (){
+                        me.disconnect();
+                        reject(gpgme_error('CONN_TIMEOUT'));
+                    }, 5000);
+                })
+            ]);
+        }
     }
 }
 
@@ -213,6 +238,13 @@ class Answer{
     }
 
     /**
+     * Checks if an error matching browsers 'host not known' messages occurred
+     */
+    get isNativeHostUnknown () {
+        return this._connectionError === 'Specified native messaging host not found.';
+    }
+
+    /**
      * Adds incoming base64 encoded data to the existing response
      * @param {*} msg base64 encoded data.
      * @returns {Boolean}
index bf52cce..6189414 100644 (file)
@@ -35,6 +35,14 @@ export const err_list = {
         msg: 'The nativeMessaging answer was empty.',
         type: 'error'
     },
+    'CONN_NO_CONFIG':{
+        msg: 'The browser does not recognize the nativeMessaging host.',
+        type: 'error'
+    },
+    'CONN_NATIVEMESSAGE':{
+        msg: 'The native messaging was not successful.',
+        type: 'error'
+    },
     'CONN_TIMEOUT': {
         msg: 'A connection timeout was exceeded.',
         type: 'error'
@@ -156,8 +164,8 @@ export function gpgme_error (code = 'GENERIC_ERROR', info){
  */
 class GPGME_Error extends Error{
     constructor (code = 'GENERIC_ERROR', msg=''){
-
-        if (code === 'GNUPG_ERROR' && typeof (msg) === 'string'){
+        const verboseErrors = ['GNUPG_ERROR', 'CONN_NATIVEMESSAGE'];
+        if (verboseErrors.includes(code) && typeof (msg) === 'string'){
             super(msg);
         } else if (err_list.hasOwnProperty(code)){
             if (msg){
index 4424069..3fff929 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -339,6 +339,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -378,8 +379,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -403,7 +404,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 106086f..3c31a04 100644 (file)
@@ -33,7 +33,7 @@ import { Connection } from './Connection';
  * An unsuccessful attempt will reject as a GPGME_Error.
  * @param {Object} config (optional) configuration options
  * @param {Number} config.timeout set the timeout for the initial connection
- * check. On some machines and operating systems a default timeout of 500 ms is
+ * check. On some machines and operating systems a default timeout of 1000 ms is
  * too low, so a higher number might be attempted.
  * @returns {Promise<GpgME>}
  * @async
@@ -46,7 +46,17 @@ function init ({ timeout = 1000 } = {}){
                 if (result === true) {
                     resolve(new GpgME());
                 } else {
-                    reject(gpgme_error('CONN_NO_CONNECT'));
+                    if (connection._connectionError) {
+                        if (connection.isNativeHostUnknown){
+                            reject(gpgme_error('CONN_NO_CONFIG'));
+                        } else {
+                            reject(gpgme_error('CONN_NATIVEMESSAGE',
+                                connection._connectionError)
+                            );
+                        }
+                    } else {
+                        reject(gpgme_error('CONN_TIMEOUT'));
+                    }
                 }
             }, function (){ // unspecific connection error. Should not happen
                 reject(gpgme_error('CONN_NO_CONNECT'));
index 414d18d..45e2b93 100644 (file)
@@ -49,11 +49,42 @@ function unittests (){
                     expect(answer.info).to.be.an('Array');
                     expect(conn0.disconnect).to.be.a('function');
                     expect(conn0.post).to.be.a('function');
+                    expect(conn0.isDisconnected).to.be.false;
                     done();
                 });
 
         });
 
+        it('Simple connection check', function (done) {
+            let conn0 = new Connection;
+            conn0.checkConnection(false, connectionTimeout).then(
+                function (answer) {
+                    expect(answer).to.be.true;
+                    expect(conn0.isDisconnected).to.be.false;
+                    done();
+                });
+        });
+
+        it('Connection check with backend information', function (done) {
+            let conn0 = new Connection;
+            conn0.checkConnection(true, connectionTimeout).then(
+                function (answer) {
+                    expect(answer).to.be.an('Object');
+                    expect(answer.gpgme).to.be.a('String');
+                    expect(answer.info).to.be.an('Array');
+                    expect(answer.info.length).to.be.above(0);
+                    for (const item of answer.info) {
+                        expect(item).to.have.property('protocol');
+                        expect(item).to.have.property('fname');
+                        expect(item).to.have.property('version');
+                        expect(item).to.have.property('req_version');
+                        expect(item).to.have.property('homedir');
+                    }
+                    expect(conn0.isDisconnected).to.be.false;
+                    done();
+                });
+        });
+
         it('Disconnecting', function (done) {
             let conn0 = new Connection;
             conn0.checkConnection(false, connectionTimeout).then(
@@ -63,6 +94,7 @@ function unittests (){
                     conn0.checkConnection(false, connectionTimeout).then(
                         function (result) {
                             expect(result).to.be.false;
+                            expect(conn0.isDisconnected).to.be.true;
                             done();
                         });
                 });
index 6bc5a15..19ed6f3 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -160,7 +160,7 @@ am__recursive_targets = \
   $(RECURSIVE_CLEAN_TARGETS) \
   $(am__extra_recursive_targets)
 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir
+       distdir distdir-am
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -399,6 +399,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -439,8 +440,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -561,7 +562,10 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 3abc9e6..ec8a75f 100644 (file)
 # License along with this program; if not, see <https://gnu.org/licenses/>.
 # SPDX-License-Identifier: LGPL-2.1-or-later
 
-# Created by:
-# find . -type f -print | sed 's/^.\//             /;$q;s/$/ \\/' | sort
-EXTRA_DIST = texinfo/what-was-new.texi \
-             meta/old-commits.log \
-             meta/TODO.org \
-             README \
-             rst/_build/README \
-             rst/conf.py \
-             rst/gpgme-python-howto.rst \
-             rst/index.rst \
-             rst/maintenance-mode.rst \
-             rst/short-history.rst \
-             rst/_static/README \
-             rst/_templates/README \
-             rst/what-is-new.rst \
-             rst/what-was-new.rst \
-             src/gpgme-python-howto \
-             src/index \
-             src/maintenance-mode \
-             src/short-history \
-             src/what-is-new \
-             src/what-was-new \
-             texinfo/gpgme-python-howto.texi \
-             texinfo/index.texi \
-             texinfo/maintenance-mode.texi \
-             texinfo/short-history.texi \
-             texinfo/texinfo.tex \
-             texinfo/what-is-new.texi \
-             texinfo/what-was-new.texi
+EXTRA_DIST = README rst src texinfo
+
+if MAINTAINER_MODE
+
+ORGSRCS = index.org gpgme-python-howto.org maintenance-mode.org \
+         short-history.org what-is-new.org what-was-new.org
+
+# Make sure we have 'rst' and 'texinfo' dirs in build directory
+.PHONY: the_doc_dirs gen_rst gen_texi
+
+the_doc_dirs:
+       @if test ! -d rst; then echo $(MKDIR_P) rst; $(MKDIR_P) rst; fi
+       @if test ! -d texinfo; then echo $(MKDIR_P) texinfo; $(MKDIR_P) texinfo; fi
+
+# Generate RST files from ORG
+gen_rst:
+       @for f in $(ORGSRCS); do if test ! -e rst/$${f%.org}.rst \
+         -o rst/$${f%.org}.rst -ot $(srcdir)/src/$$f; then \
+           echo pandoc -f org -t rst $(srcdir)/src/$$f -o rst/$${f%.org}.rst; \
+           pandoc -f org -t rst $(srcdir)/src/$$f -o rst/$${f%.org}.rst;      \
+         fi; \
+       done
+
+# Generate Texinfo files from ORG
+gen_texi:
+       @for f in $(ORGSRCS); do if test ! -e texinfo/$${f%.org}.texi \
+         -o texinfo/$${f%.org}.texi -ot $(srcdir)/src/$$f; then \
+           echo pandoc -f org -t texinfo $(srcdir)/src/$$f -o texinfo/$${f%.org}.texi; \
+           pandoc -f org -t texinfo $(srcdir)/src/$$f -o texinfo/$${f%.org}.texi;      \
+         fi; \
+       done
+
+all-local: gen_rst gen_texi
+
+gen_rst gen_texi: the_doc_dirs
+
+maintainer-clean-local:
+       @for f in $(ORGSRCS); do \
+         echo rm -f rst/$${f%.org}.rst texinfo/$${f%.org}.texi; \
+         rm -f rst/$${f%.org}.rst texinfo/$${f%.org}.texi; \
+       done
+endif
index 31f8187..36eef56 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -338,6 +338,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -346,36 +347,9 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-
-# Created by:
-# find . -type f -print | sed 's/^.\//             /;$q;s/$/ \\/' | sort
-EXTRA_DIST = texinfo/what-was-new.texi \
-             meta/old-commits.log \
-             meta/TODO.org \
-             README \
-             rst/_build/README \
-             rst/conf.py \
-             rst/gpgme-python-howto.rst \
-             rst/index.rst \
-             rst/maintenance-mode.rst \
-             rst/short-history.rst \
-             rst/_static/README \
-             rst/_templates/README \
-             rst/what-is-new.rst \
-             rst/what-was-new.rst \
-             src/gpgme-python-howto \
-             src/index \
-             src/maintenance-mode \
-             src/short-history \
-             src/what-is-new \
-             src/what-was-new \
-             texinfo/gpgme-python-howto.texi \
-             texinfo/index.texi \
-             texinfo/maintenance-mode.texi \
-             texinfo/short-history.texi \
-             texinfo/texinfo.tex \
-             texinfo/what-is-new.texi \
-             texinfo/what-was-new.texi
+EXTRA_DIST = README rst src texinfo
+@MAINTAINER_MODE_TRUE@ORGSRCS = index.org gpgme-python-howto.org maintenance-mode.org \
+@MAINTAINER_MODE_TRUE@   short-history.org what-is-new.org what-was-new.org
 
 all: all-am
 
@@ -397,8 +371,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -422,7 +396,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -454,7 +431,8 @@ distdir: $(DISTFILES)
        done
 check-am: all-am
 check: check-am
-all-am: Makefile
+@MAINTAINER_MODE_FALSE@all-local:
+all-am: Makefile all-local
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -486,6 +464,7 @@ distclean-generic:
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
+@MAINTAINER_MODE_FALSE@maintainer-clean-local:
 clean: clean-am
 
 clean-am: clean-generic clean-libtool mostlyclean-am
@@ -536,7 +515,8 @@ installcheck-am:
 
 maintainer-clean: maintainer-clean-am
        -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+       maintainer-clean-local
 
 mostlyclean: mostlyclean-am
 
@@ -554,21 +534,57 @@ uninstall-am:
 
 .MAKE: install-am install-strip
 
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-       cscopelist-am ctags-am distclean distclean-generic \
-       distclean-libtool distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
+.PHONY: all all-am all-local check check-am clean clean-generic \
+       clean-libtool cscopelist-am ctags-am distclean \
+       distclean-generic distclean-libtool distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic maintainer-clean-local mostlyclean \
        mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
        tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
 
+# Make sure we have 'rst' and 'texinfo' dirs in build directory
+@MAINTAINER_MODE_TRUE@.PHONY: the_doc_dirs gen_rst gen_texi
+
+@MAINTAINER_MODE_TRUE@the_doc_dirs:
+@MAINTAINER_MODE_TRUE@ @if test ! -d rst; then echo $(MKDIR_P) rst; $(MKDIR_P) rst; fi
+@MAINTAINER_MODE_TRUE@ @if test ! -d texinfo; then echo $(MKDIR_P) texinfo; $(MKDIR_P) texinfo; fi
+
+# Generate RST files from ORG
+@MAINTAINER_MODE_TRUE@gen_rst:
+@MAINTAINER_MODE_TRUE@ @for f in $(ORGSRCS); do if test ! -e rst/$${f%.org}.rst \
+@MAINTAINER_MODE_TRUE@   -o rst/$${f%.org}.rst -ot $(srcdir)/src/$$f; then \
+@MAINTAINER_MODE_TRUE@     echo pandoc -f org -t rst $(srcdir)/src/$$f -o rst/$${f%.org}.rst; \
+@MAINTAINER_MODE_TRUE@     pandoc -f org -t rst $(srcdir)/src/$$f -o rst/$${f%.org}.rst;      \
+@MAINTAINER_MODE_TRUE@   fi; \
+@MAINTAINER_MODE_TRUE@ done
+
+# Generate Texinfo files from ORG
+@MAINTAINER_MODE_TRUE@gen_texi:
+@MAINTAINER_MODE_TRUE@ @for f in $(ORGSRCS); do if test ! -e texinfo/$${f%.org}.texi \
+@MAINTAINER_MODE_TRUE@   -o texinfo/$${f%.org}.texi -ot $(srcdir)/src/$$f; then \
+@MAINTAINER_MODE_TRUE@     echo pandoc -f org -t texinfo $(srcdir)/src/$$f -o texinfo/$${f%.org}.texi; \
+@MAINTAINER_MODE_TRUE@     pandoc -f org -t texinfo $(srcdir)/src/$$f -o texinfo/$${f%.org}.texi;      \
+@MAINTAINER_MODE_TRUE@   fi; \
+@MAINTAINER_MODE_TRUE@ done
+
+@MAINTAINER_MODE_TRUE@all-local: gen_rst gen_texi
+
+@MAINTAINER_MODE_TRUE@gen_rst gen_texi: the_doc_dirs
+
+@MAINTAINER_MODE_TRUE@maintainer-clean-local:
+@MAINTAINER_MODE_TRUE@ @for f in $(ORGSRCS); do \
+@MAINTAINER_MODE_TRUE@   echo rm -f rst/$${f%.org}.rst texinfo/$${f%.org}.texi; \
+@MAINTAINER_MODE_TRUE@   rm -f rst/$${f%.org}.rst texinfo/$${f%.org}.texi; \
+@MAINTAINER_MODE_TRUE@ done
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/lang/python/doc/meta/TODO.org b/lang/python/doc/meta/TODO.org
deleted file mode 100644 (file)
index 0be99b3..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-#+TITLE: Stuff To Do
-#+LATEX_COMPILER: xelatex
-#+LATEX_CLASS: article
-#+LATEX_CLASS_OPTIONS: [12pt]
-#+LATEX_HEADER: \usepackage{xltxtra}
-#+LATEX_HEADER: \usepackage[margin=1in]{geometry}
-#+LATEX_HEADER: \setmainfont[Ligatures={Common}]{Latin Modern Roman}
-
-* Project Task List
-  :PROPERTIES:
-  :CUSTOM_ID: task-list
-  :END:
-
-** DONE Documentation default format
-   CLOSED: [2018-02-15 Thu 21:29]
-   :PROPERTIES:
-   :CUSTOM_ID: todo-docs-default
-   :END:
-
-   Decide on a default file format for documentation.  The two main
-   contenders being Org Mode, the default for the GnuPG Project and
-   reStructuredText, the default for Python projects.  A third option
-   of DITA XML was considered due to a number of beneficial features
-   it provides.
-
-   The decision was made to use Org Mode in order to fully integrate
-   with the rest of the GPGME and GnuPG documentation.  It is possible
-   to produce reST versions via Pandoc and DITA XML can be reached
-   through converting to either Markdown or XHTML first.
-
-
-** TODO Documentation build systems
-   :PROPERTIES:
-   :CUSTOM_ID: todo-docs-build-systems
-   :END:
-
-Though Org Mode is being used for the default documentation format, it
-still needs to end up as usable by end users.  So the Org Mode files
-are used to produce the "source" files used by the two main contenders
-for documenting the bindings: Texinfo and ReStructuredText/Docutils.
-
-
-*** TODO Texinfo documentation
-    :PROPERTIES:
-    :CUSTOM_ID: todo-docs-build-texinfo
-    :END:
-
-Need to add all of Texinfo's ... special systems to make it do its
-things.
-
-
-*** TODO ReStructuredText documentation
-    :PROPERTIES:
-    :CUSTOM_ID: todo-docs-build-docutils
-    :END:
-
-Need to run Sphinx's quick start, add it to the requirements and tweak
-the index page for the rst files to point to the HOWTO and other files.
-
-It might just be easier to do all that in Org Mode and convert the
-lot, then the Sphinx bits can be automated.
-
-
-** STARTED Documentation HOWTO
-   :PROPERTIES:
-   :CUSTOM_ID: todo-docs-howto
-   :END:
-
-   - State "STARTED"    from "TODO"       [2018-03-08 Thu 13:59] \\
-     Started yesterday.
-   Write a HOWTO style guide for the current Python bindings.
-
-*** DONE Start python bindings HOWTO
-    CLOSED: [2018-03-07 Wed 18:14]
-    :PROPERTIES:
-    :CUSTOM_ID: howto-start
-    :END:
-
-
-*** STARTED Include certain specific instructions in the HOWTO
-    :PROPERTIES:
-    :CUSTOM_ID: howto-requests
-    :END:
-
-    Note: moved the S/MIME bits out to their own section of the TODO
-    list and may be served better by separate HOWTO documentation
-    anyway.
-
-    - State "STARTED"    from "TODO"       [2018-03-09 Fri 15:27]
-    Some functions can be worked out from the handful of examples
-    available, but many more can't and I've already begun receiving
-    requests for certain functions to be explained.
-
-
-**** DONE Standard scenarios
-     CLOSED: [2018-03-19 Mon 12:34]
-     :PROPERTIES:
-     :CUSTOM_ID: howto-the-basics
-     :END:
-
-     - State "DONE"       from "STARTED"    [2018-03-19 Mon 12:34] \\
-       All four of those are done.
-     - State "STARTED"    from "TODO"       [2018-03-09 Fri 15:26] \\
-       Began with the example code, now to add the text.
-     What everyone expects: encryption, decryption, signing and verifying.
-
-
-**** STARTED Key control
-     :PROPERTIES:
-     :CUSTOM_ID: howto-key-control
-     :END:
-
-     - State "STARTED"    from "TODO"       [2018-03-19 Mon 12:35] \\
-       Generating keys and subkeys are done, but revocation is still to be done.
-     Generating keys, adding subkeys, revoking subkeys (and keeping
-     the cert key), adding and revoking UIDs, signing/certifying keys.
-
-
-**** DONE More key control
-     CLOSED: [2018-03-19 Mon 12:36]
-     :PROPERTIES:
-     :CUSTOM_ID: howto-key-selection
-     :END:
-
-     - State "DONE"       from "TODO"       [2018-03-19 Mon 12:36] \\
-       Key selection, searching, matching and counting is done.
-     Selecting keys to encrypt to or manipulate in other ways (e.g. as
-     with key control or the basics).
-
-
-** TODO Documentation SWIG
-   :PROPERTIES:
-   :CUSTOM_ID: todo-docs-swig
-   :END:
-
-   Write documentation for the complete SWIG bindings demonstrating
-   the correspondence with GPGME itself.
-
-   Note: it is likely that this will be more in the nature of
-   something to be used in conjunction with the existing GPGME
-   documentation which makes it easier for Python developers to use.
-
-
-** TODO GUI examples
-   :PROPERTIES:
-   :CUSTOM_ID: todo-gui-examples
-   :END:
-
-   Create some examples of using Python bindings in a GUI application
-   to either match or be similar to the old GTK2 examples available
-   with PyME.
-
-
-** TODO Replace SWIG
-   :PROPERTIES:
-   :CUSTOM_ID: todo-replace-swig
-   :END:
-
-   Selecting SWIG for this project in 2002 was understandable and
-   effectively the only viable option.  The options available now,
-   however, are significantly improved and some of those would resolve
-   a number of existing problems with using SWIG, particularly when
-   running code on both POSIX compliant and Windows platforms.
-
-   The long term goal is to replace SWIG by reimplementing the Python
-   bindings using a more suitable means of interfacing with the GPGME
-   C source code.
-
-
-*** TODO Replacement for SWIG
-    :PROPERTIES:
-    :CUSTOM_ID: todo-replace-swig-replacement
-    :END:
-
-    Decide on a replacement for SWIG.  Currently CFFI is looking like
-    the most viable candidate, but some additional testing and checks
-    are yet to be completed.
-
-
-** TODO API for an API
-   :PROPERTIES:
-   :CUSTOM_ID: todo-api-squared
-   :END:
-
-   A C API like GPGME is not what most modern developers think of when
-   they hear the term API. Normally they think of something they can
-   interact with like a RESTful web API.  Though RESTful is unlikely
-   given the nature of GPGME and the process of encryption, it may be
-   possible to provide a more familiar interface which can be utilised
-   by developers of other languages for which bindings are not
-   available or for which it is too difficult to create proper
-   bindings.
-
-
-** TODO S/MIME
-   :PROPERTIES:
-   :CUSTOM_ID: s-mime
-   :END:
-
-   Eventually add some of this, but the OpenPGP details are far more
-   important at the moment.
-
-
-* Project Task Details
-  :PROPERTIES:
-  :CUSTOM_ID: detailed-tasks
-  :END:
-
-** Working examples
-   :PROPERTIES:
-   :CUSTOM_ID: working-examples
-   :END:
-
-   The old GUI examples were unable to be retained since they depended
-   on GTK2 and Python 2's integration with GTK2.
-
-   Current GPGME examples so far only include command line tools or
-   basic Python code for use with either Python 2.7 or Python 3.4 and
-   above.
-
-   Future GUI examples ought to utilise available GUI modules and
-   libraries supported by Python 3.  This may include Qt frameworks,
-   Tkinter, GTK3 or something else entirely.
-
-** Documentation
-   :PROPERTIES:
-   :CUSTOM_ID: documentation
-   :END:
-
-   The legacy documentation which no longer applies to the Python
-   bindings has been removed.
-
-   Current and future documentation will adhere to the GnuPG standard
-   of using Org Mode and not use the reStructuredText (reST) format
-   more commonly associated with Python documentation.  The reasons
-   for this are that this project is best served as shipping with the
-   rest of GPGME and the documentation ought to match that.  There are
-   also aspects of Org Mode's publishing features which are superior
-   to the defaults of reST, including the capacity to generate fully
-   validating strict XHTML output.
-
-   If reST files are required at a later point for future inclusion
-   with other Python packages, then that format can be generated from
-   the .org files with Pandoc before being leveraged by either
-   Docutils, Sphinx or something else.
-
-   While there are some advanced typesetting features of reST which
-   are not directly available to Org Mode, more often than not those
-   features are best implemented with either HTML and CSS, with LaTeX
-   to produce a PDF or via a number of XML solutions.  Both reST and
-   Org Mode have multiple paths by which to achieve all of these.
diff --git a/lang/python/doc/meta/old-commits.log b/lang/python/doc/meta/old-commits.log
deleted file mode 100644 (file)
index eb870cd..0000000
+++ /dev/null
@@ -1,2445 +0,0 @@
-commit 2145348ec54c6027f2ea20f695de0277e2871405
-Merge: 348ba88 2036f1a
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Wed May 6 03:04:19 2015 +1000
-
-    Merge pull request #4 from Hasimir/master
-
-    history
-
-commit 2036f1a0a670a0561993e195c458059220b36114
-Merge: dbabf0c 348ba88
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Wed May 6 02:57:44 2015 +1000
-
-    Merge branch 'master' of github:adversary-org/pyme3
-
-commit dbabf0cf1f2985755c2293b619011832e34faa9c
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Wed May 6 02:52:23 2015 +1000
-
-    Added a short history
-
-    * A (very) brief summary of the project's history since 2002.
-    * Deals with why the commit log in the GPGME repo does not include the
-      history of PyME.
-    * Mentions that intact git repos will be maintained, but not where they
-      are (one will be on github, another will be in a user directory on
-      playfair.gnupg.org).
-
- docs/Short_History.rst | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 57 insertions(+)
-
-commit 348ba883424778c711c04ae9b66035ccdb36eb8c
-Merge: 127d0a5 7c37a27
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Wed May 6 02:21:34 2015 +1000
-
-    Merge pull request #3 from Hasimir/master
-
-    Version release preparation
-
-commit 7c37a27a6845c58222d4d947c2efbe38e955b612
-Merge: f692cff 127d0a5
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Wed May 6 02:17:14 2015 +1000
-
-    Merge branch 'master' of github:adversary-org/pyme3
-
-commit f692cff50a89c2c61acdbd3d7dd60f5ce3cd15af
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Wed May 6 02:09:44 2015 +1000
-
-    TODO update
-
-    * Removed reference to GitHub, replaced with impending new home at gnupg.org.
-
- docs/TODO.rst | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit bd5ccf9e3bfe69fa681613757577e87b72ca08ec
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Wed May 6 02:00:44 2015 +1000
-
-    Version bump
-
-    * Bumped version number to 0.9.1 to keep it somewhat in line with the
-      existing PyME project, even though there will be some divergence at
-      some point (or even re-merging, depending on how many of the Python 3
-      modifications can be back-ported to the Python 2 version).
-    * Updated the author and copyright information to reflect the two
-      current authors (Martin and I).
-    * Replaced Igor's contact details with mine.
-    * Replaced project home page with the GnuPG one.
-
- pyme/version.py | 16 +++++++++-------
- 1 file changed, 9 insertions(+), 7 deletions(-)
-
-commit ec167512f4ca88d8f6e89e2ae831798c8283b4df
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Wed May 6 01:48:01 2015 +1000
-
-    README preparation.
-
-    * Changes in preparation for impending move of code to the GnuPG git
-      server as a part of GPGME.
-
- README.rst | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
-
-commit 8a48515e884c36b5bdb24a13cb4d2e49f4ee6f17
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Wed May 6 01:43:53 2015 +1000
-
-    TODO moved to docs
-
-    * As it says.
-
- TODO.rst      | 25 -------------------------
- docs/TODO.rst | 25 +++++++++++++++++++++++++
- 2 files changed, 25 insertions(+), 25 deletions(-)
-
-commit f968c777472f01f308f6e57eac1740bf5c76c205
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 16:52:13 2015 +1000
-
-    Started another TODO file.
-
- TODO.rst | 25 +++++++++++++++++++++++++
- 1 file changed, 25 insertions(+)
-
-commit 127d0a56fa9f7ad1d4fb39d0b529b890a8d67365
-Merge: db72dea 44837f6
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 14:59:44 2015 +1000
-
-    Merge pull request #2 from Hasimir/master
-
-    Minor editing.
-
-commit 44837f6e50fc539c86aef1f75a6a3538b02029ea
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 14:56:55 2015 +1000
-
-    Minor editing.
-
-    * Fixed another URL.
-    * Changed Py3 version's version number to v0.9.1-beta0.
-
- README.rst | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit db72deaae19c3513391df040bcaf66a88d9213af
-Merge: db34286 48eb185
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 14:26:11 2015 +1000
-
-    Merge pull request #1 from Hasimir/master
-
-    Links
-
-commit 48eb1856cb0739cc9f0b9084da9d965e1fc7fddd
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 14:22:30 2015 +1000
-
-    Links
-
-    * Fixed URLs for authors.
-    * Updated my entry to point to github location.
-    ** I strongly suspect the result of this work will be concurrent
-       projects, so preparing for that eventuality with this repo.
-
- README.rst | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-commit db3428659783f30b9a76204403daedf9fc4cf7cf
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 11:29:00 2015 +1000
-
-    Explicit over Implicit ...
-
-    ... isn't just for code.
-
-    * Removed the 2to3 working directory and its contents.
-    * Made the README.rst file a little more clear that this branch is for
-      Python 3 (set Python 3.2 as a fairly arbitrary requirement for the
-      moment, but will probably raise this to 3.3).
-
- 2to3/2to3-output-remaining.log |  60 ---
- 2to3/2to3-output-setup.log     |  35 --
- 2to3/2to3-output.log           | 950 -----------------------------------------
- README.rst                     |  10 +-
- 4 files changed, 7 insertions(+), 1048 deletions(-)
-
-commit 3edf07a4ba8a86af3a33246234d6e133074862af
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 11:19:41 2015 +1000
-
-    Added authors.
-
-    * In alphabetical order.
-    * Mine will need updating once Martin and I have decided what to do
-      regarding the two main branches.
-
- README.rst | 12 ++++++++++++
- 1 file changed, 12 insertions(+)
-
-commit 811eb14b53e8856312d99f46b77215f7f9bd672c
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 10:23:00 2015 +1000
-
-    Docs and other things.
-
-    * Now able to import pyme.core without error, indicates port process is
-      successful.
-    * Code is *not* compatible with the Python 2 version.
-    * Will need to consider making this a parallel project with the master
-      branch.
-    * Got rid of the .org TODO file.
-    * Changed the README to use the reST file extension since it's full of
-      reST anyway.
-
- 2to3/TODO.org |  5 -----
- README.rst    | 32 ++++++++++++++++++++++++++++++++
- README.txt    | 32 --------------------------------
- 3 files changed, 32 insertions(+), 37 deletions(-)
-
-commit 79e784bdcce1de6f7856921b5431044c62c6f015
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 10:18:40 2015 +1000
-
-    Fixed another implicit import by making it explicit.  Hopefully this is the last one.
-
- pyme/util.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 2b52b46ccda3e7abcc50eed0745062259d698661
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 10:16:01 2015 +1000
-
-    Fixed another implicit import by making it explicit.
-
- pyme/errors.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 409c8fd565e21f23cd41daaeffc867e6d23a0863
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 10:08:22 2015 +1000
-
-    Bytes vs. Unicode
-
-    * Trying PyBytes instead of PyUnicode.
-
- gpgme.i   | 14 +++++++-------
- helpers.c |  8 ++++----
- 2 files changed, 11 insertions(+), 11 deletions(-)
-
-commit d8164aa2ae98bf8c807c16e2d9be12c5fbea7cfd
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 09:22:58 2015 +1000
-
-    String to Unicode
-
-    * Replaced all instances of PyString with PyUnicode (and hoping there's
-      no byte data in there).
-
- gpgme.i   | 14 +++++++-------
- helpers.c |  8 ++++----
- 2 files changed, 11 insertions(+), 11 deletions(-)
-
-commit bd99b7865656e559b17c419c6b64b412a22c6c44
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 09:17:06 2015 +1000
-
-    PyInt_AsLong
-
-    * Replaced all instances of PyInt with PyLong, as per C API docs.
-
- gpgme.i   | 4 ++--
- helpers.c | 8 ++++----
- 2 files changed, 6 insertions(+), 6 deletions(-)
-
-commit 3c91e2ccf8ca788b51e3308e292c6b64888fdb15
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 05:59:36 2015 +1000
-
-    Import correction
-
-    * Once pygpgme.py is generated and moved, it will be in the right
-      directory for the explicit "from . import pygpgme" to be correct.
-
- pyme/core.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 23a49e7070812ff1ce138d8d4cc46d0b80328897
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 05:38:29 2015 +1000
-
-    The -py3 flag.
-
- Makefile | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit b1549587d6db5e33081b9c20f75d1348a1d25938
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 05:01:42 2015 +1000
-
-    Fixed indentation - 4.
-
- pyme/core.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit a685142ce46761ee6f5176e90717176e38e0d24f
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 05:00:16 2015 +1000
-
-    Fixed indentation - 3.
-
- pyme/core.py | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
-
-commit 488a70b490cc64eb1c47d2483cb2f4079c6767f7
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 04:53:21 2015 +1000
-
-    Pet Peeve
-
-    def pet_peeve(self):
-        peeve = print("people who don't press return after a colon!")
-
-    FFS!
-
- pyme/core.py | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
-
-commit a5d38eb47d64bb17bb609fe594dae2aca480bac9
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 04:47:54 2015 +1000
-
-    Fixed indentation - 2.
-
- pyme/core.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 476a207f732b8559abb1ea3c23147c0e34804730
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 04:46:01 2015 +1000
-
-    Fixed indentation.
-
- pyme/core.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit 0572900eba9bcd9b0283c7d8e022e8972f06f9f8
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 04:43:49 2015 +1000
-
-    Replaced all tabs with 4 spaces.
-
- pyme/core.py | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
-commit 78c0b7677e94ce1e11b8cdb833a9064527187330
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 04:39:07 2015 +1000
-
-    SWIG flags in the wrong place.
-
- Makefile | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit dfa7f2589963494a8f89277560d8c1116604a3c8
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 04:35:09 2015 +1000
-
-    Fixed subprocess call for swig (again).
-
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 249bfd8c714dcda53127b99b6cc8a6c7c4a99f20
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 04:32:40 2015 +1000
-
-    Fixed subprocess call for swig.
-
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 6fd7e719cf4c975f466ceb39835db7007df36fb2
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sun May 3 03:51:48 2015 +1000
-
-    Linking swig to py3
-
-    * Changed the swig invocations to run with the -python -py3 flags explicitly.
-
- Makefile | 4 ++--
- setup.py | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-commit 7a6b584f50ed6ddc8617a642185eea1f24ff791a
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sat May 2 11:12:00 2015 +1000
-
-    String fun
-
-    * streamlined confdata details, including decoding strom binary to string.
-
- setup.py | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-commit f7fd3f270592021a95a8f779bfe85ac18f4e390b
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sat May 2 10:46:59 2015 +1000
-
-    Open File
-
-    * Removed deprecated file() and replaced with open().
-
- examples/PyGtkGpgKeys.py | 2 +-
- examples/pygpa.py        | 6 +++---
- gpgme-h-clean.py         | 2 +-
- 3 files changed, 5 insertions(+), 5 deletions(-)
-
-commit 4227d486f9558015e7e548d71085e58e1b50ec08
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sat May 2 10:36:15 2015 +1000
-
-    print() fix
-
-    * Makefile includes a python print, changed from statement to function.
-
- Makefile | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 406f7f2567b701502186fe0a325dc2a3491ff7f8
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sat May 2 10:28:42 2015 +1000
-
-    Updated Makefile
-
-    * set make to use python3 instead.
-    * This will mean a successful port may need to be maintained separately
-      from the original python2 code instead of merged, but ought to be able
-      to share most things.  So maybe merge with separated make files or a
-      pre-make script to set python2 or python3 prior to building ... decide
-      later, after it works.
-
- Makefile | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-commit 90b3efa5b193d37e08dc9b4ee766ba9ebc9412af
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sat May 2 10:15:20 2015 +1000
-
-    Env and a little license issue
-
-    * Updated all the /usr/bin/env paths to point to python3.
-    * Also fixed the hard coded /usr/bin/python paths.
-    * Updated part of setup.py which gave the impression this package was
-      only licensed under the GPL (it's actually licensed under the LGPL as
-      well, essentially the same dual licensing as the GPGME library).
-
- examples/PyGtkGpgKeys.py   | 2 +-
- examples/delkey.py         | 2 +-
- examples/encrypt-to-all.py | 2 +-
- examples/exportimport.py   | 2 +-
- examples/genkey.py         | 2 +-
- examples/inter-edit.py     | 2 +-
- examples/pygpa.py          | 2 +-
- examples/sign.py           | 2 +-
- examples/signverify.py     | 2 +-
- examples/simple.py         | 2 +-
- examples/t-edit.py         | 2 +-
- examples/testCMSgetkey.py  | 2 +-
- examples/verifydetails.py  | 2 +-
- gpgme-h-clean.py           | 2 +-
- setup.py                   | 4 ++--
- 15 files changed, 16 insertions(+), 16 deletions(-)
-
-commit 1a4b55dbccd2774344352e579130bf494bc5fa4b
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sat May 2 08:50:54 2015 +1000
-
-    Removed extraneous files.
-
-    * The two .bak files.
-
- pyme/errors.py.bak |  46 ---------------------
- setup.py.bak       | 116 -----------------------------------------------------
- 2 files changed, 162 deletions(-)
-
-commit 208879d4f2a6d0514c3f8ee2fc0da8bba42350de
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sat May 2 08:19:37 2015 +1000
-
-    Added TODO.org
-
-    * TODO list in Emacs org-mode.
-    * Will eventually be removed along with this entire directory when the
-      porting process is complete.
-
- 2to3/TODO.org | 5 +++++
- 1 file changed, 5 insertions(+)
-
-commit 1548bf201059638675c5387c6f124d4b703363a9
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sat May 2 07:58:40 2015 +1000
-
-    2to3 conversion of remaining files
-
-    * Ran the extended version against all the unmodified python files.
-    * Only pyme/errors.py required additional work.
-
- 2to3/2to3-output-remaining.log | 60 ++++++++++++++++++++++++++++++++++++++++++
- pyme/errors.py                 |  2 +-
- pyme/errors.py.bak             | 46 ++++++++++++++++++++++++++++++++
- 3 files changed, 107 insertions(+), 1 deletion(-)
-
-commit 1230650bc6bbe4c14d1284f7877aa932f3e86eb4
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Sat May 2 07:50:39 2015 +1000
-
-    2to3 conversion of setup.py
-
-    * Ran extended 2to3 command to produce python 3 code for setup.py.
-    * Effectively testing for what to run against the other originally
-      unmodified py2 files.
-
- 2to3/2to3-output-setup.log |  35 ++++++++++++++
- setup.py                   |   7 ++-
- setup.py.bak               | 116 +++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 154 insertions(+), 4 deletions(-)
-
-commit edad44955f59aa879e95a369591717fb19eec6b7
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Fri May 1 21:50:07 2015 +1000
-
-    Removing 2to3 generated .bak files.
-
-    * Not really needed with a real VCS, but couldn't hurt to have them for
-      a couple of revisions.  ;)
-
- examples/PyGtkGpgKeys.py.bak           |  663 ---------------
- examples/encrypt-to-all.py.bak         |   65 --
- examples/exportimport.py.bak           |   75 --
- examples/genkey.py.bak                 |   45 -
- examples/inter-edit.py.bak             |   57 --
- examples/pygpa.py.bak                  | 1457 --------------------------------
- examples/sign.py.bak                   |   31 -
- examples/signverify.py.bak             |   78 --
- examples/simple.py.bak                 |   52 --
- examples/t-edit.py.bak                 |   59 --
- examples/testCMSgetkey.py.bak          |   45 -
- examples/verifydetails.py.bak          |  100 ---
- gpgme-h-clean.py.bak                   |   42 -
- pyme/callbacks.py.bak                  |   47 --
- pyme/constants/data/__init__.py.bak    |    4 -
- pyme/constants/keylist/__init__.py.bak |    4 -
- pyme/constants/sig/__init__.py.bak     |    4 -
- pyme/core.py.bak                       |  463 ----------
- pyme/util.py.bak                       |   72 --
- pyme/version.py.bak                    |   41 -
- 20 files changed, 3404 deletions(-)
-
-commit 1cfc3c969f885ed191610bffbbd60ac23fdd349e
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Fri May 1 21:45:50 2015 +1000
-
-    2to3 conversion log
-
-    * The output of the command to convert the code from Python 2 to 3.
-    * Note: this contains the list of files which were not modified and
-      which will or may need to be modified.
-
- 2to3/2to3-output.log | 950 +++++++++++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 950 insertions(+)
-
-commit 078f6cf878aa62d12704fab424198a613a24cc8c
-Author: Ben McGinnes <ben@adversary.org>
-Date:   Fri May 1 21:36:58 2015 +1000
-
-    2to3 conversion of pyme master
-
-    * Branch from commit 459f3eca659b4949e394c4a032d9ce2053e6c721
-    * Ran this: or x in `find . | egrep .py$` ; do 2to3 -w $x; done ;
-    * Multiple files not modified, will record elsewhere (see next commit).
-
- examples/PyGtkGpgKeys.py               |   10 +-
- examples/PyGtkGpgKeys.py.bak           |  663 +++++++++++++++
- examples/encrypt-to-all.py             |   12 +-
- examples/encrypt-to-all.py.bak         |   65 ++
- examples/exportimport.py               |   20 +-
- examples/exportimport.py.bak           |   75 ++
- examples/genkey.py                     |    2 +-
- examples/genkey.py.bak                 |   45 +
- examples/inter-edit.py                 |    8 +-
- examples/inter-edit.py.bak             |   57 ++
- examples/pygpa.py                      |   40 +-
- examples/pygpa.py.bak                  | 1457 ++++++++++++++++++++++++++++++++
- examples/sign.py                       |    2 +-
- examples/sign.py.bak                   |   31 +
- examples/signverify.py                 |   18 +-
- examples/signverify.py.bak             |   78 ++
- examples/simple.py                     |    8 +-
- examples/simple.py.bak                 |   52 ++
- examples/t-edit.py                     |   12 +-
- examples/t-edit.py.bak                 |   59 ++
- examples/testCMSgetkey.py              |    8 +-
- examples/testCMSgetkey.py.bak          |   45 +
- examples/verifydetails.py              |   34 +-
- examples/verifydetails.py.bak          |  100 +++
- gpgme-h-clean.py                       |    2 +-
- gpgme-h-clean.py.bak                   |   42 +
- pyme/callbacks.py                      |    6 +-
- pyme/callbacks.py.bak                  |   47 ++
- pyme/constants/data/__init__.py        |    2 +-
- pyme/constants/data/__init__.py.bak    |    4 +
- pyme/constants/keylist/__init__.py     |    2 +-
- pyme/constants/keylist/__init__.py.bak |    4 +
- pyme/constants/sig/__init__.py         |    2 +-
- pyme/constants/sig/__init__.py.bak     |    4 +
- pyme/core.py                           |   26 +-
- pyme/core.py.bak                       |  463 ++++++++++
- pyme/util.py                           |    6 +-
- pyme/util.py.bak                       |   72 ++
- pyme/version.py                        |    2 +-
- pyme/version.py.bak                    |   41 +
- 40 files changed, 3515 insertions(+), 111 deletions(-)
-
-commit 459f3eca659b4949e394c4a032d9ce2053e6c721
-Merge: c5966ab dae7f14
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Wed Jul 9 10:48:33 2014 +0100
-
-    Merged in jerrykan/pyme/fix_setup_26 (pull request #1)
-
-    Provide support for using setup.py with Python v2.6
-
-commit dae7f14a54e6c2bde0ad4da7308cc7fc0d0c0469
-Author: John Kristensen <john.kristensen@dpipwe.tas.gov.au>
-Date:   Wed Jul 9 15:54:39 2014 +1000
-
-    Provide support for using setup.py with Python v2.6
-
-    The setup.py script uses subprocess.check_output() which was introduced
-    in Python v2.7. The equivalent functionality can be achieved without
-    adding much extra code and provide support for Python v2.6.
-
- setup.py | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-commit c5966abec9d772b3922d32650da288fd50a217be
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Thu May 15 19:43:00 2014 +0100
-
-    README.txt in ReST, including headlines
-
- README.txt | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-commit 43ee8c6f34fa9b6d3975aa6ea60b3d4a741fa721
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Thu May 15 19:37:15 2014 +0100
-
-    README.txt in ReST
-
- README.txt | 25 +++++++++++++------------
- 1 file changed, 13 insertions(+), 12 deletions(-)
-
-commit f71a369484cba8801df23ccc5842335fa496c0df
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Thu May 15 19:28:12 2014 +0100
-
-    added MANIFEST.in and README.txt (instead of .md)
-
- MANIFEST.in |  6 ++++++
- README.md   | 27 ---------------------------
- README.txt  | 27 +++++++++++++++++++++++++++
- 3 files changed, 33 insertions(+), 27 deletions(-)
-
-commit d0d6755229f920b0bed043e9c2731de2d57c096c
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Tue May 13 09:52:44 2014 +0100
-
-    added mailing list to README
-
- README.md | 19 ++++++++++++++++---
- 1 file changed, 16 insertions(+), 3 deletions(-)
-
-commit 30ca60ddf92df684de261cb24c83c68089be0adc
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sun May 11 13:34:28 2014 +0100
-
-    we don't need a separate out of date ChangeLog file
-
- ChangeLog | 802 --------------------------------------------------------------
- 1 file changed, 802 deletions(-)
-
-commit 8263f1a6d38fdb7f5f3dd5c7e28f83caa7528a08
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sun May 11 13:32:31 2014 +0100
-
-    adding README.md
-
- README.md | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
-commit 3fc71b47e9e14b0b984801c28d722723baa4b406
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 10 15:43:06 2014 +0100
-
-    ValueError -> RuntimeError
-
- setup.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit eec432abea56296b9fa36aac0d10926a2335b739
-Merge: eea6537 d2738b3
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 10 15:41:02 2014 +0100
-
-    Merge branch 'master' of bitbucket.org:malb/pyme
-
-    Conflicts:
-        setup.py
-
-commit eea6537921061b4dcfc54e00a99d3fa110e71433
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 10 15:39:51 2014 +0100
-
-    check for swig
-
- setup.py | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
-commit 53867bf9715ee1b4ea873bf5e2fbb7d9740a2b4a
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 10 15:35:04 2014 +0100
-
-    more friendly error message if gpgme is missing
-
- setup.py | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-commit d2738b35d63b1492d69641c5466103685f2d3a30
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 10 15:35:04 2014 +0100
-
-    more friendly error message if gpgme is missing
-
- setup.py | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-commit c0b01240becf8ba6cf1d4c1f64b2cb4c056f5163
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Fri May 9 15:20:24 2014 +0100
-
-    version number should have three digits
-
- pyme/version.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 6672bb60b9bec60d38e854016c48658b57774578
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Wed May 7 15:11:08 2014 +0100
-
-    bump version number for upcoming release
-
- pyme/version.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 7bd6de700f33ca5d1f27bc16ebbd401f21d2e788
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 3 19:36:25 2014 +0100
-
-    bump version number to indicate changes
-
- pyme/version.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 4fb6bd9b3f47c1a343242ac83b326cacd12a136e
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 3 19:34:07 2014 +0100
-
-    pyme instead of pygpgme
-
- setup.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 9548973138d78241a45ccb82333b25f2cf36ce7d
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 3 19:31:10 2014 +0100
-
-    dirty hack to make 'python setup.py install' work
-
- setup.py | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-commit a961d7eab9db478b7e603324bc5d243bd3c84bad
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 3 19:05:44 2014 +0100
-
-    moved everything down to the toplevel directory
-
- COPYING                                 |  340 ++
- COPYING.LESSER                          |  510 +++
- ChangeLog                               |  802 +++++
- INSTALL                                 |   15 +
- Makefile                                |  104 +
- debian/README.Debian                    |    6 +
- debian/changelog                        |   93 +
- debian/control                          |   34 +
- debian/copyright                        |   25 +
- debian/docs                             |    2 +
- debian/examples                         |    2 +
- debian/rules                            |   99 +
- examples/PyGtkGpgKeys.glade             | 1394 ++++++++
- examples/PyGtkGpgKeys.gladep            |    8 +
- examples/PyGtkGpgKeys.py                |  663 ++++
- examples/delkey.py                      |   34 +
- examples/encrypt-to-all.py              |   65 +
- examples/exportimport.py                |   75 +
- examples/genkey.py                      |   45 +
- examples/inter-edit.py                  |   57 +
- examples/pygpa.glade                    | 5546 +++++++++++++++++++++++++++++++
- examples/pygpa.py                       | 1457 ++++++++
- examples/sign.py                        |   31 +
- examples/signverify.py                  |   78 +
- examples/simple.py                      |   52 +
- examples/t-edit.py                      |   59 +
- examples/testCMSgetkey.py               |   45 +
- examples/verifydetails.py               |  100 +
- gpgme-h-clean.py                        |   42 +
- gpgme.i                                 |  267 ++
- helpers.c                               |  154 +
- helpers.h                               |   36 +
- pyme/COPYING                            |  340 --
- pyme/COPYING.LESSER                     |  510 ---
- pyme/ChangeLog                          |  802 -----
- pyme/INSTALL                            |   15 -
- pyme/Makefile                           |  104 -
- pyme/__init__.py                        |  137 +
- pyme/callbacks.py                       |   47 +
- pyme/constants/__init__.py              |    7 +
- pyme/constants/data/__init__.py         |    4 +
- pyme/constants/data/encoding.py         |   20 +
- pyme/constants/event.py                 |   20 +
- pyme/constants/import.py                |   20 +
- pyme/constants/keylist/__init__.py      |    4 +
- pyme/constants/keylist/mode.py          |   20 +
- pyme/constants/md.py                    |   20 +
- pyme/constants/pk.py                    |   20 +
- pyme/constants/protocol.py              |   20 +
- pyme/constants/sig/__init__.py          |    4 +
- pyme/constants/sig/mode.py              |   20 +
- pyme/constants/sigsum.py                |   20 +
- pyme/constants/status.py                |   20 +
- pyme/constants/validity.py              |   20 +
- pyme/core.py                            |  463 +++
- pyme/debian/README.Debian               |    6 -
- pyme/debian/changelog                   |   93 -
- pyme/debian/control                     |   34 -
- pyme/debian/copyright                   |   25 -
- pyme/debian/docs                        |    2 -
- pyme/debian/examples                    |    2 -
- pyme/debian/rules                       |   99 -
- pyme/errors.py                          |   46 +
- pyme/examples/PyGtkGpgKeys.glade        | 1394 --------
- pyme/examples/PyGtkGpgKeys.gladep       |    8 -
- pyme/examples/PyGtkGpgKeys.py           |  663 ----
- pyme/examples/delkey.py                 |   34 -
- pyme/examples/encrypt-to-all.py         |   65 -
- pyme/examples/exportimport.py           |   75 -
- pyme/examples/genkey.py                 |   45 -
- pyme/examples/inter-edit.py             |   57 -
- pyme/examples/pygpa.glade               | 5546 -------------------------------
- pyme/examples/pygpa.py                  | 1457 --------
- pyme/examples/sign.py                   |   31 -
- pyme/examples/signverify.py             |   78 -
- pyme/examples/simple.py                 |   52 -
- pyme/examples/t-edit.py                 |   59 -
- pyme/examples/testCMSgetkey.py          |   45 -
- pyme/examples/verifydetails.py          |  100 -
- pyme/gpgme-h-clean.py                   |   42 -
- pyme/gpgme.i                            |  267 --
- pyme/helpers.c                          |  154 -
- pyme/helpers.h                          |   36 -
- pyme/pyme/__init__.py                   |  137 -
- pyme/pyme/callbacks.py                  |   47 -
- pyme/pyme/constants/__init__.py         |    7 -
- pyme/pyme/constants/data/__init__.py    |    4 -
- pyme/pyme/constants/data/encoding.py    |   20 -
- pyme/pyme/constants/event.py            |   20 -
- pyme/pyme/constants/import.py           |   20 -
- pyme/pyme/constants/keylist/__init__.py |    4 -
- pyme/pyme/constants/keylist/mode.py     |   20 -
- pyme/pyme/constants/md.py               |   20 -
- pyme/pyme/constants/pk.py               |   20 -
- pyme/pyme/constants/protocol.py         |   20 -
- pyme/pyme/constants/sig/__init__.py     |    4 -
- pyme/pyme/constants/sig/mode.py         |   20 -
- pyme/pyme/constants/sigsum.py           |   20 -
- pyme/pyme/constants/status.py           |   20 -
- pyme/pyme/constants/validity.py         |   20 -
- pyme/pyme/core.py                       |  463 ---
- pyme/pyme/errors.py                     |   46 -
- pyme/pyme/util.py                       |   72 -
- pyme/pyme/version.py                    |   41 -
- pyme/setup.py                           |   99 -
- pyme/util.py                            |   72 +
- pyme/version.py                         |   41 +
- setup.py                                |   99 +
- 108 files changed, 13384 insertions(+), 13384 deletions(-)
-
-commit 8148cdd424c434e833ce427612ea8c89abc6e41c
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Sat May 3 18:58:52 2014 +0100
-
-    removing pyme-web
-
- pyme-web/Makefile                                  |  15 -
- pyme-web/default.css                               |  37 --
- pyme-web/doc/gpgme/ASCII-Armor.html                |  57 ---
- pyme-web/doc/gpgme/Advanced-Key-Editing.html       |  98 ----
- pyme-web/doc/gpgme/Algorithms.html                 |  47 --
- pyme-web/doc/gpgme/Building-the-Source.html        |  82 ----
- .../doc/gpgme/Callback-Based-Data-Buffers.html     | 148 ------
- pyme-web/doc/gpgme/Cancellation.html               |  67 ---
- pyme-web/doc/gpgme/Concept-Index.html              | 186 -------
- pyme-web/doc/gpgme/Context-Attributes.html         |  52 --
- pyme-web/doc/gpgme/Contexts.html                   |  61 ---
- pyme-web/doc/gpgme/Creating-Contexts.html          |  49 --
- pyme-web/doc/gpgme/Creating-Data-Buffers.html      |  47 --
- pyme-web/doc/gpgme/Creating-a-Signature.html       | 143 ------
- pyme-web/doc/gpgme/Crypto-Engine.html              |  79 ---
- pyme-web/doc/gpgme/Crypto-Operations.html          |  67 ---
- .../doc/gpgme/Cryptographic-Message-Syntax.html    |  42 --
- .../doc/gpgme/Data-Buffer-I_002fO-Operations.html  | 104 ----
- pyme-web/doc/gpgme/Data-Buffer-Meta_002dData.html  | 100 ----
- pyme-web/doc/gpgme/Decrypt-and-Verify.html         |  79 ---
- pyme-web/doc/gpgme/Decrypt.html                    | 123 -----
- pyme-web/doc/gpgme/Deleting-Keys.html              |  67 ---
- pyme-web/doc/gpgme/Destroying-Contexts.html        |  46 --
- pyme-web/doc/gpgme/Destroying-Data-Buffers.html    |  70 ---
- pyme-web/doc/gpgme/Encrypt.html                    |  45 --
- pyme-web/doc/gpgme/Encrypting-a-Plaintext.html     | 147 ------
- pyme-web/doc/gpgme/Engine-Configuration.html       |  65 ---
- pyme-web/doc/gpgme/Engine-Information.html         | 119 -----
- pyme-web/doc/gpgme/Engine-Version-Check.html       |  48 --
- pyme-web/doc/gpgme/Error-Codes.html                | 133 -----
- pyme-web/doc/gpgme/Error-Handling.html             |  72 ---
- pyme-web/doc/gpgme/Error-Sources.html              |  89 ----
- pyme-web/doc/gpgme/Error-Strings.html              |  80 ---
- pyme-web/doc/gpgme/Error-Values.html               | 159 ------
- pyme-web/doc/gpgme/Exchanging-Data.html            |  58 ---
- pyme-web/doc/gpgme/Exporting-Keys.html             | 101 ----
- pyme-web/doc/gpgme/Features.html                   |  59 ---
- pyme-web/doc/gpgme/File-Based-Data-Buffers.html    |  74 ---
- pyme-web/doc/gpgme/Function-and-Data-Index.html    | 229 ---------
- pyme-web/doc/gpgme/Generating-Keys.html            | 144 ------
- pyme-web/doc/gpgme/Getting-Started.html            |  55 ---
- pyme-web/doc/gpgme/Hash-Algorithms.html            |  59 ---
- pyme-web/doc/gpgme/Header.html                     |  53 --
- .../doc/gpgme/I_002fO-Callback-Example-GDK.html    |  85 ----
- .../gpgme/I_002fO-Callback-Example-GTK_002b.html   |  86 ----
- .../doc/gpgme/I_002fO-Callback-Example-Qt.html     |  99 ----
- pyme-web/doc/gpgme/I_002fO-Callback-Example.html   | 259 ----------
- pyme-web/doc/gpgme/I_002fO-Callback-Interface.html | 142 ------
- pyme-web/doc/gpgme/Importing-Keys.html             | 171 -------
- pyme-web/doc/gpgme/Included-Certificates.html      |  70 ---
- pyme-web/doc/gpgme/Information-About-Keys.html     | 207 --------
- .../doc/gpgme/Information-About-Trust-Items.html   |  75 ---
- pyme-web/doc/gpgme/Introduction.html               |  53 --
- pyme-web/doc/gpgme/Key-Listing-Mode.html           |  99 ----
- pyme-web/doc/gpgme/Key-Management.html             | 260 ----------
- pyme-web/doc/gpgme/Key-Signatures.html             | 130 -----
- .../doc/gpgme/Largefile-Support-_0028LFS_0029.html | 110 -----
- pyme-web/doc/gpgme/Library-Copying.html            | 542 ---------------------
- pyme-web/doc/gpgme/Library-Version-Check.html      |  97 ----
- pyme-web/doc/gpgme/Listing-Keys.html               | 204 --------
- pyme-web/doc/gpgme/Listing-Trust-Items.html        |  88 ----
- pyme-web/doc/gpgme/Locale.html                     |  69 ---
- pyme-web/doc/gpgme/Manipulating-Data-Buffers.html  |  45 --
- pyme-web/doc/gpgme/Manipulating-Keys.html          |  63 ---
- pyme-web/doc/gpgme/Manipulating-Trust-Items.html   |  62 ---
- pyme-web/doc/gpgme/Memory-Based-Data-Buffers.html  | 107 ----
- pyme-web/doc/gpgme/Multi-Threading.html            |  93 ----
- pyme-web/doc/gpgme/OpenPGP.html                    |  44 --
- pyme-web/doc/gpgme/Overview.html                   |  57 ---
- pyme-web/doc/gpgme/Passphrase-Callback.html        | 101 ----
- pyme-web/doc/gpgme/Preparation.html                |  54 --
- pyme-web/doc/gpgme/Progress-Meter-Callback.html    |  80 ---
- pyme-web/doc/gpgme/Protocol-Selection.html         |  60 ---
- pyme-web/doc/gpgme/Protocols-and-Engines.html      |  82 ----
- pyme-web/doc/gpgme/Public-Key-Algorithms.html      |  74 ---
- .../doc/gpgme/Registering-I_002fO-Callbacks.html   |  81 ---
- pyme-web/doc/gpgme/Run-Control.html                |  53 --
- pyme-web/doc/gpgme/Selecting-Signers.html          |  64 ---
- pyme-web/doc/gpgme/Sign.html                       |  50 --
- pyme-web/doc/gpgme/Signal-Handling.html            |  61 ---
- pyme-web/doc/gpgme/Signature-Notation-Data.html    |  85 ----
- pyme-web/doc/gpgme/Text-Mode.html                  |  63 ---
- pyme-web/doc/gpgme/Trust-Item-Management.html      |  68 ---
- pyme-web/doc/gpgme/Using-Automake.html             |  74 ---
- pyme-web/doc/gpgme/Using-External-Event-Loops.html |  74 ---
- pyme-web/doc/gpgme/Using-Libtool.html              |  44 --
- pyme-web/doc/gpgme/Verify.html                     | 492 -------------------
- pyme-web/doc/gpgme/Waiting-For-Completion.html     |  77 ---
- pyme-web/doc/gpgme/index.html                      | 169 -------
- pyme-web/doc/pyme/index.html                       | 164 -------
- pyme-web/doc/pyme/pyme.callbacks.html              |  42 --
- .../doc/pyme/pyme.constants.data.encoding.html     |  48 --
- pyme-web/doc/pyme/pyme.constants.data.html         |  29 --
- pyme-web/doc/pyme/pyme.constants.event.html        |  48 --
- pyme-web/doc/pyme/pyme.constants.html              |  39 --
- pyme-web/doc/pyme/pyme.constants.import.html       |  49 --
- pyme-web/doc/pyme/pyme.constants.keylist.html      |  29 --
- pyme-web/doc/pyme/pyme.constants.keylist.mode.html |  49 --
- pyme-web/doc/pyme/pyme.constants.md.html           |  58 ---
- pyme-web/doc/pyme/pyme.constants.pk.html           |  50 --
- pyme-web/doc/pyme/pyme.constants.protocol.html     |  48 --
- pyme-web/doc/pyme/pyme.constants.sig.html          |  29 --
- pyme-web/doc/pyme/pyme.constants.sig.mode.html     |  47 --
- pyme-web/doc/pyme/pyme.constants.sigsum.html       |  55 ---
- pyme-web/doc/pyme/pyme.constants.status.html       | 126 -----
- pyme-web/doc/pyme/pyme.constants.validity.html     |  50 --
- pyme-web/doc/pyme/pyme.core.html                   | 277 -----------
- pyme-web/doc/pyme/pyme.errors.html                 |  82 ----
- pyme-web/doc/pyme/pyme.html                        | 164 -------
- pyme-web/doc/pyme/pyme.util.html                   |  81 ---
- pyme-web/doc/pyme/pyme.version.html                |  37 --
- pyme-web/index.html                                |  72 ---
- 112 files changed, 10551 deletions(-)
-
-commit 684d95feb7e10e538a56fb1b27f1456111bacb60
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Mon Jan 6 17:44:20 2014 +0100
-
-    fixing op_export_keys()
-
-    the conversion of gpgme_key_t [] was restricted to gpgme_key_t [] with the
-    name recv, i.e. only the use-cases of encryption were covered.
-
-    see: http://sourceforge.net/mailarchive/forum.php?forum_name=pyme-help&max_rows=25&style=nested&viewmonth=201309
-
- pyme/gpgme.i | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-commit 658d23b95110d21eeb50abf4e74701a667521a88
-Author: Martin Albrecht <martinralbrecht@googlemail.com>
-Date:   Mon Jan 6 17:41:33 2014 +0100
-
-    deleting CVSROOT
-
- CVSROOT/checkoutlist | 13 -------------
- CVSROOT/commitinfo   | 15 ---------------
- CVSROOT/config       | 21 ---------------------
- CVSROOT/cvswrappers  | 19 -------------------
- CVSROOT/editinfo     | 21 ---------------------
- CVSROOT/loginfo      | 26 --------------------------
- CVSROOT/modules      | 26 --------------------------
- CVSROOT/notify       | 12 ------------
- CVSROOT/rcsinfo      | 13 -------------
- CVSROOT/taginfo      | 20 --------------------
- CVSROOT/verifymsg    | 21 ---------------------
- 11 files changed, 207 deletions(-)
-
-commit 576b555499c094c4786d42de9e59aa9826009b89
-Author: convert-repo <devnull@localhost>
-Date:   Mon Jan 6 15:22:44 2014 +0000
-
-    update tags
-
-commit 2dcf0c5b702eb5a18c66ff1e42a72eaa7427af1d
-Author: belyi <devnull@localhost>
-Date:   Wed Nov 26 02:38:33 2008 +0000
-
-    Move Windows specific fix from helpers.c to helpers.h so that it works
-    for edit callback as well as for the passphrase one.
-
- pyme/helpers.c | 5 -----
- pyme/helpers.h | 5 +++++
- 2 files changed, 5 insertions(+), 5 deletions(-)
-
-commit 42a035f2ef62470fea7a7f8ee33a1297fa90a603
-Author: belyi <devnull@localhost>
-Date:   Mon Nov 24 21:44:30 2008 +0000
-
-    Update the way build directives are constructed on MinGW to have a bit
-    more robust. Update PyMe build version to 0.8.1 in version.py
-
- pyme/pyme/version.py |  2 +-
- pyme/setup.py        | 10 ++++++++--
- 2 files changed, 9 insertions(+), 3 deletions(-)
-
-commit 3aaa20fbcba17066c9ffd580f5209946022793a2
-Author: belyi <devnull@localhost>
-Date:   Mon Nov 24 06:57:11 2008 +0000
-
-    Update changelog
-
- pyme/debian/changelog | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-commit 689ff46b2550547e3883f809a6dc40c22c3e137e
-Author: belyi <devnull@localhost>
-Date:   Mon Nov 24 06:50:41 2008 +0000
-
-    Fix hang problem on Windows when password is written to a filehandle.
-    Fix the way path is constructed on MinGW platform.
-
- pyme/helpers.c | 5 +++++
- pyme/setup.py  | 4 ++--
- 2 files changed, 7 insertions(+), 2 deletions(-)
-
-commit 852a60d541d66cb56f40378182b976fd87a02c46
-Author: belyi <devnull@localhost>
-Date:   Sun Nov 23 04:31:31 2008 +0000
-
-    Add Bernard's example testCMSgetkey.py and his updates for
-    verifydetails.py
-
- pyme/examples/testCMSgetkey.py | 45 ++++++++++++++++++++++++++++++++++++++++++
- pyme/examples/verifydetails.py | 43 +++++++++++++++++++++++++++++-----------
- 2 files changed, 77 insertions(+), 11 deletions(-)
-
-commit f080527d9184f3360f0a8ef6136b9a188d8e7d2a
-Author: belyi <devnull@localhost>
-Date:   Thu May 29 18:29:37 2008 +0000
-
-    Remove debian packaging for python2.3 since it is removed from both
-    testing and unstable dists.
-    Update docs build target to have correct PYTHONPATH set.
-
- pyme/Makefile         | 2 +-
- pyme/debian/changelog | 4 +++-
- pyme/debian/control   | 4 ++--
- pyme/debian/rules     | 2 --
- 4 files changed, 6 insertions(+), 6 deletions(-)
-
-commit c25d133fcbadf3c7f6e655586b4a05d6e3cf6f0b
-Author: belyi <devnull@localhost>
-Date:   Thu Apr 3 13:37:12 2008 +0000
-
-    Forgot to adjust mainText margin. Doing it now.
-
- pyme-web/default.css | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit 897286a54a32336d060cd03305cdecb7905f34f1
-Author: belyi <devnull@localhost>
-Date:   Thu Apr 3 13:00:11 2008 +0000
-
-    Fix an error in default.css and make index.html "Standards Compliant".
-
- pyme-web/default.css | 2 +-
- pyme-web/index.html  | 7 ++++---
- 2 files changed, 5 insertions(+), 4 deletions(-)
-
-commit 4e049212bd214449cc0ba1ce06e00782783f328a
-Author: belyi <devnull@localhost>
-Date:   Thu Apr 3 12:38:42 2008 +0000
-
-    Adjust spacing between links.
-
- pyme-web/default.css | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
-
-commit cb2bddfbd77483b1deb14f2eab0715a03dd33fcd
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 2 22:50:21 2008 +0000
-
-    Make style a big more IE friendly.
-
- pyme-web/default.css | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
-
-commit ad66f0a1bb01b46baac328e9fee439b35a60c232
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 2 11:58:32 2008 +0000
-
-    Make GPGME documentation a bit more web friendly on the index.html page.
-
- pyme-web/doc/gpgme/Algorithms.html              |   2 +-
- pyme-web/doc/gpgme/Concept-Index.html           |   2 +-
- pyme-web/doc/gpgme/Contexts.html                |   2 +-
- pyme-web/doc/gpgme/Error-Handling.html          |   2 +-
- pyme-web/doc/gpgme/Exchanging-Data.html         |   2 +-
- pyme-web/doc/gpgme/Function-and-Data-Index.html |   2 +-
- pyme-web/doc/gpgme/Introduction.html            |   4 +-
- pyme-web/doc/gpgme/Library-Copying.html         |   2 +-
- pyme-web/doc/gpgme/Preparation.html             |   2 +-
- pyme-web/doc/gpgme/Protocols-and-Engines.html   |   2 +-
- pyme-web/doc/gpgme/index.html                   | 229 +-----------------------
- 11 files changed, 12 insertions(+), 239 deletions(-)
-
-commit 4f57c0ccb049d4442e7732e2d1d05dabffd2a21d
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 2 06:12:57 2008 +0000
-
-    Add missing core.set_locale() to set default locale for contexts.
-
- pyme/debian/changelog | 2 +-
- pyme/pyme/core.py     | 4 ++++
- 2 files changed, 5 insertions(+), 1 deletion(-)
-
-commit acf7ead3dea8590cf9fe86b67bb125837ad6ed4f
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 2 05:50:24 2008 +0000
-
-    Avoid leaks caused by keys.
-    Add set/get methods for engine info.
-
- pyme/debian/changelog | 10 ++++++++++
- pyme/pyme/core.py     | 24 ++++++++++++++++++++++++
- 2 files changed, 34 insertions(+)
-
-commit df4a2fb518adbb6420d95ce74af212c87abff7e7
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 2 04:04:41 2008 +0000
-
-    Update index.html to reflect new versions on the web.
-
- pyme-web/Makefile             | 3 ++-
- pyme-web/doc/gpgme/index.html | 4 +---
- pyme-web/index.html           | 4 ++--
- 3 files changed, 5 insertions(+), 6 deletions(-)
-
-commit bd3ffc9bdf98d6aafde6b689c6c8215fa468612d
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 2 04:01:04 2008 +0000
-
-    Update PyMe documentation to match 0.8.0 version of the package.
-
- pyme-web/doc/pyme/index.html                       | 14 ++++-----
- pyme-web/doc/pyme/pyme.constants.keylist.mode.html |  1 +
- pyme-web/doc/pyme/pyme.constants.protocol.html     |  4 ++-
- pyme-web/doc/pyme/pyme.constants.status.html       |  9 ++++++
- pyme-web/doc/pyme/pyme.core.html                   | 36 ++++++++++++++++++----
- pyme-web/doc/pyme/pyme.errors.html                 |  8 ++---
- pyme-web/doc/pyme/pyme.html                        | 14 ++++-----
- pyme-web/doc/pyme/pyme.util.html                   | 17 ++++++++--
- pyme-web/doc/pyme/pyme.version.html                | 14 ++++-----
- 9 files changed, 82 insertions(+), 35 deletions(-)
-
-commit 6973a69a317608a0d0661590d701f4e3f3a21b32
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 2 02:35:24 2008 +0000
-
-    Have a fix for Contents being put onto 'Function and Data Index' page.
-
- pyme-web/doc/gpgme/Concept-Index.html           |   2 +-
- pyme-web/doc/gpgme/Function-and-Data-Index.html | 153 +----------------------
- pyme-web/doc/gpgme/index.html                   | 154 +++++++++++++++++++++++-
- 3 files changed, 155 insertions(+), 154 deletions(-)
-
-commit 086315964cbc2abad1187f306dcb9c72ac3257f3
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 2 01:00:29 2008 +0000
-
-    Update GPGME documentation. It's for v1.1.6 now.
-
- pyme-web/doc/gpgme/ASCII-Armor.html                |  57 ++
- pyme-web/doc/gpgme/Advanced-Key-Editing.html       |  98 +++
- pyme-web/doc/gpgme/Algorithms.html                 |  47 ++
- pyme-web/doc/gpgme/Building-the-Source.html        |  82 +++
- .../doc/gpgme/Callback-Based-Data-Buffers.html     | 148 +++++
- pyme-web/doc/gpgme/Cancellation.html               |  67 ++
- pyme-web/doc/gpgme/Concept-Index.html              | 186 ++++++
- pyme-web/doc/gpgme/Context-Attributes.html         |  52 ++
- pyme-web/doc/gpgme/Contexts.html                   |  61 ++
- pyme-web/doc/gpgme/Creating-Contexts.html          |  49 ++
- pyme-web/doc/gpgme/Creating-Data-Buffers.html      |  47 ++
- pyme-web/doc/gpgme/Creating-a-Signature.html       | 143 +++++
- pyme-web/doc/gpgme/Crypto-Engine.html              |  79 +++
- pyme-web/doc/gpgme/Crypto-Operations.html          |  67 ++
- .../doc/gpgme/Cryptographic-Message-Syntax.html    |  42 ++
- .../doc/gpgme/Data-Buffer-I_002fO-Operations.html  | 104 ++++
- pyme-web/doc/gpgme/Data-Buffer-Meta_002dData.html  | 100 +++
- pyme-web/doc/gpgme/Decrypt-and-Verify.html         |  79 +++
- pyme-web/doc/gpgme/Decrypt.html                    | 123 ++++
- pyme-web/doc/gpgme/Deleting-Keys.html              |  67 ++
- pyme-web/doc/gpgme/Destroying-Contexts.html        |  46 ++
- pyme-web/doc/gpgme/Destroying-Data-Buffers.html    |  70 +++
- pyme-web/doc/gpgme/Encrypt.html                    |  45 ++
- pyme-web/doc/gpgme/Encrypting-a-Plaintext.html     | 147 +++++
- pyme-web/doc/gpgme/Engine-Configuration.html       |  65 ++
- pyme-web/doc/gpgme/Engine-Information.html         | 119 ++++
- pyme-web/doc/gpgme/Engine-Version-Check.html       |  48 ++
- pyme-web/doc/gpgme/Error-Codes.html                | 133 ++++
- pyme-web/doc/gpgme/Error-Handling.html             |  72 +++
- pyme-web/doc/gpgme/Error-Sources.html              |  89 +++
- pyme-web/doc/gpgme/Error-Strings.html              |  80 +++
- pyme-web/doc/gpgme/Error-Values.html               | 159 +++++
- pyme-web/doc/gpgme/Exchanging-Data.html            |  58 ++
- pyme-web/doc/gpgme/Exporting-Keys.html             | 101 +++
- pyme-web/doc/gpgme/Features.html                   |  59 ++
- pyme-web/doc/gpgme/File-Based-Data-Buffers.html    |  74 +++
- pyme-web/doc/gpgme/Function-and-Data-Index.html    | 380 ++++++++++++
- pyme-web/doc/gpgme/Generating-Keys.html            | 144 +++++
- pyme-web/doc/gpgme/Getting-Started.html            |  55 ++
- pyme-web/doc/gpgme/Hash-Algorithms.html            |  59 ++
- pyme-web/doc/gpgme/Header.html                     |  53 ++
- .../doc/gpgme/I_002fO-Callback-Example-GDK.html    |  85 +++
- .../gpgme/I_002fO-Callback-Example-GTK_002b.html   |  86 +++
- .../doc/gpgme/I_002fO-Callback-Example-Qt.html     |  99 +++
- pyme-web/doc/gpgme/I_002fO-Callback-Example.html   | 259 ++++++++
- pyme-web/doc/gpgme/I_002fO-Callback-Interface.html | 142 +++++
- pyme-web/doc/gpgme/Importing-Keys.html             | 171 +++++
- pyme-web/doc/gpgme/Included-Certificates.html      |  70 +++
- pyme-web/doc/gpgme/Information-About-Keys.html     | 207 +++++++
- .../doc/gpgme/Information-About-Trust-Items.html   |  75 +++
- pyme-web/doc/gpgme/Introduction.html               |  53 ++
- pyme-web/doc/gpgme/Key-Listing-Mode.html           |  99 +++
- pyme-web/doc/gpgme/Key-Management.html             | 260 ++++++++
- pyme-web/doc/gpgme/Key-Signatures.html             | 130 ++++
- .../doc/gpgme/Largefile-Support-_0028LFS_0029.html | 110 ++++
- pyme-web/doc/gpgme/Library-Copying.html            | 542 ++++++++++++++++
- pyme-web/doc/gpgme/Library-Version-Check.html      |  97 +++
- pyme-web/doc/gpgme/Listing-Keys.html               | 204 ++++++
- pyme-web/doc/gpgme/Listing-Trust-Items.html        |  88 +++
- pyme-web/doc/gpgme/Locale.html                     |  69 +++
- pyme-web/doc/gpgme/Manipulating-Data-Buffers.html  |  45 ++
- pyme-web/doc/gpgme/Manipulating-Keys.html          |  63 ++
- pyme-web/doc/gpgme/Manipulating-Trust-Items.html   |  62 ++
- pyme-web/doc/gpgme/Memory-Based-Data-Buffers.html  | 107 ++++
- pyme-web/doc/gpgme/Multi-Threading.html            |  93 +++
- pyme-web/doc/gpgme/OpenPGP.html                    |  44 ++
- pyme-web/doc/gpgme/Overview.html                   |  57 ++
- pyme-web/doc/gpgme/Passphrase-Callback.html        | 101 +++
- pyme-web/doc/gpgme/Preparation.html                |  54 ++
- pyme-web/doc/gpgme/Progress-Meter-Callback.html    |  80 +++
- pyme-web/doc/gpgme/Protocol-Selection.html         |  60 ++
- pyme-web/doc/gpgme/Protocols-and-Engines.html      |  82 +++
- pyme-web/doc/gpgme/Public-Key-Algorithms.html      |  74 +++
- .../doc/gpgme/Registering-I_002fO-Callbacks.html   |  81 +++
- pyme-web/doc/gpgme/Run-Control.html                |  53 ++
- pyme-web/doc/gpgme/Selecting-Signers.html          |  64 ++
- pyme-web/doc/gpgme/Sign.html                       |  50 ++
- pyme-web/doc/gpgme/Signal-Handling.html            |  61 ++
- pyme-web/doc/gpgme/Signature-Notation-Data.html    |  85 +++
- pyme-web/doc/gpgme/Text-Mode.html                  |  63 ++
- pyme-web/doc/gpgme/Trust-Item-Management.html      |  68 ++
- pyme-web/doc/gpgme/Using-Automake.html             |  74 +++
- pyme-web/doc/gpgme/Using-External-Event-Loops.html |  74 +++
- pyme-web/doc/gpgme/Using-Libtool.html              |  44 ++
- pyme-web/doc/gpgme/Verify.html                     | 492 +++++++++++++++
- pyme-web/doc/gpgme/Waiting-For-Completion.html     |  77 +++
- pyme-web/doc/gpgme/gpgme.html                      | 251 --------
- pyme-web/doc/gpgme/gpgme_1.html                    |  76 ---
- pyme-web/doc/gpgme/gpgme_10.html                   |  61 --
- pyme-web/doc/gpgme/gpgme_11.html                   | 130 ----
- pyme-web/doc/gpgme/gpgme_12.html                   |  82 ---
- pyme-web/doc/gpgme/gpgme_13.html                   | 130 ----
- pyme-web/doc/gpgme/gpgme_14.html                   | 108 ----
- pyme-web/doc/gpgme/gpgme_15.html                   |  69 ---
- pyme-web/doc/gpgme/gpgme_16.html                   | 169 -----
- pyme-web/doc/gpgme/gpgme_17.html                   |  63 --
- pyme-web/doc/gpgme/gpgme_18.html                   |  63 --
- pyme-web/doc/gpgme/gpgme_19.html                   |  66 --
- pyme-web/doc/gpgme/gpgme_2.html                    |  79 ---
- pyme-web/doc/gpgme/gpgme_20.html                   | 120 ----
- pyme-web/doc/gpgme/gpgme_21.html                   | 102 ---
- pyme-web/doc/gpgme/gpgme_22.html                   | 108 ----
- pyme-web/doc/gpgme/gpgme_23.html                   | 237 -------
- pyme-web/doc/gpgme/gpgme_24.html                   | 154 -----
- pyme-web/doc/gpgme/gpgme_25.html                   | 248 --------
- pyme-web/doc/gpgme/gpgme_26.html                   | 107 ----
- pyme-web/doc/gpgme/gpgme_27.html                   |  80 ---
- pyme-web/doc/gpgme/gpgme_28.html                   |  67 --
- pyme-web/doc/gpgme/gpgme_29.html                   | 164 -----
- pyme-web/doc/gpgme/gpgme_3.html                    |  86 ---
- pyme-web/doc/gpgme/gpgme_30.html                   | 106 ----
- pyme-web/doc/gpgme/gpgme_31.html                   | 232 -------
- pyme-web/doc/gpgme/gpgme_32.html                   |  85 ---
- pyme-web/doc/gpgme/gpgme_33.html                   | 223 -------
- pyme-web/doc/gpgme/gpgme_34.html                   |  83 ---
- pyme-web/doc/gpgme/gpgme_35.html                   |  70 ---
- pyme-web/doc/gpgme/gpgme_36.html                   |  63 --
- pyme-web/doc/gpgme/gpgme_37.html                   |  66 --
- pyme-web/doc/gpgme/gpgme_38.html                   |  86 ---
- pyme-web/doc/gpgme/gpgme_39.html                   |  79 ---
- pyme-web/doc/gpgme/gpgme_4.html                    |  83 ---
- pyme-web/doc/gpgme/gpgme_40.html                   |  89 ---
- pyme-web/doc/gpgme/gpgme_41.html                   |  99 ---
- pyme-web/doc/gpgme/gpgme_42.html                   | 144 -----
- pyme-web/doc/gpgme/gpgme_43.html                   | 152 -----
- pyme-web/doc/gpgme/gpgme_44.html                   | 112 ----
- pyme-web/doc/gpgme/gpgme_45.html                   | 101 ---
- pyme-web/doc/gpgme/gpgme_46.html                   | 459 --------------
- pyme-web/doc/gpgme/gpgme_47.html                   | 292 ---------
- pyme-web/doc/gpgme/gpgme_48.html                   | 363 -----------
- pyme-web/doc/gpgme/gpgme_49.html                   | 209 -------
- pyme-web/doc/gpgme/gpgme_5.html                    |  74 ---
- pyme-web/doc/gpgme/gpgme_50.html                   |  88 ---
- pyme-web/doc/gpgme/gpgme_51.html                   | 208 -------
- pyme-web/doc/gpgme/gpgme_52.html                   | 154 -----
- pyme-web/doc/gpgme/gpgme_53.html                   | 291 ---------
- pyme-web/doc/gpgme/gpgme_54.html                   |  91 ---
- pyme-web/doc/gpgme/gpgme_55.html                   | 107 ----
- pyme-web/doc/gpgme/gpgme_56.html                   | 140 -----
- pyme-web/doc/gpgme/gpgme_57.html                   | 106 ----
- pyme-web/doc/gpgme/gpgme_58.html                   |  89 ---
- pyme-web/doc/gpgme/gpgme_59.html                   |  97 ---
- pyme-web/doc/gpgme/gpgme_6.html                    |  77 ---
- pyme-web/doc/gpgme/gpgme_60.html                   | 142 -----
- pyme-web/doc/gpgme/gpgme_61.html                   | 626 -------------------
- pyme-web/doc/gpgme/gpgme_62.html                   | 107 ----
- pyme-web/doc/gpgme/gpgme_63.html                   |  67 --
- pyme-web/doc/gpgme/gpgme_64.html                   |  95 ---
- pyme-web/doc/gpgme/gpgme_65.html                   | 233 -------
- pyme-web/doc/gpgme/gpgme_66.html                   |  65 --
- pyme-web/doc/gpgme/gpgme_67.html                   | 220 -------
- pyme-web/doc/gpgme/gpgme_68.html                   |  75 ---
- pyme-web/doc/gpgme/gpgme_69.html                   | 119 ----
- pyme-web/doc/gpgme/gpgme_7.html                    | 123 ----
- pyme-web/doc/gpgme/gpgme_70.html                   | 107 ----
- pyme-web/doc/gpgme/gpgme_71.html                   | 218 -------
- pyme-web/doc/gpgme/gpgme_72.html                   | 134 ----
- pyme-web/doc/gpgme/gpgme_73.html                   | 299 ---------
- pyme-web/doc/gpgme/gpgme_74.html                   | 103 ----
- pyme-web/doc/gpgme/gpgme_75.html                   | 104 ----
- pyme-web/doc/gpgme/gpgme_76.html                   | 118 ----
- pyme-web/doc/gpgme/gpgme_77.html                   |  95 ---
- pyme-web/doc/gpgme/gpgme_78.html                   |  71 ---
- pyme-web/doc/gpgme/gpgme_79.html                   | 686 ---------------------
- pyme-web/doc/gpgme/gpgme_8.html                    | 155 -----
- pyme-web/doc/gpgme/gpgme_80.html                   | 120 ----
- pyme-web/doc/gpgme/gpgme_81.html                   | 278 ---------
- pyme-web/doc/gpgme/gpgme_82.html                   | 272 --------
- pyme-web/doc/gpgme/gpgme_83.html                   | 180 ------
- pyme-web/doc/gpgme/gpgme_84.html                   |  99 ---
- pyme-web/doc/gpgme/gpgme_9.html                    | 104 ----
- pyme-web/doc/gpgme/gpgme_abt.html                  | 206 -------
- pyme-web/doc/gpgme/gpgme_fot.html                  |  53 --
- pyme-web/doc/gpgme/gpgme_ovr.html                  |  68 --
- pyme-web/doc/gpgme/gpgme_toc.html                  | 247 --------
- pyme-web/doc/gpgme/index.html                      | 497 ++++++++-------
- 176 files changed, 9054 insertions(+), 13378 deletions(-)
-
-commit 163c1053dc761682f5a4231da163bdd0ff7162d7
-Author: belyi <devnull@localhost>
-Date:   Tue Apr 1 21:14:29 2008 +0000
-
-    Update Home page to be a bit more visitor friendly.
-
- pyme-web/Makefile    |  2 +-
- pyme-web/default.css | 27 ++++++++++++++++++++
- pyme-web/index.html  | 70 +++++++++++++++++++++++++++++++++++-----------------
- 3 files changed, 75 insertions(+), 24 deletions(-)
-
-commit 05db2d17d8fda0ab8c948bbdc0643dfc1466830d
-Author: belyi <devnull@localhost>
-Date:   Sun Mar 30 21:27:38 2008 +0000
-
-    Add a rule to build binary distribution for Windows.
-
- pyme/Makefile | 16 ++++++++++++++--
- 1 file changed, 14 insertions(+), 2 deletions(-)
-
-commit 57acb1089f5f8c24323ee62fc0a7f492a496b9c0
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 29 22:50:11 2008 +0000
-
-    Switch to using central location for python files (pycentral)
-    Update docs rule to fix location of the python source files.
-
- pyme/Makefile             |  5 +++-
- pyme/debian/changelog     |  4 ++-
- pyme/debian/control       | 74 +++++------------------------------------------
- pyme/debian/dirs          |  2 --
- pyme/debian/docs          |  1 +
- pyme/debian/postinst.ex   | 48 ------------------------------
- pyme/debian/postrm.ex     | 38 ------------------------
- pyme/debian/preinst.ex    | 44 ----------------------------
- pyme/debian/prerm.ex      | 39 -------------------------
- pyme/debian/rules         | 50 ++++++--------------------------
- pyme/debian/setup.cfg-2.2 |  8 -----
- pyme/debian/setup.cfg-2.3 |  8 -----
- pyme/debian/setup.cfg-2.4 |  8 -----
- pyme/gpgme-h-clean.py     |  2 +-
- pyme/pyme/core.py         |  2 +-
- pyme/pyme/util.py         |  2 +-
- 16 files changed, 28 insertions(+), 307 deletions(-)
-
-commit 2b56fd10517cfbcffaa4ba98d8ea42f40f0d38a9
-Author: belyi <devnull@localhost>
-Date:   Sun Mar 23 02:01:12 2008 +0000
-
-    Turn SWIG's autodoc feature on. Ignore 'next' in the types which are lists now.
-    Use new style for class declarations. Specify None as a default value for
-    core.check_version() method. Update version.py for 0.8.0 version.
-
- pyme/examples/pygpa.py | 2 +-
- pyme/gpgme.i           | 5 +++++
- pyme/pyme/core.py      | 2 +-
- pyme/pyme/util.py      | 5 +++--
- pyme/pyme/version.py   | 6 +++---
- 5 files changed, 13 insertions(+), 7 deletions(-)
-
-commit df5e25d7ee4dc0aa0d429f9d009322dd8ac33bb8
-Author: belyi <devnull@localhost>
-Date:   Thu Mar 20 19:07:00 2008 +0000
-
-    Improve matching for DEPRECATED typedefs
-
- pyme/gpgme-h-clean.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit 78d8fc732848ac267ec65e9069265cd500587cdf
-Author: belyi <devnull@localhost>
-Date:   Wed Mar 19 19:28:40 2008 +0000
-
-    Update API to use list when types containing 'next' field are return.
-    Update examples accordingly
-    Add verifydetails.py example
-    Start adding bullets for 0.8.0 version.
-
- pyme/Makefile                   |  2 +-
- pyme/debian/changelog           | 14 +++++++-
- pyme/examples/PyGtkGpgKeys.py   | 53 +++++++++++++--------------
- pyme/examples/delkey.py         |  7 ++--
- pyme/examples/encrypt-to-all.py |  7 ++--
- pyme/examples/exportimport.py   |  7 ++--
- pyme/examples/pygpa.py          | 70 ++++++++++++++++--------------------
- pyme/examples/signverify.py     | 11 +++---
- pyme/examples/verifydetails.py  | 79 +++++++++++++++++++++++++++++++++++++++++
- pyme/gpgme.i                    | 19 +++++++++-
- 10 files changed, 180 insertions(+), 89 deletions(-)
-
-commit 342d85b07475e7360bcd62804bf5facda039494f
-Author: belyi <devnull@localhost>
-Date:   Mon Mar 10 01:14:16 2008 +0000
-
-    Change references to source files so that they point to the WebCVS browse
-    location.
-
- pyme-web/doc/pyme/index.html                        | 2 +-
- pyme-web/doc/pyme/pyme.callbacks.html               | 2 +-
- pyme-web/doc/pyme/pyme.constants.data.encoding.html | 2 +-
- pyme-web/doc/pyme/pyme.constants.data.html          | 2 +-
- pyme-web/doc/pyme/pyme.constants.event.html         | 2 +-
- pyme-web/doc/pyme/pyme.constants.html               | 2 +-
- pyme-web/doc/pyme/pyme.constants.import.html        | 2 +-
- pyme-web/doc/pyme/pyme.constants.keylist.html       | 2 +-
- pyme-web/doc/pyme/pyme.constants.keylist.mode.html  | 2 +-
- pyme-web/doc/pyme/pyme.constants.md.html            | 2 +-
- pyme-web/doc/pyme/pyme.constants.pk.html            | 2 +-
- pyme-web/doc/pyme/pyme.constants.protocol.html      | 2 +-
- pyme-web/doc/pyme/pyme.constants.sig.html           | 2 +-
- pyme-web/doc/pyme/pyme.constants.sig.mode.html      | 2 +-
- pyme-web/doc/pyme/pyme.constants.sigsum.html        | 2 +-
- pyme-web/doc/pyme/pyme.constants.status.html        | 2 +-
- pyme-web/doc/pyme/pyme.constants.validity.html      | 2 +-
- pyme-web/doc/pyme/pyme.core.html                    | 2 +-
- pyme-web/doc/pyme/pyme.errors.html                  | 2 +-
- pyme-web/doc/pyme/pyme.html                         | 2 +-
- pyme-web/doc/pyme/pyme.util.html                    | 2 +-
- pyme-web/doc/pyme/pyme.version.html                 | 2 +-
- 22 files changed, 22 insertions(+), 22 deletions(-)
-
-commit 4139dd1d066c1a6c892d84fe45dc3e6c4aa1b803
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 8 18:21:08 2008 +0000
-
-    Add core.check_version(None) to all examples since this function is used by
-    Gpgme to do internal initialization. Update debian/rules to use dh_pysupport
-    instead of deprecated dh_python.
-
- pyme/debian/rules               | 8 +++-----
- pyme/examples/PyGtkGpgKeys.py   | 7 ++++++-
- pyme/examples/delkey.py         | 2 ++
- pyme/examples/encrypt-to-all.py | 3 +++
- pyme/examples/exportimport.py   | 2 ++
- pyme/examples/genkey.py         | 1 +
- pyme/examples/inter-edit.py     | 3 +++
- pyme/examples/pygpa.py          | 5 +++++
- pyme/examples/sign.py           | 2 ++
- pyme/examples/signverify.py     | 2 ++
- pyme/examples/simple.py         | 2 ++
- pyme/examples/t-edit.py         | 3 +++
- 12 files changed, 34 insertions(+), 6 deletions(-)
-
-commit ae76c6176457dd38e0634cbc17d794294a3a81d2
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 12 22:20:38 2006 +0000
-
-    Change name of internal package name from 'gpgme' to 'pygpgme' to avoid
-    conflict with gpgme.dll on Windows.
-    Fix build with SWIG 1.3.28.
-    Change version to 0.7.1 in a preparation for new release.
-
- pyme/Makefile          |   3 +-
- pyme/debian/changelog  |  12 ++++
- pyme/gpgme.i           |  19 +++---
- pyme/pyme/callbacks.py |   1 -
- pyme/pyme/core.py      | 153 +++++++++++++++++++++++++------------------------
- pyme/pyme/errors.py    |  12 ++--
- pyme/pyme/util.py      |  10 ++--
- pyme/pyme/version.py   |   2 +-
- pyme/setup.py          |   4 +-
- 9 files changed, 116 insertions(+), 100 deletions(-)
-
-commit d644383a76e9f83bc2d426628319e3c4a989dc2d
-Author: belyi <devnull@localhost>
-Date:   Sat Dec 17 01:34:53 2005 +0000
-
-    Put all constants into pyme.constants package to avoid stepping on python
-    reserved words.
-    Add build rules for Mingw32 and Cygwin on Windows. Rules for Mingw under
-    Debian are still to come.
-    Fixed a small bug in pygpa.py example.
-
- pyme/Makefile                   | 11 ++++++++---
- pyme/examples/pygpa.py          |  3 ++-
- pyme/pyme/__init__.py           |  2 +-
- pyme/pyme/constants/__init__.py |  3 +++
- pyme/setup.py                   | 42 ++++++++++++++++++++++++++++++++++++-----
- 5 files changed, 51 insertions(+), 10 deletions(-)
-
-commit 89eb370fcaa8adc9d219eadbaa579dde7bf06329
-Author: belyi <devnull@localhost>
-Date:   Mon Aug 1 03:08:32 2005 +0000
-
-    Imported changes provided by Joost van Baal:
-    Use dh_python in debian/rules and change the Section pyme belongs to from
-    'libs' to 'python'.
-
- pyme/debian/control | 6 +++---
- pyme/debian/rules   | 2 ++
- 2 files changed, 5 insertions(+), 3 deletions(-)
-
-commit ad76d10c2a77b45b7459c62131279e946b860891
-Author: belyi <devnull@localhost>
-Date:   Fri Jun 10 03:01:22 2005 +0000
-
-    Update 'docs' rule in Makefile to build packages first to ensure that
-    documentation is build for the current version of pyme and not for the
-    installed one.
-
-    Added 'callbacks' into the list of visible pyme modules (__all__ var.)
-
-    Slightly updated INSTALL file.
-
- pyme/INSTALL          | 11 ++++++++---
- pyme/Makefile         |  4 ++--
- pyme/pyme/__init__.py |  2 +-
- 3 files changed, 11 insertions(+), 6 deletions(-)
-
-commit 2fe1a81e00721698bfa6850b3db2eb85e43d1724
-Author: belyi <devnull@localhost>
-Date:   Wed Jun 8 16:16:18 2005 +0000
-
-    Update pyme documentation to remove dead links to pyme.gpgme.html and
-    pyme._gpgme.html
-    Added reference to the installed GPGME and PyMe documentation to the head
-    web page.
-    Updated Makefile to install all *.html files and to clean *~ files in all
-    subdirectories
-
- pyme-web/Makefile                     | 10 ++++++----
- pyme-web/doc/pyme/index.html          |  8 +++-----
- pyme-web/doc/pyme/pyme.callbacks.html |  8 --------
- pyme-web/doc/pyme/pyme.core.html      |  1 -
- pyme-web/doc/pyme/pyme.errors.html    |  8 --------
- pyme-web/doc/pyme/pyme.html           |  8 +++-----
- pyme-web/doc/pyme/pyme.util.html      |  8 --------
- pyme-web/index.html                   |  9 +++++++--
- 8 files changed, 19 insertions(+), 41 deletions(-)
-
-commit 6aa34cce4ea0099e50b4936dfee59778157b8ca8
-Author: belyi <devnull@localhost>
-Date:   Wed Jun 8 15:18:20 2005 +0000
-
-    Added pyme and gpgme documentation.
-
- pyme-web/doc/gpgme/gpgme.html                      | 251 ++++++++
- pyme-web/doc/gpgme/gpgme_1.html                    |  76 +++
- pyme-web/doc/gpgme/gpgme_10.html                   |  61 ++
- pyme-web/doc/gpgme/gpgme_11.html                   | 130 ++++
- pyme-web/doc/gpgme/gpgme_12.html                   |  82 +++
- pyme-web/doc/gpgme/gpgme_13.html                   | 130 ++++
- pyme-web/doc/gpgme/gpgme_14.html                   | 108 ++++
- pyme-web/doc/gpgme/gpgme_15.html                   |  69 +++
- pyme-web/doc/gpgme/gpgme_16.html                   | 169 +++++
- pyme-web/doc/gpgme/gpgme_17.html                   |  63 ++
- pyme-web/doc/gpgme/gpgme_18.html                   |  63 ++
- pyme-web/doc/gpgme/gpgme_19.html                   |  66 ++
- pyme-web/doc/gpgme/gpgme_2.html                    |  79 +++
- pyme-web/doc/gpgme/gpgme_20.html                   | 120 ++++
- pyme-web/doc/gpgme/gpgme_21.html                   | 102 +++
- pyme-web/doc/gpgme/gpgme_22.html                   | 108 ++++
- pyme-web/doc/gpgme/gpgme_23.html                   | 237 +++++++
- pyme-web/doc/gpgme/gpgme_24.html                   | 154 +++++
- pyme-web/doc/gpgme/gpgme_25.html                   | 248 ++++++++
- pyme-web/doc/gpgme/gpgme_26.html                   | 107 ++++
- pyme-web/doc/gpgme/gpgme_27.html                   |  80 +++
- pyme-web/doc/gpgme/gpgme_28.html                   |  67 ++
- pyme-web/doc/gpgme/gpgme_29.html                   | 164 +++++
- pyme-web/doc/gpgme/gpgme_3.html                    |  86 +++
- pyme-web/doc/gpgme/gpgme_30.html                   | 106 ++++
- pyme-web/doc/gpgme/gpgme_31.html                   | 232 +++++++
- pyme-web/doc/gpgme/gpgme_32.html                   |  85 +++
- pyme-web/doc/gpgme/gpgme_33.html                   | 223 +++++++
- pyme-web/doc/gpgme/gpgme_34.html                   |  83 +++
- pyme-web/doc/gpgme/gpgme_35.html                   |  70 +++
- pyme-web/doc/gpgme/gpgme_36.html                   |  63 ++
- pyme-web/doc/gpgme/gpgme_37.html                   |  66 ++
- pyme-web/doc/gpgme/gpgme_38.html                   |  86 +++
- pyme-web/doc/gpgme/gpgme_39.html                   |  79 +++
- pyme-web/doc/gpgme/gpgme_4.html                    |  83 +++
- pyme-web/doc/gpgme/gpgme_40.html                   |  89 +++
- pyme-web/doc/gpgme/gpgme_41.html                   |  99 +++
- pyme-web/doc/gpgme/gpgme_42.html                   | 144 +++++
- pyme-web/doc/gpgme/gpgme_43.html                   | 152 +++++
- pyme-web/doc/gpgme/gpgme_44.html                   | 112 ++++
- pyme-web/doc/gpgme/gpgme_45.html                   | 101 +++
- pyme-web/doc/gpgme/gpgme_46.html                   | 459 ++++++++++++++
- pyme-web/doc/gpgme/gpgme_47.html                   | 292 +++++++++
- pyme-web/doc/gpgme/gpgme_48.html                   | 363 +++++++++++
- pyme-web/doc/gpgme/gpgme_49.html                   | 209 +++++++
- pyme-web/doc/gpgme/gpgme_5.html                    |  74 +++
- pyme-web/doc/gpgme/gpgme_50.html                   |  88 +++
- pyme-web/doc/gpgme/gpgme_51.html                   | 208 +++++++
- pyme-web/doc/gpgme/gpgme_52.html                   | 154 +++++
- pyme-web/doc/gpgme/gpgme_53.html                   | 291 +++++++++
- pyme-web/doc/gpgme/gpgme_54.html                   |  91 +++
- pyme-web/doc/gpgme/gpgme_55.html                   | 107 ++++
- pyme-web/doc/gpgme/gpgme_56.html                   | 140 +++++
- pyme-web/doc/gpgme/gpgme_57.html                   | 106 ++++
- pyme-web/doc/gpgme/gpgme_58.html                   |  89 +++
- pyme-web/doc/gpgme/gpgme_59.html                   |  97 +++
- pyme-web/doc/gpgme/gpgme_6.html                    |  77 +++
- pyme-web/doc/gpgme/gpgme_60.html                   | 142 +++++
- pyme-web/doc/gpgme/gpgme_61.html                   | 626 +++++++++++++++++++
- pyme-web/doc/gpgme/gpgme_62.html                   | 107 ++++
- pyme-web/doc/gpgme/gpgme_63.html                   |  67 ++
- pyme-web/doc/gpgme/gpgme_64.html                   |  95 +++
- pyme-web/doc/gpgme/gpgme_65.html                   | 233 +++++++
- pyme-web/doc/gpgme/gpgme_66.html                   |  65 ++
- pyme-web/doc/gpgme/gpgme_67.html                   | 220 +++++++
- pyme-web/doc/gpgme/gpgme_68.html                   |  75 +++
- pyme-web/doc/gpgme/gpgme_69.html                   | 119 ++++
- pyme-web/doc/gpgme/gpgme_7.html                    | 123 ++++
- pyme-web/doc/gpgme/gpgme_70.html                   | 107 ++++
- pyme-web/doc/gpgme/gpgme_71.html                   | 218 +++++++
- pyme-web/doc/gpgme/gpgme_72.html                   | 134 ++++
- pyme-web/doc/gpgme/gpgme_73.html                   | 299 +++++++++
- pyme-web/doc/gpgme/gpgme_74.html                   | 103 ++++
- pyme-web/doc/gpgme/gpgme_75.html                   | 104 ++++
- pyme-web/doc/gpgme/gpgme_76.html                   | 118 ++++
- pyme-web/doc/gpgme/gpgme_77.html                   |  95 +++
- pyme-web/doc/gpgme/gpgme_78.html                   |  71 +++
- pyme-web/doc/gpgme/gpgme_79.html                   | 686 +++++++++++++++++++++
- pyme-web/doc/gpgme/gpgme_8.html                    | 155 +++++
- pyme-web/doc/gpgme/gpgme_80.html                   | 120 ++++
- pyme-web/doc/gpgme/gpgme_81.html                   | 278 +++++++++
- pyme-web/doc/gpgme/gpgme_82.html                   | 272 ++++++++
- pyme-web/doc/gpgme/gpgme_83.html                   | 180 ++++++
- pyme-web/doc/gpgme/gpgme_84.html                   |  99 +++
- pyme-web/doc/gpgme/gpgme_9.html                    | 104 ++++
- pyme-web/doc/gpgme/gpgme_abt.html                  | 206 +++++++
- pyme-web/doc/gpgme/gpgme_fot.html                  |  53 ++
- pyme-web/doc/gpgme/gpgme_ovr.html                  |  68 ++
- pyme-web/doc/gpgme/gpgme_toc.html                  | 247 ++++++++
- pyme-web/doc/gpgme/index.html                      | 251 ++++++++
- pyme-web/doc/pyme/index.html                       | 166 +++++
- pyme-web/doc/pyme/pyme.callbacks.html              |  50 ++
- .../doc/pyme/pyme.constants.data.encoding.html     |  48 ++
- pyme-web/doc/pyme/pyme.constants.data.html         |  29 +
- pyme-web/doc/pyme/pyme.constants.event.html        |  48 ++
- pyme-web/doc/pyme/pyme.constants.html              |  39 ++
- pyme-web/doc/pyme/pyme.constants.import.html       |  49 ++
- pyme-web/doc/pyme/pyme.constants.keylist.html      |  29 +
- pyme-web/doc/pyme/pyme.constants.keylist.mode.html |  48 ++
- pyme-web/doc/pyme/pyme.constants.md.html           |  58 ++
- pyme-web/doc/pyme/pyme.constants.pk.html           |  50 ++
- pyme-web/doc/pyme/pyme.constants.protocol.html     |  46 ++
- pyme-web/doc/pyme/pyme.constants.sig.html          |  29 +
- pyme-web/doc/pyme/pyme.constants.sig.mode.html     |  47 ++
- pyme-web/doc/pyme/pyme.constants.sigsum.html       |  55 ++
- pyme-web/doc/pyme/pyme.constants.status.html       | 117 ++++
- pyme-web/doc/pyme/pyme.constants.validity.html     |  50 ++
- pyme-web/doc/pyme/pyme.core.html                   | 254 ++++++++
- pyme-web/doc/pyme/pyme.errors.html                 |  90 +++
- pyme-web/doc/pyme/pyme.html                        | 166 +++++
- pyme-web/doc/pyme/pyme.util.html                   |  78 +++
- pyme-web/doc/pyme/pyme.version.html                |  37 ++
- pyme-web/index.html                                |   6 +-
- 113 files changed, 14966 insertions(+), 1 deletion(-)
-
-commit 2d6fe54479f042644f7b0f3d2fe35877d2056144
-Author: belyi <devnull@localhost>
-Date:   Thu May 19 02:06:09 2005 +0000
-
-    Added INSTALL file.
-
- pyme/INSTALL | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-commit d6892fff0c3cedf41dba4c25ab8608e7f2bc039c
-Author: belyi <devnull@localhost>
-Date:   Tue May 17 16:49:28 2005 +0000
-
-    Update copyright note on simple.py
-
- pyme/examples/simple.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-commit c2cd9cdf5995843aad7b200b929db2969effc9d2
-Author: belyi <devnull@localhost>
-Date:   Tue May 17 15:03:58 2005 +0000
-
-    Update simple.py to catch errors.
-
- pyme/examples/simple.py | 17 +++++++++++------
- 1 file changed, 11 insertions(+), 6 deletions(-)
-
-commit eaedae7c6a0ea993caab067efe781a59b6769c44
-Author: belyi <devnull@localhost>
-Date:   Tue May 17 01:18:23 2005 +0000
-
-    Added 'PYTHON = python' into Makefile for bug #1199122
-
- pyme/Makefile               | 1 +
- pyme/examples/signverify.py | 1 +
- 2 files changed, 2 insertions(+)
-
-commit 56fd244bb2636a4d58629899ea3cde1d96428198
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 27 21:37:06 2005 +0000
-
-    Added pygpa example.
-
- pyme/debian/changelog     |    3 +-
- pyme/examples/pygpa.glade | 5546 +++++++++++++++++++++++++++++++++++++++++++++
- pyme/examples/pygpa.py    | 1459 ++++++++++++
- 3 files changed, 7007 insertions(+), 1 deletion(-)
-
-commit 2d9a2a91a59ac3fee5410c953b7e0859e9e7cd35
-Author: belyi <devnull@localhost>
-Date:   Thu Apr 21 15:17:51 2005 +0000
-
-    Change version to 0.7.0 due to the change in license.
-
- pyme/debian/changelog | 2 +-
- pyme/pyme/version.py  | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit 94e34e38d742f145385bd235825b6ba1e30d8339
-Author: belyi <devnull@localhost>
-Date:   Thu Apr 21 03:53:12 2005 +0000
-
-    Changed license on PyMe from GPL to LGPL.
-    PyMe examples keep GPL license.
-
- pyme/COPYING.LESSER                  | 510 +++++++++++++++++++++++++++++++++++
- pyme/Makefile                        |  20 +-
- pyme/debian/changelog                |   4 +-
- pyme/debian/copyright                |  22 +-
- pyme/gpgme-h-clean.py                |  16 ++
- pyme/gpgme.i                         |  20 +-
- pyme/helpers.c                       |  20 +-
- pyme/helpers.h                       |  20 +-
- pyme/pyme/__init__.py                |  20 +-
- pyme/pyme/callbacks.py               |  20 +-
- pyme/pyme/constants/data/encoding.py |  20 +-
- pyme/pyme/constants/event.py         |  20 +-
- pyme/pyme/constants/import.py        |  20 +-
- pyme/pyme/constants/keylist/mode.py  |  20 +-
- pyme/pyme/constants/md.py            |  20 +-
- pyme/pyme/constants/pk.py            |  20 +-
- pyme/pyme/constants/protocol.py      |  20 +-
- pyme/pyme/constants/sig/mode.py      |  20 +-
- pyme/pyme/constants/sigsum.py        |  20 +-
- pyme/pyme/constants/status.py        |  20 +-
- pyme/pyme/constants/validity.py      |  20 +-
- pyme/pyme/core.py                    |  20 +-
- pyme/pyme/errors.py                  |  20 +-
- pyme/pyme/util.py                    |  20 +-
- pyme/pyme/version.py                 |  22 +-
- pyme/setup.py                        |  20 +-
- 26 files changed, 761 insertions(+), 233 deletions(-)
-
-commit 0d8aa0f6335cb1506a37085095ed45173b099a02
-Author: belyi <devnull@localhost>
-Date:   Tue Apr 19 01:46:06 2005 +0000
-
-    Added __hash__ and __eq__ methods to GpgmeWrapper to allow both Context()
-    and Data() to be used as a dictionary key.
-    Changed core.wait() function to always return a tuple. On timeout now it
-    returns (0, None) instead of just None. Plus, return context is now a
-    Context() object instead of a wrapper return by underlying gpgme.
-
- pyme/helpers.c    |  1 -
- pyme/pyme/core.py | 25 +++++++++++++++----------
- pyme/pyme/util.py |  9 +++++++++
- 3 files changed, 24 insertions(+), 11 deletions(-)
-
-commit 63ff6d10637be1dcbcd78c939ac1ef1ac30b1024
-Author: belyi <devnull@localhost>
-Date:   Wed Apr 6 04:58:40 2005 +0000
-
-    Made hook parameter optional in passphrase_cb and progress_cb.
-    Allowed None for callbacks to unset ones set previously.
-    Removed cleanup of exception in callbacks - now just retrieve the error code.
-    Added prev_bad parameter in passphrase_cb since it can be used in
-    change password protocols.
-    Updated examples to follow new sets of arguments in callbacks
-    Updated op_edit to check if passed key is None (otherwise gpgme dumps core)
-    God rid of annoying warning "function declaration isn't a prototype" in
-    helpers.c and helpers.h by changing from () to (void) list of arguments.
-
- pyme/debian/changelog       | 10 +++++---
- pyme/examples/signverify.py |  2 +-
- pyme/examples/t-edit.py     |  2 +-
- pyme/gpgme.i                | 18 +++++++++-----
- pyme/helpers.c              | 60 ++++++++++++++++++++++++++++++---------------
- pyme/helpers.h              |  4 +--
- pyme/pyme/callbacks.py      |  6 +++--
- pyme/pyme/core.py           | 47 +++++++++++++++++++++--------------
- pyme/pyme/errors.py         |  2 +-
- 9 files changed, 96 insertions(+), 55 deletions(-)
-
-commit 8f0ab8138c7aa190936376ccbbf33bb09c64d6f1
-Author: belyi <devnull@localhost>
-Date:   Thu Mar 31 23:50:59 2005 +0000
-
-    Added exception handling in passphrase_cb and edit_cb. If GPGMEError
-    exception is thrown in those callbacks it will be converted into its
-    core representation and return as an error code to the caller.
-    On all other exceptions error code will be GPG_ERR_GENERAL.
-
- pyme/Makefile         |  1 +
- pyme/debian/changelog |  8 ++++++++
- pyme/gpgme.i          | 20 ++++++++++++++------
- pyme/helpers.c        | 51 +++++++++++++++++++++++++++++++++++++++++++++------
- pyme/helpers.h        |  3 +++
- 5 files changed, 71 insertions(+), 12 deletions(-)
-
-commit 9903d1fb11231e7e3d920e58d1ecb674c5988b07
-Author: belyi <devnull@localhost>
-Date:   Thu Mar 31 05:12:15 2005 +0000
-
-    Remove workaround from Context.wait() method since the bug report and
-    patch fixing gpgme_wait's behavior is sent to GPMGE developers already.
-    Added errorcheck into op_edit() so that it can report an error.
-
- pyme/pyme/core.py | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-commit 45e8a5f4e13d3ca797ec3b0037242874a6be5562
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 26 19:44:18 2005 +0000
-
-    Updated version number to 0.6.2 in version.py
-    Added examples/*.glade files into documentation package.
-
- pyme/debian/examples | 1 +
- pyme/pyme/version.py | 2 +-
- 2 files changed, 2 insertions(+), 1 deletion(-)
-
-commit 270b87bb40e180cb6e8f1de9a0e8161525ffa4ab
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 26 19:31:14 2005 +0000
-
-    Updated debian/changelog regarding PyGtkGpgKeys example and a fix in errors.
-
- pyme/debian/changelog | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-commit ea4682009a506db91e5174ffd038fe7e4406b591
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 26 19:25:36 2005 +0000
-
-    Added handling of right mouse button click.
-    Changed reporting a string instead of a number on key generation failure.
-
- pyme/examples/PyGtkGpgKeys.glade |  2 ++
- pyme/examples/PyGtkGpgKeys.py    | 30 +++++++++++++++++++++++++++---
- 2 files changed, 29 insertions(+), 3 deletions(-)
-
-commit f65ad1a703d0098a3204fb8527a54d253e5847e7
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 26 18:11:11 2005 +0000
-
-    Added another column indicating if a key has a secret part.
-    Automated generation of the View menu from the view field of the KeyColumn
-    class.
-
- pyme/examples/PyGtkGpgKeys.glade | 93 ++--------------------------------------
- pyme/examples/PyGtkGpgKeys.py    | 74 +++++++++++++++++---------------
- 2 files changed, 44 insertions(+), 123 deletions(-)
-
-commit b54e83a7a7a5785502f3c7e8b95f15e23b40e65a
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 26 16:45:13 2005 +0000
-
-    Small change to the way gtk.TreeModel object is used.
-
- pyme/examples/PyGtkGpgKeys.py | 21 ++++++++++-----------
- 1 file changed, 10 insertions(+), 11 deletions(-)
-
-commit 7078db75cef4c1fd70cf03e37172bdb4f933fd1b
-Author: belyi <devnull@localhost>
-Date:   Fri Mar 25 23:33:06 2005 +0000
-
-    Use more comprehansible error reporting since gpgme_strerror_r returns None
-    all the time.
-
- pyme/pyme/errors.py | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-commit 151213f4344d9984975721440af07de09e3df61c
-Author: belyi <devnull@localhost>
-Date:   Fri Mar 25 04:30:17 2005 +0000
-
-    Improved PyGtkGpgKeys example to manage owner_trust on keys.
-    Added another example inter-edit.py which is just a helper to write
-    scripts for Context.op_edit() command.
-
- pyme/examples/PyGtkGpgKeys.glade | 78 ++++++++++++++++++++++++++++++++++++++++
- pyme/examples/PyGtkGpgKeys.py    | 68 +++++++++++++++++++++++++++++++----
- pyme/examples/inter-edit.py      | 54 ++++++++++++++++++++++++++++
- pyme/examples/t-edit.py          | 18 ++++++++++
- 4 files changed, 212 insertions(+), 6 deletions(-)
-
-commit fc7235af217bcee5231ce7fbd7f234712d5ad3b0
-Author: belyi <devnull@localhost>
-Date:   Fri Mar 25 00:30:39 2005 +0000
-
-    Updated PyGtkGpgKeys example to include import, export and reload
-    functionality. Also added ability to remove number of keys simultaneously.
-    Rearanged how KeyColumn is used to avoid unnecessary sorts and duplication
-    of information in different parts of the code.
-
- pyme/examples/PyGtkGpgKeys.glade |  86 +++++++++-
- pyme/examples/PyGtkGpgKeys.py    | 332 ++++++++++++++++++++++++++++-----------
- 2 files changed, 325 insertions(+), 93 deletions(-)
-
-commit 9f65749ccb1b7cab562e19c03f4371d5f7d94912
-Author: belyi <devnull@localhost>
-Date:   Thu Mar 24 05:51:03 2005 +0000
-
-    Added example of PyGTK+ and PyMe integration.
-    For now it does only simple things - listing, deleting, and generating keys.
-
- pyme/examples/PyGtkGpgKeys.glade  | 1321 +++++++++++++++++++++++++++++++++++++
- pyme/examples/PyGtkGpgKeys.gladep |    8 +
- pyme/examples/PyGtkGpgKeys.py     |  424 ++++++++++++
- 3 files changed, 1753 insertions(+)
-
-commit 59e23f32c3b46413c9ec09e23e1a385a110fb103
-Author: belyi <devnull@localhost>
-Date:   Thu Mar 24 05:44:58 2005 +0000
-
-    Added wait method Context class which handles asynchronous calls a little
-    bit better than the one generated by SWIG.
-
- pyme/debian/changelog |  7 +++++++
- pyme/gpgme.i          |  1 +
- pyme/pyme/core.py     | 40 ++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 48 insertions(+)
-
-commit 4c1b5259e4985df2cba0ae4fc09f12cd94603a75
-Author: belyi <devnull@localhost>
-Date:   Tue Mar 22 18:29:31 2005 +0000
-
-    Added correct handling of Context.op_edit() method.
-    Added example/t-edit.py showing usage for this method.
-    Output of this example should match output of the  tests/gpg/t-edit
-    from the GPGME test suite.
-    Remove unused static function from helpers.c
-
- pyme/examples/t-edit.py | 38 ++++++++++++++++++++++++++++++++++++++
- pyme/gpgme.i            | 36 ++++++++++++++++++++++++++++++++++++
- pyme/helpers.c          | 36 ------------------------------------
- pyme/pyme/core.py       |  5 ++++-
- 4 files changed, 78 insertions(+), 37 deletions(-)
-
-commit dc587e215283bfef2dd594f86a7b2945f74f5155
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 19 01:43:59 2005 +0000
-
-    Update changelog to include note about deprecated function in 0.6.1 release
-
- pyme/debian/changelog           | 3 ++-
- pyme/examples/encrypt-to-all.py | 3 +--
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-commit 86de4b3ad777f980ccf7ba3462c85bbe1787d1fd
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 19 01:40:07 2005 +0000
-
-    Remove deprecated functions from helpers.[ch]
-    Use gpgme-h-clean.py to remove deprecated functions and typedefs from
-    the GPGME header file. This will reduce the number of unused methods.
-
- pyme/Makefile         |  4 ++--
- pyme/gpgme-h-clean.py | 26 ++++++++++++++++++++++++++
- pyme/helpers.c        |  8 --------
- pyme/helpers.h        |  2 --
- 4 files changed, 28 insertions(+), 12 deletions(-)
-
-commit 2483efcbd0d73c628c4d7717928a766c3b58f0aa
-Author: belyi <devnull@localhost>
-Date:   Fri Mar 18 22:15:52 2005 +0000
-
-    Update copyright and author values in pyme/version.py
-    Create rules to build distribution files - one full and one without
-    debian bits.
-
- pyme/Makefile        | 28 ++++++++++++++++++++++------
- pyme/pyme/version.py | 12 ++++++------
- 2 files changed, 28 insertions(+), 12 deletions(-)
-
-commit 168593285380f5a7805f3dd08657d429a72d3621
-Author: belyi <devnull@localhost>
-Date:   Fri Mar 18 19:09:33 2005 +0000
-
-    Added package building for python2.4
-
-    Updated copyright notes to include myself and avoid confusion who's the
-    maintainer. In John's own words: "I'd prefer to just step out of the picture".
-    Jonh's copyright notice left intact.
-
- pyme/Makefile                        |  6 +++---
- pyme/debian/changelog                |  7 +++++++
- pyme/debian/control                  | 30 +++++++++++++++++++++++++++---
- pyme/debian/copyright                | 10 ++++------
- pyme/debian/rules                    |  4 ++++
- pyme/debian/setup.cfg-2.4            |  8 ++++++++
- pyme/examples/genkey.py              |  4 ++--
- pyme/gpgme.i                         |  4 ++--
- pyme/helpers.c                       |  4 ++--
- pyme/helpers.h                       |  4 ++--
- pyme/pyme/__init__.py                |  4 ++--
- pyme/pyme/callbacks.py               |  4 ++--
- pyme/pyme/constants/data/encoding.py |  4 ++--
- pyme/pyme/constants/event.py         |  4 ++--
- pyme/pyme/constants/import.py        |  4 ++--
- pyme/pyme/constants/keylist/mode.py  |  4 ++--
- pyme/pyme/constants/md.py            |  4 ++--
- pyme/pyme/constants/pk.py            |  4 ++--
- pyme/pyme/constants/protocol.py      |  4 ++--
- pyme/pyme/constants/sig/mode.py      |  4 ++--
- pyme/pyme/constants/sigsum.py        |  4 ++--
- pyme/pyme/constants/status.py        |  4 ++--
- pyme/pyme/constants/validity.py      |  4 ++--
- pyme/pyme/core.py                    |  4 ++--
- pyme/pyme/errors.py                  |  4 ++--
- pyme/pyme/util.py                    |  4 ++--
- pyme/pyme/version.py                 |  2 +-
- pyme/setup.py                        |  3 ++-
- 28 files changed, 96 insertions(+), 54 deletions(-)
-
-commit 6dbbb252771133724b2879ed6d767cd708196dae
-Author: belyi <devnull@localhost>
-Date:   Fri Mar 18 18:04:35 2005 +0000
-
-    Remove the note about gpgme.i to be generated - it's been the primary source
-    for some time.
-
- pyme/gpgme.i | 6 ------
- 1 file changed, 6 deletions(-)
-
-commit 9d449fa4889c6bda6d14583c0625b8d5c4ffe759
-Author: belyi <devnull@localhost>
-Date:   Fri May 7 18:31:22 2004 +0000
-
-    Added my copyright in genkey.py since there's enough changes made.
-    Updated signverify to use only keys generated by genkey.py, to check
-      that keys added to singers are able to sign and to check that the
-      list of signers is not empty. The last check is necessary to prevent
-      signing with the key of the user running signverify.py script.
-    Added delkey.py script to delete keys generated by genkey.py
-    Added exportimport.py example for key export/import.
-
- pyme/examples/delkey.py       | 29 +++++++++++++++++
- pyme/examples/exportimport.py | 76 +++++++++++++++++++++++++++++++++++++++++++
- pyme/examples/genkey.py       |  6 ++--
- pyme/examples/signverify.py   | 18 ++++++----
- 4 files changed, 119 insertions(+), 10 deletions(-)
-
-commit df98c8d28245ad2c14b0ab50fc8f8932853bec8b
-Author: belyi <devnull@localhost>
-Date:   Tue May 4 17:34:15 2004 +0000
-
-    Added examples/signverify.py for unattended sing/verify.
-    Updated examples/genkey.py to work correctly.
-    Updated gpgme.i to allow None as a value for gpgme_data_t
-
- pyme/examples/genkey.py     | 14 ++-------
- pyme/examples/signverify.py | 72 +++++++++++++++++++++++++++++++++++++++++++++
- pyme/gpgme.i                | 21 ++++++++-----
- 3 files changed, 87 insertions(+), 20 deletions(-)
-
-commit ba45931abf530ab89ead46d7233ff1b62b629a18
-Author: belyi <devnull@localhost>
-Date:   Thu Apr 8 16:15:09 2004 +0000
-
-    Ensure that we support only python2.2 and up. :-)
-    Use generators in core.Context class which makes pyme.aux obsolete
-    Remove importing future nested_scopes since they are standard starting
-    with python2.2
-
- pyme/pyme/__init__.py |  5 ++---
- pyme/pyme/aux.py      | 56 ---------------------------------------------------
- pyme/pyme/core.py     | 15 +++++++++++---
- pyme/pyme/errors.py   |  1 -
- pyme/pyme/util.py     |  2 +-
- 5 files changed, 15 insertions(+), 64 deletions(-)
-
-commit 4e9be5a55ecffa4da7ad5c192cc892eddaaa9586
-Author: belyi <devnull@localhost>
-Date:   Sun Mar 21 03:53:30 2004 +0000
-
-    Small change to index.html
-    Added clean: rule to the Makefile
-
- pyme-web/Makefile   | 3 +++
- pyme-web/index.html | 6 +++---
- 2 files changed, 6 insertions(+), 3 deletions(-)
-
-commit 2efb95176f4edf56ed61c9ac0c3aa09c56534df0
-Author: belyi <devnull@localhost>
-Date:   Sun Mar 21 03:00:32 2004 +0000
-
-    Added Makefile rules for pyme module installation.
-
- pyme/Makefile | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-commit 2b83d5d8b513029cc3e54f2fa502ccc85618104b
-Author: belyi <devnull@localhost>
-Date:   Sun Mar 21 02:29:54 2004 +0000
-
-    Decorative change.
-
- pyme/pyme/aux.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-commit e3478015d763a036c1d806ae01433fce59712204
-Author: belyi <devnull@localhost>
-Date:   Sun Mar 21 02:25:55 2004 +0000
-
-    Added RCS Id: tags
-
- pyme/Makefile                           | 1 +
- pyme/examples/encrypt-to-all.py         | 3 ++-
- pyme/examples/genkey.py                 | 3 ++-
- pyme/examples/sign.py                   | 3 ++-
- pyme/examples/simple.py                 | 3 ++-
- pyme/gpgme.i                            | 1 +
- pyme/helpers.c                          | 1 +
- pyme/helpers.h                          | 1 +
- pyme/pyme/__init__.py                   | 1 +
- pyme/pyme/aux.py                        | 1 +
- pyme/pyme/callbacks.py                  | 1 +
- pyme/pyme/constants/__init__.py         | 2 ++
- pyme/pyme/constants/data/__init__.py    | 2 ++
- pyme/pyme/constants/data/encoding.py    | 1 +
- pyme/pyme/constants/event.py            | 1 +
- pyme/pyme/constants/import.py           | 1 +
- pyme/pyme/constants/keylist/__init__.py | 2 ++
- pyme/pyme/constants/keylist/mode.py     | 1 +
- pyme/pyme/constants/md.py               | 1 +
- pyme/pyme/constants/pk.py               | 1 +
- pyme/pyme/constants/protocol.py         | 1 +
- pyme/pyme/constants/sig/__init__.py     | 2 ++
- pyme/pyme/constants/sig/mode.py         | 1 +
- pyme/pyme/constants/sigsum.py           | 1 +
- pyme/pyme/constants/status.py           | 1 +
- pyme/pyme/constants/validity.py         | 1 +
- pyme/pyme/core.py                       | 1 +
- pyme/pyme/errors.py                     | 1 +
- pyme/pyme/util.py                       | 1 +
- pyme/pyme/version.py                    | 2 ++
- 30 files changed, 39 insertions(+), 4 deletions(-)
-
-commit b3b3712645332c5bc3e8d9d557aab21d48ff0f86
-Author: belyi <devnull@localhost>
-Date:   Sun Mar 21 02:07:36 2004 +0000
-
-    Added Id: RCS tags to all files.
-
- pyme-web/Makefile   | 2 ++
- pyme-web/index.html | 3 ++-
- 2 files changed, 4 insertions(+), 1 deletion(-)
-
-commit 6aea2426beaaa8c43e6f2310a37a2737c0c3a1b5
-Author: belyi <devnull@localhost>
-Date:   Sun Mar 21 01:50:55 2004 +0000
-
-    Update example on the init pyme.html page to match simple.py example.
-    Fix core.py to use getcode() instead of getvalue() method of the exception.
-
- pyme/pyme/__init__.py | 22 ++++++++++++++--------
- pyme/pyme/core.py     |  4 ++--
- 2 files changed, 16 insertions(+), 10 deletions(-)
-
-commit dee337455ffd624d3f83e1c159c4bb2cefc692c9
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 20 20:32:29 2004 +0000
-
-    Added Makefile to simplify publishing web files.
-
- pyme-web/Makefile | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-commit af7129baa8260697d85c2ddb434562e8a80b62d8
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 20 20:15:53 2004 +0000
-
-    Added minimum of formatting and SF icon.
-
- pyme-web/index.html | 18 +++++++++++-------
- 1 file changed, 11 insertions(+), 7 deletions(-)
-
-commit 2e64dcbf99cee796b51667b04d8961e390edde87
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 20 18:30:09 2004 +0000
-
-    Initial revision
-
- pyme-web/index.html | 33 +++++++++++++++++++++++++++++++++
- 1 file changed, 33 insertions(+)
-
-commit 1c51644b3d0b6611422d971758e35f303d2ad5df
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 20 05:10:46 2004 +0000
-
-    Update examples and package information on the initial pyme doc page.
-
- pyme/pyme/__init__.py | 27 ++++++++++++---------------
- 1 file changed, 12 insertions(+), 15 deletions(-)
-
-commit b2d31b0bfbffdff5247d6db4e3c95140cc1b1f19
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 20 04:47:42 2004 +0000
-
-    Deleted unnecessary files.
-    Updated debian/control to remove dependency on python-xml package since there's
-    none now.
-    Move example files from 'doc' into separate control file.
-    Update debian/rules to build documentation from *.py files and to exclude
-    CVS directories from the installation.
-
- pyme/Makefile                   |  26 ++-----
- pyme/debian/control             |   8 +--
- pyme/debian/docs                |   1 -
- pyme/debian/ex.package.doc-base |  22 ------
- pyme/debian/examples            |   1 +
- pyme/debian/manpage.1.ex        |  60 ----------------
- pyme/debian/manpage.sgml.ex     | 152 ----------------------------------------
- pyme/debian/rules               |  12 ++--
- 8 files changed, 15 insertions(+), 267 deletions(-)
-
-commit 1b517dd9b82a433499b4696b06d94d756cd36e53
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 20 02:59:15 2004 +0000
-
-    Remove doc/gpgme directory containing GPGME documentation since this belongs
-    to a different project. Need to add reference in our documentation.
-
- pyme/doc/gpgme/fdl.texi     |  402 ------
- pyme/doc/gpgme/gpgme.texi   | 3372 -------------------------------------------
- pyme/doc/gpgme/gpl.texi     |  397 -----
- pyme/doc/gpgme/version.texi |    4 -
- 4 files changed, 4175 deletions(-)
-
-commit 95d7d171da115a0fedfe2a4a7e5acc8aa408f673
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 20 02:45:03 2004 +0000
-
-    Change debian/rules to generate files by swig during build and to cleanup
-    those files on 'clean' rule.
-    Plus, leave generated gpgme_wrap.c in the root directory instead of moving
-    it into subdirectory 'generated'.
-
- pyme/Makefile     | 8 +++-----
- pyme/debian/rules | 3 ++-
- pyme/setup.py     | 2 +-
- 3 files changed, 6 insertions(+), 7 deletions(-)
-
-commit 545b3d90d445c5c78e8d72b2c1780863e02c789a
-Author: belyi <devnull@localhost>
-Date:   Sat Mar 20 02:18:01 2004 +0000
-
-    Initial revision
-
- pyme/COPYING                            |  340 ++++
- pyme/ChangeLog                          |  802 ++++++++
- pyme/Makefile                           |   79 +
- pyme/debian/README.Debian               |    6 +
- pyme/debian/changelog                   |   19 +
- pyme/debian/control                     |   68 +
- pyme/debian/copyright                   |   27 +
- pyme/debian/dirs                        |    2 +
- pyme/debian/docs                        |    2 +
- pyme/debian/ex.package.doc-base         |   22 +
- pyme/debian/manpage.1.ex                |   60 +
- pyme/debian/manpage.sgml.ex             |  152 ++
- pyme/debian/postinst.ex                 |   48 +
- pyme/debian/postrm.ex                   |   38 +
- pyme/debian/preinst.ex                  |   44 +
- pyme/debian/prerm.ex                    |   39 +
- pyme/debian/rules                       |  130 ++
- pyme/debian/setup.cfg-2.2               |    8 +
- pyme/debian/setup.cfg-2.3               |    8 +
- pyme/doc/gpgme/fdl.texi                 |  402 ++++
- pyme/doc/gpgme/gpgme.texi               | 3372 +++++++++++++++++++++++++++++++
- pyme/doc/gpgme/gpl.texi                 |  397 ++++
- pyme/doc/gpgme/version.texi             |    4 +
- pyme/examples/encrypt-to-all.py         |   63 +
- pyme/examples/genkey.py                 |   55 +
- pyme/examples/sign.py                   |   28 +
- pyme/examples/simple.py                 |   44 +
- pyme/gpgme.i                            |  191 ++
- pyme/helpers.c                          |  139 ++
- pyme/helpers.h                          |   29 +
- pyme/pyme/__init__.py                   |  134 ++
- pyme/pyme/aux.py                        |   55 +
- pyme/pyme/callbacks.py                  |   45 +
- pyme/pyme/constants/__init__.py         |    2 +
- pyme/pyme/constants/data/__init__.py    |    2 +
- pyme/pyme/constants/data/encoding.py    |   19 +
- pyme/pyme/constants/event.py            |   19 +
- pyme/pyme/constants/import.py           |   19 +
- pyme/pyme/constants/keylist/__init__.py |    2 +
- pyme/pyme/constants/keylist/mode.py     |   19 +
- pyme/pyme/constants/md.py               |   19 +
- pyme/pyme/constants/pk.py               |   19 +
- pyme/pyme/constants/protocol.py         |   19 +
- pyme/pyme/constants/sig/__init__.py     |    2 +
- pyme/pyme/constants/sig/mode.py         |   19 +
- pyme/pyme/constants/sigsum.py           |   19 +
- pyme/pyme/constants/status.py           |   19 +
- pyme/pyme/constants/validity.py         |   19 +
- pyme/pyme/core.py                       |  367 ++++
- pyme/pyme/errors.py                     |   46 +
- pyme/pyme/util.py                       |   61 +
- pyme/pyme/version.py                    |   39 +
- pyme/setup.py                           |   60 +
- 53 files changed, 7642 insertions(+)
-
-commit a3d5a442dc713b6c4d6fc4134db5b47e379dc41d
-Author: root <devnull@localhost>
-Date:   Fri Mar 19 14:12:30 2004 +0000
-
-    initial checkin
-
- CVSROOT/checkoutlist | 13 +++++++++++++
- CVSROOT/commitinfo   | 15 +++++++++++++++
- CVSROOT/config       | 21 +++++++++++++++++++++
- CVSROOT/cvswrappers  | 19 +++++++++++++++++++
- CVSROOT/editinfo     | 21 +++++++++++++++++++++
- CVSROOT/loginfo      | 26 ++++++++++++++++++++++++++
- CVSROOT/modules      | 26 ++++++++++++++++++++++++++
- CVSROOT/notify       | 12 ++++++++++++
- CVSROOT/rcsinfo      | 13 +++++++++++++
- CVSROOT/taginfo      | 20 ++++++++++++++++++++
- CVSROOT/verifymsg    | 21 +++++++++++++++++++++
- 11 files changed, 207 insertions(+)
diff --git a/lang/python/doc/rst/gpgme-python-howto.rst b/lang/python/doc/rst/gpgme-python-howto.rst
deleted file mode 100644 (file)
index 6f71109..0000000
+++ /dev/null
@@ -1,3330 +0,0 @@
-.. _intro:
-
-Introduction
-============
-
-+-----------------+------------------------------------------+
-| Version:        | 0.1.5                                    |
-+-----------------+------------------------------------------+
-| GPGME Version:  | 1.13.0                                   |
-+-----------------+------------------------------------------+
-| Author:         | Ben McGinnes <ben@gnupg.org>             |
-+-----------------+------------------------------------------+
-| Author GPG Key: | DB4724E6FA4286C92B4E55C4321E4E2373590E5D |
-+-----------------+------------------------------------------+
-| Language:       | Australian English, British English      |
-+-----------------+------------------------------------------+
-| Language codes: | en-AU, en-GB, en                         |
-+-----------------+------------------------------------------+
-
-This document provides basic instruction in how to use the GPGME Python
-bindings to programmatically leverage the GPGME library.
-
-.. _py2-vs-py3:
-
-Python 2 versus Python 3
-------------------------
-
-Though the GPGME Python bindings themselves provide support for both
-Python 2 and 3, the focus is unequivocally on Python 3 and specifically
-from Python 3.4 and above. As a consequence all the examples and
-instructions in this guide use Python 3 code.
-
-Much of it will work with Python 2, but much of it also deals with
-Python 3 byte literals, particularly when reading and writing data.
-Developers concentrating on Python 2.7, and possibly even 2.6, will need
-to make the appropriate modifications to support the older string and
-unicode types as opposed to bytes.
-
-There are multiple reasons for concentrating on Python 3; some of which
-relate to the immediate integration of these bindings, some of which
-relate to longer term plans for both GPGME and the python bindings and
-some of which relate to the impending EOL period for Python 2.7.
-Essentially, though, there is little value in tying the bindings to a
-version of the language which is a dead end and the advantages offered
-by Python 3 over Python 2 make handling the data types with which GPGME
-deals considerably easier.
-
-.. _howto-python3-examples:
-
-Examples
---------
-
-All of the examples found in this document can be found as Python 3
-scripts in the ``lang/python/examples/howto`` directory.
-
-Unofficial Drafts
------------------
-
-In addition to shipping with each release of GPGME, there is a section
-on locations to read or download `draft editions <#draft-editions>`__ of
-this document from at the end of it. These are unofficial versions
-produced in between major releases.
-
-.. _new-stuff:
-
-What\'s New
------------
-
-Full details of what is new are now available in the `What\'s
-New <what-is-new.org>`__ file and archives of the preceding *What\'s
-New* sections are available in the `What Was New <what-was-new>`__ file.
-
-.. _new-stuff-1-13-0:
-
-New in GPGME 1·13·0
-~~~~~~~~~~~~~~~~~~~
-
-See the `What\'s New <what-is-new#new-stuff-1-13-0>`__ document for what
-is new in version 1.13.0.
-
-.. _new-stuff-1-12-0:
-
-New in GPGME 1·12·0
-~~~~~~~~~~~~~~~~~~~
-
-See the `What Was New <what-was-new#new-stuff-1-12-0>`__ document for
-what was new in version 1.12.0.
-
-GPGME Concepts
-==============
-
-.. _gpgme-c-api:
-
-A C API
--------
-
-Unlike many modern APIs with which programmers will be more familiar
-with these days, the GPGME API is a C API. The API is intended for use
-by C coders who would be able to access its features by including the
-``gpgme.h`` header file with their own C source code and then access its
-functions just as they would any other C headers.
-
-This is a very effective method of gaining complete access to the API
-and in the most efficient manner possible. It does, however, have the
-drawback that it cannot be directly used by other languages without some
-means of providing an interface to those languages. This is where the
-need for bindings in various languages stems.
-
-.. _gpgme-python-bindings:
-
-Python bindings
----------------
-
-The Python bindings for GPGME provide a higher level means of accessing
-the complete feature set of GPGME itself. It also provides a more
-pythonic means of calling these API functions.
-
-The bindings are generated dynamically with SWIG and the copy of
-``gpgme.h`` generated when GPGME is compiled.
-
-This means that a version of the Python bindings is fundamentally tied
-to the exact same version of GPGME used to generate that copy of
-``gpgme.h``.
-
-.. _gpgme-python-bindings-diffs:
-
-Difference between the Python bindings and other GnuPG Python packages
-----------------------------------------------------------------------
-
-There have been numerous attempts to add GnuPG support to Python over
-the years. Some of the most well known are listed here, along with what
-differentiates them.
-
-.. _diffs-python-gnupg:
-
-The python-gnupg package maintained by Vinay Sajip
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This is arguably the most popular means of integrating GPG with Python.
-The package utilises the ``subprocess`` module to implement wrappers for
-the ``gpg`` and ``gpg2`` executables normally invoked on the command
-line (``gpg.exe`` and ``gpg2.exe`` on Windows).
-
-The popularity of this package stemmed from its ease of use and
-capability in providing the most commonly required features.
-
-Unfortunately it has been beset by a number of security issues in the
-past; most of which stemmed from using unsafe methods of accessing the
-command line via the ``subprocess`` calls. While some effort has been
-made over the last two to three years (as of 2018) to mitigate this,
-particularly by no longer providing shell access through those
-subprocess calls, the wrapper is still somewhat limited in the scope of
-its GnuPG features coverage.
-
-The python-gnupg package is available under the MIT license.
-
-.. _diffs-isis-gnupg:
-
-The gnupg package created and maintained by Isis Lovecruft
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In 2015 Isis Lovecruft from the Tor Project forked and then
-re-implemented the python-gnupg package as just gnupg. This new package
-also relied on subprocess to call the ``gpg`` or ``gpg2`` binaries, but
-did so somewhat more securely.
-
-The naming and version numbering selected for this package, however,
-resulted in conflicts with the original python-gnupg and since its
-functions were called in a different manner to python-gnupg, the release
-of this package also resulted in a great deal of consternation when
-people installed what they thought was an upgrade that subsequently
-broke the code relying on it.
-
-The gnupg package is available under the GNU General Public License
-version 3.0 (or any later version).
-
-.. _diffs-pyme:
-
-The PyME package maintained by Martin Albrecht
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This package is the origin of these bindings, though they are somewhat
-different now. For details of when and how the PyME package was folded
-back into GPGME itself see the `Short History <short-history.org>`__
-document. [1]_
-
-The PyME package was first released in 2002 and was also the first
-attempt to implement a low level binding to GPGME. In doing so it
-provided access to considerably more functionality than either the
-``python-gnupg`` or ``gnupg`` packages.
-
-The PyME package is only available for Python 2.6 and 2.7.
-
-Porting the PyME package to Python 3.4 in 2015 is what resulted in it
-being folded into the GPGME project and the current bindings are the end
-result of that effort.
-
-The PyME package is available under the same dual licensing as GPGME
-itself: the GNU General Public License version 2.0 (or any later
-version) and the GNU Lesser General Public License version 2.1 (or any
-later version).
-
-.. _gpgme-python-install:
-
-GPGME Python bindings installation
-==================================
-
-.. _do-not-use-pypi:
-
-No PyPI
--------
-
-Most third-party Python packages and modules are available and
-distributed through the Python Package Installer, known as PyPI.
-
-Due to the nature of what these bindings are and how they work, it is
-infeasible to install the GPGME Python bindings in the same way.
-
-This is because the bindings use SWIG to dynamically generate C bindings
-against ``gpgme.h`` and ``gpgme.h`` is generated from ``gpgme.h.in`` at
-compile time when GPGME is built from source. Thus to include a package
-in PyPI which actually built correctly would require either statically
-built libraries for every architecture bundled with it or a full
-implementation of C for each architecture.
-
-See the additional notes regarding `CFFI and SWIG <#snafu-cffi>`__ at
-the end of this section for further details.
-
-.. _gpgme-python-requirements:
-
-Requirements
-------------
-
-The GPGME Python bindings only have three requirements:
-
-#. A suitable version of Python 2 or Python 3. With Python 2 that means
-   CPython 2.7 and with Python 3 that means CPython 3.4 or higher.
-#. `SWIG <https://www.swig.org>`__.
-#. GPGME itself. Which also means that all of GPGME\'s dependencies must
-   be installed too.
-
-.. _gpgme-python-recommendations:
-
-Recommended Additions
-~~~~~~~~~~~~~~~~~~~~~
-
-Though none of the following are absolute requirements, they are all
-recommended for use with the Python bindings. In some cases these
-recommendations refer to which version(s) of CPython to use the bindings
-with, while others refer to third party modules which provide a
-significant advantage in some way.
-
-#. If possible, use Python 3 instead of 2.
-#. Favour a more recent version of Python since even 3.4 is due to reach
-   EOL soon. In production systems and services, Python 3.6 should be
-   robust enough to be relied on.
-#. If possible add the following Python modules which are not part of
-   the standard library:
-   `Requests <http://docs.python-requests.org/en/latest/index.html>`__,
-   `Cython <https://cython.org/>`__,
-   `Pendulum <https://pendulum.eustace.io/>`__ and
-   `hkp4py <https://github.com/Selfnet/hkp4py>`__.
-
-Chances are quite high that at least the first one and maybe two of
-those will already be installed.
-
-Note that, as with Cython, some of advanced use case scenarios will
-bring with them additional requirements. Most of these will be fairly
-well known and commonly installed ones, however, which are in many cases
-likely to have already been installed on many systems or be familiar to
-Python programmers.
-
-Installation
-------------
-
-Installing the Python bindings is effectively achieved by compiling and
-installing GPGME itself.
-
-Once SWIG is installed with Python and all the dependencies for GPGME
-are installed you only need to confirm that the version(s) of Python you
-want the bindings installed for are in your ``$PATH``.
-
-By default GPGME will attempt to install the bindings for the most
-recent or highest version number of Python 2 and Python 3 it detects in
-``$PATH``. It specifically checks for the ``python`` and ``python3``
-executables first and then checks for specific version numbers.
-
-For Python 2 it checks for these executables in this order: ``python``,
-``python2`` and ``python2.7``.
-
-For Python 3 it checks for these executables in this order: ``python3``,
-``python3.7``, ``python3.6``, ``python3.5`` and ``python3.4``. [2]_
-
-On systems where ``python`` is actually ``python3`` and not ``python2``
-it may be possible that ``python2`` may be overlooked, but there have
-been no reports of that actually occurring as yet.
-
-In the three months or so since the release of Python 3.7.0 there has
-been extensive testing and work with these bindings with no issues
-specifically relating to the new version of Python or any of the new
-features of either the language or the bindings. This has also been the
-case with Python 3.7.1rc1. With that in mind and given the release of
-Python 3.7.1 is scheduled for around the same time as GPGME 1.12.0, the
-order of preferred Python versions has been changed to move Python 3.7
-ahead of Python 3.6.
-
-.. _install-gpgme:
-
-Installing GPGME
-~~~~~~~~~~~~~~~~
-
-See the GPGME ``README`` file for details of how to install GPGME from
-source.
-
-.. _snafu:
-
-Known Issues
-------------
-
-There are a few known issues with the current build process and the
-Python bindings. For the most part these are easily addressed should
-they be encountered.
-
-.. _snafu-a-swig-of-this-builds-character:
-
-Breaking Builds
-~~~~~~~~~~~~~~~
-
-Occasionally when installing GPGME with the Python bindings included it
-may be observed that the ``make`` portion of that process induces a
-large very number of warnings and, eventually errors which end that part
-of the build process. Yet following that with ``make check`` and
-``make install`` appears to work seamlessly.
-
-The cause of this is related to the way SWIG needs to be called to
-dynamically generate the C bindings for GPGME in the first place. So the
-entire process will always produce ``lang/python/python2-gpg/`` and
-``lang/python/python3-gpg/`` directories. These should contain the build
-output generated during compilation, including the complete bindings and
-module installed into ``site-packages``.
-
-Occasionally the errors in the early part or some other conflict (e.g.
-not installing as **root** or **su**) may result in nothing being
-installed to the relevant ``site-packages`` directory and the build
-directory missing a lot of expected files. Even when this occurs, the
-solution is actually quite simple and will always work.
-
-That solution is simply to run the following commands as either the
-**root** user or prepended with ``sudo -H``\  [3]_ in the
-``lang/python/`` directory:
-
-.. code:: shell
-
-   /path/to/pythonX.Y setup.py build
-   /path/to/pythonX.Y setup.py build
-   /path/to/pythonX.Y setup.py install
-
-Yes, the build command does need to be run twice. Yes, you still need to
-run the potentially failing or incomplete steps during the
-``configure``, ``make`` and ``make install`` steps with installing
-GPGME. This is because those steps generate a lot of essential files
-needed, both by and in order to create, the bindings (including both the
-``setup.py`` and ``gpgme.h`` files).
-
-#. IMPORTANT Note
-
-   If specifying a selected number of languages to create bindings for,
-   try to leave Python last. Currently the majority of the other
-   language bindings are also preceding Python of either version when
-   listed alphabetically (not counting the Qt bindings).
-
-   If Python is set to precede one of the other languages then it is
-   possible that the errors described here may interrupt the build
-   process before generating bindings for those other languages. In
-   these cases it may be preferable to configure all preferred language
-   bindings separately with alternative ``configure`` steps for GPGME
-   using the ``--enable-languages=$LANGUAGE`` option.
-
-   Alternatively ``make`` (or ``gmake``, depending on your platform) may
-   be run with the the ``-k`` option, which tells make to keep going
-   even if errors are encountered. In that case the failure of one
-   language\'s set of bindings to build should not hamper another
-   language\'s bindings to build.
-
-.. _snafu-lessons-for-the-lazy:
-
-Reinstalling Responsibly
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-Regardless of whether you\'re installing for one version of Python or
-several, there will come a point where reinstallation is required. With
-most Python module installations, the installed files go into the
-relevant site-packages directory and are then forgotten about. Then the
-module is upgraded, the new files are copied over the old and that\'s
-the end of the matter.
-
-While the same is true of these bindings, there have been intermittent
-issues observed on some platforms which have benefited significantly
-from removing all the previous installations of the bindings before
-installing the updated versions.
-
-Removing the previous version(s) is simply a matter of changing to the
-relevant ``site-packages`` directory for the version of Python in
-question and removing the ``gpg/`` directory and any accompanying
-egg-info files for that module.
-
-In most cases this will require root or administration privileges on the
-system, but the same is true of installing the module in the first
-place.
-
-.. _snafu-the-full-monty:
-
-Multiple installations
-~~~~~~~~~~~~~~~~~~~~~~
-
-For a variety of reasons it may be either necessary or just preferable
-to install the bindings to alternative installed Python versions which
-meet the requirements of these bindings.
-
-On POSIX systems this will generally be most simply achieved by running
-the manual installation commands (build, build, install) as described in
-the previous section for each Python installation the bindings need to
-be installed to.
-
-As per the SWIG documentation: the compilers, libraries and runtime used
-to build GPGME and the Python Bindings **must** match those used to
-compile Python itself, including the version number(s) (at least going
-by major version numbers and probably minor numbers too).
-
-On most POSIX systems, including OS X, this will very likely be the case
-in most, if not all, cases.
-
-Note that from GPGME
-`1.12.1 <https://dev.gnupg.org/rMff6ff616aea6f59b7f2ce1176492850ecdf3851e>`__
-the default installation installs to each version of Python it can find
-first. That is that it will currently install for the first copies of
-Python versions 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8 (dev branch) that it
-finds. Usually this will be in the same prefix as GPGME itself, but is
-dictated by the ``$PATH`` when the installation is performed. The above
-instructions can still be performed on other python installations which
-the installer does not find, including alternative prefixes.
-
-.. _snafu-runtime-not-funtime:
-
-Won\'t Work With Windows
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-There are semi-regular reports of Windows users having considerable
-difficulty in installing and using the Python bindings at all. Very
-often, possibly even always, these reports come from Cygwin users and/or
-MinGW users and/or Msys2 users. Though not all of them have been
-confirmed, it appears that these reports have also come from people who
-installed Python using the Windows installer files from the `Python
-website <https://python.org>`__ (i.e. mostly MSI installers, sometimes
-self-extracting ``.exe`` files).
-
-The Windows versions of Python are not built using Cygwin, MinGW or
-Msys2; they\'re built using Microsoft Visual Studio. Furthermore the
-version used is *considerably* more advanced than the version which
-MinGW obtained a small number of files from many years ago in order to
-be able to compile anything at all. Not only that, but there are changes
-to the version of Visual Studio between some micro releases, though that
-is is particularly the case with Python 2.7, since it has been kept
-around far longer than it should have been.
-
-There are two theoretical solutions to this issue:
-
-#. Compile and install the GnuPG stack, including GPGME and the Python
-   bindings using the same version of Microsoft Visual Studio used by
-   the Python Foundation to compile the version of Python installed.
-
-   If there are multiple versions of Python then this will need to be
-   done with each different version of Visual Studio used for those
-   versions of Python.
-
-#. Compile and install Python using the same tools used by choice, such
-   as MinGW or Msys2.
-
-Do **not** use the official Windows installer for Python unless
-following the first method.
-
-In this type of situation it may even be for the best to accept that
-there are less limitations on permissive software than free software and
-simply opt to use a recent version of the Community Edition of Microsoft
-Visual Studio to compile and build all of it, no matter what.
-
-Investigations into the extent or the limitations of this issue are
-ongoing.
-
-The following table lists the version of Microsoft Visual Studio which
-needs to be used when compiling GPGME and the Python bindings with each
-version of the CPython binary released `for
-Windows <https://www.python.org/downloads/windows/>`__:
-
-+---------+------------------------+------------------+
-| CPython | Microsoft product name | runtime filename |
-+---------+------------------------+------------------+
-| 2.7.6   | Visual Studio 2008     | MSVCR90.DLL      |
-+---------+------------------------+------------------+
-| 3.4.0   | Visual Studio 2010     | MSVCR100.DLL     |
-+---------+------------------------+------------------+
-| 3.5.0   | Visual Studio 2015     | **see below**    |
-+---------+------------------------+------------------+
-| 3.6.0   | Visual Studio 2015     | **see below**    |
-+---------+------------------------+------------------+
-| 3.7.0   | Visual Studio 2017\*   | **see below**    |
-+---------+------------------------+------------------+
-
-It is important to note that MingW and Msys2 ship with the Visual C
-runtime from Microsoft Visual Studio 2005 and are thus **incompatible**
-with all the versions of CPython which can be used with the GPGME Python
-bindings.
-
-It is also important to note that from CPython 3.5 onwards, the Python
-Foundation has adopted the reworking of the Visual C runtime which was
-performed for Visual Studio 2015 and aimed at resolving many of these
-kinds of issues. Much greater detail on these issues and the correct
-file(s) to link to are available from Matthew Brett\'s invaluable page,
-`Using Microsoft Visual C with
-Python <https://matthew-brett.github.io/pydagogue/python_msvc.html>`__.
-It is also worth reading the Microsoft Developer Network blog post on
-`the universal
-CRT <http://blogs.msdn.com/b/vcblog/archive/2015/03/03/introducing-the-universal-crt.aspx>`__
-and Steve Dower\'s blog posts on Python extensions (`part
-1 <http://stevedower.id.au/blog/building-for-python-3-5>`__ and `part
-2 <http://stevedower.id.au/blog/building-for-python-3-5-part-two>`__).
-
-The second of those two posts by Steve Dower contains the details of
-specific configuration options required for compiling anything to be
-used with official CPython releases. In addition to those configuration
-and compiler settings to use, the versions of Visual Studio prior to
-Visual Studio 2015 did not support 64-bit systems by default. So
-compiling a 64-bit version of these bindings for a 64-bit version of
-CPython 2.7 or 3.4 requires additional work.
-
-In addition to the blog posts, the `Windows
-compilers <https://wiki.python.org/moin/WindowsCompilers>`__ wiki page
-on the CPython wiki is another essential reference on the relevant
-versions of Visual Studio to use and the degree of compatibility with
-CPython releases.
-
-Eventually someone will ask why there isn\'t an installable binary for
-Windows, which the GPGME of the licenses do not preclude as long as the
-source code is available in conjunction with such a release.
-
-The sheer number of versions of Visual Studio in conjunction with
-differing configuration options depending on the target Windows version
-and whether the architecture is 64-bit or 32-bit makes it difficult to
-provide a correct binary installer for Windows users. At the bare
-minimum doing so would require the GnuPG project compile ten different
-versions of the bindings with each release; both 32-bit and 64-bit
-versions for CPython 2.7 and 3.4, with 64-bit versions for both x86-64
-(i.e. Intel and AMD) and ARM architectures for CPython 3.5, 3.6, 3.7 and
-later releases. That\'s the bare **minimum**, it\'d probably be higher.
-
-Additionally, with only a binary installation used in conjunction with
-the CPython installer from ``python.org`` the advanced options available
-which utilise `Cython <#cython>`__ will not be able to be used at all.
-Cython depends on being able to compile the C code it generates and that
-too would need to utilise a matching runtime to both the installed
-version of CPython and these bindings in order to work with the
-bindings.
-
-Considering all of that, what do we recommend?
-
-#. Use a recent version of CPython; at least 3.5, but ideally 3.6 or
-   later.
-
-#. Use Visual Studio 2015 or the standalone build tools for Visual
-   Studio 2017 (or later).
-
-#. Compile both CPython and GPGME with these bindings using the tools
-   selected in step 2.
-
-#. Ignore MingW, Msys2 and the official CPython binary installers.
-
-#. Be thankful the answer to this question wasn\'t simply to say
-   something like, "install Linux" or "install FreeBSD" (or even
-   Apple\'s OS X).
-
-.. _snafu-cffi:
-
-CFFI is the Best™ and GPGME should use it instead of SWIG
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-There are many reasons for favouring
-`CFFI <https://cffi.readthedocs.io/en/latest/overview.html>`__ and
-proponents of it are quite happy to repeat these things as if all it
-would take to switch from SWIG to CFFI is repeating that list as if it
-were a new concept.
-
-The fact is that there are things which Python\'s CFFI implementation
-cannot handle in the GPGME C code. Beyond that there are features of
-SWIG which are simply not available with CFFI at all. SWIG generates the
-bindings to Python using the ``gpgme.h`` file, but that file is not a
-single version shipped with each release, it too is generated when GPGME
-is compiled.
-
-CFFI is currently unable to adapt to such a potentially mutable
-codebase. If there were some means of applying SWIG\'s dynamic code
-generation to produce the Python/CFFI API modes of accessing the GPGME
-libraries (or the source source code directly), but such a thing does
-not exist yet either and it currently appears that work is needed in at
-least one of CFFI\'s dependencies before any of this can be addressed.
-
-So if you\'re a massive fan of CFFI; that\'s great, but if you want this
-project to switch to CFFI then rather than just insisting that it
-should, I\'d suggest you volunteer to bring CFFI up to the level this
-project needs.
-
-If you\'re actually seriously considering doing so, then I\'d suggest
-taking the ``gpgme-tool.c`` file in the GPGME ``src/`` directory and
-getting that to work with any of the CFFI API methods (not the ABI
-methods, they\'ll work with pretty much anything). When you start
-running into trouble with \"ifdefs\" then you\'ll know what sort of
-things are lacking. That doesn\'t even take into account the amount of
-work saved via SWIG\'s code generation techniques either.
-
-.. _snafu-venv:
-
-Virtualised Environments
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-It is fairly common practice amongst Python developers to, as much as
-possible, use packages like virtualenv to keep various things that are
-to be installed from interfering with each other. Given how much of the
-GPGME bindings is often at odds with the usual pythonic way of doing
-things, it stands to reason that this would be called into question too.
-
-As it happens the answer as to whether or not the bindings can be used
-with virtualenv, the answer is both yes and no.
-
-In general we recommend installing to the relevant path and matching
-prefix of GPGME itself. Which means that when GPGME, and ideally the
-rest of the GnuPG stack, is installed to a prefix like ``/usr/local`` or
-``/opt/local`` then the bindings would need to be installed to the main
-Python installation and not a virtualised abstraction. Attempts to
-separate the two in the past have been known to cause weird and
-intermittent errors ranging from minor annoyances to complete failures
-in the build process.
-
-As a consequence we only recommend building with and installing to the
-main Python installations within the same prefix as GPGME is installed
-to or which are found by GPGME\'s configuration stage immediately prior
-to running the make commands. Which is exactly what the compiling and
-installing process of GPGME does by default.
-
-Once that is done, however, it appears that a copy of the compiled
-module may be installed into a virtualenv of the same major and minor
-version matching the build. Alternatively it is possible to utilise a
-``sites.pth`` file in the ``site-packages/`` directory of a virtualenv
-installation, which links back to the system installations corresponding
-directory in order to import anything installed system wide. This may or
-may not be appropriate on a case by case basis.
-
-Though extensive testing of either of these options is not yet complete,
-preliminary testing of them indicates that both are viable as long as
-the main installation is complete. Which means that certain other
-options normally restricted to virtual environments are also available,
-including integration with pythonic test suites (e.g.
-`pytest <https://docs.pytest.org/en/latest/index.html>`__) and other
-large projects.
-
-That said, it is worth reiterating the warning regarding non-standard
-installations. If one were to attempt to install the bindings only to a
-virtual environment without somehow also including the full GnuPG stack
-(or enough of it as to include GPGME) then it is highly likely that
-errors would be encountered at some point and more than a little likely
-that the build process itself would break.
-
-If a degree of separation from the main operating system is still
-required in spite of these warnings, then consider other forms of
-virtualisation. Either a virtual machine (e.g.
-`VirtualBox <https://www.virtualbox.org/>`__), a hardware emulation
-layer (e.g. `QEMU <https://www.qemu.org/>`__) or an application
-container (e.g. `Docker <https://www.docker.com/why-docker>`__).
-
-Finally it should be noted that the limited tests conducted thus far
-have been using the ``virtualenv`` command in a new directory to create
-the virtual python environment. As opposed to the standard ``python3
--m venv`` and it is possible that this will make a difference depending
-on the system and version of Python in use. Another option is to run the
-command ``python3 -m virtualenv /path/to/install/virtual/thingy``
-instead.
-
-.. _snafu-docs:
-
-Post installation
-~~~~~~~~~~~~~~~~~
-
-Following installation it is recommended to move the
-``post_installer.py`` script from the ``lang/python/examples/howto/``
-directory to the ``lang/python/`` directory and run it. This will fix or
-restore files needed by Sphinx which may be removed during a
-distribution build for release. It will also generate reST files from
-Org mode files with Pandoc and generate Texinfo files from Org mode
-files with GNU Emacs and Org mode (in batch mode). Additionally it will
-fix the UTF-8 declaration line in the Texinfo files (Emacs expects
-\"UTF-8\" to be \"utf-8\").
-
-.. _howto-fund-a-mental:
-
-Fundamentals
-============
-
-Before we can get to the fun stuff, there are a few matters regarding
-GPGME\'s design which hold true whether you\'re dealing with the C code
-directly or these Python bindings.
-
-.. _no-rest-for-the-wicked:
-
-No REST
--------
-
-The first part of which is or will be fairly blatantly obvious upon
-viewing the first example, but it\'s worth reiterating anyway. That
-being that this API is **not** a REST API. Nor indeed could it ever be
-one.
-
-Most, if not all, Python programmers (and not just Python programmers)
-know how easy it is to work with a RESTful API. In fact they\'ve become
-so popular that many other APIs attempt to emulate REST-like behaviour
-as much as they are able. Right down to the use of JSON formatted output
-to facilitate the use of their API without having to retrain developers.
-
-This API does not do that. It would not be able to do that and also
-provide access to the entire C API on which it\'s built. It does,
-however, provide a very pythonic interface on top of the direct bindings
-and it\'s this pythonic layer that this HOWTO deals with.
-
-.. _howto-get-context:
-
-Context
--------
-
-One of the reasons which prevents this API from being RESTful is that
-most operations require more than one instruction to the API to perform
-the task. Sure, there are certain functions which can be performed
-simultaneously, particularly if the result known or strongly anticipated
-(e.g. selecting and encrypting to a key known to be in the public
-keybox).
-
-There are many more, however, which cannot be manipulated so readily:
-they must be performed in a specific sequence and the result of one
-operation has a direct bearing on the outcome of subsequent operations.
-Not merely by generating an error either.
-
-When dealing with this type of persistent state on the web, full of both
-the RESTful and REST-like, it\'s most commonly referred to as a session.
-In GPGME, however, it is called a context and every operation type has
-one.
-
-.. _howto-keys:
-
-Working with keys
-=================
-
-.. _howto-keys-selection:
-
-Key selection
--------------
-
-Selecting keys to encrypt to or to sign with will be a common occurrence
-when working with GPGMe and the means available for doing so are quite
-simple.
-
-They do depend on utilising a Context; however once the data is recorded
-in another variable, that Context does not need to be the same one which
-subsequent operations are performed.
-
-The easiest way to select a specific key is by searching for that key\'s
-key ID or fingerprint, preferably the full fingerprint without any
-spaces in it. A long key ID will probably be okay, but is not advised
-and short key IDs are already a problem with some being generated to
-match specific patterns. It does not matter whether the pattern is upper
-or lower case.
-
-So this is the best method:
-
-.. code:: python
-
-   import gpg
-
-   k = gpg.Context().keylist(pattern="258E88DCBD3CD44D8E7AB43F6ECB6AF0DEADBEEF")
-   keys = list(k)
-
-This is passable and very likely to be common:
-
-.. code:: python
-
-   import gpg
-
-   k = gpg.Context().keylist(pattern="0x6ECB6AF0DEADBEEF")
-   keys = list(k)
-
-And this is a really bad idea:
-
-.. code:: python
-
-   import gpg
-
-   k = gpg.Context().keylist(pattern="0xDEADBEEF")
-   keys = list(k)
-
-Alternatively it may be that the intention is to create a list of keys
-which all match a particular search string. For instance all the
-addresses at a particular domain, like this:
-
-.. code:: python
-
-   import gpg
-
-   ncsc = gpg.Context().keylist(pattern="ncsc.mil")
-   nsa = list(ncsc)
-
-.. _howto-keys-counting:
-
-Counting keys
-~~~~~~~~~~~~~
-
-Counting the number of keys in your public keybox (``pubring.kbx``), the
-format which has superseded the old keyring format (``pubring.gpg`` and
-``secring.gpg``), or the number of secret keys is a very simple task.
-
-.. code:: python
-
-   import gpg
-
-   c = gpg.Context()
-   seckeys = c.keylist(pattern=None, secret=True)
-   pubkeys = c.keylist(pattern=None, secret=False)
-
-   seclist = list(seckeys)
-   secnum = len(seclist)
-
-   publist = list(pubkeys)
-   pubnum = len(publist)
-
-   print("""
-     Number of secret keys:  {0}
-     Number of public keys:  {1}
-   """.format(secnum, pubnum))
-
-NOTE: The `Cython <#cython>`__ introduction in the `Advanced and
-Experimental <#advanced-use>`__ section uses this same key counting code
-with Cython to demonstrate some areas where Cython can improve
-performance even with the bindings. Users with large public keyrings or
-keyboxes, for instance, should consider these options if they are
-comfortable with using Cython.
-
-.. _howto-get-key:
-
-Get key
--------
-
-An alternative method of getting a single key via its fingerprint is
-available directly within a Context with ``Context().get_key``. This is
-the preferred method of selecting a key in order to modify it, sign or
-certify it and for obtaining relevant data about a single key as a part
-of other functions; when verifying a signature made by that key, for
-instance.
-
-By default this method will select public keys, but it can select secret
-keys as well.
-
-This first example demonstrates selecting the current key of Werner
-Koch, which is due to expire at the end of 2018:
-
-.. code:: python
-
-   import gpg
-
-   fingerprint = "80615870F5BAD690333686D0F2AD85AC1E42B367"
-   key = gpg.Context().get_key(fingerprint)
-
-Whereas this example demonstrates selecting the author\'s current key
-with the ``secret`` key word argument set to ``True``:
-
-.. code:: python
-
-   import gpg
-
-   fingerprint = "DB4724E6FA4286C92B4E55C4321E4E2373590E5D"
-   key = gpg.Context().get_key(fingerprint, secret=True)
-
-It is, of course, quite possible to select expired, disabled and revoked
-keys with this function, but only to effectively display information
-about those keys.
-
-It is also possible to use both unicode or string literals and byte
-literals with the fingerprint when getting a key in this way.
-
-.. _howto-import-key:
-
-Importing keys
---------------
-
-Importing keys is possible with the ``key_import()`` method and takes
-one argument which is a bytes literal object containing either the
-binary or ASCII armoured key data for one or more keys.
-
-The following example retrieves one or more keys from the SKS keyservers
-via the web using the requests module. Since requests returns the
-content as a bytes literal object, we can then use that directly to
-import the resulting data into our keybox.
-
-.. code:: python
-
-   import gpg
-   import os.path
-   import requests
-
-   c = gpg.Context()
-   url = "https://sks-keyservers.net/pks/lookup"
-   pattern = input("Enter the pattern to search for key or user IDs: ")
-   payload = {"op": "get", "search": pattern}
-
-   r = requests.get(url, verify=True, params=payload)
-   result = c.key_import(r.content)
-
-   if result is not None and hasattr(result, "considered") is False:
-       print(result)
-   elif result is not None and hasattr(result, "considered") is True:
-       num_keys = len(result.imports)
-       new_revs = result.new_revocations
-       new_sigs = result.new_signatures
-       new_subs = result.new_sub_keys
-       new_uids = result.new_user_ids
-       new_scrt = result.secret_imported
-       nochange = result.unchanged
-       print("""
-     The total number of keys considered for import was:  {0}
-
-        Number of keys revoked:  {1}
-      Number of new signatures:  {2}
-         Number of new subkeys:  {3}
-        Number of new user IDs:  {4}
-     Number of new secret keys:  {5}
-      Number of unchanged keys:  {6}
-
-     The key IDs for all considered keys were:
-   """.format(num_keys, new_revs, new_sigs, new_subs, new_uids, new_scrt,
-              nochange))
-       for i in range(num_keys):
-           print("{0}\n".format(result.imports[i].fpr))
-   else:
-       pass
-
-NOTE: When searching for a key ID of any length or a fingerprint
-(without spaces), the SKS servers require the the leading ``0x``
-indicative of hexadecimal be included. Also note that the old short key
-IDs (e.g. ``0xDEADBEEF``) should no longer be used due to the relative
-ease by which such key IDs can be reproduced, as demonstrated by the
-Evil32 Project in 2014 (which was subsequently exploited in 2016).
-
-Testing for whether a string in any given search is or may be a
-hexadecimal value which may be missing the leading ``0x`` is a simple
-matter of using a try/except statement which attempts to convert the
-string as hex to an integer and then back to hex; then using that to
-search with. Raising a ValueError simply results in treating the string
-as a string. This is the method and logic utilised in the
-``import-keys-hkp.py`` script (see below).
-
-.. _import-protonmail:
-
-Working with ProtonMail
-~~~~~~~~~~~~~~~~~~~~~~~
-
-Here is a variation on the example above which checks the constrained
-ProtonMail keyserver for ProtonMail public keys.
-
-.. code:: python
-
-   import gpg
-   import requests
-   import sys
-
-   print("""
-   This script searches the ProtonMail key server for the specified key and
-   imports it.
-   """)
-
-   c = gpg.Context(armor=True)
-   url = "https://api.protonmail.ch/pks/lookup"
-   ksearch = []
-
-   if len(sys.argv) >= 2:
-       keyterm = sys.argv[1]
-   else:
-       keyterm = input("Enter the key ID, UID or search string: ")
-
-   if keyterm.count("@") == 2 and keyterm.startswith("@") is True:
-       ksearch.append(keyterm[1:])
-       ksearch.append(keyterm[1:])
-       ksearch.append(keyterm[1:])
-   elif keyterm.count("@") == 1 and keyterm.startswith("@") is True:
-       ksearch.append("{0}@protonmail.com".format(keyterm[1:]))
-       ksearch.append("{0}@protonmail.ch".format(keyterm[1:]))
-       ksearch.append("{0}@pm.me".format(keyterm[1:]))
-   elif keyterm.count("@") == 0:
-       ksearch.append("{0}@protonmail.com".format(keyterm))
-       ksearch.append("{0}@protonmail.ch".format(keyterm))
-       ksearch.append("{0}@pm.me".format(keyterm))
-   elif keyterm.count("@") == 2 and keyterm.startswith("@") is False:
-       uidlist = keyterm.split("@")
-       for uid in uidlist:
-           ksearch.append("{0}@protonmail.com".format(uid))
-           ksearch.append("{0}@protonmail.ch".format(uid))
-           ksearch.append("{0}@pm.me".format(uid))
-   elif keyterm.count("@") > 2:
-       uidlist = keyterm.split("@")
-       for uid in uidlist:
-           ksearch.append("{0}@protonmail.com".format(uid))
-           ksearch.append("{0}@protonmail.ch".format(uid))
-           ksearch.append("{0}@pm.me".format(uid))
-   else:
-       ksearch.append(keyterm)
-
-   for k in ksearch:
-       payload = {"op": "get", "search": k}
-       try:
-           r = requests.get(url, verify=True, params=payload)
-           if r.ok is True:
-               result = c.key_import(r.content)
-           elif r.ok is False:
-               result = r.content
-       except Exception as e:
-           result = None
-
-       if result is not None and hasattr(result, "considered") is False:
-           print("{0} for {1}".format(result.decode(), k))
-       elif result is not None and hasattr(result, "considered") is True:
-           num_keys = len(result.imports)
-           new_revs = result.new_revocations
-           new_sigs = result.new_signatures
-           new_subs = result.new_sub_keys
-           new_uids = result.new_user_ids
-           new_scrt = result.secret_imported
-           nochange = result.unchanged
-           print("""
-   The total number of keys considered for import was:  {0}
-
-   With UIDs wholely or partially matching the following string:
-
-           {1}
-
-      Number of keys revoked:  {2}
-    Number of new signatures:  {3}
-       Number of new subkeys:  {4}
-      Number of new user IDs:  {5}
-   Number of new secret keys:  {6}
-    Number of unchanged keys:  {7}
-
-   The key IDs for all considered keys were:
-   """.format(num_keys, k, new_revs, new_sigs, new_subs, new_uids, new_scrt,
-              nochange))
-           for i in range(num_keys):
-               print(result.imports[i].fpr)
-           print("")
-       elif result is None:
-           print(e)
-
-Both the above example,
-`pmkey-import.py <../examples/howto/pmkey-import.py>`__, and a version
-which prompts for an alternative GnuPG home directory,
-`pmkey-import-alt.py <../examples/howto/pmkey-import-alt.py>`__, are
-available with the other examples and are executable scripts.
-
-Note that while the ProtonMail servers are based on the SKS servers,
-their server is related more to their API and is not feature complete by
-comparison to the servers in the SKS pool. One notable difference being
-that the ProtonMail server does not permit non ProtonMail users to
-update their own keys, which could be a vector for attacking ProtonMail
-users who may not receive a key\'s revocation if it had been
-compromised.
-
-.. _import-hkp4py:
-
-Importing with HKP for Python
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Performing the same tasks with the `hkp4py
-module <https://github.com/Selfnet/hkp4py>`__ (available via PyPI) is
-not too much different, but does provide a number of options of benefit
-to end users. Not least of which being the ability to perform some
-checks on a key before importing it or not. For instance it may be the
-policy of a site or project to only import keys which have not been
-revoked. The hkp4py module permits such checks prior to the importing of
-the keys found.
-
-.. code:: python
-
-   import gpg
-   import hkp4py
-   import sys
-
-   c = gpg.Context()
-   server = hkp4py.KeyServer("hkps://hkps.pool.sks-keyservers.net")
-   results = []
-   keys = []
-
-   if len(sys.argv) > 2:
-       pattern = " ".join(sys.argv[1:])
-   elif len(sys.argv) == 2:
-       pattern = sys.argv[1]
-   else:
-       pattern = input("Enter the pattern to search for keys or user IDs: ")
-
-
-   if pattern is not None:
-       try:
-           key = server.search(hex(int(pattern, 16)))
-           keyed = True
-       except ValueError as ve:
-           key = server.search(pattern)
-           keyed = False
-
-       if key is not None:
-           keys.append(key[0])
-           if keyed is True:
-               try:
-                   fob = server.search(pattern)
-               except:
-                   fob = None
-               if fob is not None:
-                   keys.append(fob[0])
-           else:
-               pass
-       else:
-           pass
-
-       for logrus in pattern.split():
-           try:
-               key = server.search(hex(int(logrus, 16)))
-               hexed = True
-           except ValueError as ve:
-               key = server.search(logrus)
-               hexed = False
-
-           if key is not None:
-               keys.append(key[0])
-               if hexed is True:
-                   try:
-                       fob = server.search(logrus)
-                   except:
-                       fob = None
-                   if fob is not None:
-                       keys.append(fob[0])
-               else:
-                   pass
-           else:
-               pass
-
-
-   if len(keys) > 0:
-       for key in keys:
-           import_result = c.key_import(key.key_blob)
-           results.append(import_result)
-
-   for result in results:
-       if result is not None and hasattr(result, "considered") is False:
-           print(result)
-       elif result is not None and hasattr(result, "considered") is True:
-           num_keys = len(result.imports)
-           new_revs = result.new_revocations
-           new_sigs = result.new_signatures
-           new_subs = result.new_sub_keys
-           new_uids = result.new_user_ids
-           new_scrt = result.secret_imported
-           nochange = result.unchanged
-           print("""
-   The total number of keys considered for import was:  {0}
-
-      Number of keys revoked:  {1}
-    Number of new signatures:  {2}
-       Number of new subkeys:  {3}
-      Number of new user IDs:  {4}
-   Number of new secret keys:  {5}
-    Number of unchanged keys:  {6}
-
-   The key IDs for all considered keys were:
-   """.format(num_keys, new_revs, new_sigs, new_subs, new_uids, new_scrt,
-              nochange))
-           for i in range(num_keys):
-               print(result.imports[i].fpr)
-           print("")
-       else:
-           pass
-
-Since the hkp4py module handles multiple keys just as effectively as one
-(``keys`` is a list of responses per matching key), the example above is
-able to do a little bit more with the returned data before anything is
-actually imported.
-
-.. _import-protonmail-hkp4py:
-
-Importing from ProtonMail with HKP for Python
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Though this can provide certain benefits even when working with
-ProtonMail, the scope is somewhat constrained there due to the
-limitations of the ProtonMail keyserver.
-
-For instance, searching the SKS keyserver pool for the term \"gnupg\"
-produces hundreds of results from any time the word appears in any part
-of a user ID. Performing the same search on the ProtonMail keyserver
-returns zero results, even though there are at least two test accounts
-which include it as part of the username.
-
-The cause of this discrepancy is the deliberate configuration of that
-server by ProtonMail to require an exact match of the full email address
-of the ProtonMail user whose key is being requested. Presumably this is
-intended to reduce breaches of privacy of their users as an email
-address must already be known before a key for that address can be
-obtained.
-
-#. Import from ProtonMail via HKP for Python Example no. 1
-
-   The following script is available with the rest of the examples under
-   the somewhat less than original name, ``pmkey-import-hkp.py``.
-
-   .. code:: python
-
-      import gpg
-      import hkp4py
-      import os.path
-      import sys
-
-      print("""
-      This script searches the ProtonMail key server for the specified key and
-      imports it.
-
-      Usage:  pmkey-import-hkp.py [search strings]
-      """)
-
-      c = gpg.Context(armor=True)
-      server = hkp4py.KeyServer("hkps://api.protonmail.ch")
-      keyterms = []
-      ksearch = []
-      allkeys = []
-      results = []
-      paradox = []
-      homeless = None
-
-      if len(sys.argv) > 2:
-          keyterms = sys.argv[1:]
-      elif len(sys.argv) == 2:
-          keyterm = sys.argv[1]
-          keyterms.append(keyterm)
-      else:
-          key_term = input("Enter the key ID, UID or search string: ")
-          keyterms = key_term.split()
-
-      for keyterm in keyterms:
-          if keyterm.count("@") == 2 and keyterm.startswith("@") is True:
-              ksearch.append(keyterm[1:])
-              ksearch.append(keyterm[1:])
-              ksearch.append(keyterm[1:])
-          elif keyterm.count("@") == 1 and keyterm.startswith("@") is True:
-              ksearch.append("{0}@protonmail.com".format(keyterm[1:]))
-              ksearch.append("{0}@protonmail.ch".format(keyterm[1:]))
-              ksearch.append("{0}@pm.me".format(keyterm[1:]))
-          elif keyterm.count("@") == 0:
-              ksearch.append("{0}@protonmail.com".format(keyterm))
-              ksearch.append("{0}@protonmail.ch".format(keyterm))
-              ksearch.append("{0}@pm.me".format(keyterm))
-          elif keyterm.count("@") == 2 and keyterm.startswith("@") is False:
-              uidlist = keyterm.split("@")
-              for uid in uidlist:
-                  ksearch.append("{0}@protonmail.com".format(uid))
-                  ksearch.append("{0}@protonmail.ch".format(uid))
-                  ksearch.append("{0}@pm.me".format(uid))
-          elif keyterm.count("@") > 2:
-              uidlist = keyterm.split("@")
-              for uid in uidlist:
-                  ksearch.append("{0}@protonmail.com".format(uid))
-                  ksearch.append("{0}@protonmail.ch".format(uid))
-                  ksearch.append("{0}@pm.me".format(uid))
-          else:
-              ksearch.append(keyterm)
-
-      for k in ksearch:
-          print("Checking for key for: {0}".format(k))
-          try:
-              keys = server.search(k)
-              if isinstance(keys, list) is True:
-                  for key in keys:
-                      allkeys.append(key)
-                      try:
-                          import_result = c.key_import(key.key_blob)
-                      except Exception as e:
-                          import_result = c.key_import(key.key)
-              else:
-                  paradox.append(keys)
-                  import_result = None
-          except Exception as e:
-              import_result = None
-          results.append(import_result)
-
-      for result in results:
-          if result is not None and hasattr(result, "considered") is False:
-              print("{0} for {1}".format(result.decode(), k))
-          elif result is not None and hasattr(result, "considered") is True:
-              num_keys = len(result.imports)
-              new_revs = result.new_revocations
-              new_sigs = result.new_signatures
-              new_subs = result.new_sub_keys
-              new_uids = result.new_user_ids
-              new_scrt = result.secret_imported
-              nochange = result.unchanged
-              print("""
-      The total number of keys considered for import was:  {0}
-
-      With UIDs wholely or partially matching the following string:
-
-              {1}
-
-         Number of keys revoked:  {2}
-       Number of new signatures:  {3}
-          Number of new subkeys:  {4}
-         Number of new user IDs:  {5}
-      Number of new secret keys:  {6}
-       Number of unchanged keys:  {7}
-
-      The key IDs for all considered keys were:
-      """.format(num_keys, k, new_revs, new_sigs, new_subs, new_uids, new_scrt,
-                 nochange))
-              for i in range(num_keys):
-                  print(result.imports[i].fpr)
-              print("")
-          elif result is None:
-              pass
-
-#. Import from ProtonMail via HKP for Python Example no. 2
-
-   Like its counterpart above, this script can also be found with the
-   rest of the examples, by the name pmkey-import-hkp-alt.py.
-
-   With this script a modicum of effort has been made to treat anything
-   passed as a ``homedir`` which either does not exist or which is not a
-   directory, as also being a pssible user ID to check for. It\'s not
-   guaranteed to pick up on all such cases, but it should cover most of
-   them.
-
-   .. code:: python
-
-      import gpg
-      import hkp4py
-      import os.path
-      import sys
-
-      print("""
-      This script searches the ProtonMail key server for the specified key and
-      imports it.  Optionally enables specifying a different GnuPG home directory.
-
-      Usage:  pmkey-import-hkp.py [homedir] [search string]
-         or:  pmkey-import-hkp.py [search string]
-      """)
-
-      c = gpg.Context(armor=True)
-      server = hkp4py.KeyServer("hkps://api.protonmail.ch")
-      keyterms = []
-      ksearch = []
-      allkeys = []
-      results = []
-      paradox = []
-      homeless = None
-
-      if len(sys.argv) > 3:
-          homedir = sys.argv[1]
-          keyterms = sys.argv[2:]
-      elif len(sys.argv) == 3:
-          homedir = sys.argv[1]
-          keyterm = sys.argv[2]
-          keyterms.append(keyterm)
-      elif len(sys.argv) == 2:
-          homedir = ""
-          keyterm = sys.argv[1]
-          keyterms.append(keyterm)
-      else:
-          keyterm = input("Enter the key ID, UID or search string: ")
-          homedir = input("Enter the GPG configuration directory path (optional): ")
-          keyterms.append(keyterm)
-
-      if len(homedir) == 0:
-          homedir = None
-          homeless = False
-
-      if homedir is not None:
-          if homedir.startswith("~"):
-              if os.path.exists(os.path.expanduser(homedir)) is True:
-                  if os.path.isdir(os.path.expanduser(homedir)) is True:
-                      c.home_dir = os.path.realpath(os.path.expanduser(homedir))
-                  else:
-                      homeless = True
-              else:
-                  homeless = True
-          elif os.path.exists(os.path.realpath(homedir)) is True:
-              if os.path.isdir(os.path.realpath(homedir)) is True:
-                  c.home_dir = os.path.realpath(homedir)
-              else:
-                  homeless = True
-          else:
-              homeless = True
-
-      # First check to see if the homedir really is a homedir and if not, treat it as
-      # a search string.
-      if homeless is True:
-          keyterms.append(homedir)
-          c.home_dir = None
-      else:
-          pass
-
-      for keyterm in keyterms:
-          if keyterm.count("@") == 2 and keyterm.startswith("@") is True:
-              ksearch.append(keyterm[1:])
-              ksearch.append(keyterm[1:])
-              ksearch.append(keyterm[1:])
-          elif keyterm.count("@") == 1 and keyterm.startswith("@") is True:
-              ksearch.append("{0}@protonmail.com".format(keyterm[1:]))
-              ksearch.append("{0}@protonmail.ch".format(keyterm[1:]))
-              ksearch.append("{0}@pm.me".format(keyterm[1:]))
-          elif keyterm.count("@") == 0:
-              ksearch.append("{0}@protonmail.com".format(keyterm))
-              ksearch.append("{0}@protonmail.ch".format(keyterm))
-              ksearch.append("{0}@pm.me".format(keyterm))
-          elif keyterm.count("@") == 2 and keyterm.startswith("@") is False:
-              uidlist = keyterm.split("@")
-              for uid in uidlist:
-                  ksearch.append("{0}@protonmail.com".format(uid))
-                  ksearch.append("{0}@protonmail.ch".format(uid))
-                  ksearch.append("{0}@pm.me".format(uid))
-          elif keyterm.count("@") > 2:
-              uidlist = keyterm.split("@")
-              for uid in uidlist:
-                  ksearch.append("{0}@protonmail.com".format(uid))
-                  ksearch.append("{0}@protonmail.ch".format(uid))
-                  ksearch.append("{0}@pm.me".format(uid))
-          else:
-              ksearch.append(keyterm)
-
-      for k in ksearch:
-          print("Checking for key for: {0}".format(k))
-          try:
-              keys = server.search(k)
-              if isinstance(keys, list) is True:
-                  for key in keys:
-                      allkeys.append(key)
-                      try:
-                          import_result = c.key_import(key.key_blob)
-                      except Exception as e:
-                          import_result = c.key_import(key.key)
-              else:
-                  paradox.append(keys)
-                  import_result = None
-          except Exception as e:
-              import_result = None
-          results.append(import_result)
-
-      for result in results:
-          if result is not None and hasattr(result, "considered") is False:
-              print("{0} for {1}".format(result.decode(), k))
-          elif result is not None and hasattr(result, "considered") is True:
-              num_keys = len(result.imports)
-              new_revs = result.new_revocations
-              new_sigs = result.new_signatures
-              new_subs = result.new_sub_keys
-              new_uids = result.new_user_ids
-              new_scrt = result.secret_imported
-              nochange = result.unchanged
-              print("""
-      The total number of keys considered for import was:  {0}
-
-      With UIDs wholely or partially matching the following string:
-
-              {1}
-
-         Number of keys revoked:  {2}
-       Number of new signatures:  {3}
-          Number of new subkeys:  {4}
-         Number of new user IDs:  {5}
-      Number of new secret keys:  {6}
-       Number of unchanged keys:  {7}
-
-      The key IDs for all considered keys were:
-      """.format(num_keys, k, new_revs, new_sigs, new_subs, new_uids, new_scrt,
-                 nochange))
-              for i in range(num_keys):
-                  print(result.imports[i].fpr)
-              print("")
-          elif result is None:
-              pass
-
-.. _howto-export-key:
-
-Exporting keys
---------------
-
-Exporting keys remains a reasonably simple task, but has been separated
-into three different functions for the OpenPGP cryptographic engine. Two
-of those functions are for exporting public keys and the third is for
-exporting secret keys.
-
-.. _howto-export-public-key:
-
-Exporting public keys
-~~~~~~~~~~~~~~~~~~~~~
-
-There are two methods of exporting public keys, both of which are very
-similar to the other. The default method, ``key_export()``, will export
-a public key or keys matching a specified pattern as normal. The
-alternative, the ``key_export_minimal()`` method, will do the same thing
-except producing a minimised output with extra signatures and third
-party signatures or certifications removed.
-
-.. code:: python
-
-   import gpg
-   import os.path
-   import sys
-
-   print("""
-   This script exports one or more public keys.
-   """)
-
-   c = gpg.Context(armor=True)
-
-   if len(sys.argv) >= 4:
-       keyfile = sys.argv[1]
-       logrus = sys.argv[2]
-       homedir = sys.argv[3]
-   elif len(sys.argv) == 3:
-       keyfile = sys.argv[1]
-       logrus = sys.argv[2]
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-   elif len(sys.argv) == 2:
-       keyfile = sys.argv[1]
-       logrus = input("Enter the UID matching the key(s) to export: ")
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-   else:
-       keyfile = input("Enter the path and filename to save the secret key to: ")
-       logrus = input("Enter the UID matching the key(s) to export: ")
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-
-   if homedir.startswith("~"):
-       if os.path.exists(os.path.expanduser(homedir)) is True:
-           c.home_dir = os.path.expanduser(homedir)
-       else:
-           pass
-   elif os.path.exists(homedir) is True:
-       c.home_dir = homedir
-   else:
-       pass
-
-   try:
-       result = c.key_export(pattern=logrus)
-   except:
-       result = c.key_export(pattern=None)
-
-   if result is not None:
-       with open(keyfile, "wb") as f:
-           f.write(result)
-   else:
-       pass
-
-It should be noted that the result will only return ``None`` when a
-search pattern has been entered, but has not matched any keys. When the
-search pattern itself is set to ``None`` this triggers the exporting of
-the entire public keybox.
-
-.. code:: python
-
-   import gpg
-   import os.path
-   import sys
-
-   print("""
-   This script exports one or more public keys in minimised form.
-   """)
-
-   c = gpg.Context(armor=True)
-
-   if len(sys.argv) >= 4:
-       keyfile = sys.argv[1]
-       logrus = sys.argv[2]
-       homedir = sys.argv[3]
-   elif len(sys.argv) == 3:
-       keyfile = sys.argv[1]
-       logrus = sys.argv[2]
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-   elif len(sys.argv) == 2:
-       keyfile = sys.argv[1]
-       logrus = input("Enter the UID matching the key(s) to export: ")
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-   else:
-       keyfile = input("Enter the path and filename to save the secret key to: ")
-       logrus = input("Enter the UID matching the key(s) to export: ")
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-
-   if homedir.startswith("~"):
-       if os.path.exists(os.path.expanduser(homedir)) is True:
-           c.home_dir = os.path.expanduser(homedir)
-       else:
-           pass
-   elif os.path.exists(homedir) is True:
-       c.home_dir = homedir
-   else:
-       pass
-
-   try:
-       result = c.key_export_minimal(pattern=logrus)
-   except:
-       result = c.key_export_minimal(pattern=None)
-
-   if result is not None:
-       with open(keyfile, "wb") as f:
-           f.write(result)
-   else:
-       pass
-
-.. _howto-export-secret-key:
-
-Exporting secret keys
-~~~~~~~~~~~~~~~~~~~~~
-
-Exporting secret keys is, functionally, very similar to exporting public
-keys; save for the invocation of ``pinentry`` via ``gpg-agent`` in order
-to securely enter the key\'s passphrase and authorise the export.
-
-The following example exports the secret key to a file which is then set
-with the same permissions as the output files created by the command
-line secret key export options.
-
-.. code:: python
-
-   import gpg
-   import os
-   import os.path
-   import sys
-
-   print("""
-   This script exports one or more secret keys.
-
-   The gpg-agent and pinentry are invoked to authorise the export.
-   """)
-
-   c = gpg.Context(armor=True)
-
-   if len(sys.argv) >= 4:
-       keyfile = sys.argv[1]
-       logrus = sys.argv[2]
-       homedir = sys.argv[3]
-   elif len(sys.argv) == 3:
-       keyfile = sys.argv[1]
-       logrus = sys.argv[2]
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-   elif len(sys.argv) == 2:
-       keyfile = sys.argv[1]
-       logrus = input("Enter the UID matching the secret key(s) to export: ")
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-   else:
-       keyfile = input("Enter the path and filename to save the secret key to: ")
-       logrus = input("Enter the UID matching the secret key(s) to export: ")
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-
-   if len(homedir) == 0:
-       homedir = None
-   elif homedir.startswith("~"):
-       userdir = os.path.expanduser(homedir)
-       if os.path.exists(userdir) is True:
-           homedir = os.path.realpath(userdir)
-       else:
-           homedir = None
-   else:
-       homedir = os.path.realpath(homedir)
-
-   if os.path.exists(homedir) is False:
-       homedir = None
-   else:
-       if os.path.isdir(homedir) is False:
-           homedir = None
-       else:
-           pass
-
-   if homedir is not None:
-       c.home_dir = homedir
-   else:
-       pass
-
-   try:
-       result = c.key_export_secret(pattern=logrus)
-   except:
-       result = c.key_export_secret(pattern=None)
-
-   if result is not None:
-       with open(keyfile, "wb") as f:
-           f.write(result)
-       os.chmod(keyfile, 0o600)
-   else:
-       pass
-
-Alternatively the approach of the following script can be used. This
-longer example saves the exported secret key(s) in files in the GnuPG
-home directory, in addition to setting the file permissions as only
-readable and writable by the user. It also exports the secret key(s)
-twice in order to output both GPG binary (``.gpg``) and ASCII armoured
-(``.asc``) files.
-
-.. code:: python
-
-   import gpg
-   import os
-   import os.path
-   import subprocess
-   import sys
-
-   print("""
-   This script exports one or more secret keys as both ASCII armored and binary
-   file formats, saved in files within the user's GPG home directory.
-
-   The gpg-agent and pinentry are invoked to authorise the export.
-   """)
-
-   if sys.platform == "win32":
-       gpgconfcmd = "gpgconf.exe --list-dirs homedir"
-   else:
-       gpgconfcmd = "gpgconf --list-dirs homedir"
-
-   a = gpg.Context(armor=True)
-   b = gpg.Context()
-   c = gpg.Context()
-
-   if len(sys.argv) >= 4:
-       keyfile = sys.argv[1]
-       logrus = sys.argv[2]
-       homedir = sys.argv[3]
-   elif len(sys.argv) == 3:
-       keyfile = sys.argv[1]
-       logrus = sys.argv[2]
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-   elif len(sys.argv) == 2:
-       keyfile = sys.argv[1]
-       logrus = input("Enter the UID matching the secret key(s) to export: ")
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-   else:
-       keyfile = input("Enter the filename to save the secret key to: ")
-       logrus = input("Enter the UID matching the secret key(s) to export: ")
-       homedir = input("Enter the GPG configuration directory path (optional): ")
-
-   if len(homedir) == 0:
-       homedir = None
-   elif homedir.startswith("~"):
-       userdir = os.path.expanduser(homedir)
-       if os.path.exists(userdir) is True:
-           homedir = os.path.realpath(userdir)
-       else:
-           homedir = None
-   else:
-       homedir = os.path.realpath(homedir)
-
-   if os.path.exists(homedir) is False:
-       homedir = None
-   else:
-       if os.path.isdir(homedir) is False:
-           homedir = None
-       else:
-           pass
-
-   if homedir is not None:
-       c.home_dir = homedir
-   else:
-       pass
-
-   if c.home_dir is not None:
-       if c.home_dir.endswith("/"):
-           gpgfile = "{0}{1}.gpg".format(c.home_dir, keyfile)
-           ascfile = "{0}{1}.asc".format(c.home_dir, keyfile)
-       else:
-           gpgfile = "{0}/{1}.gpg".format(c.home_dir, keyfile)
-           ascfile = "{0}/{1}.asc".format(c.home_dir, keyfile)
-   else:
-       if os.path.exists(os.environ["GNUPGHOME"]) is True:
-           hd = os.environ["GNUPGHOME"]
-       else:
-           try:
-               hd = subprocess.getoutput(gpgconfcmd)
-           except:
-               process = subprocess.Popen(gpgconfcmd.split(),
-                                          stdout=subprocess.PIPE)
-               procom = process.communicate()
-               if sys.version_info[0] == 2:
-                   hd = procom[0].strip()
-               else:
-                   hd = procom[0].decode().strip()
-       gpgfile = "{0}/{1}.gpg".format(hd, keyfile)
-       ascfile = "{0}/{1}.asc".format(hd, keyfile)
-
-   try:
-       a_result = a.key_export_secret(pattern=logrus)
-       b_result = b.key_export_secret(pattern=logrus)
-   except:
-       a_result = a.key_export_secret(pattern=None)
-       b_result = b.key_export_secret(pattern=None)
-
-   if a_result is not None:
-       with open(ascfile, "wb") as f:
-           f.write(a_result)
-       os.chmod(ascfile, 0o600)
-   else:
-       pass
-
-   if b_result is not None:
-       with open(gpgfile, "wb") as f:
-           f.write(b_result)
-       os.chmod(gpgfile, 0o600)
-   else:
-       pass
-
-.. _howto-send-public-key:
-
-Sending public keys to the SKS Keyservers
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-As with the previous section on importing keys, the ``hkp4py`` module
-adds another option with exporting keys in order to send them to the
-public keyservers.
-
-The following example demonstrates how this may be done.
-
-.. code:: python
-
-   import gpg
-   import hkp4py
-   import os.path
-   import sys
-
-   print("""
-   This script sends one or more public keys to the SKS keyservers and is
-   essentially a slight variation on the export-key.py script.
-   """)
-
-   c = gpg.Context(armor=True)
-   server = hkp4py.KeyServer("hkps://hkps.pool.sks-keyservers.net")
-
-   if len(sys.argv) > 2:
-       logrus = " ".join(sys.argv[1:])
-   elif len(sys.argv) == 2:
-       logrus = sys.argv[1]
-   else:
-       logrus = input("Enter the UID matching the key(s) to send: ")
-
-   if len(logrus) > 0:
-       try:
-           export_result = c.key_export(pattern=logrus)
-       except Exception as e:
-           print(e)
-           export_result = None
-   else:
-       export_result = c.key_export(pattern=None)
-
-   if export_result is not None:
-       try:
-           try:
-               send_result = server.add(export_result)
-           except:
-               send_result = server.add(export_result.decode())
-           if send_result is not None:
-               print(send_result)
-           else:
-               pass
-       except Exception as e:
-           print(e)
-   else:
-       pass
-
-An expanded version of this script with additional functions for
-specifying an alternative homedir location is in the examples directory
-as ``send-key-to-keyserver.py``.
-
-The ``hkp4py`` module appears to handle both string and byte literal
-text data equally well, but the GPGME bindings deal primarily with byte
-literal data only and so this script sends in that format first, then
-tries the string literal form.
-
-.. _howto-the-basics:
-
-Basic Functions
-===============
-
-The most frequently called features of any cryptographic library will be
-the most fundamental tasks for encryption software. In this section we
-will look at how to programmatically encrypt data, decrypt it, sign it
-and verify signatures.
-
-.. _howto-basic-encryption:
-
-Encryption
-----------
-
-Encrypting is very straight forward. In the first example below the
-message, ``text``, is encrypted to a single recipient\'s key. In the
-second example the message will be encrypted to multiple recipients.
-
-.. _howto-basic-encryption-single:
-
-Encrypting to one key
-~~~~~~~~~~~~~~~~~~~~~
-
-Once the the Context is set the main issues with encrypting data is
-essentially reduced to key selection and the keyword arguments specified
-in the ``gpg.Context().encrypt()`` method.
-
-Those keyword arguments are: ``recipients``, a list of keys encrypted to
-(covered in greater detail in the following section); ``sign``, whether
-or not to sign the plaintext data, see subsequent sections on signing
-and verifying signatures below (defaults to ``True``); ``sink``, to
-write results or partial results to a secure sink instead of returning
-it (defaults to ``None``); ``passphrase``, only used when utilising
-symmetric encryption (defaults to ``None``); ``always_trust``, used to
-override the trust model settings for recipient keys (defaults to
-``False``); ``add_encrypt_to``, utilises any preconfigured
-``encrypt-to`` or ``default-key`` settings in the user\'s ``gpg.conf``
-file (defaults to ``False``); ``prepare``, prepare for encryption
-(defaults to ``False``); ``expect_sign``, prepare for signing (defaults
-to ``False``); ``compress``, compresses the plaintext prior to
-encryption (defaults to ``True``).
-
-.. code:: python
-
-   import gpg
-
-   a_key = "0x12345678DEADBEEF"
-   text = b"""Some text to test with.
-
-   Since the text in this case must be bytes, it is most likely that
-   the input form will be a separate file which is opened with "rb"
-   as this is the simplest method of obtaining the correct data format.
-   """
-
-   c = gpg.Context(armor=True)
-   rkey = list(c.keylist(pattern=a_key, secret=False))
-   ciphertext, result, sign_result = c.encrypt(text, recipients=rkey, sign=False)
-
-   with open("secret_plans.txt.asc", "wb") as afile:
-       afile.write(ciphertext)
-
-Though this is even more likely to be used like this; with the plaintext
-input read from a file, the recipient keys used for encryption
-regardless of key trust status and the encrypted output also encrypted
-to any preconfigured keys set in the ``gpg.conf`` file:
-
-.. code:: python
-
-   import gpg
-
-   a_key = "0x12345678DEADBEEF"
-
-   with open("secret_plans.txt", "rb") as afile:
-       text = afile.read()
-
-   c = gpg.Context(armor=True)
-   rkey = list(c.keylist(pattern=a_key, secret=False))
-   ciphertext, result, sign_result = c.encrypt(text, recipients=rkey, sign=True,
-                                               always_trust=True,
-                                               add_encrypt_to=True)
-
-   with open("secret_plans.txt.asc", "wb") as afile:
-       afile.write(ciphertext)
-
-If the ``recipients`` parameter is empty then the plaintext is encrypted
-symmetrically. If no ``passphrase`` is supplied as a parameter or via a
-callback registered with the ``Context()`` then an out-of-band prompt
-for the passphrase via pinentry will be invoked.
-
-.. _howto-basic-encryption-multiple:
-
-Encrypting to multiple keys
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Encrypting to multiple keys essentially just expands upon the key
-selection process and the recipients from the previous examples.
-
-The following example encrypts a message (``text``) to everyone with an
-email address on the ``gnupg.org`` domain, [4]_ but does *not* encrypt
-to a default key or other key which is configured to normally encrypt
-to.
-
-.. code:: python
-
-   import gpg
-
-   text = b"""Oh look, another test message.
-
-   The same rules apply as with the previous example and more likely
-   than not, the message will actually be drawn from reading the
-   contents of a file or, maybe, from entering data at an input()
-   prompt.
-
-   Since the text in this case must be bytes, it is most likely that
-   the input form will be a separate file which is opened with "rb"
-   as this is the simplest method of obtaining the correct data
-   format.
-   """
-
-   c = gpg.Context(armor=True)
-   rpattern = list(c.keylist(pattern="@gnupg.org", secret=False))
-   logrus = []
-
-   for i in range(len(rpattern)):
-       if rpattern[i].can_encrypt == 1:
-           logrus.append(rpattern[i])
-
-   ciphertext, result, sign_result = c.encrypt(text, recipients=logrus,
-                                               sign=False, always_trust=True)
-
-   with open("secret_plans.txt.asc", "wb") as afile:
-       afile.write(ciphertext)
-
-All it would take to change the above example to sign the message and
-also encrypt the message to any configured default keys would be to
-change the ``c.encrypt`` line to this:
-
-.. code:: python
-
-   ciphertext, result, sign_result = c.encrypt(text, recipients=logrus,
-                                               always_trust=True,
-                                               add_encrypt_to=True)
-
-The only keyword arguments requiring modification are those for which
-the default values are changing. The default value of ``sign`` is
-``True``, the default of ``always_trust`` is ``False``, the default of
-``add_encrypt_to`` is ``False``.
-
-If ``always_trust`` is not set to ``True`` and any of the recipient keys
-are not trusted (e.g. not signed or locally signed) then the encryption
-will raise an error. It is possible to mitigate this somewhat with
-something more like this:
-
-.. code:: python
-
-   import gpg
-
-   with open("secret_plans.txt.asc", "rb") as afile:
-       text = afile.read()
-
-   c = gpg.Context(armor=True)
-   rpattern = list(c.keylist(pattern="@gnupg.org", secret=False))
-   logrus = []
-
-   for i in range(len(rpattern)):
-       if rpattern[i].can_encrypt == 1:
-           logrus.append(rpattern[i])
-
-       try:
-           ciphertext, result, sign_result = c.encrypt(text, recipients=logrus,
-                                                       add_encrypt_to=True)
-       except gpg.errors.InvalidRecipients as e:
-           for i in range(len(e.recipients)):
-               for n in range(len(logrus)):
-                   if logrus[n].fpr == e.recipients[i].fpr:
-                       logrus.remove(logrus[n])
-                   else:
-                       pass
-           try:
-               ciphertext, result, sign_result = c.encrypt(text,
-                                                           recipients=logrus,
-                                                           add_encrypt_to=True)
-               with open("secret_plans.txt.asc", "wb") as afile:
-                   afile.write(ciphertext)
-           except:
-               pass
-
-This will attempt to encrypt to all the keys searched for, then remove
-invalid recipients if it fails and try again.
-
-.. _howto-basic-decryption:
-
-Decryption
-----------
-
-Decrypting something encrypted to a key in one\'s secret keyring is
-fairly straight forward.
-
-In this example code, however, preconfiguring either ``gpg.Context()``
-or ``gpg.core.Context()`` as ``c`` is unnecessary because there is no
-need to modify the Context prior to conducting the decryption and since
-the Context is only used once, setting it to ``c`` simply adds lines for
-no gain.
-
-.. code:: python
-
-   import gpg
-
-   ciphertext = input("Enter path and filename of encrypted file: ")
-   newfile = input("Enter path and filename of file to save decrypted data to: ")
-
-   with open(ciphertext, "rb") as cfile:
-       try:
-           plaintext, result, verify_result = gpg.Context().decrypt(cfile)
-       except gpg.errors.GPGMEError as e:
-           plaintext = None
-           print(e)
-
-   if plaintext is not None:
-       with open(newfile, "wb") as nfile:
-           nfile.write(plaintext)
-       else:
-           pass
-
-The data available in ``plaintext`` in this example is the decrypted
-content as a byte object, the recipient key IDs and algorithms in
-``result`` and the results of verifying any signatures of the data in
-``verify_result``.
-
-If ``gpg.Context().decrypt(cfile, verify=False)`` is called instead,
-then ``verify_result`` will be returned as ``None`` and the rest remains
-as described here.
-
-.. _howto-basic-signing:
-
-Signing text and files
-----------------------
-
-The following sections demonstrate how to specify keys to sign with.
-
-.. _howto-basic-signing-signers:
-
-Signing key selection
-~~~~~~~~~~~~~~~~~~~~~
-
-By default GPGME and the Python bindings will use the default key
-configured for the user invoking the GPGME API. If there is no default
-key specified and there is more than one secret key available it may be
-necessary to specify the key or keys with which to sign messages and
-files.
-
-.. code:: python
-
-   import gpg
-
-   logrus = input("Enter the email address or string to match signing keys to: ")
-   hancock = gpg.Context().keylist(pattern=logrus, secret=True)
-   sig_src = list(hancock)
-
-The signing examples in the following sections include the explicitly
-designated ``signers`` parameter in two of the five examples; once where
-the resulting signature would be ASCII armoured and once where it would
-not be armoured.
-
-While it would be possible to enter a key ID or fingerprint here to
-match a specific key, it is not possible to enter two fingerprints and
-match two keys since the patten expects a string, bytes or None and not
-a list. A string with two fingerprints won\'t match any single key.
-
-.. _howto-basic-signing-normal:
-
-Normal or default signing messages or files
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The normal or default signing process is essentially the same as is most
-often invoked when also encrypting a message or file. So when the
-encryption component is not utilised, the result is to produce an
-encoded and signed output which may or may not be ASCII armoured and
-which may or may not also be compressed.
-
-By default compression will be used unless GnuPG detects that the
-plaintext is already compressed. ASCII armouring will be determined
-according to the value of ``gpg.Context().armor``.
-
-The compression algorithm is selected in much the same way as the
-symmetric encryption algorithm or the hash digest algorithm is when
-multiple keys are involved; from the preferences saved into the key
-itself or by comparison with the preferences with all other keys
-involved.
-
-.. code:: python
-
-   import gpg
-
-   text0 = """Declaration of ... something.
-
-   """
-   text = text0.encode()
-
-   c = gpg.Context(armor=True, signers=sig_src)
-   signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.NORMAL)
-
-   with open("/path/to/statement.txt.asc", "w") as afile:
-       afile.write(signed_data.decode())
-
-Though everything in this example is accurate, it is more likely that
-reading the input data from another file and writing the result to a new
-file will be performed more like the way it is done in the next example.
-Even if the output format is ASCII armoured.
-
-.. code:: python
-
-   import gpg
-
-   with open("/path/to/statement.txt", "rb") as tfile:
-       text = tfile.read()
-
-   c = gpg.Context()
-   signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.NORMAL)
-
-   with open("/path/to/statement.txt.sig", "wb") as afile:
-       afile.write(signed_data)
-
-.. _howto-basic-signing-detached:
-
-Detached signing messages and files
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Detached signatures will often be needed in programmatic uses of GPGME,
-either for signing files (e.g. tarballs of code releases) or as a
-component of message signing (e.g. PGP/MIME encoded email).
-
-.. code:: python
-
-   import gpg
-
-   text0 = """Declaration of ... something.
-
-   """
-   text = text0.encode()
-
-   c = gpg.Context(armor=True)
-   signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.DETACH)
-
-   with open("/path/to/statement.txt.asc", "w") as afile:
-       afile.write(signed_data.decode())
-
-As with normal signatures, detached signatures are best handled as byte
-literals, even when the output is ASCII armoured.
-
-.. code:: python
-
-   import gpg
-
-   with open("/path/to/statement.txt", "rb") as tfile:
-       text = tfile.read()
-
-   c = gpg.Context(signers=sig_src)
-   signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.DETACH)
-
-   with open("/path/to/statement.txt.sig", "wb") as afile:
-       afile.write(signed_data)
-
-.. _howto-basic-signing-clear:
-
-Clearsigning messages or text
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Though PGP/in-line messages are no longer encouraged in favour of
-PGP/MIME, there is still sometimes value in utilising in-line
-signatures. This is where clear-signed messages or text is of value.
-
-.. code:: python
-
-   import gpg
-
-   text0 = """Declaration of ... something.
-
-   """
-   text = text0.encode()
-
-   c = gpg.Context()
-   signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.CLEAR)
-
-   with open("/path/to/statement.txt.asc", "w") as afile:
-       afile.write(signed_data.decode())
-
-In spite of the appearance of a clear-signed message, the data handled
-by GPGME in signing it must still be byte literals.
-
-.. code:: python
-
-   import gpg
-
-   with open("/path/to/statement.txt", "rb") as tfile:
-       text = tfile.read()
-
-   c = gpg.Context()
-   signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.CLEAR)
-
-   with open("/path/to/statement.txt.asc", "wb") as afile:
-       afile.write(signed_data)
-
-.. _howto-basic-verification:
-
-Signature verification
-----------------------
-
-Essentially there are two principal methods of verification of a
-signature. The first of these is for use with the normal or default
-signing method and for clear-signed messages. The second is for use with
-files and data with detached signatures.
-
-The following example is intended for use with the default signing
-method where the file was not ASCII armoured:
-
-.. code:: python
-
-   import gpg
-   import time
-
-   filename = "statement.txt"
-   gpg_file = "statement.txt.gpg"
-
-   c = gpg.Context()
-
-   try:
-       data, result = c.verify(open(gpg_file))
-       verified = True
-   except gpg.errors.BadSignatures as e:
-       verified = False
-       print(e)
-
-   if verified is True:
-       for i in range(len(result.signatures)):
-           sign = result.signatures[i]
-           print("""Good signature from:
-   {0}
-   with key {1}
-   made at {2}
-   """.format(c.get_key(sign.fpr).uids[0].uid, sign.fpr,
-              time.ctime(sign.timestamp)))
-   else:
-       pass
-
-Whereas this next example, which is almost identical would work with
-normal ASCII armoured files and with clear-signed files:
-
-.. code:: python
-
-   import gpg
-   import time
-
-   filename = "statement.txt"
-   asc_file = "statement.txt.asc"
-
-   c = gpg.Context()
-
-   try:
-       data, result = c.verify(open(asc_file))
-       verified = True
-   except gpg.errors.BadSignatures as e:
-       verified = False
-       print(e)
-
-   if verified is True:
-       for i in range(len(result.signatures)):
-           sign = result.signatures[i]
-           print("""Good signature from:
-   {0}
-   with key {1}
-   made at {2}
-   """.format(c.get_key(sign.fpr).uids[0].uid, sign.fpr,
-              time.ctime(sign.timestamp)))
-   else:
-       pass
-
-In both of the previous examples it is also possible to compare the
-original data that was signed against the signed data in ``data`` to see
-if it matches with something like this:
-
-.. code:: python
-
-   with open(filename, "rb") as afile:
-       text = afile.read()
-
-   if text == data:
-       print("Good signature.")
-   else:
-       pass
-
-The following two examples, however, deal with detached signatures. With
-his method of verification the data that was signed does not get
-returned since it is already being explicitly referenced in the first
-argument of ``c.verify``. So ``data`` is ``None`` and only the
-information in ``result`` is available.
-
-.. code:: python
-
-   import gpg
-   import time
-
-   filename = "statement.txt"
-   sig_file = "statement.txt.sig"
-
-   c = gpg.Context()
-
-   try:
-       data, result = c.verify(open(filename), open(sig_file))
-       verified = True
-   except gpg.errors.BadSignatures as e:
-       verified = False
-       print(e)
-
-   if verified is True:
-       for i in range(len(result.signatures)):
-           sign = result.signatures[i]
-           print("""Good signature from:
-   {0}
-   with key {1}
-   made at {2}
-   """.format(c.get_key(sign.fpr).uids[0].uid, sign.fpr,
-              time.ctime(sign.timestamp)))
-   else:
-       pass
-
-.. code:: python
-
-   import gpg
-   import time
-
-   filename = "statement.txt"
-   asc_file = "statement.txt.asc"
-
-   c = gpg.Context()
-
-   try:
-       data, result = c.verify(open(filename), open(asc_file))
-       verified = True
-   except gpg.errors.BadSignatures as e:
-       verified = False
-       print(e)
-
-   if verified is True:
-       for i in range(len(result.signatures)):
-           sign = result.signatures[i]
-           print("""Good signature from:
-   {0}
-   with key {1}
-   made at {2}
-   """.format(c.get_key(sign.fpr).uids[0].uid, sign.fpr,
-              time.ctime(sign.timestamp)))
-   else:
-       pass
-
-.. _key-generation:
-
-Creating keys and subkeys
-=========================
-
-The one thing, aside from GnuPG itself, that GPGME depends on, of
-course, is the keys themselves. So it is necessary to be able to
-generate them and modify them by adding subkeys, revoking or disabling
-them, sometimes deleting them and doing the same for user IDs.
-
-In the following examples a key will be created for the world\'s
-greatest secret agent, Danger Mouse. Since Danger Mouse is a secret
-agent he needs to be able to protect information to ``SECRET`` level
-clearance, so his keys will be 3072-bit keys.
-
-The pre-configured ``gpg.conf`` file which sets cipher, digest and other
-preferences contains the following configuration parameters:
-
-.. code:: conf
-
-   expert
-   allow-freeform-uid
-   allow-secret-key-import
-   trust-model tofu+pgp
-   tofu-default-policy unknown
-   enable-large-rsa
-   enable-dsa2
-   cert-digest-algo SHA512
-   default-preference-list TWOFISH CAMELLIA256 AES256 CAMELLIA192 AES192 CAMELLIA128 AES BLOWFISH IDEA CAST5 3DES SHA512 SHA384 SHA256 SHA224 RIPEMD160 SHA1 ZLIB BZIP2 ZIP Uncompressed
-   personal-cipher-preferences TWOFISH CAMELLIA256 AES256 CAMELLIA192 AES192 CAMELLIA128 AES BLOWFISH IDEA CAST5 3DES
-   personal-digest-preferences SHA512 SHA384 SHA256 SHA224 RIPEMD160 SHA1
-   personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed
-
-.. _keygen-primary:
-
-Primary key
------------
-
-Generating a primary key uses the ``create_key`` method in a Context. It
-contains multiple arguments and keyword arguments, including:
-``userid``, ``algorithm``, ``expires_in``, ``expires``, ``sign``,
-``encrypt``, ``certify``, ``authenticate``, ``passphrase`` and
-``force``. The defaults for all of those except ``userid``,
-``algorithm``, ``expires_in``, ``expires`` and ``passphrase`` is
-``False``. The defaults for ``algorithm`` and ``passphrase`` is
-``None``. The default for ``expires_in`` is ``0``. The default for
-``expires`` is ``True``. There is no default for ``userid``.
-
-If ``passphrase`` is left as ``None`` then the key will not be generated
-with a passphrase, if ``passphrase`` is set to a string then that will
-be the passphrase and if ``passphrase`` is set to ``True`` then
-gpg-agent will launch pinentry to prompt for a passphrase. For the sake
-of convenience, these examples will keep ``passphrase`` set to ``None``.
-
-.. code:: python
-
-   import gpg
-
-   c = gpg.Context()
-
-   c.home_dir = "~/.gnupg-dm"
-   userid = "Danger Mouse <dm@secret.example.net>"
-
-   dmkey = c.create_key(userid, algorithm="rsa3072", expires_in=31536000,
-                        sign=True, certify=True)
-
-One thing to note here is the use of setting the ``c.home_dir``
-parameter. This enables generating the key or keys in a different
-location. In this case to keep the new key data created for this example
-in a separate location rather than adding it to existing and active key
-store data. As with the default directory, ``~/.gnupg``, any temporary
-or separate directory needs the permissions set to only permit access by
-the directory owner. On posix systems this means setting the directory
-permissions to 700.
-
-The ``temp-homedir-config.py`` script in the HOWTO examples directory
-will create an alternative homedir with these configuration options
-already set and the correct directory and file permissions.
-
-The successful generation of the key can be confirmed via the returned
-``GenkeyResult`` object, which includes the following data:
-
-.. code:: python
-
-   print("""
-    Fingerprint:  {0}
-    Primary Key:  {1}
-     Public Key:  {2}
-     Secret Key:  {3}
-    Sub Key:  {4}
-   User IDs:  {5}
-   """.format(dmkey.fpr, dmkey.primary, dmkey.pubkey, dmkey.seckey, dmkey.sub,
-              dmkey.uid))
-
-Alternatively the information can be confirmed using the command line
-program:
-
-.. code:: shell
-
-   bash-4.4$ gpg --homedir ~/.gnupg-dm -K
-   ~/.gnupg-dm/pubring.kbx
-   ----------------------
-   sec   rsa3072 2018-03-15 [SC] [expires: 2019-03-15]
-     177B7C25DB99745EE2EE13ED026D2F19E99E63AA
-   uid           [ultimate] Danger Mouse <dm@secret.example.net>
-
-   bash-4.4$
-
-As with generating keys manually, to preconfigure expanded preferences
-for the cipher, digest and compression algorithms, the ``gpg.conf`` file
-must contain those details in the home directory in which the new key is
-being generated. I used a cut down version of my own ``gpg.conf`` file
-in order to be able to generate this:
-
-.. code:: shell
-
-   bash-4.4$ gpg --homedir ~/.gnupg-dm --edit-key 177B7C25DB99745EE2EE13ED026D2F19E99E63AA showpref quit
-   Secret key is available.
-
-   sec  rsa3072/026D2F19E99E63AA
-        created: 2018-03-15  expires: 2019-03-15  usage: SC
-        trust: ultimate      validity: ultimate
-   [ultimate] (1). Danger Mouse <dm@secret.example.net>
-
-   [ultimate] (1). Danger Mouse <dm@secret.example.net>
-        Cipher: TWOFISH, CAMELLIA256, AES256, CAMELLIA192, AES192, CAMELLIA128, AES, BLOWFISH, IDEA, CAST5, 3DES
-        Digest: SHA512, SHA384, SHA256, SHA224, RIPEMD160, SHA1
-        Compression: ZLIB, BZIP2, ZIP, Uncompressed
-        Features: MDC, Keyserver no-modify
-
-   bash-4.4$
-
-.. _keygen-subkeys:
-
-Subkeys
--------
-
-Adding subkeys to a primary key is fairly similar to creating the
-primary key with the ``create_subkey`` method. Most of the arguments are
-the same, but not quite all. Instead of the ``userid`` argument there is
-now a ``key`` argument for selecting which primary key to add the subkey
-to.
-
-In the following example an encryption subkey will be added to the
-primary key. Since Danger Mouse is a security conscious secret agent,
-this subkey will only be valid for about six months, half the length of
-the primary key.
-
-.. code:: python
-
-   import gpg
-
-   c = gpg.Context()
-   c.home_dir = "~/.gnupg-dm"
-
-   key = c.get_key(dmkey.fpr, secret=True)
-   dmsub = c.create_subkey(key, algorithm="rsa3072", expires_in=15768000,
-                           encrypt=True)
-
-As with the primary key, the results here can be checked with:
-
-.. code:: python
-
-   print("""
-    Fingerprint:  {0}
-    Primary Key:  {1}
-     Public Key:  {2}
-     Secret Key:  {3}
-    Sub Key:  {4}
-   User IDs:  {5}
-   """.format(dmsub.fpr, dmsub.primary, dmsub.pubkey, dmsub.seckey, dmsub.sub,
-              dmsub.uid))
-
-As well as on the command line with:
-
-.. code:: shell
-
-   bash-4.4$ gpg --homedir ~/.gnupg-dm -K
-   ~/.gnupg-dm/pubring.kbx
-   ----------------------
-   sec   rsa3072 2018-03-15 [SC] [expires: 2019-03-15]
-     177B7C25DB99745EE2EE13ED026D2F19E99E63AA
-   uid           [ultimate] Danger Mouse <dm@secret.example.net>
-   ssb   rsa3072 2018-03-15 [E] [expires: 2018-09-13]
-
-   bash-4.4$
-
-.. _keygen-uids:
-
-User IDs
---------
-
-.. _keygen-uids-add:
-
-Adding User IDs
-~~~~~~~~~~~~~~~
-
-By comparison to creating primary keys and subkeys, adding a new user ID
-to an existing key is much simpler. The method used to do this is
-``key_add_uid`` and the only arguments it takes are for the ``key`` and
-the new ``uid``.
-
-.. code:: python
-
-   import gpg
-
-   c = gpg.Context()
-   c.home_dir = "~/.gnupg-dm"
-
-   dmfpr = "177B7C25DB99745EE2EE13ED026D2F19E99E63AA"
-   key = c.get_key(dmfpr, secret=True)
-   uid = "Danger Mouse <danger.mouse@secret.example.net>"
-
-   c.key_add_uid(key, uid)
-
-Unsurprisingly the result of this is:
-
-.. code:: shell
-
-   bash-4.4$ gpg --homedir ~/.gnupg-dm -K
-   ~/.gnupg-dm/pubring.kbx
-   ----------------------
-   sec   rsa3072 2018-03-15 [SC] [expires: 2019-03-15]
-     177B7C25DB99745EE2EE13ED026D2F19E99E63AA
-   uid           [ultimate] Danger Mouse <danger.mouse@secret.example.net>
-   uid           [ultimate] Danger Mouse <dm@secret.example.net>
-   ssb   rsa3072 2018-03-15 [E] [expires: 2018-09-13]
-
-   bash-4.4$
-
-.. _keygen-uids-revoke:
-
-Revoking User IDs
-~~~~~~~~~~~~~~~~~
-
-Revoking a user ID is a fairly similar process, except that it uses the
-``key_revoke_uid`` method.
-
-.. code:: python
-
-   import gpg
-
-   c = gpg.Context()
-   c.home_dir = "~/.gnupg-dm"
-
-   dmfpr = "177B7C25DB99745EE2EE13ED026D2F19E99E63AA"
-   key = c.get_key(dmfpr, secret=True)
-   uid = "Danger Mouse <danger.mouse@secret.example.net>"
-
-   c.key_revoke_uid(key, uid)
-
-.. _key-sign:
-
-Key certification
------------------
-
-Since key certification is more frequently referred to as key signing,
-the method used to perform this function is ``key_sign``.
-
-The ``key_sign`` method takes four arguments: ``key``, ``uids``,
-``expires_in`` and ``local``. The default value of ``uids`` is ``None``
-and which results in all user IDs being selected. The default value of
-both ``expires_in`` and ``local`` is ``False``; which results in the
-signature never expiring and being able to be exported.
-
-The ``key`` is the key being signed rather than the key doing the
-signing. To change the key doing the signing refer to the signing key
-selection above for signing messages and files.
-
-If the ``uids`` value is not ``None`` then it must either be a string to
-match a single user ID or a list of strings to match multiple user IDs.
-In this case the matching of those strings must be precise and it is
-case sensitive.
-
-To sign Danger Mouse\'s key for just the initial user ID with a
-signature which will last a little over a month, do this:
-
-.. code:: python
-
-   import gpg
-
-   c = gpg.Context()
-   uid = "Danger Mouse <dm@secret.example.net>"
-
-   dmfpr = "177B7C25DB99745EE2EE13ED026D2F19E99E63AA"
-   key = c.get_key(dmfpr, secret=True)
-   c.key_sign(key, uids=uid, expires_in=2764800)
-
-.. _key-sign-verify:
-
-Verifying key certifications
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-   import gpg
-   import time
-
-   c = gpg.Context()
-   dmfpr = "177B7C25DB99745EE2EE13ED026D2F19E99E63AA"
-   keys = list(c.keylist(pattern=dmuid, mode=gpg.constants.keylist.mode.SIGS))
-   key = keys[0]
-
-   for user in key.uids:
-       for sig in user.signatures:
-           print("0x{0}".format(sig.keyid), "", time.ctime(sig.timestamp), "",
-                 sig.uid)
-
-Which for Danger Mouse displays the following:
-
-::
-
-   0x92E3F6115435C65A  Thu Mar 15 13:17:44 2018  Danger Mouse <dm@secret.example.net>
-   0x321E4E2373590E5D  Mon Nov 26 12:46:05 2018  Ben McGinnes <ben@adversary.org>
-
-The two key signatures listed are for the self-certification of Danger
-Mouse\'s key made when the key was created in March, 2018; and the
-second is a signature made by the author and set to expire at the end of
-the year. Note that the second signature was made with the following
-code (including the preceding code to display the output of the
-certifications or key signatures):
-
-.. code:: python
-
-   import gpg
-   import math
-   import pendulum
-   import time
-
-   hd = "/home/dm/.gnupg"
-   c = gpg.Context()
-   d = gpg.Context(home_dir=hd)
-   dmfpr = "177B7C25DB99745EE2EE13ED026D2F19E99E63AA"
-   dmuid = "Danger Mouse <dm@secret.example.net>"
-   dkeys = list(c.keylist(pattern=dmuid))
-   dmkey = dkeys[0]
-
-   c.key_import(d.key_export(pattern=None))
-
-   tp = pendulum.period(pendulum.now(tz="local"), pendulum.datetime(2019, 1, 1))
-   ts = tp.total_seconds()
-   total_secs = math.ceil(ts)
-   c.key_sign(dmkey, uids=dmuid, expires_in=total_secs)
-
-   d.key_import(c.key_export(pattern=dmuid))
-   keys = list(c.keylist(pattern=dmuid, mode=gpg.constants.keylist.mode.SIGS))
-   key = keys[0]
-
-   for user in key.uids:
-       for sig in user.signatures:
-           print("0x{0}".format(sig.keyid), "", time.ctime(sig.timestamp), "",
-                 sig.uid)
-
-Note that this final code block includes the use of a module which is
-*not* part of Python\'s standard library, the `pendulum
-module <https://pendulum.eustace.io/>`__. Unlike the standard datetime
-module, pendulum makes working with dates and times significantly easier
-in Python; just as the requests module makes working with HTTP and HTTPS
-easier than the builtin modules do.
-
-Though neither requests nor pendulum are required modules for using the
-GPGME Python bindings, they are both highly recommended more generally.
-
-.. _advanced-use:
-
-Advanced or Experimental Use Cases
-==================================
-
-.. _cython:
-
-C plus Python plus SWIG plus Cython
------------------------------------
-
-In spite of the apparent incongruence of using Python bindings to a C
-interface only to generate more C from the Python; it is in fact quite
-possible to use the GPGME bindings with
-`Cython <http://docs.cython.org/en/latest/index.html>`__. Though in many
-cases the benefits may not be obvious since the most computationally
-intensive work never leaves the level of the C code with which GPGME
-itself is interacting with.
-
-Nevertheless, there are some situations where the benefits are
-demonstrable. One of the better and easier examples being the one of the
-early examples in this HOWTO, the `key
-counting <#howto-keys-counting>`__ code. Running that example as an
-executable Python script, ``keycount.py`` (available in the
-``examples/howto/`` directory), will take a noticeable amount of time to
-run on most systems where the public keybox or keyring contains a few
-thousand public keys.
-
-Earlier in the evening, prior to starting this section, I ran that
-script on my laptop; as I tend to do periodically and timed it using
-``time`` utility, with the following results:
-
-.. code:: shell
-
-   bash-4.4$ time keycount.py
-
-   Number of secret keys:  23
-   Number of public keys:  12112
-
-
-   real  11m52.945s
-   user  0m0.913s
-   sys   0m0.752s
-
-   bash-4.4$
-
-Sometime after that I imported another key and followed it with a little
-test of Cython. This test was kept fairly basic, essentially lifting the
-material from the `Cython Basic
-Tutorial <http://docs.cython.org/en/latest/src/tutorial/cython_tutorial.html>`__
-to demonstrate compiling Python code to C. The first step was to take
-the example key counting code quoted previously, essentially from the
-importing of the ``gpg`` module to the end of the script:
-
-.. code:: python
-
-   import gpg
-
-   c = gpg.Context()
-   seckeys = c.keylist(pattern=None, secret=True)
-   pubkeys = c.keylist(pattern=None, secret=False)
-
-   seclist = list(seckeys)
-   secnum = len(seclist)
-
-   publist = list(pubkeys)
-   pubnum = len(publist)
-
-   print("""
-       Number of secret keys:  {0}
-       Number of public keys:  {1}
-
-   """.format(secnum, pubnum))
-
-Save that into a file called ``keycount.pyx`` and then create a
-``setup.py`` file which contains this:
-
-.. code:: python
-
-   from distutils.core import setup
-   from Cython.Build import cythonize
-
-   setup(
-       ext_modules = cythonize("keycount.pyx")
-   )
-
-Compile it:
-
-.. code:: shell
-
-   bash-4.4$ python setup.py build_ext --inplace
-   bash-4.4$
-
-Then run it in a similar manner to ``keycount.py``:
-
-.. code:: shell
-
-   bash-4.4$ time python3.7 -c "import keycount"
-
-   Number of secret keys:  23
-   Number of public keys:  12113
-
-
-   real  6m47.905s
-   user  0m0.785s
-   sys   0m0.331s
-
-   bash-4.4$
-
-Cython turned ``keycount.pyx`` into an 81KB ``keycount.o`` file in the
-``build/`` directory, a 24KB ``keycount.cpython-37m-darwin.so`` file to
-be imported into Python 3.7 and a 113KB ``keycount.c`` generated C
-source code file of nearly three thousand lines. Quite a bit bigger than
-the 314 bytes of the ``keycount.pyx`` file or the full 1,452 bytes of
-the full executable ``keycount.py`` example script.
-
-On the other hand it ran in nearly half the time; taking 6 minutes and
-47.905 seconds to run. As opposed to the 11 minutes and 52.945 seconds
-which the CPython script alone took.
-
-The ``keycount.pyx`` and ``setup.py`` files used to generate this
-example have been added to the ``examples/howto/advanced/cython/``
-directory The example versions include some additional options to
-annotate the existing code and to detect Cython\'s use. The latter comes
-from the `Magic
-Attributes <http://docs.cython.org/en/latest/src/tutorial/pure.html#magic-attributes-within-the-pxd>`__
-section of the Cython documentation.
-
-.. _cheats-and-hacks:
-
-Miscellaneous extras and work-arounds
-=====================================
-
-Most of the things in the following sections are here simply because
-there was no better place to put them, even though some are only
-peripherally related to the GPGME Python bindings. Some are also
-workarounds for functions not integrated with GPGME as yet. This is
-especially true of the first of these, dealing with `group
-lines <#group-lines>`__.
-
-Group lines
------------
-
-There is not yet an easy way to access groups configured in the gpg.conf
-file from within GPGME. As a consequence these central groupings of keys
-cannot be shared amongst multiple programs, such as MUAs readily.
-
-The following code, however, provides a work-around for obtaining this
-information in Python.
-
-.. code:: python
-
-   import subprocess
-   import sys
-
-   if sys.platform == "win32":
-       gpgconfcmd = "gpgconf.exe --list-options gpg"
-   else:
-       gpgconfcmd = "gpgconf --list-options gpg"
-
-   process = subprocess.Popen(gpgconfcmd.split(), stdout=subprocess.PIPE)
-   procom = process.communicate()
-
-   if sys.version_info[0] == 2:
-       lines = procom[0].splitlines()
-   else:
-       lines = procom[0].decode().splitlines()
-
-   for line in lines:
-       if line.startswith("group") is True:
-           break
-
-   groups = line.split(":")[-1].replace('"', '').split(',')
-
-   group_lines = []
-   group_lists = []
-
-   for group in groups:
-       group_lines.append(group.split("="))
-       group_lists.append(group.split("="))
-
-   for glist in group_lists:
-       glist[1] = glist[1].split()
-
-The result of that code is that ``group_lines`` is a list of lists where
-``group_lines[i][0]`` is the name of the group and ``group_lines[i][1]``
-is the key IDs of the group as a string.
-
-The ``group_lists`` result is very similar in that it is a list of
-lists. The first part, ``group_lists[i][0]`` matches
-``group_lines[i][0]`` as the name of the group, but
-``group_lists[i][1]`` is the key IDs of the group as a list.
-
-A demonstration of using the ``groups.py`` module is also available in
-the form of the executable ``mutt-groups.py`` script. This second script
-reads all the group entries in a user\'s ``gpg.conf`` file and converts
-them into crypt-hooks suitable for use with the Mutt and Neomutt mail
-clients.
-
-.. _hkp4py:
-
-Keyserver access for Python
----------------------------
-
-The `hkp4py <https://github.com/Selfnet/hkp4py>`__ module by Marcel Fest
-was originally a port of the old
-`python-hkp <https://github.com/dgladkov/python-hkp>`__ module from
-Python 2 to Python 3 and updated to use the
-`requests <http://docs.python-requests.org/en/latest/index.html>`__
-module instead. It has since been modified to provide support for Python
-2.7 as well and is available via PyPI.
-
-Since it rewrites the ``hkp`` protocol prefix as ``http`` and ``hkps``
-as ``https``, the module is able to be used even with servers which do
-not support the full scope of keyserver functions. [5]_ It also works
-quite readily when incorporated into a `Cython <#cython>`__ generated
-and compiled version of any code.
-
-.. _hkp4py-strings:
-
-Key import format
-~~~~~~~~~~~~~~~~~
-
-The hkp4py module returns key data via requests as string literals
-(``r.text``) instead of byte literals (``r.content``). This means that
-the retrurned key data must be encoded to UTF-8 when importing that key
-material using a ``gpg.Context().key_import()`` method.
-
-For this reason an alternative method has been added to the ``search``
-function of ``hkp4py.KeyServer()`` which returns the key in the correct
-format as expected by ``key_import``. When importing using this module,
-it is now possible to import with this:
-
-.. code:: python
-
-   for key in keys:
-       if key.revoked is False:
-           gpg.Context().key_import(key.key_blob)
-       else:
-           pass
-
-Without that recent addition it would have been necessary to encode the
-contents of each ``hkp4py.KeyServer().search()[i].key`` in
-``hkp4py.KeyServer().search()`` before trying to import it.
-
-An example of this is included in the `Importing
-Keys <#howto-import-key>`__ section of this HOWTO and the corresponding
-executable version of that example is available in the
-``lang/python/examples/howto`` directory as normal; the executable
-version is the ``import-keys-hkp.py`` file.
-
-.. _gpgme-version-check:
-
-GPGME version checking
-----------------------
-
-For various reasons it may be necessary to check which version of GPGME
-the bindings have been built against; including whether a minimum
-required version of GPGME is in use.
-
-For the most part the ``gpg.version.versionstr`` and
-``gpg.version.versionlist`` methods have been quite sufficient. The
-former returns the same string as ``gpgme-config --version``, while the
-latter returns the major, minor and patch values in a list.
-
-To check if the installed bindings have actually been built against the
-current installed libgpgme version, this check can be performed:
-
-.. code:: python
-
-   import gpg
-   import subprocess
-   import sys
-
-   gpgme_version_call = subprocess.Popen(["gpgme-config", "--version"],
-                                         stdout=subprocess.PIPE,
-                                         stderr=subprocess.PIPE)
-   gpgme_version_str = gpgme_version_call.communicate()
-
-   if sys.version_info[0] == 2:
-       gpgme_version = gpgme_version_str[0].strip()
-   elif sys.version_info[0] >= 3:
-       gpgme_version = gpgme_version_str[0].decode().strip()
-   else:
-       gpgme_version = None
-
-   if gpgme_version is not None:
-       if gpgme_version == gpg.version.versionstr:
-           print("The GPGME Python bindings match libgpgme.")
-       else:
-           print("The GPGME Python bindings do NOT match libgpgme.")
-   else:
-       print("Upgrade Python and reinstall the GPGME Python bindings.")
-
-For many developers, however, the preferred checking means checking for
-a minimum version or point release. This is now readily available via
-the ``gpg.version.versionintlist`` method (added in version
-``1.12.1-beta79``). It is also now possible to easily check whether the
-installed GPGME Python bindings were built from a development or beta
-branch of the GPGME source code.
-
-The following code demonstrates how both of those methods may be used:
-
-.. code:: python
-
-   import gpg
-
-   try:
-       if gpg.version.is_beta is True:
-           print("The installed GPGME Python bindings were built from beta code.")
-       else:
-           print("The installed GPGME Python bindings are a released version.")
-   except Exception as e:
-       print(e)
-
-   try:
-       if gpg.version.versionintlist[0] == 1:
-           if gpg.version.versionintlist[1] == 12:
-               if gpg.version.versionintlist[2] == 1:
-                   print("This is the minimum version for using versionintlist.")
-               elif gpg.version.versionintlist[2] > 1:
-                   print("The versionintlist method is available.")
-               else:
-                   pass
-           elif gpg.version.versionintlist[1] > 12:
-               print("The versionintlist method is available.")
-           else:
-               pass
-       elif gpg.version.versionintlist[0] > 1:
-           print("The versionintlist method is available.")
-       else:
-           pass
-   except Exception as e:
-       print(e)
-
-The points where ``pass`` is used in the above example will most likely
-also produce an ``Exception`` error since those results should only
-occur in versions which do not have the ``gpgme.version.is_beta`` and
-``gpgme.version.versionintlist`` methods available.
-
-.. _copyright-and-license:
-
-Copyright and Licensing
-=======================
-
-Copyright
----------
-
-Copyright © The GnuPG Project, 2018.
-
-.. _draft-editions:
-
-Draft Editions of this HOWTO
-----------------------------
-
-Draft editions of this HOWTO may be periodically available directly from
-the author at any of the following URLs:
-
--  `GPGME Python Bindings HOWTO draft (HTML single file, AWS S3
-   SSL) <https://files.au.adversary.org/crypto/gpgme-python-howto.html>`__
--  `GPGME Python Bindings HOWTO draft (HTML single file, AWS S3 no
-   SSL) <http://files.au.adversary.org/crypto/gpgme-python-howto.html>`__
--  `GPGME Python Bindings HOWTO draft (HTML multiple files, AWS S3
-   SSL) <https://files.au.adversary.org/crypto/gpgme-python-howto-split/index.html>`__
--  `GPGME Python Bindings HOWTO draft (HTML multiple files, AWS S3 no
-   SSL) <http://files.au.adversary.org/crypto/gpgme-python-howto/index.html>`__
-
-These draft versions have been generated from this document via GNU
-Emacs `Org mode <https://orgmode.org/>`__ to ``.texi`` and `GNU
-Texinfo <https://www.gnu.org/software/texinfo/>`__ to HTML. Though it is
-likely that the specific
-`file <https://files.au.adversary.org/crypto/gpgme-python-howto>`__
-`version <http://files.au.adversary.org/crypto/gpgme-python-howto.org>`__
-used will be on the same server with the generated output formats.
-Occasionally I may include the Org mode generated XHTML versions:
-
--  `GPGME Python Bindings HOWTO draft (HTML single file, AWS S3
-   SSL) <https://files.au.adversary.org/crypto/gpgme-python-howto.xhtml>`__
--  `GPGME Python Bindings HOWTO draft (HTML single file, AWS S3 no
-   SSL) <http://files.au.adversary.org/crypto/gpgme-python-howto.xhtml>`__
-
-That XHTML version, however, is exported in a way which inherits a
-colour scheme from `the author\'s Emacs
-theme <https://github.com/holomorph/emacs-zenburn>`__ (which is a higher
-contrast version of `Zenburn <http://kippura.org/zenburnpage/>`__ ported
-by `Holomorph <https://github.com/holomorph>`__). So it\'s fine for
-people who prefer dark themed web pages, but not so great for everyone
-else.
-
-The GNU Texinfo and reStructured Text versions ship with the software,
-while the GNU Emacs Info version is generated from the Texinfo version
-using GNU Texinfo or GNU Makeinfo. The Texinfo format is generated from
-the original Org mode source file in Org mode itself either within GNU
-Emacs or via the command line by invoking Emacs in batch mode:
-
-.. code:: shell
-
-   emacs gpgme-python-howto.org --batch -f org-texinfo-export-to-texinfo --kill
-   emacs gpgme-python-howto --batch -f org-texinfo-export-to-texinfo --kill
-
-The reStructuredText format is also generated from the Org mode source
-file, except it is generated using `Pandoc <https://pandoc.org>`__ with
-either of the following commands (depending on the filename):
-
-.. code:: shell
-
-   pandoc -f org -t rst+smart -o gpgme-python-howto.rst gpgme-python-howto.org
-   pandoc -f org -t rst+smart -o gpgme-python-howto.rst gpgme-python-howto
-
-Note that the Org mode source files are identified as such via a mode
-line at the top of each file and have had their ``.org`` file extensions
-dropped in order to make scripted generation of output formats easier
-and not require renaming files post-conversion.
-
-Due to a bug in Org mode\'s texinfo conversion method, the recommended
-steps for generating the Texinfo files for all the files in the
-``lang/python/doc/src/`` directory are as follows:
-
-.. code:: shell
-
-   for x in * ; do
-       emacs $x --batch -f org-texinfo-export-to-texinfo --kill
-       cat $x.texi | sed -e 's/@documentencoding UTF-8/@documentencoding utf-8/g' > ../texinfo/$x.texi
-       pandoc -f org -t rst+smart -o ../rst/$x.rst $x
-   done ;
-   rm -fv *.texi
-   cd ../texinfo
-   mkdir info
-   mkdir html
-   for x in *.texi ; do
-       makeinfo -v $x
-       makeinfo --html --no-split $x
-   done ;
-   mv *.info info/
-   mv *.html html/
-
-This code snippet includes the generation of the reStructuredText files
-and would be expected to be run from the ``doc/src/`` directory
-containing the Org mode source files. It also assumes that the commands
-are being run on POSIX compliant systems with basic tools like sed, the
-Bourne shell and GNU Emacs [6]_ available. The code snippet also
-includes the steps for generating the Emacs Info files and HTML files
-from the Texinfo files. Using reStructuredText files with Sphinx is best
-left for the documentation of that project.
-
-In addition to these there is a significantly less frequently updated
-version as a HTML `WebHelp
-site <https://files.au.adversary.org/crypto/gpgme-python/dita/webhelp/index.html>`__
-(AWS S3 SSL); generated from DITA XML source files, which can be found
-in `an alternative
-branch <https://dev.gnupg.org/source/gpgme/browse/ben%252Fhowto-dita/>`__
-of the GPGME git repository.
-
-Various generated output formats may occasionally be found in
-subdirectories of the
-`gpgme-python <https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python>`__
-directory. In particular within the
-`DITA <https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python/dita>`__,
-`reStructuredText <https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python/rst>`__
-and
-`Texinfo <https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python/texinfo>`__
-subdirectories. The ``rst`` directory contains output files generated
-with Sphinx and may include a considerable number of its possible output
-formats, but there are no guarantees as to how recent these are or even
-if they are present.
-
-These draft editions are not official documents and the version of
-documentation in the master branch or which ships with released versions
-is the only official documentation. Nevertheless, these draft editions
-may occasionally be of use by providing more accessible web versions
-which are updated between releases. They are provided on the
-understanding that they may contain errors or may contain content
-subject to change prior to an official release.
-
-.. _license:
-
-License GPL compatible
-----------------------
-
-This file is free software; as a special exception the author gives
-unlimited permission to copy and/or distribute it, with or without
-modifications, as long as this notice is preserved.
-
-This file is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY, to the extent permitted by law; without even the implied
-warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-Footnotes
-=========
-
-.. [1]
-   ``short-history`` and/or ``short-history.html``.
-
-.. [2]
-   With no issues reported specific to Python 3.7, the release of Python
-   3.7.1 at around the same time as GPGME 1.12.0 and the testing with
-   Python 3.7.1rc1, there is no reason to delay moving 3.7 ahead of 3.6
-   now. Production environments with more conservative requirements will
-   always enforce their own policies anyway and installation to each
-   supported minor release is quite possible too.
-
-.. [3]
-   Yes, even if you use virtualenv with everything you do in Python. If
-   you want to install this module as just your user account then you
-   will need to manually configure, compile and install the *entire*
-   GnuPG stack as that user as well. This includes libraries which are
-   not often installed that way. It can be done and there are
-   circumstances under which it is worthwhile, but generally only on
-   POSIX systems which utilise single user mode (some even require it).
-
-.. [4]
-   You probably don\'t really want to do this. Searching the keyservers
-   for \"gnupg.org\" produces over 400 results, the majority of which
-   aren\'t actually at the gnupg.org domain, but just included a comment
-   regarding the project in their key somewhere.
-
-.. [5]
-   Such as with ProtonMail servers. This also means that restricted
-   servers which only advertise either HTTP or HTTPS end points and not
-   HKP or HKPS end points must still be identified as as HKP or HKPS
-   within the Python Code. The ``hkp4py`` module will rewrite these
-   appropriately when the connection is made to the server.
-
-.. [6]
-   Okay, Emacs might not necessarily qualify as a basic tool, but it is
-   common enough that having it installed on a system isn\'t too great
-   an expectation, nor is it difficult to add to most POSIX systems,
-   even if the users of those systems do not personally use it.
diff --git a/lang/python/doc/rst/index.rst b/lang/python/doc/rst/index.rst
deleted file mode 100644 (file)
index 3ff34fc..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-.. GPGME Python Bindings documentation master file, created by
-   sphinx-quickstart on Wed Dec  5 09:04:47 2018.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-GPGME Python Bindings
-=====================
-
-.. toctree::
-   :maxdepth: 3
-   :caption: Contents:
-
-Contents
---------
-
--  `A short history of the project <short-history>`__
--  `What\'s New <what-is-new>`__
-
-   -  `Maintenance Mode <maintenance-mode>`__ (from January, 2019)
-
--  `What Was New <what-was-new>`__
--  `GPGME Python Bindings HOWTO <gpgme-python-howto>`__
diff --git a/lang/python/doc/rst/maintenance-mode.rst b/lang/python/doc/rst/maintenance-mode.rst
deleted file mode 100644 (file)
index 6f770bc..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-.. _maintenance-mode:
-
-Maintenance Mode from 2019
-==========================
-
-+-----------------+------------------------------------------+
-| Version:        | 0.0.1                                    |
-+-----------------+------------------------------------------+
-| GPGME Version:  | 1.13.0                                   |
-+-----------------+------------------------------------------+
-| Author:         | Ben McGinnes <ben@gnupg.org>             |
-+-----------------+------------------------------------------+
-| Author GPG Key: | DB4724E6FA4286C92B4E55C4321E4E2373590E5D |
-+-----------------+------------------------------------------+
-| Language:       | Australian English, British English      |
-+-----------------+------------------------------------------+
-| xml:lang:       | en-AU, en-GB, en                         |
-+-----------------+------------------------------------------+
-
-From the beginning of 2019 the Python bindings to GPGME will enter
-maintenance mode, meaning that new features will not be added and only
-bug fixes and security fixes will be made. This also means that
-documentation beyond that existing at the end of 2018 will not be
-developed further except to correct errors.
-
-Though use of these bindings appears to have been quite well received,
-there has been no indication of what demand there is, if any for either
-financial backing of the current Python bindings development or support
-contracts with g10code GmbH citing the necessity of including the
-bindings.
-
-.. _maintenance-mode-bm:
-
-Maintainer from 2019 onward
----------------------------
-
-How does this affect the position of GnuPG Python Bindings Maintainer?
-
-Well, I will remain as maintainer of the bindings; but without funding
-for that position, the amount of time I will be able to dedicate solely
-to this task will be limited and reduced to volunteered time. As with
-all volunteered time and effort in free software projects, this will be
-subject to numerous external imperatives.
-
-.. _maintenance-mode-blade-runner:
-
-Using the Python Bindings from 2019 and beyond
-----------------------------------------------
-
-For most, if not all, Python developers using these bindings; they will
-continue to "just work" the same as they always have. Expansions of
-GPGME itself are usually handled by SWIG with the existing code and thus
-bindings are generated properly when the bindings are installed
-alongside GPGME and when the latter is built from source.
-
-In the rare circumstances where that is not enough to address some new
-addition to GPGME, then that is a bug and thus subject to the
-maintenance mode provisions (i.e. it will be fixed following a bug
-report being raised and your humble author will need to remember where
-the timesheet template was filed, depending on how many years off such
-an event is).
-
-All the GPGME functionality will continue to be accessible via the lower
-level, dynamically generated methods which match the GPGME C
-documentation. While the more intuitively Pythonic higher level layer
-already covers the vast majority of functionality people require with
-key generation, signatures, certifications (key signing), encryption,
-decryption, verification, validation, trust levels and so on.
-
-Any wanted features lacking in the Python bindings are usually lacking
-because they are missing from GPGME itself (e.g. revoking keys via the
-API) and in such cases they are usually deliberately excluded. More
-discussion of these issues can be found in the archives of the
-`gnupg-devel mailing
-list <https://lists.gnupg.org/mailman/listinfo/gnupg-devel>`__.
-
-Any features existing in the dynamically generated layer for which
-people want a specific, higher level function included to make it more
-Pythonic (e.g. to avoid needing to learn or memorise cryptographic mode
-values or GnuPG status code numbers), would be a feature request and
-*not* a bug.
-
-It is still worthwhile requesting it, but the addition of such a feature
-would not be guaranteed and provided on a purely volunteer basis.
-Expediting such a request would require funding that request.
-
-Those with a commercial interest in expediting such a feature request
-already know how to `expedite
-it <https://gnupg.org/cgi-bin/procdonate.cgi?mode=preset>`__ (use the
-message field to state what feature is being requested).
-
-.. _docs:
-
-Documentation formats
----------------------
-
-The documentation has been written in Org mode for GNU Emacs, with both
-Texinfo and reStructuredText formats generated from that. The Texinfo
-files are intended for use with the rest of the GnuPG documentation;
-while the reStructuredText files are intended for use with Docutils and
-Sphinx, as with other Python projects.
-
-.. _sphinx-made-epubs-suck:
-
-Cautionary Notes regarding Sphinx and EPUB
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Though Python\'s Docutils in conjunction with Sphinx is capable of
-generating some very useful HTML sites, as proven by `Read the
-Docs <https://readthedocs.org/>`__ and the `Python
-documentation <https://docs.python.org/>`__, there are a number of
-output formats it does not handle well. At the top of the list of things
-it manages to break so atrociously as to be embarassing is the `EPUB
-3 <http://idpf.org/epub>`__ format.
-
-The automatically generated EPUB of the CPython documentation always
-contains hundreds of validation errors and even the modest amount of
-documentation here `produced a
-file <https://files.au.adversary.org.s3.amazonaws.com/crypto/gpgme-python/rst/epub/GPGMEPythonBindings.epub>`__
-with approximately thirty validation errors. As the volume of
-documentation content increases, so does the induced errors. Whereas
-Texinfo doesn\'t produce EPUB output at all, nor does Org-mode.
-
-Should there ever be genuine demand for this format, lodge a `feature
-request <https://dev.gnupg.org/maniphest/task/edit/form/4/>`__ case
-marked for `my <https://dev.gnupg.org/p/BenM/>`__ attention. The means
-of generating such files flawlessly is already available, but is not yet
-part of the GnuPG build system. Nor is it integrated with a means of
-converting Org mode input files to the relevant base format
-automatically, as can already be done when converting Org to
-reStructuredText or Org to Texinfo. As a certain amount of work would be
-required to get it done, there would need to be clear demand for that
-work to be done.
diff --git a/lang/python/doc/rst/short-history.rst b/lang/python/doc/rst/short-history.rst
deleted file mode 100644 (file)
index 071ca9e..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-Overview
-========
-
-+-----------------+------------------------------------------+
-| Version:        | 0.0.1                                    |
-+-----------------+------------------------------------------+
-| GPGME Version:  | 1.13.0                                   |
-+-----------------+------------------------------------------+
-| Author:         | Ben McGinnes <ben@gnupg.org>             |
-+-----------------+------------------------------------------+
-| Author GPG Key: | DB4724E6FA4286C92B4E55C4321E4E2373590E5D |
-+-----------------+------------------------------------------+
-| Language:       | Australian English, British English      |
-+-----------------+------------------------------------------+
-| xml:lang:       | en-AU, en-GB, en                         |
-+-----------------+------------------------------------------+
-
-The GPGME Python bindings passed through many hands and numerous phases
-before, after a fifteen year journey, coming full circle to return to
-the source. This is a short explanation of that journey.
-
-.. _in-the-begining:
-
-In the beginning
-----------------
-
-In 2002 John Goerzen released PyME; Python bindings for the GPGME module
-which utilised the current release of Python of the time and SWIG. [1]_
-Shortly after creating it and ensuring it worked he stopped supporting
-it, though he left his work available on his Gopher site.
-
-Keeping the flame alive
------------------------
-
-A couple of years later the project was picked up by Igor Belyi and
-actively developed and maintained by him from 2004 to 2008. Igor\'s
-whereabouts at the time of this document\'s creation are unknown, but
-the current authors do hope he is well. We\'re assuming (or hoping) that
-life did what life does and made continuing untenable.
-
-Passing the torch
------------------
-
-In 2014 Martin Albrecht wanted to patch a bug in the PyME code and
-discovered the absence of Igor. Following a discussion on the PyME
-mailing list he became the new maintainer for PyME, releasing version
-0.9.0 in May of that year. He remains the maintainer of the original
-PyME release in Python 2.6 and 2.7 (available via PyPI).
-
-.. _ouroboros:
-
-Coming full circle
-------------------
-
-In 2015 Ben McGinnes approached Martin about a Python 3 version, while
-investigating how complex a task this would be the task ended up being
-completed. A subsequent discussion with Werner Koch led to the decision
-to fold the Python 3 port back into the original GPGME release in the
-languages subdirectory for non-C bindings under the module name of
-``pyme3``.
-
-In 2016 this PyME module was integrated back into the GPGME project by
-Justus Winter. During the course of this work Justus adjusted the port
-to restore limited support for Python 2, but not as many minor point
-releases as the original PyME package supports. During the course of
-this integration the package was renamed to more accurately reflect its
-status as a component of GPGME. The ``pyme3`` module was renamed to
-``gpg`` and adopted by the upstream GnuPG team.
-
-In 2017 Justus departed G10code and the GnuPG team. Following this Ben
-returned to maintain of gpgme Python bindings and continue building them
-from that point.
-
-.. _relics-past:
-
-Relics of the past
-==================
-
-There are a few things, in addition to code specific factors, such as
-SWIG itself, which are worth noting here.
-
-The Annoyances of Git
----------------------
-
-As anyone who has ever worked with git knows, submodules are horrible
-way to deal with pretty much anything. In the interests of avoiding
-migraines, that was skipped with addition of the PyME code to GPGME.
-
-Instead the files were added to a subdirectory of the ``lang/``
-directory, along with a copy of the entire git log up to that point as a
-separate file within the ``lang/python/docs/`` directory. [2]_ As the
-log for PyME is nearly 100KB and the log for GPGME is approximately 1MB,
-this would cause considerable bloat, as well as some confusion, should
-the two be merged.
-
-Hence the unfortunate, but necessary, step to simply move the files. A
-regular repository version has been maintained should it be possible to
-implement this better in the future.
-
-The Perils of PyPI
-------------------
-
-The early port of the Python 2 ``pyme`` module as ``pyme3`` was never
-added to PyPI while the focus remained on development and testing during
-2015 and early 2016. Later in 2016, however, when Justus completed his
-major integration work and subsequently renamed the module from
-``pyme3`` to ``gpg``, some prior releases were also provided through
-PyPI.
-
-Since these bindings require a matching release of the GPGME libraries
-in order to function, it was determined that there was little benefit in
-also providing a copy through PyPI since anyone obtaining the GPGME
-source code would obtain the Python bindings source code at the same
-time. Whereas there was the potential to sew confusion amongst Python
-users installing the module from PyPI, only to discover that without the
-relevant C files, header files or SWIG compiled binaries, the Python
-module did them little good.
-
-There are only two files on PyPI which might turn up in a search for
-this module or a sample of its content:
-
-#. gpg (1.8.0) - Python bindings for GPGME GnuPG cryptography library
-#. pyme (0.9.0) - Python support for GPGME GnuPG cryptography library
-
-.. _pypi-gpgme-180:
-
-GPG 1·8·0 - Python bindings for GPGME GnuPG cryptography library
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This is the most recent version to reach PyPI and is the version of the
-official Pyhon bindings which shipped with GPGME 1.8.0. If you have
-GPGME 1.8.0 installed and *only* 1.8.0 installed, then it is probably
-safe to use this copy from PyPI.
-
-As there have been a lot of changes since the release of GPGME 1.8.0,
-the GnuPG Project recommends not using this version of the module and
-instead installing the current version of GPGME along with the Python
-bindings included with that package.
-
-.. _pypi-gpgme-90:
-
-PyME 0·9·0 - Python support for GPGME GnuPG cryptography library
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This is the last release of the PyME bindings maintained by Martin
-Albrecht and is only compatible with Python 2, it will not work with
-Python 3. This is the version of the software from which the port from
-Python 2 to Python 3 code was made in 2015.
-
-Users of the more recent Python bindings will recognise numerous points
-of similarity, but also significant differences. It is likely that the
-more recent official bindings will feel \"more pythonic.\"
-
-For those using Python 2, there is essentially no harm in using this
-module, but it may lack a number of more recent features added to GPGME.
-
-Footnotes
-=========
-
-.. [1]
-   In all likelihood this would have been Python 2.2 or possibly Python
-   2.3.
-
-.. [2]
-   The entire PyME git log and other preceding VCS logs are located in
-   the ``gpgme/lang/python/docs/old-commits.log`` file.
diff --git a/lang/python/doc/rst/what-is-new.rst b/lang/python/doc/rst/what-is-new.rst
deleted file mode 100644 (file)
index 336fdb7..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-.. _new-stuff:
-
-What\'s New
-===========
-
-+-----------------+------------------------------------------+
-| Version:        | 0.0.1                                    |
-+-----------------+------------------------------------------+
-| GPGME Version:  | 1.13.0                                   |
-+-----------------+------------------------------------------+
-| Author:         | Ben McGinnes <ben@gnupg.org>             |
-+-----------------+------------------------------------------+
-| Author GPG Key: | DB4724E6FA4286C92B4E55C4321E4E2373590E5D |
-+-----------------+------------------------------------------+
-| Language:       | Australian English, British English      |
-+-----------------+------------------------------------------+
-| xml:lang:       | en-AU, en-GB, en                         |
-+-----------------+------------------------------------------+
-
-Last time the most obviously new thing was adding the *What\'s New*
-section to the HOWTO. Now it\'s moving it out of the HOWTO.
-
-.. _new-stuff-1-13-0:
-
-New in GPGME 1·13·0
--------------------
-
-Additions since GPGME 1.12.0 include:
-
--  Moving the *What\'s New* section out of the basic
-   `HOWTO <gpgme-python-howto.org>`__ document and into its own file so
-   as to more readily include other documents beyond that HOWTO.
--  Moving the preceding, archival, segments into `another
-   file <what-was-new.org>`__.
--  Added ``gpg.version.versionintlist`` to make it easier for Python
-   developers to check for a specific version number, even with beta
-   versions (it will drop the \"-betaN\" part).
--  Added expanded detail on issues pertaining to installing for Windows
-   users.
--  Bindings enter `maintenance mode <maintenance-mode>`__ from January,
-   2019.
--  Added documentation on maintenance mode and what changes can be made
-   to the code when in that status. Essentially that boils down to bug
-   fixes only and no feature requests.
--  The import-keys-hkp.py example script, which uses the ``hkp4py``
-   module to search the SKS servers for a key, has been tightened up to
-   search for both hexadecimal key IDs and user ID strings with reduced
-   chance of unnecessary repitition. There may still be some repetition
-   if a key includes a user ID matching the hexadecimal value of a key
-   ID.
diff --git a/lang/python/doc/rst/what-was-new.rst b/lang/python/doc/rst/what-was-new.rst
deleted file mode 100644 (file)
index 7b18280..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-.. _new-stuff:
-
-What Was New
-============
-
-+-----------------+------------------------------------------+
-| Version:        | 0.0.1                                    |
-+-----------------+------------------------------------------+
-| GPGME Version:  | 1.13.0                                   |
-+-----------------+------------------------------------------+
-| Author:         | Ben McGinnes <ben@gnupg.org>             |
-+-----------------+------------------------------------------+
-| Author GPG Key: | DB4724E6FA4286C92B4E55C4321E4E2373590E5D |
-+-----------------+------------------------------------------+
-| Language:       | Australian English, British English      |
-+-----------------+------------------------------------------+
-| xml:lang:       | en-AU, en-GB, en                         |
-+-----------------+------------------------------------------+
-
-The following are all the past *What\'s New* sections for the Python
-Bindings HOWTO and other documentation.
-
-.. _gpgme-1-12-0:
-
-What Was New in GPGME 1·12·0
-----------------------------
-
-The most obviously new point for those reading this guide is this
-section on other new things, but that's hardly important. Not given all
-the other things which spurred the need for adding this section and its
-subsections.
-
-.. _new-stuff-1-12-0:
-
-New in GPGME 1·12·0
-~~~~~~~~~~~~~~~~~~~
-
-There have been quite a number of additions to GPGME and the Python
-bindings to it since the last release of GPGME with versions 1.11.0 and
-1.11.1 in April, 2018.
-
-The bullet points of new additiions are:
-
--  an expanded section on
-   `installing <gpgme-python-howto#installation>`__ and
-   `troubleshooting <gpgme-python-howto#snafu>`__ the Python bindings.
--  The release of Python 3.7.0; which appears to be working just fine
-   with our bindings, in spite of intermittent reports of problems for
-   many other Python projects with that new release.
--  Python 3.7 has been moved to the head of the specified python
-   versions list in the build process.
--  In order to fix some other issues, there are certain underlying
-   functions which are more exposed through the
-   `gpg.Context() <gpgme-python-howto#howto-get-context>`__, but ongoing
-   documentation ought to clarify that or otherwise provide the best
-   means of using the bindings. Some additions to ``gpg.core`` and the
-   ``Context()``, however, were intended (see below).
--  Continuing work in identifying and confirming the cause of
-   oft-reported `problems installing the Python bindings on
-   Windows <gpgme-python-howto#snafu-runtime-not-funtime>`__.
--  GSOC: Google\'s Surreptitiously Ordered Conscription ... erm ... oh,
-   right; Google\'s Summer of Code. Though there were two hopeful
-   candidates this year; only one ended up involved with the GnuPG
-   Project directly, the other concentrated on an unrelated third party
-   project with closer ties to one of the GNU/Linux distributions than
-   to the GnuPG Project. Thus the Python bindings benefited from GSOC
-   participant Jacob Adams, who added the key\ :sub:`import` function;
-   building on prior work by Tobias Mueller.
--  Several new methods functions were added to the gpg.Context(),
-   including: `key\ import <gpgme-python-howto#howto-import-key>`__,
-   `key\ export <gpgme-python-howto#howto-export-key>`__,
-   `key\ exportminimal <gpgme-python-howto#howto-export-public-key>`__
-   and
-   `key\ exportsecret <gpgme-python-howto#howto-export-secret-key>`__.
--  Importing and exporting examples include versions integrated with
-   Marcel Fest\'s recently released `HKP for
-   Python <https://github.com/Selfnet/hkp4py>`__ module. Some
-   `additional notes on this module <gpgme-python-howto#hkp4py>`__ are
-   included at the end of the HOWTO.
--  Instructions for dealing with semi-walled garden implementations like
-   ProtonMail are also included. This is intended to make things a
-   little easier when communicating with users of ProtonMail\'s services
-   and should not be construed as an endorsement of said service. The
-   GnuPG Project neither favours, nor disfavours ProtonMail and the
-   majority of this deals with interacting with the ProtonMail
-   keyserver.
--  Semi-formalised the location where `draft
-   versions <gpgme-python-howto#draft-editions>`__ of this HOWTO may
-   periodically be accessible. This is both for the reference of others
-   and testing the publishing of the document itself. Renamed this file
-   at around the same time.
--  The Texinfo documentation build configuration has been replicated
-   from the parent project in order to make to maintain consistency with
-   that project (and actually ship with each release).
--  a reStructuredText (``.rst``) version is also generated for Python
-   developers more used to and comfortable with that format as it is the
-   standard Python documentation format and Python developers may wish
-   to use it with Sphinx. Please note that there has been no testing of
-   the reStructuredText version with Sphinx at all. The reST file was
-   generated by the simple expedient of using
-   `Pandoc <https://pandoc.org/>`__.
--  Added a new section for `advanced or experimental
-   use <gpgme-python-howto#advanced-use>`__.
--  Began the advanced use cases with `a
-   section <gpgme-python-howto#cython>`__ on using the module with
-   `Cython <https://cython.org/>`__.
--  Added a number of new scripts to the ``example/howto/`` directory;
-   some of which may be in advance of their planned sections of the
-   HOWTO (and some are just there because it seemed like a good idea at
-   the time).
--  Cleaned up a lot of things under the hood.
similarity index 99%
rename from lang/python/doc/src/gpgme-python-howto
rename to lang/python/doc/src/gpgme-python-howto.org
index e2e7e71..046b2e0 100644 (file)
@@ -464,8 +464,8 @@ case in most, if not all, cases.
 
 Note that from GPGME [[https://dev.gnupg.org/rMff6ff616aea6f59b7f2ce1176492850ecdf3851e][1.12.1]] the default installation installs to each
 version of Python it can find first.  That is that it will currently
-install for the first copies of Python versions 2.7, 3.4, 3.5, 3.6,
-3.7 and 3.8 (dev branch) that it finds.  Usually this will be in the
+install for the first copies of Python versions 2.7, 3.4, 3.5, and so on
+up until the current dev branch that it finds.  Usually this will be in the
 same prefix as GPGME itself, but is dictated by the =$PATH= when the
 installation is performed.  The above instructions can still be
 performed on other python installations which the installer does not
-\input texinfo    @c -*- texinfo -*-
-@c %**start of header
-@setfilename gpgme-python-howto.info
-@settitle GNU Privacy Guard (GnuPG) Made Easy Python Bindings HOWTO (English)
-@documentencoding utf-8
-@documentlanguage en
-@c %**end of header
-
-@finalout
-@titlepage
-@title GNU Privacy Guard (GnuPG) Made Easy Python Bindings HOWTO (English)
-@author Ben McGinnes
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top
-@top GNU Privacy Guard (GnuPG) Made Easy Python Bindings HOWTO (English)
-@end ifnottex
-
-@menu
-* Introduction::
-* GPGME Concepts::
-* GPGME Python bindings installation::
-* Fundamentals::
-* Working with keys::
-* Basic Functions::
-* Creating keys and subkeys::
-* Advanced or Experimental Use Cases::
-* Miscellaneous extras and work-arounds::
-* Copyright and Licensing::
-
-@detailmenu
---- The Detailed Node Listing ---
-
-Introduction
-
-* Python 2 versus Python 3::
-* Examples::
-* Unofficial Drafts::
-* What's New::
-
-What's New
-
-* New in GPGME 1·13·0::
-* New in GPGME 1·12·0::
-
-GPGME Concepts
-
-* A C API::
-* Python bindings::
-* Difference between the Python bindings and other GnuPG Python packages::
-
-Difference between the Python bindings and other GnuPG Python packages
-
-* The python-gnupg package maintained by Vinay Sajip::
-* The gnupg package created and maintained by Isis Lovecruft::
-* The PyME package maintained by Martin Albrecht::
-
-GPGME Python bindings installation
-
-* No PyPI::
-* Requirements::
-* Installation::
-* Known Issues::
-
-Requirements
-
-* Recommended Additions::
-
-Installation
-
-* Installing GPGME::
-
-Known Issues
-
-* Breaking Builds::
-* Reinstalling Responsibly::
-* Multiple installations::
-* Won't Work With Windows::
-* CFFI is the Best™ and GPGME should use it instead of SWIG::
-* Virtualised Environments::
-* Post installation::
-
-Fundamentals
-
-* No REST::
-* Context::
-
-Working with keys
-
-* Key selection::
-* Get key::
-* Importing keys::
-* Exporting keys::
-
-Key selection
-
-* Counting keys::
-
-Importing keys
-
-* Working with ProtonMail::
-* Importing with HKP for Python::
-* Importing from ProtonMail with HKP for Python::
-
-Exporting keys
-
-* Exporting public keys::
-* Exporting secret keys::
-* Sending public keys to the SKS Keyservers::
-
-Basic Functions
-
-* Encryption::
-* Decryption::
-* Signing text and files::
-* Signature verification::
-
-Encryption
-
-* Encrypting to one key::
-* Encrypting to multiple keys::
-
-Signing text and files
-
-* Signing key selection::
-* Normal or default signing messages or files::
-* Detached signing messages and files::
-* Clearsigning messages or text::
-
-Creating keys and subkeys
-
-* Primary key::
-* Subkeys::
-* User IDs::
-* Key certification::
-
-User IDs
-
-* Adding User IDs::
-* Revoking User IDs::
-
-Key certification
-
-* Verifying key certifications::
-
-Advanced or Experimental Use Cases
-
-* C plus Python plus SWIG plus Cython::
-
-Miscellaneous extras and work-arounds
-
-* Group lines::
-* Keyserver access for Python::
-* GPGME version checking::
-
-Keyserver access for Python
-
-* Key import format::
-
-Copyright and Licensing
-
-* Copyright::
-* Draft Editions of this HOWTO::
-* License GPL compatible::
-
-@end detailmenu
-@end menu
-
-@node Introduction
-@chapter Introduction
-
-@multitable {aaaaaaaaaaaaaaa} {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
-@item Version:
-@tab 0.1.5
-@item GPGME Version:
-@tab 1.13.0
-@item Author:
-@tab Ben McGinnes <ben@@gnupg.org>
-@item Author GPG Key:
-@tab DB4724E6FA4286C92B4E55C4321E4E2373590E5D
-@item Language:
-@tab Australian English, British English
-@item Language codes:
-@tab en-AU, en-GB, en
-@end multitable
+% Created 2019-01-18 Fri 10:10
+% Intended LaTeX compiler: xelatex
+\documentclass[12pt]{article}
+\usepackage{graphicx}
+\usepackage{grffile}
+\usepackage{longtable}
+\usepackage{wrapfig}
+\usepackage{rotating}
+\usepackage[normalem]{ulem}
+\usepackage{amsmath}
+\usepackage{textcomp}
+\usepackage{amssymb}
+\usepackage{capt-of}
+\usepackage{hyperref}
+\usepackage{xltxtra}
+\usepackage[margin=1in]{geometry}
+\setmainfont[Ligatures={Common}]{Times New Roman}
+\author{Ben McGinnes <ben@gnupg.org>}
+\author{Ben McGinnes}
+\date{\today}
+\title{GNU Privacy Guard (GnuPG) Made Easy Python Bindings HOWTO (English)}
+\hypersetup{
+ pdfauthor={Ben McGinnes},
+ pdftitle={GNU Privacy Guard (GnuPG) Made Easy Python Bindings HOWTO (English)},
+ pdfkeywords={},
+ pdfsubject={},
+ pdfcreator={Emacs 26.1 (Org mode 9.1.14)},
+ pdflang={English}}
+\begin{document}
+
+\maketitle
+\tableofcontents
+
+
+
+\section{Introduction}
+\label{sec:org8e5fa02}
+\begin{center}
+\begin{tabular}{ll}
+Version: & 0.1.4\\
+GPGME Version: & 1.12.1\\
+Author: & Ben McGinnes <ben@gnupg.org>\\
+Author GPG Key: & DB4724E6FA4286C92B4E55C4321E4E2373590E5D\\
+Language: & Australian English, British English\\
+Language codes: & en-AU, en-GB, en\\
+\end{tabular}
+\end{center}
 
 This document provides basic instruction in how to use the GPGME
 Python bindings to programmatically leverage the GPGME library.
 
-@menu
-* Python 2 versus Python 3::
-* Examples::
-* Unofficial Drafts::
-* What's New::
-@end menu
-
-@node Python 2 versus Python 3
-@section Python 2 versus Python 3
 
+\subsection{Python 2 versus Python 3}
+\label{sec:org517cbf4}
 Though the GPGME Python bindings themselves provide support for both
 Python 2 and 3, the focus is unequivocally on Python 3 and
 specifically from Python 3.4 and above.  As a consequence all the
@@ -220,58 +72,46 @@ bindings to a version of the language which is a dead end and the
 advantages offered by Python 3 over Python 2 make handling the data
 types with which GPGME deals considerably easier.
 
-@node Examples
-@section Examples
 
+\subsection{Examples}
+\label{sec:org2c08d53}
 All of the examples found in this document can be found as Python 3
-scripts in the @samp{lang/python/examples/howto} directory.
+scripts in the \texttt{lang/python/examples/howto} directory.
 
-@node Unofficial Drafts
-@section Unofficial Drafts
 
+\subsection{Unofficial Drafts}
+\label{sec:orgceb2216}
 In addition to shipping with each release of GPGME, there is a section
-on locations to read or download @ref{Draft Editions of this HOWTO, , draft editions} of this document from
+on locations to read or download \hyperref[sec:org080a94a]{draft editions} of this document from
 at the end of it.  These are unofficial versions produced in between
 major releases.
 
-@node What's New
-@section What's New
-
-Full details of what is new are now available in the @uref{what-is-new.org, What's New} file
-and archives of the preceding @emph{What's New} sections are available in
-the @uref{what-was-new, What Was New} file.
-
-@menu
-* New in GPGME 1·13·0::
-* New in GPGME 1·12·0::
-@end menu
-
-@node New in GPGME 1·13·0
-@subsection New in GPGME 1·13·0
 
-See the @uref{what-is-new#new-stuff-1-13-0, What's New} document for what is new in version 1.13.0.
+\subsection{What's New}
+\label{sec:orga79ddc2}
+Full details of what is new are now available in the \href{what-is-new.org}{What's New} file
+and archives of the preceding \emph{What's New} sections are available in
+the \href{what-was-new}{What Was New} file.
 
-@node New in GPGME 1·12·0
-@subsection New in GPGME 1·12·0
 
-See the @uref{what-was-new#new-stuff-1-12-0, What Was New} document for what was new in version 1.12.0.
+\subsubsection{New in GPGME 1·13·0}
+\label{sec:org746b75d}
+See the \href{what-is-new\#new-stuff-1-13-0}{What's New} document for what is new in version 1.13.0.
 
-@node GPGME Concepts
-@chapter GPGME Concepts
 
-@menu
-* A C API::
-* Python bindings::
-* Difference between the Python bindings and other GnuPG Python packages::
-@end menu
+\subsubsection{New in GPGME 1·12·0}
+\label{sec:org7adcade}
+See the \href{what-was-new\#new-stuff-1-12-0}{What Was New} document for what was new in version 1.12.0.
 
-@node A C API
-@section A C API
 
+\section{GPGME Concepts}
+\label{sec:orgb257fc1}
+\subsection{A C API}
+\label{sec:org4fe1dfa}
 Unlike many modern APIs with which programmers will be more familiar
 with these days, the GPGME API is a C API.  The API is intended for
 use by C coders who would be able to access its features by including
-the @samp{gpgme.h} header file with their own C source code and then access
+the \texttt{gpgme.h} header file with their own C source code and then access
 its functions just as they would any other C headers.
 
 This is a very effective method of gaining complete access to the API
@@ -280,47 +120,41 @@ drawback that it cannot be directly used by other languages without
 some means of providing an interface to those languages.  This is
 where the need for bindings in various languages stems.
 
-@node Python bindings
-@section Python bindings
 
+\subsection{Python bindings}
+\label{sec:org0e49e52}
 The Python bindings for GPGME provide a higher level means of
 accessing the complete feature set of GPGME itself.  It also provides
 a more pythonic means of calling these API functions.
 
 The bindings are generated dynamically with SWIG and the copy of
-@samp{gpgme.h} generated when GPGME is compiled.
+\texttt{gpgme.h} generated when GPGME is compiled.
 
 This means that a version of the Python bindings is fundamentally tied
 to the exact same version of GPGME used to generate that copy of
-@samp{gpgme.h}.
+\texttt{gpgme.h}.
 
-@node Difference between the Python bindings and other GnuPG Python packages
-@section Difference between the Python bindings and other GnuPG Python packages
 
+\subsection{Difference between the Python bindings and other GnuPG Python packages}
+\label{sec:org97acfd7}
 There have been numerous attempts to add GnuPG support to Python over
 the years.  Some of the most well known are listed here, along with
 what differentiates them.
 
-@menu
-* The python-gnupg package maintained by Vinay Sajip::
-* The gnupg package created and maintained by Isis Lovecruft::
-* The PyME package maintained by Martin Albrecht::
-@end menu
-
-@node The python-gnupg package maintained by Vinay Sajip
-@subsection The python-gnupg package maintained by Vinay Sajip
 
+\subsubsection{The python-gnupg package maintained by Vinay Sajip}
+\label{sec:org0136847}
 This is arguably the most popular means of integrating GPG with
-Python.  The package utilises the @samp{subprocess} module to implement
-wrappers for the @samp{gpg} and @samp{gpg2} executables normally invoked on the
-command line (@samp{gpg.exe} and @samp{gpg2.exe} on Windows).
+Python.  The package utilises the \texttt{subprocess} module to implement
+wrappers for the \texttt{gpg} and \texttt{gpg2} executables normally invoked on the
+command line (\texttt{gpg.exe} and \texttt{gpg2.exe} on Windows).
 
 The popularity of this package stemmed from its ease of use and
 capability in providing the most commonly required features.
 
 Unfortunately it has been beset by a number of security issues in the
 past; most of which stemmed from using unsafe methods of accessing the
-command line via the @samp{subprocess} calls.  While some effort has been
+command line via the \texttt{subprocess} calls.  While some effort has been
 made over the last two to three years (as of 2018) to mitigate this,
 particularly by no longer providing shell access through those
 subprocess calls, the wrapper is still somewhat limited in the scope
@@ -328,12 +162,12 @@ of its GnuPG features coverage.
 
 The python-gnupg package is available under the MIT license.
 
-@node The gnupg package created and maintained by Isis Lovecruft
-@subsection The gnupg package created and maintained by Isis Lovecruft
 
+\subsubsection{The gnupg package created and maintained by Isis Lovecruft}
+\label{sec:orgdc03987}
 In 2015 Isis Lovecruft from the Tor Project forked and then
 re-implemented the python-gnupg package as just gnupg.  This new
-package also relied on subprocess to call the @samp{gpg} or @samp{gpg2}
+package also relied on subprocess to call the \texttt{gpg} or \texttt{gpg2}
 binaries, but did so somewhat more securely.
 
 The naming and version numbering selected for this package, however,
@@ -346,17 +180,17 @@ subsequently broke the code relying on it.
 The gnupg package is available under the GNU General Public License
 version 3.0 (or any later version).
 
-@node The PyME package maintained by Martin Albrecht
-@subsection The PyME package maintained by Martin Albrecht
 
+\subsubsection{The PyME package maintained by Martin Albrecht}
+\label{sec:org715600b}
 This package is the origin of these bindings, though they are somewhat
 different now.  For details of when and how the PyME package was
-folded back into GPGME itself see the @uref{short-history.org, Short History} document.@footnote{@samp{short-history} and/or @samp{short-history.html}.}
+folded back into GPGME itself see the \href{short-history.org}{Short History} document.\footnote{\texttt{short-history} and/or \texttt{short-history.html}.}
 
 The PyME package was first released in 2002 and was also the first
 attempt to implement a low level binding to GPGME.  In doing so it
 provided access to considerably more functionality than either the
-@samp{python-gnupg} or @samp{gnupg} packages.
+\texttt{python-gnupg} or \texttt{gnupg} packages.
 
 The PyME package is only available for Python 2.6 and 2.7.
 
@@ -369,19 +203,11 @@ itself: the GNU General Public License version 2.0 (or any later
 version) and the GNU Lesser General Public License version 2.1 (or any
 later version).
 
-@node GPGME Python bindings installation
-@chapter GPGME Python bindings installation
-
-@menu
-* No PyPI::
-* Requirements::
-* Installation::
-* Known Issues::
-@end menu
-
-@node No PyPI
-@section No PyPI
 
+\section{GPGME Python bindings installation}
+\label{sec:org73d8d6f}
+\subsection{No PyPI}
+\label{sec:orgec9a038}
 Most third-party Python packages and modules are available and
 distributed through the Python Package Installer, known as PyPI.
 
@@ -389,56 +215,46 @@ Due to the nature of what these bindings are and how they work, it is
 infeasible to install the GPGME Python bindings in the same way.
 
 This is because the bindings use SWIG to dynamically generate C
-bindings against @samp{gpgme.h} and @samp{gpgme.h} is generated from
-@samp{gpgme.h.in} at compile time when GPGME is built from source.  Thus to
+bindings against \texttt{gpgme.h} and \texttt{gpgme.h} is generated from
+\texttt{gpgme.h.in} at compile time when GPGME is built from source.  Thus to
 include a package in PyPI which actually built correctly would require
 either statically built libraries for every architecture bundled with
 it or a full implementation of C for each architecture.
 
-See the additional notes regarding @ref{CFFI is the Best™ and GPGME should use it instead of SWIG, , CFFI and SWIG} at the end of this
+See the additional notes regarding \hyperref[sec:org645735a]{CFFI and SWIG} at the end of this
 section for further details.
 
-@node Requirements
-@section Requirements
 
+\subsection{Requirements}
+\label{sec:org2f7f06c}
 The GPGME Python bindings only have three requirements:
 
-@enumerate
-@item
-A suitable version of Python 2 or Python 3.  With Python 2 that
+\begin{enumerate}
+\item A suitable version of Python 2 or Python 3.  With Python 2 that
 means CPython 2.7 and with Python 3 that means CPython 3.4 or
 higher.
-@item
-@uref{https://www.swig.org, SWIG}.
-@item
-GPGME itself.  Which also means that all of GPGME's dependencies
+\item \href{https://www.swig.org}{SWIG}.
+\item GPGME itself.  Which also means that all of GPGME's dependencies
 must be installed too.
-@end enumerate
+\end{enumerate}
 
-@menu
-* Recommended Additions::
-@end menu
-
-@node Recommended Additions
-@subsection Recommended Additions
 
+\subsubsection{Recommended Additions}
+\label{sec:org25bd7d4}
 Though none of the following are absolute requirements, they are all
 recommended for use with the Python bindings.  In some cases these
 recommendations refer to which version(s) of CPython to use the
 bindings with, while others refer to third party modules which provide
 a significant advantage in some way.
 
-@enumerate
-@item
-If possible, use Python 3 instead of 2.
-@item
-Favour a more recent version of Python since even 3.4 is due to
+\begin{enumerate}
+\item If possible, use Python 3 instead of 2.
+\item Favour a more recent version of Python since even 3.4 is due to
 reach EOL soon.  In production systems and services, Python 3.6
 should be robust enough to be relied on.
-@item
-If possible add the following Python modules which are not part of
-the standard library: @uref{http://docs.python-requests.org/en/latest/index.html, Requests}, @uref{https://cython.org/, Cython}, @uref{https://pendulum.eustace.io/, Pendulum} and @uref{https://github.com/Selfnet/hkp4py, hkp4py}.
-@end enumerate
+\item If possible add the following Python modules which are not part of
+the standard library: \href{http://docs.python-requests.org/en/latest/index.html}{Requests}, \href{https://cython.org/}{Cython}, \href{https://pendulum.eustace.io/}{Pendulum} and \href{https://github.com/Selfnet/hkp4py}{hkp4py}.
+\end{enumerate}
 
 Chances are quite high that at least the first one and maybe two of
 those will already be installed.
@@ -449,34 +265,34 @@ well known and commonly installed ones, however, which are in many
 cases likely to have already been installed on many systems or be
 familiar to Python programmers.
 
-@node Installation
-@section Installation
 
+\subsection{Installation}
+\label{sec:orgf1c7587}
 Installing the Python bindings is effectively achieved by compiling
 and installing GPGME itself.
 
 Once SWIG is installed with Python and all the dependencies for GPGME
 are installed you only need to confirm that the version(s) of Python
-you want the bindings installed for are in your @samp{$PATH}.
+you want the bindings installed for are in your \texttt{\$PATH}.
 
 By default GPGME will attempt to install the bindings for the most
 recent or highest version number of Python 2 and Python 3 it detects
-in @samp{$PATH}.  It specifically checks for the @samp{python} and @samp{python3}
+in \texttt{\$PATH}.  It specifically checks for the \texttt{python} and \texttt{python3}
 executables first and then checks for specific version numbers.
 
-For Python 2 it checks for these executables in this order: @samp{python},
-@samp{python2} and @samp{python2.7}.
+For Python 2 it checks for these executables in this order: \texttt{python},
+\texttt{python2} and \texttt{python2.7}.
 
-For Python 3 it checks for these executables in this order: @samp{python3},
@samp{python3.7}, @samp{python3.6}, @samp{python3.5} and @samp{python3.4}.@footnote{With no issues reported specific to Python 3.7, the release of
+For Python 3 it checks for these executables in this order: \texttt{python3},
\texttt{python3.7}, \texttt{python3.6}, \texttt{python3.5} and \texttt{python3.4}.\footnote{With no issues reported specific to Python 3.7, the release of
 Python 3.7.1 at around the same time as GPGME 1.12.0 and the testing
 with Python 3.7.1rc1, there is no reason to delay moving 3.7 ahead of
 3.6 now.  Production environments with more conservative requirements
 will always enforce their own policies anyway and installation to each
 supported minor release is quite possible too.}
 
-On systems where @samp{python} is actually @samp{python3} and not @samp{python2} it
-may be possible that @samp{python2} may be overlooked, but there have been
+On systems where \texttt{python} is actually \texttt{python3} and not \texttt{python2} it
+may be possible that \texttt{python2} may be overlooked, but there have been
 no reports of that actually occurring as yet.
 
 In the three months or so since the release of Python 3.7.0 there has
@@ -488,83 +304,68 @@ release of Python 3.7.1 is scheduled for around the same time as GPGME
 1.12.0, the order of preferred Python versions has been changed to
 move Python 3.7 ahead of Python 3.6.
 
-@menu
-* Installing GPGME::
-@end menu
-
-@node Installing GPGME
-@subsection Installing GPGME
 
-See the GPGME @samp{README} file for details of how to install GPGME from
+\subsubsection{Installing GPGME}
+\label{sec:org903bd67}
+See the GPGME \texttt{README} file for details of how to install GPGME from
 source.
 
-@node Known Issues
-@section Known Issues
 
+\subsection{Known Issues}
+\label{sec:org0d2a332}
 There are a few known issues with the current build process and the
 Python bindings.  For the most part these are easily addressed should
 they be encountered.
 
-@menu
-* Breaking Builds::
-* Reinstalling Responsibly::
-* Multiple installations::
-* Won't Work With Windows::
-* CFFI is the Best™ and GPGME should use it instead of SWIG::
-* Virtualised Environments::
-* Post installation::
-@end menu
-
-@node Breaking Builds
-@subsection Breaking Builds
 
+\subsubsection{Breaking Builds}
+\label{sec:orgbac75f3}
 Occasionally when installing GPGME with the Python bindings included
-it may be observed that the @samp{make} portion of that process induces a
+it may be observed that the \texttt{make} portion of that process induces a
 large very number of warnings and, eventually errors which end that
-part of the build process.  Yet following that with @samp{make check} and
-@samp{make install} appears to work seamlessly.
+part of the build process.  Yet following that with \texttt{make check} and
+\texttt{make install} appears to work seamlessly.
 
 The cause of this is related to the way SWIG needs to be called to
 dynamically generate the C bindings for GPGME in the first place.  So
-the entire process will always produce @samp{lang/python/python2-gpg/} and
-@samp{lang/python/python3-gpg/} directories.  These should contain the
+the entire process will always produce \texttt{lang/python/python2-gpg/} and
+\texttt{lang/python/python3-gpg/} directories.  These should contain the
 build output generated during compilation, including the complete
-bindings and module installed into @samp{site-packages}.
+bindings and module installed into \texttt{site-packages}.
 
 Occasionally the errors in the early part or some other conflict
-(e.g. not installing as @strong{@emph{root}} or @strong{@emph{su}}) may result in nothing
-being installed to the relevant @samp{site-packages} directory and the
+(e.g. not installing as \textbf{\emph{root}} or \textbf{\emph{su}}) may result in nothing
+being installed to the relevant \texttt{site-packages} directory and the
 build directory missing a lot of expected files.  Even when this
 occurs, the solution is actually quite simple and will always work.
 
 That solution is simply to run the following commands as either the
-@strong{root} user or prepended with @samp{sudo -H}@footnote{Yes, even if you use virtualenv with everything you do in
+\textbf{root} user or prepended with \texttt{sudo -H}\footnote{Yes, even if you use virtualenv with everything you do in
 Python.  If you want to install this module as just your user account
 then you will need to manually configure, compile and install the
-@emph{entire} GnuPG stack as that user as well.  This includes libraries
+\emph{entire} GnuPG stack as that user as well.  This includes libraries
 which are not often installed that way.  It can be done and there are
 circumstances under which it is worthwhile, but generally only on
-POSIX systems which utilise single user mode (some even require it).} in the @samp{lang/python/}
+POSIX systems which utilise single user mode (some even require it).} in the \texttt{lang/python/}
 directory:
 
-@example
+\begin{verbatim}
 /path/to/pythonX.Y setup.py build
 /path/to/pythonX.Y setup.py build
 /path/to/pythonX.Y setup.py install
-@end example
+\end{verbatim}
 
 Yes, the build command does need to be run twice.  Yes, you still need
 to run the potentially failing or incomplete steps during the
-@samp{configure}, @samp{make} and @samp{make install} steps with installing GPGME.
+\texttt{configure}, \texttt{make} and \texttt{make install} steps with installing GPGME.
 This is because those steps generate a lot of essential files needed,
 both by and in order to create, the bindings (including both the
-@samp{setup.py} and @samp{gpgme.h} files).
-
-@enumerate
-@item
-IMPORTANT Note
+\texttt{setup.py} and \texttt{gpgme.h} files).
 
 
+\begin{enumerate}
+\item IMPORTANT Note
+\label{sec:org37f3d4a}
 If specifying a selected number of languages to create bindings for,
 try to leave Python last.  Currently the majority of the other
 language bindings are also preceding Python of either version when
@@ -574,19 +375,19 @@ If Python is set to precede one of the other languages then it is
 possible that the errors described here may interrupt the build
 process before generating bindings for those other languages.  In
 these cases it may be preferable to configure all preferred language
-bindings separately with alternative @samp{configure} steps for GPGME using
-the @samp{--enable-languages=$LANGUAGE} option.
+bindings separately with alternative \texttt{configure} steps for GPGME using
+the \texttt{-{}-enable-languages=\$LANGUAGE} option.
 
-Alternatively @samp{make} (or @samp{gmake}, depending on your platform) may be
-run with the the @samp{-k} option, which tells make to keep going even if
+Alternatively \texttt{make} (or \texttt{gmake}, depending on your platform) may be
+run with the the \texttt{-k} option, which tells make to keep going even if
 errors are encountered.  In that case the failure of one language's
 set of bindings to build should not hamper another language's bindings
 to build.
-@end enumerate
+\end{enumerate}
 
-@node Reinstalling Responsibly
-@subsection Reinstalling Responsibly
 
+\subsubsection{Reinstalling Responsibly}
+\label{sec:org21e4dec}
 Regardless of whether you're installing for one version of Python or
 several, there will come a point where reinstallation is required.
 With most Python module installations, the installed files go into the
@@ -600,17 +401,17 @@ from removing all the previous installations of the bindings before
 installing the updated versions.
 
 Removing the previous version(s) is simply a matter of changing to the
-relevant @samp{site-packages} directory for the version of Python in
-question and removing the @samp{gpg/} directory and any accompanying
+relevant \texttt{site-packages} directory for the version of Python in
+question and removing the \texttt{gpg/} directory and any accompanying
 egg-info files for that module.
 
 In most cases this will require root or administration privileges on
 the system, but the same is true of installing the module in the first
 place.
 
-@node Multiple installations
-@subsection Multiple installations
 
+\subsubsection{Multiple installations}
+\label{sec:org30b18bd}
 For a variety of reasons it may be either necessary or just preferable
 to install the bindings to alternative installed Python versions which
 meet the requirements of these bindings.
@@ -621,37 +422,38 @@ described in the previous section for each Python installation the
 bindings need to be installed to.
 
 As per the SWIG documentation: the compilers, libraries and runtime
-used to build GPGME and the Python Bindings @strong{must} match those used to
+used to build GPGME and the Python Bindings \textbf{must} match those used to
 compile Python itself, including the version number(s) (at least going
 by major version numbers and probably minor numbers too).
 
 On most POSIX systems, including OS X, this will very likely be the
 case in most, if not all, cases.
 
-Note that from GPGME @uref{https://dev.gnupg.org/rMff6ff616aea6f59b7f2ce1176492850ecdf3851e, 1.12.1} the default installation installs to each
+Note that from GPGME \href{https://dev.gnupg.org/rMff6ff616aea6f59b7f2ce1176492850ecdf3851e}{1.12.1} the default installation installs to each
 version of Python it can find first.  That is that it will currently
 install for the first copies of Python versions 2.7, 3.4, 3.5, 3.6,
 3.7 and 3.8 (dev branch) that it finds.  Usually this will be in the
-same prefix as GPGME itself, but is dictated by the @samp{$PATH} when the
+same prefix as GPGME itself, but is dictated by the \texttt{\$PATH} when the
 installation is performed.  The above instructions can still be
 performed on other python installations which the installer does not
 find, including alternative prefixes.
 
-@node Won't Work With Windows
-@subsection Won't Work With Windows
 
+
+\subsubsection{Won't Work With Windows}
+\label{sec:org0ebae3a}
 There are semi-regular reports of Windows users having considerable
 difficulty in installing and using the Python bindings at all.  Very
 often, possibly even always, these reports come from Cygwin users
 and/or MinGW users and/or Msys2 users.  Though not all of them have
 been confirmed, it appears that these reports have also come from
 people who installed Python using the Windows installer files from the
-@uref{https://python.org, Python website} (i.e. mostly MSI installers, sometimes self-extracting
-@samp{.exe} files).
+\href{https://python.org}{Python website} (i.e. mostly MSI installers, sometimes self-extracting
+\texttt{.exe} files).
 
 The Windows versions of Python are not built using Cygwin, MinGW or
 Msys2; they're built using Microsoft Visual Studio.  Furthermore the
-version used is @emph{considerably} more advanced than the version which
+version used is \emph{considerably} more advanced than the version which
 MinGW obtained a small number of files from many years ago in order to
 be able to compile anything at all.  Not only that, but there are
 changes to the version of Visual Studio between some micro releases,
@@ -660,9 +462,8 @@ been kept around far longer than it should have been.
 
 There are two theoretical solutions to this issue:
 
-@enumerate
-@item
-Compile and install the GnuPG stack, including GPGME and the
+\begin{enumerate}
+\item Compile and install the GnuPG stack, including GPGME and the
 Python bindings using the same version of Microsoft Visual Studio
 used by the Python Foundation to compile the version of Python
 installed.
@@ -671,12 +472,11 @@ If there are multiple versions of Python then this will need to be
 done with each different version of Visual Studio used for those
 versions of Python.
 
-@item
-Compile and install Python using the same tools used by choice,
+\item Compile and install Python using the same tools used by choice,
 such as MinGW or Msys2.
-@end enumerate
+\end{enumerate}
 
-Do @strong{not} use the official Windows installer for Python unless
+Do \textbf{not} use the official Windows installer for Python unless
 following the first method.
 
 In this type of situation it may even be for the best to accept that
@@ -690,31 +490,21 @@ ongoing.
 
 The following table lists the version of Microsoft Visual Studio which
 needs to be used when compiling GPGME and the Python bindings with
-each version of the CPython binary released @uref{https://www.python.org/downloads/windows/, for Windows}:
-
-@multitable {aaaaaaa} {aaaaaaaaaaaaaaaaaaaaaa} {aaaaaaaaaaaaaaaa}
-@item CPython
-@tab Microsoft product name
-@tab runtime filename
-@item 2.7.6
-@tab Visual Studio 2008
-@tab MSVCR90.DLL
-@item 3.4.0
-@tab Visual Studio 2010
-@tab MSVCR100.DLL
-@item 3.5.0
-@tab Visual Studio 2015
-@tab @strong{see below}
-@item 3.6.0
-@tab Visual Studio 2015
-@tab @strong{see below}
-@item 3.7.0
-@tab Visual Studio 2017*
-@tab @strong{see below}
-@end multitable
+each version of the CPython binary released \href{https://www.python.org/downloads/windows/}{for Windows}:
+
+\begin{center}
+\begin{tabular}{rll}
+CPython & Microsoft product name & runtime filename\\
+2.7.6 & Visual Studio 2008 & MSVCR90.DLL\\
+3.4.0 & Visual Studio 2010 & MSVCR100.DLL\\
+3.5.0 & Visual Studio 2015 & \textbf{see below}\\
+3.6.0 & Visual Studio 2015 & \textbf{see below}\\
+3.7.0 & Visual Studio 2017* & \textbf{see below}\\
+\end{tabular}
+\end{center}
 
 It is important to note that MingW and Msys2 ship with the Visual C
-runtime from Microsoft Visual Studio 2005 and are thus @strong{incompatible}
+runtime from Microsoft Visual Studio 2005 and are thus \textbf{incompatible}
 with all the versions of CPython which can be used with the GPGME
 Python bindings.
 
@@ -723,9 +513,9 @@ Foundation has adopted the reworking of the Visual C runtime which was
 performed for Visual Studio 2015 and aimed at resolving many of these
 kinds of issues.  Much greater detail on these issues and the correct
 file(s) to link to are available from Matthew Brett's invaluable page,
-@uref{https://matthew-brett.github.io/pydagogue/python_msvc.html, Using Microsoft Visual C with Python}.  It is also worth reading the
-Microsoft Developer Network blog post on @uref{http://blogs.msdn.com/b/vcblog/archive/2015/03/03/introducing-the-universal-crt.aspx, the universal CRT} and Steve
-Dower's blog posts on Python extensions (@uref{http://stevedower.id.au/blog/building-for-python-3-5, part 1} and @uref{http://stevedower.id.au/blog/building-for-python-3-5-part-two, part 2}).
+\href{https://matthew-brett.github.io/pydagogue/python\_msvc.html}{Using Microsoft Visual C with Python}.  It is also worth reading the
+Microsoft Developer Network blog post on \href{http://blogs.msdn.com/b/vcblog/archive/2015/03/03/introducing-the-universal-crt.aspx}{the universal CRT} and Steve
+Dower's blog posts on Python extensions (\href{http://stevedower.id.au/blog/building-for-python-3-5}{part 1} and \href{http://stevedower.id.au/blog/building-for-python-3-5-part-two}{part 2}).
 
 The second of those two posts by Steve Dower contains the details of
 specific configuration options required for compiling anything to be
@@ -735,7 +525,7 @@ Studio prior to Visual Studio 2015 did not support 64-bit systems by
 default.  So compiling a 64-bit version of these bindings for a 64-bit
 version of CPython 2.7 or 3.4 requires additional work.
 
-In addition to the blog posts, the @uref{https://wiki.python.org/moin/WindowsCompilers, Windows compilers} wiki page on the
+In addition to the blog posts, the \href{https://wiki.python.org/moin/WindowsCompilers}{Windows compilers} wiki page on the
 CPython wiki is another essential reference on the relevant versions
 of Visual Studio to use and the degree of compatibility with CPython
 releases.
@@ -752,51 +542,46 @@ the bare minimum doing so would require the GnuPG project compile ten
 different versions of the bindings with each release; both 32-bit and
 64-bit versions for CPython 2.7 and 3.4, with 64-bit versions for both
 x86-64 (i.e. Intel and AMD) and ARM architectures for CPython 3.5,
-3.6, 3.7 and later releases.  That's the bare @strong{minimum}, it'd probably
+3.6, 3.7 and later releases.  That's the bare \textbf{minimum}, it'd probably
 be higher.
 
 Additionally, with only a binary installation used in conjunction with
-the CPython installer from @samp{python.org} the advanced options available
-which utilise @ref{C plus Python plus SWIG plus Cython, , Cython} will not be able to be used at all.  Cython
+the CPython installer from \texttt{python.org} the advanced options available
+which utilise \hyperref[sec:org3b53926]{Cython} will not be able to be used at all.  Cython
 depends on being able to compile the C code it generates and that too
 would need to utilise a matching runtime to both the installed version
 of CPython and these bindings in order to work with the bindings.
 
 Considering all of that, what do we recommend?
 
-@enumerate
-@item
-Use a recent version of CPython; at least 3.5, but ideally 3.6 or
+\begin{enumerate}
+\item Use a recent version of CPython; at least 3.5, but ideally 3.6 or
 later.
 
-@item
-Use Visual Studio 2015 or the standalone build tools for Visual
+\item Use Visual Studio 2015 or the standalone build tools for Visual
 Studio 2017 (or later).
 
-@item
-Compile both CPython and GPGME with these bindings using the tools
+\item Compile both CPython and GPGME with these bindings using the tools
 selected in step 2.
 
-@item
-Ignore MingW, Msys2 and the official CPython binary installers.
+\item Ignore MingW, Msys2 and the official CPython binary installers.
 
-@item
-Be thankful the answer to this question wasn't simply to say
+\item Be thankful the answer to this question wasn't simply to say
 something like, “install Linux” or “install FreeBSD” (or even
 Apple's OS X).
-@end enumerate
+\end{enumerate}
 
-@node CFFI is the Best™ and GPGME should use it instead of SWIG
-@subsection CFFI is the Best™ and GPGME should use it instead of SWIG
 
-There are many reasons for favouring @uref{https://cffi.readthedocs.io/en/latest/overview.html, CFFI} and proponents of it are
+\subsubsection{CFFI is the Best™ and GPGME should use it instead of SWIG}
+\label{sec:org645735a}
+There are many reasons for favouring \href{https://cffi.readthedocs.io/en/latest/overview.html}{CFFI} and proponents of it are
 quite happy to repeat these things as if all it would take to switch
 from SWIG to CFFI is repeating that list as if it were a new concept.
 
 The fact is that there are things which Python's CFFI implementation
 cannot handle in the GPGME C code.  Beyond that there are features of
 SWIG which are simply not available with CFFI at all.  SWIG generates
-the bindings to Python using the @samp{gpgme.h} file, but that file is not
+the bindings to Python using the \texttt{gpgme.h} file, but that file is not
 a single version shipped with each release, it too is generated when
 GPGME is compiled.
 
@@ -814,16 +599,16 @@ should, I'd suggest you volunteer to bring CFFI up to the level this
 project needs.
 
 If you're actually seriously considering doing so, then I'd suggest
-taking the @samp{gpgme-tool.c} file in the GPGME @samp{src/} directory and
+taking the \texttt{gpgme-tool.c} file in the GPGME \texttt{src/} directory and
 getting that to work with any of the CFFI API methods (not the ABI
 methods, they'll work with pretty much anything).  When you start
 running into trouble with "ifdefs" then you'll know what sort of
 things are lacking.  That doesn't even take into account the amount of
 work saved via SWIG's code generation techniques either.
 
-@node Virtualised Environments
-@subsection Virtualised Environments
 
+\subsubsection{Virtualised Environments}
+\label{sec:orgb0d56f5}
 It is fairly common practice amongst Python developers to, as much as
 possible, use packages like virtualenv to keep various things that are
 to be installed from interfering with each other.  Given how much of
@@ -836,8 +621,8 @@ with virtualenv, the answer is both yes and no.
 
 In general we recommend installing to the relevant path and matching
 prefix of GPGME itself.  Which means that when GPGME, and ideally the
-rest of the GnuPG stack, is installed to a prefix like @samp{/usr/local} or
-@samp{/opt/local} then the bindings would need to be installed to the main
+rest of the GnuPG stack, is installed to a prefix like \texttt{/usr/local} or
+\texttt{/opt/local} then the bindings would need to be installed to the main
 Python installation and not a virtualised abstraction.  Attempts to
 separate the two in the past have been known to cause weird and
 intermittent errors ranging from minor annoyances to complete failures
@@ -852,7 +637,7 @@ installing process of GPGME does by default.
 Once that is done, however, it appears that a copy of the compiled
 module may be installed into a virtualenv of the same major and minor
 version matching the build.  Alternatively it is possible to utilise a
-@samp{sites.pth} file in the @samp{site-packages/} directory of a virtualenv
+\texttt{sites.pth} file in the \texttt{site-packages/} directory of a virtualenv
 installation, which links back to the system installations
 corresponding directory in order to import anything installed system
 wide.  This may or may not be appropriate on a case by case basis.
@@ -862,7 +647,7 @@ complete, preliminary testing of them indicates that both are viable
 as long as the main installation is complete.  Which means that
 certain other options normally restricted to virtual environments are
 also available, including integration with pythonic test suites
-(e.g. @uref{https://docs.pytest.org/en/latest/index.html, pytest}) and other large projects.
+(e.g. \href{https://docs.pytest.org/en/latest/index.html}{pytest}) and other large projects.
 
 That said, it is worth reiterating the warning regarding non-standard
 installations.  If one were to attempt to install the bindings only to
@@ -873,49 +658,31 @@ likely that the build process itself would break.
 
 If a degree of separation from the main operating system is still
 required in spite of these warnings, then consider other forms of
-virtualisation.  Either a virtual machine (e.g. @uref{https://www.virtualbox.org/, VirtualBox}), a
-hardware emulation layer (e.g. @uref{https://www.qemu.org/, QEMU}) or an application container
-(e.g. @uref{https://www.docker.com/why-docker, Docker}).
+virtualisation.  Either a virtual machine (e.g. \href{https://www.virtualbox.org/}{VirtualBox}), a
+hardware emulation layer (e.g. \href{https://www.qemu.org/}{QEMU}) or an application container
+(e.g. \href{https://www.docker.com/why-docker}{Docker}).
 
 Finally it should be noted that the limited tests conducted thus far
-have been using the @samp{virtualenv} command in a new directory to create
-the virtual python environment.  As opposed to the standard @samp{python3
+have been using the \texttt{virtualenv} command in a new directory to create
+the virtual python environment.  As opposed to the standard \texttt{python3
 -m venv} and it is possible that this will make a difference depending
 on the system and version of Python in use.  Another option is to run
-the command @samp{python3 -m virtualenv /path/to/install/virtual/thingy}
+the command \texttt{python3 -m virtualenv /path/to/install/virtual/thingy}
 instead.
 
-@node Post installation
-@subsection Post installation
-
-Following installation it is recommended to move the
-@samp{post_installer.py} script from the @samp{lang/python/examples/howto/}
-directory to the @samp{lang/python/} directory and run it.  This will fix
-or restore files needed by Sphinx which may be removed during a
-distribution build for release.  It will also generate reST files from
-Org mode files with Pandoc and generate Texinfo files from Org mode
-files with GNU Emacs and Org mode (in batch mode).  Additionally it
-will fix the UTF-8 declaration line in the Texinfo files (Emacs
-expects "UTF-8" to be "utf-8").
-
-@node Fundamentals
-@chapter Fundamentals
 
+\section{Fundamentals}
+\label{sec:org832642e}
 Before we can get to the fun stuff, there are a few matters regarding
 GPGME's design which hold true whether you're dealing with the C code
 directly or these Python bindings.
 
-@menu
-* No REST::
-* Context::
-@end menu
-
-@node No REST
-@section No REST
 
+\subsection{No REST}
+\label{sec:org3d694ba}
 The first part of which is or will be fairly blatantly obvious upon
 viewing the first example, but it's worth reiterating anyway.  That
-being that this API is @emph{@strong{not}} a REST API.  Nor indeed could it ever
+being that this API is \emph{\textbf{not}} a REST API.  Nor indeed could it ever
 be one.
 
 Most, if not all, Python programmers (and not just Python programmers)
@@ -930,9 +697,9 @@ provide access to the entire C API on which it's built.  It does,
 however, provide a very pythonic interface on top of the direct
 bindings and it's this pythonic layer that this HOWTO deals with.
 
-@node Context
-@section Context
 
+\subsection{Context}
+\label{sec:org10e4004}
 One of the reasons which prevents this API from being RESTful is that
 most operations require more than one instruction to the API to
 perform the task.  Sure, there are certain functions which can be
@@ -950,19 +717,11 @@ both the RESTful and REST-like, it's most commonly referred to as a
 session.  In GPGME, however, it is called a context and every
 operation type has one.
 
-@node Working with keys
-@chapter Working with keys
-
-@menu
-* Key selection::
-* Get key::
-* Importing keys::
-* Exporting keys::
-@end menu
-
-@node Key selection
-@section Key selection
 
+\section{Working with keys}
+\label{sec:orgff114ca}
+\subsection{Key selection}
+\label{sec:org6589217}
 Selecting keys to encrypt to or to sign with will be a common
 occurrence when working with GPGMe and the means available for doing
 so are quite simple.
@@ -980,54 +739,50 @@ pattern is upper or lower case.
 
 So this is the best method:
 
-@example
+\begin{verbatim}
 import gpg
 
 k = gpg.Context().keylist(pattern="258E88DCBD3CD44D8E7AB43F6ECB6AF0DEADBEEF")
 keys = list(k)
-@end example
+\end{verbatim}
 
 This is passable and very likely to be common:
 
-@example
+\begin{verbatim}
 import gpg
 
 k = gpg.Context().keylist(pattern="0x6ECB6AF0DEADBEEF")
 keys = list(k)
-@end example
+\end{verbatim}
 
 And this is a really bad idea:
 
-@example
+\begin{verbatim}
 import gpg
 
 k = gpg.Context().keylist(pattern="0xDEADBEEF")
 keys = list(k)
-@end example
+\end{verbatim}
 
 Alternatively it may be that the intention is to create a list of keys
 which all match a particular search string.  For instance all the
 addresses at a particular domain, like this:
 
-@example
+\begin{verbatim}
 import gpg
 
 ncsc = gpg.Context().keylist(pattern="ncsc.mil")
 nsa = list(ncsc)
-@end example
-
-@menu
-* Counting keys::
-@end menu
+\end{verbatim}
 
-@node Counting keys
-@subsection Counting keys
 
-Counting the number of keys in your public keybox (@samp{pubring.kbx}), the
-format which has superseded the old keyring format (@samp{pubring.gpg} and
-@samp{secring.gpg}), or the number of secret keys is a very simple task.
+\subsubsection{Counting keys}
+\label{sec:org63a3d62}
+Counting the number of keys in your public keybox (\texttt{pubring.kbx}), the
+format which has superseded the old keyring format (\texttt{pubring.gpg} and
+\texttt{secring.gpg}), or the number of secret keys is a very simple task.
 
-@example
+\begin{verbatim}
 import gpg
 
 c = gpg.Context()
@@ -1041,23 +796,23 @@ publist = list(pubkeys)
 pubnum = len(publist)
 
 print("""
-  Number of secret keys:  @{0@}
-  Number of public keys:  @{1@}
+  Number of secret keys:  {0}
+  Number of public keys:  {1}
 """.format(secnum, pubnum))
-@end example
+\end{verbatim}
 
-NOTE: The @ref{C plus Python plus SWIG plus Cython, , Cython} introduction in the @ref{Advanced or Experimental Use Cases, , Advanced and Experimental}
+NOTE: The \hyperref[sec:org3b53926]{Cython} introduction in the \hyperref[sec:org944cc00]{Advanced and Experimental}
 section uses this same key counting code with Cython to demonstrate
 some areas where Cython can improve performance even with the
 bindings.  Users with large public keyrings or keyboxes, for instance,
 should consider these options if they are comfortable with using
 Cython.
 
-@node Get key
-@section Get key
 
+\subsection{Get key}
+\label{sec:org26adb2e}
 An alternative method of getting a single key via its fingerprint is
-available directly within a Context with @samp{Context().get_key}.  This is
+available directly within a Context with \texttt{Context().get\_key}.  This is
 the preferred method of selecting a key in order to modify it, sign or
 certify it and for obtaining relevant data about a single key as a
 part of other functions; when verifying a signature made by that key,
@@ -1069,22 +824,22 @@ secret keys as well.
 This first example demonstrates selecting the current key of Werner
 Koch, which is due to expire at the end of 2018:
 
-@example
+\begin{verbatim}
 import gpg
 
 fingerprint = "80615870F5BAD690333686D0F2AD85AC1E42B367"
 key = gpg.Context().get_key(fingerprint)
-@end example
+\end{verbatim}
 
 Whereas this example demonstrates selecting the author's current key
-with the @samp{secret} key word argument set to @samp{True}:
+with the \texttt{secret} key word argument set to \texttt{True}:
 
-@example
+\begin{verbatim}
 import gpg
 
 fingerprint = "DB4724E6FA4286C92B4E55C4321E4E2373590E5D"
 key = gpg.Context().get_key(fingerprint, secret=True)
-@end example
+\end{verbatim}
 
 It is, of course, quite possible to select expired, disabled and
 revoked keys with this function, but only to effectively display
@@ -1093,10 +848,10 @@ information about those keys.
 It is also possible to use both unicode or string literals and byte
 literals with the fingerprint when getting a key in this way.
 
-@node Importing keys
-@section Importing keys
 
-Importing keys is possible with the @samp{key_import()} method and takes
+\subsection{Importing keys}
+\label{sec:org1ad598a}
+Importing keys is possible with the \texttt{key\_import()} method and takes
 one argument which is a bytes literal object containing either the
 binary or ASCII armoured key data for one or more keys.
 
@@ -1105,7 +860,7 @@ keyservers via the web using the requests module.  Since requests
 returns the content as a bytes literal object, we can then use that
 directly to import the resulting data into our keybox.
 
-@example
+\begin{verbatim}
 import gpg
 import os.path
 import requests
@@ -1113,7 +868,7 @@ import requests
 c = gpg.Context()
 url = "https://sks-keyservers.net/pks/lookup"
 pattern = input("Enter the pattern to search for key or user IDs: ")
-payload = @{"op": "get", "search": pattern@}
+payload = {"op": "get", "search": pattern}
 
 r = requests.get(url, verify=True, params=payload)
 result = c.key_import(r.content)
@@ -1129,53 +884,47 @@ elif result is not None and hasattr(result, "considered") is True:
     new_scrt = result.secret_imported
     nochange = result.unchanged
     print("""
-  The total number of keys considered for import was:  @{0@}
+  The total number of keys considered for import was:  {0}
 
-     Number of keys revoked:  @{1@}
-   Number of new signatures:  @{2@}
-      Number of new subkeys:  @{3@}
-     Number of new user IDs:  @{4@}
-  Number of new secret keys:  @{5@}
-   Number of unchanged keys:  @{6@}
+     Number of keys revoked:  {1}
+   Number of new signatures:  {2}
+      Number of new subkeys:  {3}
+     Number of new user IDs:  {4}
+  Number of new secret keys:  {5}
+   Number of unchanged keys:  {6}
 
   The key IDs for all considered keys were:
 """.format(num_keys, new_revs, new_sigs, new_subs, new_uids, new_scrt,
            nochange))
     for i in range(num_keys):
-        print("@{0@}\n".format(result.imports[i].fpr))
+        print("{0}\n".format(result.imports[i].fpr))
 else:
     pass
-@end example
+\end{verbatim}
 
 NOTE: When searching for a key ID of any length or a fingerprint
-(without spaces), the SKS servers require the the leading @samp{0x}
+(without spaces), the SKS servers require the the leading \texttt{0x}
 indicative of hexadecimal be included.  Also note that the old short
-key IDs (e.g. @samp{0xDEADBEEF}) should no longer be used due to the
+key IDs (e.g. \texttt{0xDEADBEEF}) should no longer be used due to the
 relative ease by which such key IDs can be reproduced, as demonstrated
 by the Evil32 Project in 2014 (which was subsequently exploited in
 2016).
 
 Testing for whether a string in any given search is or may be a
-hexadecimal value which may be missing the leading @samp{0x} is a simple
+hexadecimal value which may be missing the leading \texttt{0x} is a simple
 matter of using a try/except statement which attempts to convert the
 string as hex to an integer and then back to hex; then using that to
 search with.  Raising a ValueError simply results in treating the
 string as a string.  This is the method and logic utilised in the
-@samp{import-keys-hkp.py} script (see below).
+\texttt{import-keys-hkp.py} script (see below).
 
-@menu
-* Working with ProtonMail::
-* Importing with HKP for Python::
-* Importing from ProtonMail with HKP for Python::
-@end menu
-
-@node Working with ProtonMail
-@subsection Working with ProtonMail
 
+\subsubsection{Working with ProtonMail}
+\label{sec:org27b0d6f}
 Here is a variation on the example above which checks the constrained
 ProtonMail keyserver for ProtonMail public keys.
 
-@example
+\begin{verbatim}
 import gpg
 import requests
 import sys
@@ -1194,35 +943,35 @@ if len(sys.argv) >= 2:
 else:
     keyterm = input("Enter the key ID, UID or search string: ")
 
-if keyterm.count("@@") == 2 and keyterm.startswith("@@") is True:
+if keyterm.count("@") == 2 and keyterm.startswith("@") is True:
     ksearch.append(keyterm[1:])
     ksearch.append(keyterm[1:])
     ksearch.append(keyterm[1:])
-elif keyterm.count("@@") == 1 and keyterm.startswith("@@") is True:
-    ksearch.append("@{0@}@@protonmail.com".format(keyterm[1:]))
-    ksearch.append("@{0@}@@protonmail.ch".format(keyterm[1:]))
-    ksearch.append("@{0@}@@pm.me".format(keyterm[1:]))
-elif keyterm.count("@@") == 0:
-    ksearch.append("@{0@}@@protonmail.com".format(keyterm))
-    ksearch.append("@{0@}@@protonmail.ch".format(keyterm))
-    ksearch.append("@{0@}@@pm.me".format(keyterm))
-elif keyterm.count("@@") == 2 and keyterm.startswith("@@") is False:
-    uidlist = keyterm.split("@@")
+elif keyterm.count("@") == 1 and keyterm.startswith("@") is True:
+    ksearch.append("{0}@protonmail.com".format(keyterm[1:]))
+    ksearch.append("{0}@protonmail.ch".format(keyterm[1:]))
+    ksearch.append("{0}@pm.me".format(keyterm[1:]))
+elif keyterm.count("@") == 0:
+    ksearch.append("{0}@protonmail.com".format(keyterm))
+    ksearch.append("{0}@protonmail.ch".format(keyterm))
+    ksearch.append("{0}@pm.me".format(keyterm))
+elif keyterm.count("@") == 2 and keyterm.startswith("@") is False:
+    uidlist = keyterm.split("@")
     for uid in uidlist:
-        ksearch.append("@{0@}@@protonmail.com".format(uid))
-        ksearch.append("@{0@}@@protonmail.ch".format(uid))
-        ksearch.append("@{0@}@@pm.me".format(uid))
-elif keyterm.count("@@") > 2:
-    uidlist = keyterm.split("@@")
+        ksearch.append("{0}@protonmail.com".format(uid))
+        ksearch.append("{0}@protonmail.ch".format(uid))
+        ksearch.append("{0}@pm.me".format(uid))
+elif keyterm.count("@") > 2:
+    uidlist = keyterm.split("@")
     for uid in uidlist:
-        ksearch.append("@{0@}@@protonmail.com".format(uid))
-        ksearch.append("@{0@}@@protonmail.ch".format(uid))
-        ksearch.append("@{0@}@@pm.me".format(uid))
+        ksearch.append("{0}@protonmail.com".format(uid))
+        ksearch.append("{0}@protonmail.ch".format(uid))
+        ksearch.append("{0}@pm.me".format(uid))
 else:
     ksearch.append(keyterm)
 
 for k in ksearch:
-    payload = @{"op": "get", "search": k@}
+    payload = {"op": "get", "search": k}
     try:
         r = requests.get(url, verify=True, params=payload)
         if r.ok is True:
@@ -1233,7 +982,7 @@ for k in ksearch:
         result = None
 
     if result is not None and hasattr(result, "considered") is False:
-        print("@{0@} for @{1@}".format(result.decode(), k))
+        print("{0} for {1}".format(result.decode(), k))
     elif result is not None and hasattr(result, "considered") is True:
         num_keys = len(result.imports)
         new_revs = result.new_revocations
@@ -1243,18 +992,18 @@ for k in ksearch:
         new_scrt = result.secret_imported
         nochange = result.unchanged
         print("""
-The total number of keys considered for import was:  @{0@}
+The total number of keys considered for import was:  {0}
 
 With UIDs wholely or partially matching the following string:
 
-        @{1@}
+        {1}
 
-   Number of keys revoked:  @{2@}
- Number of new signatures:  @{3@}
-    Number of new subkeys:  @{4@}
-   Number of new user IDs:  @{5@}
-Number of new secret keys:  @{6@}
- Number of unchanged keys:  @{7@}
+   Number of keys revoked:  {2}
+ Number of new signatures:  {3}
+    Number of new subkeys:  {4}
+   Number of new user IDs:  {5}
+Number of new secret keys:  {6}
+ Number of unchanged keys:  {7}
 
 The key IDs for all considered keys were:
 """.format(num_keys, k, new_revs, new_sigs, new_subs, new_uids, new_scrt,
@@ -1264,10 +1013,10 @@ The key IDs for all considered keys were:
         print("")
     elif result is None:
         print(e)
-@end example
+\end{verbatim}
 
-Both the above example, @uref{../examples/howto/pmkey-import.py, pmkey-import.py}, and a version which prompts
-for an alternative GnuPG home directory, @uref{../examples/howto/pmkey-import-alt.py, pmkey-import-alt.py}, are
+Both the above example, \href{../examples/howto/pmkey-import.py}{pmkey-import.py}, and a version which prompts
+for an alternative GnuPG home directory, \href{../examples/howto/pmkey-import-alt.py}{pmkey-import-alt.py}, are
 available with the other examples and are executable scripts.
 
 Note that while the ProtonMail servers are based on the SKS servers,
@@ -1278,10 +1027,10 @@ to update their own keys, which could be a vector for attacking
 ProtonMail users who may not receive a key's revocation if it had been
 compromised.
 
-@node Importing with HKP for Python
-@subsection Importing with HKP for Python
 
-Performing the same tasks with the @uref{https://github.com/Selfnet/hkp4py, hkp4py module} (available via PyPI)
+\subsubsection{Importing with HKP for Python}
+\label{sec:org592d7ab}
+Performing the same tasks with the \href{https://github.com/Selfnet/hkp4py}{hkp4py module} (available via PyPI)
 is not too much different, but does provide a number of options of
 benefit to end users.  Not least of which being the ability to perform
 some checks on a key before importing it or not.  For instance it may
@@ -1289,7 +1038,7 @@ be the policy of a site or project to only import keys which have not
 been revoked.  The hkp4py module permits such checks prior to the
 importing of the keys found.
 
-@example
+\begin{verbatim}
 import gpg
 import hkp4py
 import sys
@@ -1369,14 +1118,14 @@ for result in results:
         new_scrt = result.secret_imported
         nochange = result.unchanged
         print("""
-The total number of keys considered for import was:  @{0@}
+The total number of keys considered for import was:  {0}
 
-   Number of keys revoked:  @{1@}
- Number of new signatures:  @{2@}
-    Number of new subkeys:  @{3@}
-   Number of new user IDs:  @{4@}
-Number of new secret keys:  @{5@}
- Number of unchanged keys:  @{6@}
+   Number of keys revoked:  {1}
+ Number of new signatures:  {2}
+    Number of new subkeys:  {3}
+   Number of new user IDs:  {4}
+Number of new secret keys:  {5}
+ Number of unchanged keys:  {6}
 
 The key IDs for all considered keys were:
 """.format(num_keys, new_revs, new_sigs, new_subs, new_uids, new_scrt,
@@ -1386,16 +1135,16 @@ The key IDs for all considered keys were:
         print("")
     else:
         pass
-@end example
+\end{verbatim}
 
 Since the hkp4py module handles multiple keys just as effectively as
-one (@samp{keys} is a list of responses per matching key), the example
+one (\texttt{keys} is a list of responses per matching key), the example
 above is able to do a little bit more with the returned data before
 anything is actually imported.
 
-@node Importing from ProtonMail with HKP for Python
-@subsection Importing from ProtonMail with HKP for Python
 
+\subsubsection{Importing from ProtonMail with HKP for Python}
+\label{sec:org3966a76}
 Though this can provide certain benefits even when working with
 ProtonMail, the scope is somewhat constrained there due to the
 limitations of the ProtonMail keyserver.
@@ -1413,15 +1162,14 @@ Presumably this is intended to reduce breaches of privacy of their
 users as an email address must already be known before a key for that
 address can be obtained.
 
-@enumerate
-@item
-Import from ProtonMail via HKP for Python Example no. 1
-
 
+\begin{enumerate}
+\item Import from ProtonMail via HKP for Python Example no. 1
+\label{sec:org6cd15c3}
 The following script is available with the rest of the examples under
-the somewhat less than original name, @samp{pmkey-import-hkp.py}.
+the somewhat less than original name, \texttt{pmkey-import-hkp.py}.
 
-@example
+\begin{verbatim}
 import gpg
 import hkp4py
 import os.path
@@ -1453,35 +1201,35 @@ else:
     keyterms = key_term.split()
 
 for keyterm in keyterms:
-    if keyterm.count("@@") == 2 and keyterm.startswith("@@") is True:
+    if keyterm.count("@") == 2 and keyterm.startswith("@") is True:
         ksearch.append(keyterm[1:])
         ksearch.append(keyterm[1:])
         ksearch.append(keyterm[1:])
-    elif keyterm.count("@@") == 1 and keyterm.startswith("@@") is True:
-        ksearch.append("@{0@}@@protonmail.com".format(keyterm[1:]))
-        ksearch.append("@{0@}@@protonmail.ch".format(keyterm[1:]))
-        ksearch.append("@{0@}@@pm.me".format(keyterm[1:]))
-    elif keyterm.count("@@") == 0:
-        ksearch.append("@{0@}@@protonmail.com".format(keyterm))
-        ksearch.append("@{0@}@@protonmail.ch".format(keyterm))
-        ksearch.append("@{0@}@@pm.me".format(keyterm))
-    elif keyterm.count("@@") == 2 and keyterm.startswith("@@") is False:
-        uidlist = keyterm.split("@@")
+    elif keyterm.count("@") == 1 and keyterm.startswith("@") is True:
+        ksearch.append("{0}@protonmail.com".format(keyterm[1:]))
+        ksearch.append("{0}@protonmail.ch".format(keyterm[1:]))
+        ksearch.append("{0}@pm.me".format(keyterm[1:]))
+    elif keyterm.count("@") == 0:
+        ksearch.append("{0}@protonmail.com".format(keyterm))
+        ksearch.append("{0}@protonmail.ch".format(keyterm))
+        ksearch.append("{0}@pm.me".format(keyterm))
+    elif keyterm.count("@") == 2 and keyterm.startswith("@") is False:
+        uidlist = keyterm.split("@")
         for uid in uidlist:
-            ksearch.append("@{0@}@@protonmail.com".format(uid))
-            ksearch.append("@{0@}@@protonmail.ch".format(uid))
-            ksearch.append("@{0@}@@pm.me".format(uid))
-    elif keyterm.count("@@") > 2:
-        uidlist = keyterm.split("@@")
+            ksearch.append("{0}@protonmail.com".format(uid))
+            ksearch.append("{0}@protonmail.ch".format(uid))
+            ksearch.append("{0}@pm.me".format(uid))
+    elif keyterm.count("@") > 2:
+        uidlist = keyterm.split("@")
         for uid in uidlist:
-            ksearch.append("@{0@}@@protonmail.com".format(uid))
-            ksearch.append("@{0@}@@protonmail.ch".format(uid))
-            ksearch.append("@{0@}@@pm.me".format(uid))
+            ksearch.append("{0}@protonmail.com".format(uid))
+            ksearch.append("{0}@protonmail.ch".format(uid))
+            ksearch.append("{0}@pm.me".format(uid))
     else:
         ksearch.append(keyterm)
 
 for k in ksearch:
-    print("Checking for key for: @{0@}".format(k))
+    print("Checking for key for: {0}".format(k))
     try:
         keys = server.search(k)
         if isinstance(keys, list) is True:
@@ -1500,7 +1248,7 @@ for k in ksearch:
 
 for result in results:
     if result is not None and hasattr(result, "considered") is False:
-        print("@{0@} for @{1@}".format(result.decode(), k))
+        print("{0} for {1}".format(result.decode(), k))
     elif result is not None and hasattr(result, "considered") is True:
         num_keys = len(result.imports)
         new_revs = result.new_revocations
@@ -1510,18 +1258,18 @@ for result in results:
         new_scrt = result.secret_imported
         nochange = result.unchanged
         print("""
-The total number of keys considered for import was:  @{0@}
+The total number of keys considered for import was:  {0}
 
 With UIDs wholely or partially matching the following string:
 
-        @{1@}
+        {1}
 
-   Number of keys revoked:  @{2@}
- Number of new signatures:  @{3@}
-    Number of new subkeys:  @{4@}
-   Number of new user IDs:  @{5@}
-Number of new secret keys:  @{6@}
- Number of unchanged keys:  @{7@}
+   Number of keys revoked:  {2}
+ Number of new signatures:  {3}
+    Number of new subkeys:  {4}
+   Number of new user IDs:  {5}
+Number of new secret keys:  {6}
+ Number of unchanged keys:  {7}
 
 The key IDs for all considered keys were:
 """.format(num_keys, k, new_revs, new_sigs, new_subs, new_uids, new_scrt,
@@ -1531,22 +1279,21 @@ The key IDs for all considered keys were:
         print("")
     elif result is None:
         pass
-@end example
-
-@item
-Import from ProtonMail via HKP for Python Example no. 2
+\end{verbatim}
 
 
+\item Import from ProtonMail via HKP for Python Example no. 2
+\label{sec:org3b674e5}
 Like its counterpart above, this script can also be found with the
 rest of the examples, by the name pmkey-import-hkp-alt.py.
 
 With this script a modicum of effort has been made to treat anything
-passed as a @samp{homedir} which either does not exist or which is not a
+passed as a \texttt{homedir} which either does not exist or which is not a
 directory, as also being a pssible user ID to check for.  It's not
 guaranteed to pick up on all such cases, but it should cover most of
 them.
 
-@example
+\begin{verbatim}
 import gpg
 import hkp4py
 import os.path
@@ -1615,35 +1362,35 @@ else:
     pass
 
 for keyterm in keyterms:
-    if keyterm.count("@@") == 2 and keyterm.startswith("@@") is True:
+    if keyterm.count("@") == 2 and keyterm.startswith("@") is True:
         ksearch.append(keyterm[1:])
         ksearch.append(keyterm[1:])
         ksearch.append(keyterm[1:])
-    elif keyterm.count("@@") == 1 and keyterm.startswith("@@") is True:
-        ksearch.append("@{0@}@@protonmail.com".format(keyterm[1:]))
-        ksearch.append("@{0@}@@protonmail.ch".format(keyterm[1:]))
-        ksearch.append("@{0@}@@pm.me".format(keyterm[1:]))
-    elif keyterm.count("@@") == 0:
-        ksearch.append("@{0@}@@protonmail.com".format(keyterm))
-        ksearch.append("@{0@}@@protonmail.ch".format(keyterm))
-        ksearch.append("@{0@}@@pm.me".format(keyterm))
-    elif keyterm.count("@@") == 2 and keyterm.startswith("@@") is False:
-        uidlist = keyterm.split("@@")
+    elif keyterm.count("@") == 1 and keyterm.startswith("@") is True:
+        ksearch.append("{0}@protonmail.com".format(keyterm[1:]))
+        ksearch.append("{0}@protonmail.ch".format(keyterm[1:]))
+        ksearch.append("{0}@pm.me".format(keyterm[1:]))
+    elif keyterm.count("@") == 0:
+        ksearch.append("{0}@protonmail.com".format(keyterm))
+        ksearch.append("{0}@protonmail.ch".format(keyterm))
+        ksearch.append("{0}@pm.me".format(keyterm))
+    elif keyterm.count("@") == 2 and keyterm.startswith("@") is False:
+        uidlist = keyterm.split("@")
         for uid in uidlist:
-            ksearch.append("@{0@}@@protonmail.com".format(uid))
-            ksearch.append("@{0@}@@protonmail.ch".format(uid))
-            ksearch.append("@{0@}@@pm.me".format(uid))
-    elif keyterm.count("@@") > 2:
-        uidlist = keyterm.split("@@")
+            ksearch.append("{0}@protonmail.com".format(uid))
+            ksearch.append("{0}@protonmail.ch".format(uid))
+            ksearch.append("{0}@pm.me".format(uid))
+    elif keyterm.count("@") > 2:
+        uidlist = keyterm.split("@")
         for uid in uidlist:
-            ksearch.append("@{0@}@@protonmail.com".format(uid))
-            ksearch.append("@{0@}@@protonmail.ch".format(uid))
-            ksearch.append("@{0@}@@pm.me".format(uid))
+            ksearch.append("{0}@protonmail.com".format(uid))
+            ksearch.append("{0}@protonmail.ch".format(uid))
+            ksearch.append("{0}@pm.me".format(uid))
     else:
         ksearch.append(keyterm)
 
 for k in ksearch:
-    print("Checking for key for: @{0@}".format(k))
+    print("Checking for key for: {0}".format(k))
     try:
         keys = server.search(k)
         if isinstance(keys, list) is True:
@@ -1662,7 +1409,7 @@ for k in ksearch:
 
 for result in results:
     if result is not None and hasattr(result, "considered") is False:
-        print("@{0@} for @{1@}".format(result.decode(), k))
+        print("{0} for {1}".format(result.decode(), k))
     elif result is not None and hasattr(result, "considered") is True:
         num_keys = len(result.imports)
         new_revs = result.new_revocations
@@ -1672,18 +1419,18 @@ for result in results:
         new_scrt = result.secret_imported
         nochange = result.unchanged
         print("""
-The total number of keys considered for import was:  @{0@}
+The total number of keys considered for import was:  {0}
 
 With UIDs wholely or partially matching the following string:
 
-        @{1@}
+        {1}
 
-   Number of keys revoked:  @{2@}
- Number of new signatures:  @{3@}
-    Number of new subkeys:  @{4@}
-   Number of new user IDs:  @{5@}
-Number of new secret keys:  @{6@}
- Number of unchanged keys:  @{7@}
+   Number of keys revoked:  {2}
+ Number of new signatures:  {3}
+    Number of new subkeys:  {4}
+   Number of new user IDs:  {5}
+Number of new secret keys:  {6}
+ Number of unchanged keys:  {7}
 
 The key IDs for all considered keys were:
 """.format(num_keys, k, new_revs, new_sigs, new_subs, new_uids, new_scrt,
@@ -1693,34 +1440,28 @@ The key IDs for all considered keys were:
         print("")
     elif result is None:
         pass
-@end example
-@end enumerate
+\end{verbatim}
+\end{enumerate}
 
-@node Exporting keys
-@section Exporting keys
 
+\subsection{Exporting keys}
+\label{sec:org4596a77}
 Exporting keys remains a reasonably simple task, but has been
 separated into three different functions for the OpenPGP cryptographic
 engine.  Two of those functions are for exporting public keys and the
 third is for exporting secret keys.
 
-@menu
-* Exporting public keys::
-* Exporting secret keys::
-* Sending public keys to the SKS Keyservers::
-@end menu
-
-@node Exporting public keys
-@subsection Exporting public keys
 
+\subsubsection{Exporting public keys}
+\label{sec:org873704f}
 There are two methods of exporting public keys, both of which are very
-similar to the other.  The default method, @samp{key_export()}, will export
+similar to the other.  The default method, \texttt{key\_export()}, will export
 a public key or keys matching a specified pattern as normal.  The
-alternative, the @samp{key_export_minimal()} method, will do the same thing
+alternative, the \texttt{key\_export\_minimal()} method, will do the same thing
 except producing a minimised output with extra signatures and third
 party signatures or certifications removed.
 
-@example
+\begin{verbatim}
 import gpg
 import os.path
 import sys
@@ -1768,14 +1509,14 @@ if result is not None:
         f.write(result)
 else:
     pass
-@end example
+\end{verbatim}
 
-It should be noted that the result will only return @samp{None} when a
+It should be noted that the result will only return \texttt{None} when a
 search pattern has been entered, but has not matched any keys.  When
-the search pattern itself is set to @samp{None} this triggers the exporting
+the search pattern itself is set to \texttt{None} this triggers the exporting
 of the entire public keybox.
 
-@example
+\begin{verbatim}
 import gpg
 import os.path
 import sys
@@ -1823,20 +1564,20 @@ if result is not None:
         f.write(result)
 else:
     pass
-@end example
+\end{verbatim}
 
-@node Exporting secret keys
-@subsection Exporting secret keys
 
+\subsubsection{Exporting secret keys}
+\label{sec:org6c28d3d}
 Exporting secret keys is, functionally, very similar to exporting
-public keys; save for the invocation of @samp{pinentry} via @samp{gpg-agent} in
+public keys; save for the invocation of \texttt{pinentry} via \texttt{gpg-agent} in
 order to securely enter the key's passphrase and authorise the export.
 
 The following example exports the secret key to a file which is then
 set with the same permissions as the output files created by the
 command line secret key export options.
 
-@example
+\begin{verbatim}
 import gpg
 import os
 import os.path
@@ -1902,16 +1643,16 @@ if result is not None:
     os.chmod(keyfile, 0o600)
 else:
     pass
-@end example
+\end{verbatim}
 
 Alternatively the approach of the following script can be used.  This
 longer example saves the exported secret key(s) in files in the GnuPG
 home directory, in addition to setting the file permissions as only
 readable and writable by the user.  It also exports the secret key(s)
-twice in order to output both GPG binary (@samp{.gpg}) and ASCII armoured
-(@samp{.asc}) files.
+twice in order to output both GPG binary (\texttt{.gpg}) and ASCII armoured
+(\texttt{.asc}) files.
 
-@example
+\begin{verbatim}
 import gpg
 import os
 import os.path
@@ -1977,11 +1718,11 @@ else:
 
 if c.home_dir is not None:
     if c.home_dir.endswith("/"):
-        gpgfile = "@{0@}@{1@}.gpg".format(c.home_dir, keyfile)
-        ascfile = "@{0@}@{1@}.asc".format(c.home_dir, keyfile)
+        gpgfile = "{0}{1}.gpg".format(c.home_dir, keyfile)
+        ascfile = "{0}{1}.asc".format(c.home_dir, keyfile)
     else:
-        gpgfile = "@{0@}/@{1@}.gpg".format(c.home_dir, keyfile)
-        ascfile = "@{0@}/@{1@}.asc".format(c.home_dir, keyfile)
+        gpgfile = "{0}/{1}.gpg".format(c.home_dir, keyfile)
+        ascfile = "{0}/{1}.asc".format(c.home_dir, keyfile)
 else:
     if os.path.exists(os.environ["GNUPGHOME"]) is True:
         hd = os.environ["GNUPGHOME"]
@@ -1996,8 +1737,8 @@ else:
                 hd = procom[0].strip()
             else:
                 hd = procom[0].decode().strip()
-    gpgfile = "@{0@}/@{1@}.gpg".format(hd, keyfile)
-    ascfile = "@{0@}/@{1@}.asc".format(hd, keyfile)
+    gpgfile = "{0}/{1}.gpg".format(hd, keyfile)
+    ascfile = "{0}/{1}.asc".format(hd, keyfile)
 
 try:
     a_result = a.key_export_secret(pattern=logrus)
@@ -2019,18 +1760,18 @@ if b_result is not None:
     os.chmod(gpgfile, 0o600)
 else:
     pass
-@end example
+\end{verbatim}
 
-@node Sending public keys to the SKS Keyservers
-@subsection Sending public keys to the SKS Keyservers
 
-As with the previous section on importing keys, the @samp{hkp4py} module
+\subsubsection{Sending public keys to the SKS Keyservers}
+\label{sec:org82d4958}
+As with the previous section on importing keys, the \texttt{hkp4py} module
 adds another option with exporting keys in order to send them to the
 public keyservers.
 
 The following example demonstrates how this may be done.
 
-@example
+\begin{verbatim}
 import gpg
 import hkp4py
 import os.path
@@ -2074,66 +1815,54 @@ if export_result is not None:
         print(e)
 else:
     pass
-@end example
+\end{verbatim}
 
 An expanded version of this script with additional functions for
 specifying an alternative homedir location is in the examples
-directory as @samp{send-key-to-keyserver.py}.
+directory as \texttt{send-key-to-keyserver.py}.
 
-The @samp{hkp4py} module appears to handle both string and byte literal text
+The \texttt{hkp4py} module appears to handle both string and byte literal text
 data equally well, but the GPGME bindings deal primarily with byte
 literal data only and so this script sends in that format first, then
 tries the string literal form.
 
-@node Basic Functions
-@chapter Basic Functions
 
+\section{Basic Functions}
+\label{sec:orgb40b488}
 The most frequently called features of any cryptographic library will
 be the most fundamental tasks for encryption software.  In this
 section we will look at how to programmatically encrypt data, decrypt
 it, sign it and verify signatures.
 
-@menu
-* Encryption::
-* Decryption::
-* Signing text and files::
-* Signature verification::
-@end menu
-
-@node Encryption
-@section Encryption
 
+\subsection{Encryption}
+\label{sec:org3170365}
 Encrypting is very straight forward.  In the first example below the
-message, @samp{text}, is encrypted to a single recipient's key.  In the
+message, \texttt{text}, is encrypted to a single recipient's key.  In the
 second example the message will be encrypted to multiple recipients.
 
-@menu
-* Encrypting to one key::
-* Encrypting to multiple keys::
-@end menu
-
-@node Encrypting to one key
-@subsection Encrypting to one key
 
+\subsubsection{Encrypting to one key}
+\label{sec:org8098c64}
 Once the the Context is set the main issues with encrypting data is
 essentially reduced to key selection and the keyword arguments
-specified in the @samp{gpg.Context().encrypt()} method.
+specified in the \texttt{gpg.Context().encrypt()} method.
 
-Those keyword arguments are: @samp{recipients}, a list of keys encrypted to
-(covered in greater detail in the following section); @samp{sign}, whether
+Those keyword arguments are: \texttt{recipients}, a list of keys encrypted to
+(covered in greater detail in the following section); \texttt{sign}, whether
 or not to sign the plaintext data, see subsequent sections on signing
-and verifying signatures below (defaults to @samp{True}); @samp{sink}, to write
+and verifying signatures below (defaults to \texttt{True}); \texttt{sink}, to write
 results or partial results to a secure sink instead of returning it
-(defaults to @samp{None}); @samp{passphrase}, only used when utilising symmetric
-encryption (defaults to @samp{None}); @samp{always_trust}, used to override the
-trust model settings for recipient keys (defaults to @samp{False});
-@samp{add_encrypt_to}, utilises any preconfigured @samp{encrypt-to} or
-@samp{default-key} settings in the user's @samp{gpg.conf} file (defaults to
-@samp{False}); @samp{prepare}, prepare for encryption (defaults to @samp{False});
-@samp{expect_sign}, prepare for signing (defaults to @samp{False}); @samp{compress},
-compresses the plaintext prior to encryption (defaults to @samp{True}).
-
-@example
+(defaults to \texttt{None}); \texttt{passphrase}, only used when utilising symmetric
+encryption (defaults to \texttt{None}); \texttt{always\_trust}, used to override the
+trust model settings for recipient keys (defaults to \texttt{False});
+\texttt{add\_encrypt\_to}, utilises any preconfigured \texttt{encrypt-to} or
+\texttt{default-key} settings in the user's \texttt{gpg.conf} file (defaults to
+\texttt{False}); \texttt{prepare}, prepare for encryption (defaults to \texttt{False});
+\texttt{expect\_sign}, prepare for signing (defaults to \texttt{False}); \texttt{compress},
+compresses the plaintext prior to encryption (defaults to \texttt{True}).
+
+\begin{verbatim}
 import gpg
 
 a_key = "0x12345678DEADBEEF"
@@ -2150,14 +1879,14 @@ ciphertext, result, sign_result = c.encrypt(text, recipients=rkey, sign=False)
 
 with open("secret_plans.txt.asc", "wb") as afile:
     afile.write(ciphertext)
-@end example
+\end{verbatim}
 
 Though this is even more likely to be used like this; with the
 plaintext input read from a file, the recipient keys used for
 encryption regardless of key trust status and the encrypted output
-also encrypted to any preconfigured keys set in the @samp{gpg.conf} file:
+also encrypted to any preconfigured keys set in the \texttt{gpg.conf} file:
 
-@example
+\begin{verbatim}
 import gpg
 
 a_key = "0x12345678DEADBEEF"
@@ -2173,28 +1902,28 @@ ciphertext, result, sign_result = c.encrypt(text, recipients=rkey, sign=True,
 
 with open("secret_plans.txt.asc", "wb") as afile:
     afile.write(ciphertext)
-@end example
+\end{verbatim}
 
-If the @samp{recipients} parameter is empty then the plaintext is encrypted
-symmetrically.  If no @samp{passphrase} is supplied as a parameter or via a
-callback registered with the @samp{Context()} then an out-of-band prompt
+If the \texttt{recipients} parameter is empty then the plaintext is encrypted
+symmetrically.  If no \texttt{passphrase} is supplied as a parameter or via a
+callback registered with the \texttt{Context()} then an out-of-band prompt
 for the passphrase via pinentry will be invoked.
 
-@node Encrypting to multiple keys
-@subsection Encrypting to multiple keys
 
+\subsubsection{Encrypting to multiple keys}
+\label{sec:orgdcf6e47}
 Encrypting to multiple keys essentially just expands upon the key
 selection process and the recipients from the previous examples.
 
-The following example encrypts a message (@samp{text}) to everyone with an
-email address on the @samp{gnupg.org} domain,@footnote{You probably don't really want to do this.  Searching the
+The following example encrypts a message (\texttt{text}) to everyone with an
+email address on the \texttt{gnupg.org} domain,\footnote{You probably don't really want to do this.  Searching the
 keyservers for "gnupg.org" produces over 400 results, the majority of
 which aren't actually at the gnupg.org domain, but just included a
-comment regarding the project in their key somewhere.} but does @emph{not} encrypt
+comment regarding the project in their key somewhere.} but does \emph{not} encrypt
 to a default key or other key which is configured to normally encrypt
 to.
 
-@example
+\begin{verbatim}
 import gpg
 
 text = b"""Oh look, another test message.
@@ -2211,7 +1940,7 @@ format.
 """
 
 c = gpg.Context(armor=True)
-rpattern = list(c.keylist(pattern="@@gnupg.org", secret=False))
+rpattern = list(c.keylist(pattern="@gnupg.org", secret=False))
 logrus = []
 
 for i in range(len(rpattern)):
@@ -2223,36 +1952,36 @@ ciphertext, result, sign_result = c.encrypt(text, recipients=logrus,
 
 with open("secret_plans.txt.asc", "wb") as afile:
     afile.write(ciphertext)
-@end example
+\end{verbatim}
 
 All it would take to change the above example to sign the message
 and also encrypt the message to any configured default keys would
-be to change the @samp{c.encrypt} line to this:
+be to change the \texttt{c.encrypt} line to this:
 
-@example
+\begin{verbatim}
 ciphertext, result, sign_result = c.encrypt(text, recipients=logrus,
                                             always_trust=True,
                                             add_encrypt_to=True)
-@end example
+\end{verbatim}
 
 The only keyword arguments requiring modification are those for which
-the default values are changing.  The default value of @samp{sign} is
-@samp{True}, the default of @samp{always_trust} is @samp{False}, the default of
-@samp{add_encrypt_to} is @samp{False}.
+the default values are changing.  The default value of \texttt{sign} is
+\texttt{True}, the default of \texttt{always\_trust} is \texttt{False}, the default of
+\texttt{add\_encrypt\_to} is \texttt{False}.
 
-If @samp{always_trust} is not set to @samp{True} and any of the recipient keys
+If \texttt{always\_trust} is not set to \texttt{True} and any of the recipient keys
 are not trusted (e.g. not signed or locally signed) then the
 encryption will raise an error.  It is possible to mitigate this
 somewhat with something more like this:
 
-@example
+\begin{verbatim}
 import gpg
 
 with open("secret_plans.txt.asc", "rb") as afile:
     text = afile.read()
 
 c = gpg.Context(armor=True)
-rpattern = list(c.keylist(pattern="@@gnupg.org", secret=False))
+rpattern = list(c.keylist(pattern="@gnupg.org", secret=False))
 logrus = []
 
 for i in range(len(rpattern)):
@@ -2277,24 +2006,24 @@ for i in range(len(rpattern)):
                 afile.write(ciphertext)
         except:
             pass
-@end example
+\end{verbatim}
 
 This will attempt to encrypt to all the keys searched for, then remove
 invalid recipients if it fails and try again.
 
-@node Decryption
-@section Decryption
 
+\subsection{Decryption}
+\label{sec:org1282b3d}
 Decrypting something encrypted to a key in one's secret keyring is
 fairly straight forward.
 
-In this example code, however, preconfiguring either @samp{gpg.Context()}
-or @samp{gpg.core.Context()} as @samp{c} is unnecessary because there is no need
+In this example code, however, preconfiguring either \texttt{gpg.Context()}
+or \texttt{gpg.core.Context()} as \texttt{c} is unnecessary because there is no need
 to modify the Context prior to conducting the decryption and since the
-Context is only used once, setting it to @samp{c} simply adds lines for no
+Context is only used once, setting it to \texttt{c} simply adds lines for no
 gain.
 
-@example
+\begin{verbatim}
 import gpg
 
 ciphertext = input("Enter path and filename of encrypted file: ")
@@ -2309,51 +2038,44 @@ with open(ciphertext, "rb") as cfile:
 
 if plaintext is not None:
     with open(newfile, "wb") as nfile:
-            nfile.write(plaintext)
+           nfile.write(plaintext)
     else:
         pass
-@end example
+\end{verbatim}
 
-The data available in @samp{plaintext} in this example is the decrypted
+The data available in \texttt{plaintext} in this example is the decrypted
 content as a byte object, the recipient key IDs and algorithms in
-@samp{result} and the results of verifying any signatures of the data in
-@samp{verify_result}.
+\texttt{result} and the results of verifying any signatures of the data in
+\texttt{verify\_result}.
 
-If @samp{gpg.Context().decrypt(cfile, verify=False)} is called instead,
-then @samp{verify_result} will be returned as @samp{None} and the rest remains
+If \texttt{gpg.Context().decrypt(cfile, verify=False)} is called instead,
+then \texttt{verify\_result} will be returned as \texttt{None} and the rest remains
 as described here.
 
-@node Signing text and files
-@section Signing text and files
 
+\subsection{Signing text and files}
+\label{sec:org59f1262}
 The following sections demonstrate how to specify keys to sign with.
 
-@menu
-* Signing key selection::
-* Normal or default signing messages or files::
-* Detached signing messages and files::
-* Clearsigning messages or text::
-@end menu
-
-@node Signing key selection
-@subsection Signing key selection
 
+\subsubsection{Signing key selection}
+\label{sec:org909cb3c}
 By default GPGME and the Python bindings will use the default key
 configured for the user invoking the GPGME API.  If there is no
 default key specified and there is more than one secret key available
 it may be necessary to specify the key or keys with which to sign
 messages and files.
 
-@example
+\begin{verbatim}
 import gpg
 
 logrus = input("Enter the email address or string to match signing keys to: ")
 hancock = gpg.Context().keylist(pattern=logrus, secret=True)
 sig_src = list(hancock)
-@end example
+\end{verbatim}
 
 The signing examples in the following sections include the explicitly
-designated @samp{signers} parameter in two of the five examples; once where
+designated \texttt{signers} parameter in two of the five examples; once where
 the resulting signature would be ASCII armoured and once where it
 would not be armoured.
 
@@ -2363,9 +2085,9 @@ match two keys since the patten expects a string, bytes or None and
 not a list.  A string with two fingerprints won't match any single
 key.
 
-@node Normal or default signing messages or files
-@subsection Normal or default signing messages or files
 
+\subsubsection{Normal or default signing messages or files}
+\label{sec:org6ee259d}
 The normal or default signing process is essentially the same as is
 most often invoked when also encrypting a message or file.  So when
 the encryption component is not utilised, the result is to produce an
@@ -2374,7 +2096,7 @@ which may or may not also be compressed.
 
 By default compression will be used unless GnuPG detects that the
 plaintext is already compressed.  ASCII armouring will be determined
-according to the value of @samp{gpg.Context().armor}.
+according to the value of \texttt{gpg.Context().armor}.
 
 The compression algorithm is selected in much the same way as the
 symmetric encryption algorithm or the hash digest algorithm is when
@@ -2382,7 +2104,7 @@ multiple keys are involved; from the preferences saved into the key
 itself or by comparison with the preferences with all other keys
 involved.
 
-@example
+\begin{verbatim}
 import gpg
 
 text0 = """Declaration of ... something.
@@ -2395,14 +2117,14 @@ signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.NORMAL)
 
 with open("/path/to/statement.txt.asc", "w") as afile:
     afile.write(signed_data.decode())
-@end example
+\end{verbatim}
 
 Though everything in this example is accurate, it is more likely that
 reading the input data from another file and writing the result to a
 new file will be performed more like the way it is done in the next
 example.  Even if the output format is ASCII armoured.
 
-@example
+\begin{verbatim}
 import gpg
 
 with open("/path/to/statement.txt", "rb") as tfile:
@@ -2413,16 +2135,16 @@ signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.NORMAL)
 
 with open("/path/to/statement.txt.sig", "wb") as afile:
     afile.write(signed_data)
-@end example
+\end{verbatim}
 
-@node Detached signing messages and files
-@subsection Detached signing messages and files
 
+\subsubsection{Detached signing messages and files}
+\label{sec:org51049d4}
 Detached signatures will often be needed in programmatic uses of
 GPGME, either for signing files (e.g. tarballs of code releases) or as
 a component of message signing (e.g. PGP/MIME encoded email).
 
-@example
+\begin{verbatim}
 import gpg
 
 text0 = """Declaration of ... something.
@@ -2435,12 +2157,12 @@ signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.DETACH)
 
 with open("/path/to/statement.txt.asc", "w") as afile:
     afile.write(signed_data.decode())
-@end example
+\end{verbatim}
 
 As with normal signatures, detached signatures are best handled as
 byte literals, even when the output is ASCII armoured.
 
-@example
+\begin{verbatim}
 import gpg
 
 with open("/path/to/statement.txt", "rb") as tfile:
@@ -2451,16 +2173,16 @@ signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.DETACH)
 
 with open("/path/to/statement.txt.sig", "wb") as afile:
     afile.write(signed_data)
-@end example
+\end{verbatim}
 
-@node Clearsigning messages or text
-@subsection Clearsigning messages or text
 
+\subsubsection{Clearsigning messages or text}
+\label{sec:orgf528a20}
 Though PGP/in-line messages are no longer encouraged in favour of
 PGP/MIME, there is still sometimes value in utilising in-line
 signatures.  This is where clear-signed messages or text is of value.
 
-@example
+\begin{verbatim}
 import gpg
 
 text0 = """Declaration of ... something.
@@ -2473,12 +2195,12 @@ signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.CLEAR)
 
 with open("/path/to/statement.txt.asc", "w") as afile:
     afile.write(signed_data.decode())
-@end example
+\end{verbatim}
 
 In spite of the appearance of a clear-signed message, the data handled
 by GPGME in signing it must still be byte literals.
 
-@example
+\begin{verbatim}
 import gpg
 
 with open("/path/to/statement.txt", "rb") as tfile:
@@ -2489,11 +2211,11 @@ signed_data, result = c.sign(text, mode=gpg.constants.sig.mode.CLEAR)
 
 with open("/path/to/statement.txt.asc", "wb") as afile:
     afile.write(signed_data)
-@end example
+\end{verbatim}
 
-@node Signature verification
-@section Signature verification
 
+\subsection{Signature verification}
+\label{sec:org6cd81af}
 Essentially there are two principal methods of verification of a
 signature.  The first of these is for use with the normal or default
 signing method and for clear-signed messages.  The second is for use
@@ -2502,7 +2224,7 @@ with files and data with detached signatures.
 The following example is intended for use with the default signing
 method where the file was not ASCII armoured:
 
-@example
+\begin{verbatim}
 import gpg
 import time
 
@@ -2522,19 +2244,19 @@ if verified is True:
     for i in range(len(result.signatures)):
         sign = result.signatures[i]
         print("""Good signature from:
-@{0@}
-with key @{1@}
-made at @{2@}
+{0}
+with key {1}
+made at {2}
 """.format(c.get_key(sign.fpr).uids[0].uid, sign.fpr,
            time.ctime(sign.timestamp)))
 else:
     pass
-@end example
+\end{verbatim}
 
 Whereas this next example, which is almost identical would work with
 normal ASCII armoured files and with clear-signed files:
 
-@example
+\begin{verbatim}
 import gpg
 import time
 
@@ -2554,20 +2276,20 @@ if verified is True:
     for i in range(len(result.signatures)):
         sign = result.signatures[i]
         print("""Good signature from:
-@{0@}
-with key @{1@}
-made at @{2@}
+{0}
+with key {1}
+made at {2}
 """.format(c.get_key(sign.fpr).uids[0].uid, sign.fpr,
            time.ctime(sign.timestamp)))
 else:
     pass
-@end example
+\end{verbatim}
 
 In both of the previous examples it is also possible to compare the
-original data that was signed against the signed data in @samp{data} to see
+original data that was signed against the signed data in \texttt{data} to see
 if it matches with something like this:
 
-@example
+\begin{verbatim}
 with open(filename, "rb") as afile:
     text = afile.read()
 
@@ -2575,15 +2297,15 @@ if text == data:
     print("Good signature.")
 else:
     pass
-@end example
+\end{verbatim}
 
 The following two examples, however, deal with detached signatures.
 With his method of verification the data that was signed does not get
 returned since it is already being explicitly referenced in the first
-argument of @samp{c.verify}.  So @samp{data} is @samp{None} and only the information
-in @samp{result} is available.
+argument of \texttt{c.verify}.  So \texttt{data} is \texttt{None} and only the information
+in \texttt{result} is available.
 
-@example
+\begin{verbatim}
 import gpg
 import time
 
@@ -2603,16 +2325,16 @@ if verified is True:
     for i in range(len(result.signatures)):
         sign = result.signatures[i]
         print("""Good signature from:
-@{0@}
-with key @{1@}
-made at @{2@}
+{0}
+with key {1}
+made at {2}
 """.format(c.get_key(sign.fpr).uids[0].uid, sign.fpr,
            time.ctime(sign.timestamp)))
 else:
     pass
-@end example
+\end{verbatim}
 
-@example
+\begin{verbatim}
 import gpg
 import time
 
@@ -2632,18 +2354,18 @@ if verified is True:
     for i in range(len(result.signatures)):
         sign = result.signatures[i]
         print("""Good signature from:
-@{0@}
-with key @{1@}
-made at @{2@}
+{0}
+with key {1}
+made at {2}
 """.format(c.get_key(sign.fpr).uids[0].uid, sign.fpr,
            time.ctime(sign.timestamp)))
 else:
     pass
-@end example
+\end{verbatim}
 
-@node Creating keys and subkeys
-@chapter Creating keys and subkeys
 
+\section{Creating keys and subkeys}
+\label{sec:org754c6df}
 The one thing, aside from GnuPG itself, that GPGME depends on, of
 course, is the keys themselves.  So it is necessary to be able to
 generate them and modify them by adding subkeys, revoking or disabling
@@ -2651,13 +2373,13 @@ them, sometimes deleting them and doing the same for user IDs.
 
 In the following examples a key will be created for the world's
 greatest secret agent, Danger Mouse.  Since Danger Mouse is a secret
-agent he needs to be able to protect information to @samp{SECRET} level
+agent he needs to be able to protect information to \texttt{SECRET} level
 clearance, so his keys will be 3072-bit keys.
 
-The pre-configured @samp{gpg.conf} file which sets cipher, digest and other
+The pre-configured \texttt{gpg.conf} file which sets cipher, digest and other
 preferences contains the following configuration parameters:
 
-@example
+\begin{verbatim}
 expert
 allow-freeform-uid
 allow-secret-key-import
@@ -2670,118 +2392,111 @@ default-preference-list TWOFISH CAMELLIA256 AES256 CAMELLIA192 AES192 CAMELLIA12
 personal-cipher-preferences TWOFISH CAMELLIA256 AES256 CAMELLIA192 AES192 CAMELLIA128 AES BLOWFISH IDEA CAST5 3DES
 personal-digest-preferences SHA512 SHA384 SHA256 SHA224 RIPEMD160 SHA1
 personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed
-@end example
-
-@menu
-* Primary key::
-* Subkeys::
-* User IDs::
-* Key certification::
-@end menu
+\end{verbatim}
 
-@node Primary key
-@section Primary key
 
-Generating a primary key uses the @samp{create_key} method in a Context.
+\subsection{Primary key}
+\label{sec:org0185c23}
+Generating a primary key uses the \texttt{create\_key} method in a Context.
 It contains multiple arguments and keyword arguments, including:
-@samp{userid}, @samp{algorithm}, @samp{expires_in}, @samp{expires}, @samp{sign}, @samp{encrypt},
-@samp{certify}, @samp{authenticate}, @samp{passphrase} and @samp{force}.  The defaults for
-all of those except @samp{userid}, @samp{algorithm}, @samp{expires_in}, @samp{expires} and
-@samp{passphrase} is @samp{False}.  The defaults for @samp{algorithm} and
-@samp{passphrase} is @samp{None}.  The default for @samp{expires_in} is @samp{0}.  The
-default for @samp{expires} is @samp{True}.  There is no default for @samp{userid}.
-
-If @samp{passphrase} is left as @samp{None} then the key will not be generated
-with a passphrase, if @samp{passphrase} is set to a string then that will
-be the passphrase and if @samp{passphrase} is set to @samp{True} then gpg-agent
+\texttt{userid}, \texttt{algorithm}, \texttt{expires\_in}, \texttt{expires}, \texttt{sign}, \texttt{encrypt},
+\texttt{certify}, \texttt{authenticate}, \texttt{passphrase} and \texttt{force}.  The defaults for
+all of those except \texttt{userid}, \texttt{algorithm}, \texttt{expires\_in}, \texttt{expires} and
+\texttt{passphrase} is \texttt{False}.  The defaults for \texttt{algorithm} and
+\texttt{passphrase} is \texttt{None}.  The default for \texttt{expires\_in} is \texttt{0}.  The
+default for \texttt{expires} is \texttt{True}.  There is no default for \texttt{userid}.
+
+If \texttt{passphrase} is left as \texttt{None} then the key will not be generated
+with a passphrase, if \texttt{passphrase} is set to a string then that will
+be the passphrase and if \texttt{passphrase} is set to \texttt{True} then gpg-agent
 will launch pinentry to prompt for a passphrase.  For the sake of
-convenience, these examples will keep @samp{passphrase} set to @samp{None}.
+convenience, these examples will keep \texttt{passphrase} set to \texttt{None}.
 
-@example
+\begin{verbatim}
 import gpg
 
 c = gpg.Context()
 
 c.home_dir = "~/.gnupg-dm"
-userid = "Danger Mouse <dm@@secret.example.net>"
+userid = "Danger Mouse <dm@secret.example.net>"
 
 dmkey = c.create_key(userid, algorithm="rsa3072", expires_in=31536000,
                      sign=True, certify=True)
-@end example
+\end{verbatim}
 
-One thing to note here is the use of setting the @samp{c.home_dir}
+One thing to note here is the use of setting the \texttt{c.home\_dir}
 parameter.  This enables generating the key or keys in a different
 location.  In this case to keep the new key data created for this
 example in a separate location rather than adding it to existing and
-active key store data.  As with the default directory, @samp{~/.gnupg}, any
+active key store data.  As with the default directory, \texttt{\textasciitilde{}/.gnupg}, any
 temporary or separate directory needs the permissions set to only
 permit access by the directory owner.  On posix systems this means
 setting the directory permissions to 700.
 
-The @samp{temp-homedir-config.py} script in the HOWTO examples directory
+The \texttt{temp-homedir-config.py} script in the HOWTO examples directory
 will create an alternative homedir with these configuration options
 already set and the correct directory and file permissions.
 
 The successful generation of the key can be confirmed via the returned
-@samp{GenkeyResult} object, which includes the following data:
+\texttt{GenkeyResult} object, which includes the following data:
 
-@example
+\begin{verbatim}
 print("""
- Fingerprint:  @{0@}
- Primary Key:  @{1@}
-  Public Key:  @{2@}
-  Secret Key:  @{3@}
- Sub Key:  @{4@}
-User IDs:  @{5@}
+ Fingerprint:  {0}
+ Primary Key:  {1}
+  Public Key:  {2}
+  Secret Key:  {3}
+ Sub Key:  {4}
+User IDs:  {5}
 """.format(dmkey.fpr, dmkey.primary, dmkey.pubkey, dmkey.seckey, dmkey.sub,
            dmkey.uid))
-@end example
+\end{verbatim}
 
 Alternatively the information can be confirmed using the command line
 program:
 
-@example
+\begin{verbatim}
 bash-4.4$ gpg --homedir ~/.gnupg-dm -K
 ~/.gnupg-dm/pubring.kbx
 ----------------------
 sec   rsa3072 2018-03-15 [SC] [expires: 2019-03-15]
       177B7C25DB99745EE2EE13ED026D2F19E99E63AA
-uid           [ultimate] Danger Mouse <dm@@secret.example.net>
+uid           [ultimate] Danger Mouse <dm@secret.example.net>
 
 bash-4.4$
-@end example
+\end{verbatim}
 
 As with generating keys manually, to preconfigure expanded preferences
-for the cipher, digest and compression algorithms, the @samp{gpg.conf} file
+for the cipher, digest and compression algorithms, the \texttt{gpg.conf} file
 must contain those details in the home directory in which the new key
-is being generated.  I used a cut down version of my own @samp{gpg.conf}
+is being generated.  I used a cut down version of my own \texttt{gpg.conf}
 file in order to be able to generate this:
 
-@example
+\begin{verbatim}
 bash-4.4$ gpg --homedir ~/.gnupg-dm --edit-key 177B7C25DB99745EE2EE13ED026D2F19E99E63AA showpref quit
 Secret key is available.
 
 sec  rsa3072/026D2F19E99E63AA
      created: 2018-03-15  expires: 2019-03-15  usage: SC
      trust: ultimate      validity: ultimate
-[ultimate] (1). Danger Mouse <dm@@secret.example.net>
+[ultimate] (1). Danger Mouse <dm@secret.example.net>
 
-[ultimate] (1). Danger Mouse <dm@@secret.example.net>
+[ultimate] (1). Danger Mouse <dm@secret.example.net>
      Cipher: TWOFISH, CAMELLIA256, AES256, CAMELLIA192, AES192, CAMELLIA128, AES, BLOWFISH, IDEA, CAST5, 3DES
      Digest: SHA512, SHA384, SHA256, SHA224, RIPEMD160, SHA1
      Compression: ZLIB, BZIP2, ZIP, Uncompressed
      Features: MDC, Keyserver no-modify
 
 bash-4.4$
-@end example
+\end{verbatim}
 
-@node Subkeys
-@section Subkeys
 
+\subsection{Subkeys}
+\label{sec:org5e2acbc}
 Adding subkeys to a primary key is fairly similar to creating the
-primary key with the @samp{create_subkey} method.  Most of the arguments
-are the same, but not quite all.  Instead of the @samp{userid} argument
-there is now a @samp{key} argument for selecting which primary key to add
+primary key with the \texttt{create\_subkey} method.  Most of the arguments
+are the same, but not quite all.  Instead of the \texttt{userid} argument
+there is now a \texttt{key} argument for selecting which primary key to add
 the subkey to.
 
 In the following example an encryption subkey will be added to the
@@ -2789,7 +2504,7 @@ primary key.  Since Danger Mouse is a security conscious secret agent,
 this subkey will only be valid for about six months, half the length
 of the primary key.
 
-@example
+\begin{verbatim}
 import gpg
 
 c = gpg.Context()
@@ -2798,53 +2513,47 @@ c.home_dir = "~/.gnupg-dm"
 key = c.get_key(dmkey.fpr, secret=True)
 dmsub = c.create_subkey(key, algorithm="rsa3072", expires_in=15768000,
                         encrypt=True)
-@end example
+\end{verbatim}
 
 As with the primary key, the results here can be checked with:
 
-@example
+\begin{verbatim}
 print("""
- Fingerprint:  @{0@}
- Primary Key:  @{1@}
-  Public Key:  @{2@}
-  Secret Key:  @{3@}
- Sub Key:  @{4@}
-User IDs:  @{5@}
+ Fingerprint:  {0}
+ Primary Key:  {1}
+  Public Key:  {2}
+  Secret Key:  {3}
+ Sub Key:  {4}
+User IDs:  {5}
 """.format(dmsub.fpr, dmsub.primary, dmsub.pubkey, dmsub.seckey, dmsub.sub,
            dmsub.uid))
-@end example
+\end{verbatim}
 
 As well as on the command line with:
 
-@example
+\begin{verbatim}
 bash-4.4$ gpg --homedir ~/.gnupg-dm -K
 ~/.gnupg-dm/pubring.kbx
 ----------------------
 sec   rsa3072 2018-03-15 [SC] [expires: 2019-03-15]
       177B7C25DB99745EE2EE13ED026D2F19E99E63AA
-uid           [ultimate] Danger Mouse <dm@@secret.example.net>
+uid           [ultimate] Danger Mouse <dm@secret.example.net>
 ssb   rsa3072 2018-03-15 [E] [expires: 2018-09-13]
 
 bash-4.4$
-@end example
-
-@node User IDs
-@section User IDs
+\end{verbatim}
 
-@menu
-* Adding User IDs::
-* Revoking User IDs::
-@end menu
-
-@node Adding User IDs
-@subsection Adding User IDs
 
+\subsection{User IDs}
+\label{sec:org4869c58}
+\subsubsection{Adding User IDs}
+\label{sec:orgebb13ca}
 By comparison to creating primary keys and subkeys, adding a new user
 ID to an existing key is much simpler.  The method used to do this is
-@samp{key_add_uid} and the only arguments it takes are for the @samp{key} and
-the new @samp{uid}.
+\texttt{key\_add\_uid} and the only arguments it takes are for the \texttt{key} and
+the new \texttt{uid}.
 
-@example
+\begin{verbatim}
 import gpg
 
 c = gpg.Context()
@@ -2852,33 +2561,33 @@ c.home_dir = "~/.gnupg-dm"
 
 dmfpr = "177B7C25DB99745EE2EE13ED026D2F19E99E63AA"
 key = c.get_key(dmfpr, secret=True)
-uid = "Danger Mouse <danger.mouse@@secret.example.net>"
+uid = "Danger Mouse <danger.mouse@secret.example.net>"
 
 c.key_add_uid(key, uid)
-@end example
+\end{verbatim}
 
 Unsurprisingly the result of this is:
 
-@example
+\begin{verbatim}
 bash-4.4$ gpg --homedir ~/.gnupg-dm -K
 ~/.gnupg-dm/pubring.kbx
 ----------------------
 sec   rsa3072 2018-03-15 [SC] [expires: 2019-03-15]
       177B7C25DB99745EE2EE13ED026D2F19E99E63AA
-uid           [ultimate] Danger Mouse <danger.mouse@@secret.example.net>
-uid           [ultimate] Danger Mouse <dm@@secret.example.net>
+uid           [ultimate] Danger Mouse <danger.mouse@secret.example.net>
+uid           [ultimate] Danger Mouse <dm@secret.example.net>
 ssb   rsa3072 2018-03-15 [E] [expires: 2018-09-13]
 
 bash-4.4$
-@end example
+\end{verbatim}
 
-@node Revoking User IDs
-@subsection Revoking User IDs
 
+\subsubsection{Revoking User IDs}
+\label{sec:org1683695}
 Revoking a user ID is a fairly similar process, except that it uses
-the @samp{key_revoke_uid} method.
+the \texttt{key\_revoke\_uid} method.
 
-@example
+\begin{verbatim}
 import gpg
 
 c = gpg.Context()
@@ -2886,28 +2595,28 @@ c.home_dir = "~/.gnupg-dm"
 
 dmfpr = "177B7C25DB99745EE2EE13ED026D2F19E99E63AA"
 key = c.get_key(dmfpr, secret=True)
-uid = "Danger Mouse <danger.mouse@@secret.example.net>"
+uid = "Danger Mouse <danger.mouse@secret.example.net>"
 
 c.key_revoke_uid(key, uid)
-@end example
+\end{verbatim}
 
-@node Key certification
-@section Key certification
 
+\subsection{Key certification}
+\label{sec:orgf431bf8}
 Since key certification is more frequently referred to as key signing,
-the method used to perform this function is @samp{key_sign}.
+the method used to perform this function is \texttt{key\_sign}.
 
-The @samp{key_sign} method takes four arguments: @samp{key}, @samp{uids},
-@samp{expires_in} and @samp{local}.  The default value of @samp{uids} is @samp{None} and
+The \texttt{key\_sign} method takes four arguments: \texttt{key}, \texttt{uids},
+\texttt{expires\_in} and \texttt{local}.  The default value of \texttt{uids} is \texttt{None} and
 which results in all user IDs being selected.  The default value of
-both @samp{expires_in} and @samp{local} is @samp{False}; which results in the
+both \texttt{expires\_in} and \texttt{local} is \texttt{False}; which results in the
 signature never expiring and being able to be exported.
 
-The @samp{key} is the key being signed rather than the key doing the
+The \texttt{key} is the key being signed rather than the key doing the
 signing.  To change the key doing the signing refer to the signing key
 selection above for signing messages and files.
 
-If the @samp{uids} value is not @samp{None} then it must either be a string to
+If the \texttt{uids} value is not \texttt{None} then it must either be a string to
 match a single user ID or a list of strings to match multiple user
 IDs.  In this case the matching of those strings must be precise and
 it is case sensitive.
@@ -2915,25 +2624,21 @@ it is case sensitive.
 To sign Danger Mouse's key for just the initial user ID with a
 signature which will last a little over a month, do this:
 
-@example
+\begin{verbatim}
 import gpg
 
 c = gpg.Context()
-uid = "Danger Mouse <dm@@secret.example.net>"
+uid = "Danger Mouse <dm@secret.example.net>"
 
 dmfpr = "177B7C25DB99745EE2EE13ED026D2F19E99E63AA"
 key = c.get_key(dmfpr, secret=True)
 c.key_sign(key, uids=uid, expires_in=2764800)
-@end example
-
-@menu
-* Verifying key certifications::
-@end menu
+\end{verbatim}
 
-@node Verifying key certifications
-@subsection Verifying key certifications
 
-@example
+\subsubsection{Verifying key certifications}
+\label{sec:org87abdd3}
+\begin{verbatim}
 import gpg
 import time
 
@@ -2944,16 +2649,16 @@ key = keys[0]
 
 for user in key.uids:
     for sig in user.signatures:
-        print("0x@{0@}".format(sig.keyid), "", time.ctime(sig.timestamp), "",
+        print("0x{0}".format(sig.keyid), "", time.ctime(sig.timestamp), "",
               sig.uid)
-@end example
+\end{verbatim}
 
 Which for Danger Mouse displays the following:
 
-@example
-0x92E3F6115435C65A  Thu Mar 15 13:17:44 2018  Danger Mouse <dm@@secret.example.net>
-0x321E4E2373590E5D  Mon Nov 26 12:46:05 2018  Ben McGinnes <ben@@adversary.org>
-@end example
+\begin{verbatim}
+0x92E3F6115435C65A  Thu Mar 15 13:17:44 2018  Danger Mouse <dm@secret.example.net>
+0x321E4E2373590E5D  Mon Nov 26 12:46:05 2018  Ben McGinnes <ben@adversary.org>
+\end{verbatim}
 
 The two key signatures listed are for the self-certification of Danger
 Mouse's key made when the key was created in March, 2018; and the
@@ -2962,7 +2667,7 @@ of the year.  Note that the second signature was made with the
 following code (including the preceding code to display the output of
 the certifications or key signatures):
 
-@example
+\begin{verbatim}
 import gpg
 import math
 import pendulum
@@ -2972,7 +2677,7 @@ hd = "/home/dm/.gnupg"
 c = gpg.Context()
 d = gpg.Context(home_dir=hd)
 dmfpr = "177B7C25DB99745EE2EE13ED026D2F19E99E63AA"
-dmuid = "Danger Mouse <dm@@secret.example.net>"
+dmuid = "Danger Mouse <dm@secret.example.net>"
 dkeys = list(c.keylist(pattern=dmuid))
 dmkey = dkeys[0]
 
@@ -2989,12 +2694,12 @@ key = keys[0]
 
 for user in key.uids:
     for sig in user.signatures:
-        print("0x@{0@}".format(sig.keyid), "", time.ctime(sig.timestamp), "",
+        print("0x{0}".format(sig.keyid), "", time.ctime(sig.timestamp), "",
               sig.uid)
-@end example
+\end{verbatim}
 
 Note that this final code block includes the use of a module which is
-@emph{not} part of Python's standard library, the @uref{https://pendulum.eustace.io/, pendulum module}.  Unlike
+\emph{not} part of Python's standard library, the \href{https://pendulum.eustace.io/}{pendulum module}.  Unlike
 the standard datetime module, pendulum makes working with dates and
 times significantly easier in Python; just as the requests module
 makes working with HTTP and HTTPS easier than the builtin modules do.
@@ -3003,57 +2708,52 @@ Though neither requests nor pendulum are required modules for using
 the GPGME Python bindings, they are both highly recommended more
 generally.
 
-@node Advanced or Experimental Use Cases
-@chapter Advanced or Experimental Use Cases
-
-@menu
-* C plus Python plus SWIG plus Cython::
-@end menu
-
-@node C plus Python plus SWIG plus Cython
-@section C plus Python plus SWIG plus Cython
 
+\section{Advanced or Experimental Use Cases}
+\label{sec:org944cc00}
+\subsection{C plus Python plus SWIG plus Cython}
+\label{sec:org3b53926}
 In spite of the apparent incongruence of using Python bindings to a C
 interface only to generate more C from the Python; it is in fact quite
-possible to use the GPGME bindings with @uref{http://docs.cython.org/en/latest/index.html, Cython}.  Though in many cases
+possible to use the GPGME bindings with \href{http://docs.cython.org/en/latest/index.html}{Cython}.  Though in many cases
 the benefits may not be obvious since the most computationally
 intensive work never leaves the level of the C code with which GPGME
 itself is interacting with.
 
 Nevertheless, there are some situations where the benefits are
 demonstrable.  One of the better and easier examples being the one of
-the early examples in this HOWTO, the @ref{Counting keys, , key counting} code.  Running that
-example as an executable Python script, @samp{keycount.py} (available in
-the @samp{examples/howto/} directory), will take a noticeable amount of time
+the early examples in this HOWTO, the \hyperref[sec:org63a3d62]{key counting} code.  Running that
+example as an executable Python script, \texttt{keycount.py} (available in
+the \texttt{examples/howto/} directory), will take a noticeable amount of time
 to run on most systems where the public keybox or keyring contains a
 few thousand public keys.
 
 Earlier in the evening, prior to starting this section, I ran that
 script on my laptop; as I tend to do periodically and timed it using
-@samp{time} utility, with the following results:
+\texttt{time} utility, with the following results:
 
-@example
+\begin{verbatim}
 bash-4.4$ time keycount.py
 
 Number of secret keys:  23
 Number of public keys:  12112
 
 
-real        11m52.945s
-user        0m0.913s
-sys        0m0.752s
+real   11m52.945s
+user   0m0.913s
+sys    0m0.752s
 
 bash-4.4$
-@end example
+\end{verbatim}
 
 Sometime after that I imported another key and followed it with a
 little test of Cython.  This test was kept fairly basic, essentially
-lifting the material from the @uref{http://docs.cython.org/en/latest/src/tutorial/cython_tutorial.html, Cython Basic Tutorial} to demonstrate
+lifting the material from the \href{http://docs.cython.org/en/latest/src/tutorial/cython\_tutorial.html}{Cython Basic Tutorial} to demonstrate
 compiling Python code to C.  The first step was to take the example
 key counting code quoted previously, essentially from the importing of
-the @samp{gpg} module to the end of the script:
+the \texttt{gpg} module to the end of the script:
 
-@example
+\begin{verbatim}
 import gpg
 
 c = gpg.Context()
@@ -3067,82 +2767,76 @@ publist = list(pubkeys)
 pubnum = len(publist)
 
 print("""
-    Number of secret keys:  @{0@}
-    Number of public keys:  @{1@}
+    Number of secret keys:  {0}
+    Number of public keys:  {1}
 
 """.format(secnum, pubnum))
-@end example
+\end{verbatim}
 
-Save that into a file called @samp{keycount.pyx} and then create a
-@samp{setup.py} file which contains this:
+Save that into a file called \texttt{keycount.pyx} and then create a
+\texttt{setup.py} file which contains this:
 
-@example
+\begin{verbatim}
 from distutils.core import setup
 from Cython.Build import cythonize
 
 setup(
     ext_modules = cythonize("keycount.pyx")
 )
-@end example
+\end{verbatim}
 
 Compile it:
 
-@example
+\begin{verbatim}
 bash-4.4$ python setup.py build_ext --inplace
 bash-4.4$
-@end example
+\end{verbatim}
 
-Then run it in a similar manner to @samp{keycount.py}:
+Then run it in a similar manner to \texttt{keycount.py}:
 
-@example
+\begin{verbatim}
 bash-4.4$ time python3.7 -c "import keycount"
 
 Number of secret keys:  23
 Number of public keys:  12113
 
 
-real        6m47.905s
-user        0m0.785s
-sys        0m0.331s
+real   6m47.905s
+user   0m0.785s
+sys    0m0.331s
 
 bash-4.4$
-@end example
+\end{verbatim}
 
-Cython turned @samp{keycount.pyx} into an 81KB @samp{keycount.o} file in the
-@samp{build/} directory, a 24KB @samp{keycount.cpython-37m-darwin.so} file to be
-imported into Python 3.7 and a 113KB @samp{keycount.c} generated C source
+Cython turned \texttt{keycount.pyx} into an 81KB \texttt{keycount.o} file in the
+\texttt{build/} directory, a 24KB \texttt{keycount.cpython-37m-darwin.so} file to be
+imported into Python 3.7 and a 113KB \texttt{keycount.c} generated C source
 code file of nearly three thousand lines.  Quite a bit bigger than the
-314 bytes of the @samp{keycount.pyx} file or the full 1,452 bytes of the
-full executable @samp{keycount.py} example script.
+314 bytes of the \texttt{keycount.pyx} file or the full 1,452 bytes of the
+full executable \texttt{keycount.py} example script.
 
 On the other hand it ran in nearly half the time; taking 6 minutes and
 47.905 seconds to run.  As opposed to the 11 minutes and 52.945 seconds
 which the CPython script alone took.
 
-The @samp{keycount.pyx} and @samp{setup.py} files used to generate this example
-have been added to the @samp{examples/howto/advanced/cython/} directory
+The \texttt{keycount.pyx} and \texttt{setup.py} files used to generate this example
+have been added to the \texttt{examples/howto/advanced/cython/} directory
 The example versions include some additional options to annotate the
 existing code and to detect Cython's use.  The latter comes from the
-@uref{http://docs.cython.org/en/latest/src/tutorial/pure.html#magic-attributes-within-the-pxd, Magic Attributes} section of the Cython documentation.
+\href{http://docs.cython.org/en/latest/src/tutorial/pure.html\#magic-attributes-within-the-pxd}{Magic Attributes} section of the Cython documentation.
 
-@node Miscellaneous extras and work-arounds
-@chapter Miscellaneous extras and work-arounds
 
+\section{Miscellaneous extras and work-arounds}
+\label{sec:orgd72f7de}
 Most of the things in the following sections are here simply because
 there was no better place to put them, even though some are only
 peripherally related to the GPGME Python bindings.  Some are also
 workarounds for functions not integrated with GPGME as yet.  This is
-especially true of the first of these, dealing with @ref{Group lines, , group lines}.
-
-@menu
-* Group lines::
-* Keyserver access for Python::
-* GPGME version checking::
-@end menu
+especially true of the first of these, dealing with \hyperref[sec:org83f4d00]{group lines}.
 
-@node Group lines
-@section Group lines
 
+\subsection{Group lines}
+\label{sec:org83f4d00}
 There is not yet an easy way to access groups configured in the
 gpg.conf file from within GPGME.  As a consequence these central
 groupings of keys cannot be shared amongst multiple programs, such as
@@ -3151,7 +2845,7 @@ MUAs readily.
 The following code, however, provides a work-around for obtaining this
 information in Python.
 
-@example
+\begin{verbatim}
 import subprocess
 import sys
 
@@ -3177,97 +2871,93 @@ groups = line.split(":")[-1].replace('"', '').split(',')
 group_lines = []
 group_lists = []
 
-for group in groups:
-    group_lines.append(group.split("="))
-    group_lists.append(group.split("="))
+for i in range(len(groups)):
+    group_lines.append(groups[i].split("="))
+    group_lists.append(groups[i].split("="))
 
-for glist in group_lists:
-    glist[1] = glist[1].split()
-@end example
+for i in range(len(group_lists)):
+    group_lists[i][1] = group_lists[i][1].split()
+\end{verbatim}
 
-The result of that code is that @samp{group_lines} is a list of lists where
-@samp{group_lines[i][0]} is the name of the group and @samp{group_lines[i][1]}
+The result of that code is that \texttt{group\_lines} is a list of lists where
+\texttt{group\_lines[i][0]} is the name of the group and \texttt{group\_lines[i][1]}
 is the key IDs of the group as a string.
 
-The @samp{group_lists} result is very similar in that it is a list of
-lists.  The first part, @samp{group_lists[i][0]} matches
-@samp{group_lines[i][0]} as the name of the group, but @samp{group_lists[i][1]}
+The \texttt{group\_lists} result is very similar in that it is a list of
+lists.  The first part, \texttt{group\_lists[i][0]} matches
+\texttt{group\_lines[i][0]} as the name of the group, but \texttt{group\_lists[i][1]}
 is the key IDs of the group as a list.
 
-A demonstration of using the @samp{groups.py} module is also available in
-the form of the executable @samp{mutt-groups.py} script.  This second
-script reads all the group entries in a user's @samp{gpg.conf} file and
+A demonstration of using the \texttt{groups.py} module is also available in
+the form of the executable \texttt{mutt-groups.py} script.  This second
+script reads all the group entries in a user's \texttt{gpg.conf} file and
 converts them into crypt-hooks suitable for use with the Mutt and
 Neomutt mail clients.
 
-@node Keyserver access for Python
-@section Keyserver access for Python
 
-The @uref{https://github.com/Selfnet/hkp4py, hkp4py} module by Marcel Fest was originally a port of the old
-@uref{https://github.com/dgladkov/python-hkp, python-hkp} module from Python 2 to Python 3 and updated to use the
-@uref{http://docs.python-requests.org/en/latest/index.html, requests} module instead.  It has since been modified to provide
+\subsection{Keyserver access for Python}
+\label{sec:org5ad99aa}
+The \href{https://github.com/Selfnet/hkp4py}{hkp4py} module by Marcel Fest was originally a port of the old
+\href{https://github.com/dgladkov/python-hkp}{python-hkp} module from Python 2 to Python 3 and updated to use the
+\href{http://docs.python-requests.org/en/latest/index.html}{requests} module instead.  It has since been modified to provide
 support for Python 2.7 as well and is available via PyPI.
 
-Since it rewrites the @samp{hkp} protocol prefix as @samp{http} and @samp{hkps} as
-@samp{https}, the module is able to be used even with servers which do not
-support the full scope of keyserver functions.@footnote{Such as with ProtonMail servers.  This also means that
+Since it rewrites the \texttt{hkp} protocol prefix as \texttt{http} and \texttt{hkps} as
+\texttt{https}, the module is able to be used even with servers which do not
+support the full scope of keyserver functions.\footnote{Such as with ProtonMail servers.  This also means that
 restricted servers which only advertise either HTTP or HTTPS end
 points and not HKP or HKPS end points must still be identified as as
-HKP or HKPS within the Python Code.  The @samp{hkp4py} module will rewrite
+HKP or HKPS within the Python Code.  The \texttt{hkp4py} module will rewrite
 these appropriately when the connection is made to the server.}  It also works quite
-readily when incorporated into a @ref{C plus Python plus SWIG plus Cython, , Cython} generated and compiled version
+readily when incorporated into a \hyperref[sec:org3b53926]{Cython} generated and compiled version
 of any code.
 
-@menu
-* Key import format::
-@end menu
-
-@node Key import format
-@subsection Key import format
 
+\subsubsection{Key import format}
+\label{sec:org1e47c97}
 The hkp4py module returns key data via requests as string literals
-(@samp{r.text}) instead of byte literals (@samp{r.content}).  This means that
+(\texttt{r.text}) instead of byte literals (\texttt{r.content}).  This means that
 the retrurned key data must be encoded to UTF-8 when importing that
-key material using a @samp{gpg.Context().key_import()} method.
+key material using a \texttt{gpg.Context().key\_import()} method.
 
-For this reason an alternative method has been added to the @samp{search}
-function of @samp{hkp4py.KeyServer()} which returns the key in the correct
-format as expected by @samp{key_import}.  When importing using this module,
+For this reason an alternative method has been added to the \texttt{search}
+function of \texttt{hkp4py.KeyServer()} which returns the key in the correct
+format as expected by \texttt{key\_import}.  When importing using this module,
 it is now possible to import with this:
 
-@example
+\begin{verbatim}
 for key in keys:
     if key.revoked is False:
         gpg.Context().key_import(key.key_blob)
     else:
         pass
-@end example
+\end{verbatim}
 
 Without that recent addition it would have been necessary to encode
-the contents of each @samp{hkp4py.KeyServer().search()[i].key} in
-@samp{hkp4py.KeyServer().search()} before trying to import it.
+the contents of each \texttt{hkp4py.KeyServer().search()[i].key} in
+\texttt{hkp4py.KeyServer().search()} before trying to import it.
 
-An example of this is included in the @ref{Importing keys, , Importing Keys} section of this
+An example of this is included in the \hyperref[sec:org1ad598a]{Importing Keys} section of this
 HOWTO and the corresponding executable version of that example is
-available in the @samp{lang/python/examples/howto} directory as normal; the
-executable version is the @samp{import-keys-hkp.py} file.
+available in the \texttt{lang/python/examples/howto} directory as normal; the
+executable version is the \texttt{import-keys-hkp.py} file.
 
-@node GPGME version checking
-@section GPGME version checking
 
+\subsection{GPGME version checking}
+\label{sec:org18b8ef8}
 For various reasons it may be necessary to check which version of
 GPGME the bindings have been built against; including whether a
 minimum required version of GPGME is in use.
 
-For the most part the @samp{gpg.version.versionstr} and
-@samp{gpg.version.versionlist} methods have been quite sufficient.  The
-former returns the same string as @samp{gpgme-config --version}, while the
+For the most part the \texttt{gpg.version.versionstr} and
+\texttt{gpg.version.versionlist} methods have been quite sufficient.  The
+former returns the same string as \texttt{gpgme-config -{}-version}, while the
 latter returns the major, minor and patch values in a list.
 
 To check if the installed bindings have actually been built against
 the current installed libgpgme version, this check can be performed:
 
-@example
+\begin{verbatim}
 import gpg
 import subprocess
 import sys
@@ -3291,18 +2981,18 @@ if gpgme_version is not None:
         print("The GPGME Python bindings do NOT match libgpgme.")
 else:
     print("Upgrade Python and reinstall the GPGME Python bindings.")
-@end example
+\end{verbatim}
 
 For many developers, however, the preferred checking means checking
 for a minimum version or point release.  This is now readily available
-via the @samp{gpg.version.versionintlist} method (added in version
-@samp{1.12.1-beta79}).  It is also now possible to easily check whether the
+via the \texttt{gpg.version.versionintlist} method (added in version
+\texttt{1.12.1-beta79}).  It is also now possible to easily check whether the
 installed GPGME Python bindings were built from a development or beta
 branch of the GPGME source code.
 
 The following code demonstrates how both of those methods may be used:
 
-@example
+\begin{verbatim}
 import gpg
 
 try:
@@ -3332,133 +3022,71 @@ try:
         pass
 except Exception as e:
     print(e)
-@end example
+\end{verbatim}
 
-The points where @samp{pass} is used in the above example will most likely
-also produce an @samp{Exception} error since those results should only
-occur in versions which do not have the @samp{gpgme.version.is_beta} and
-@samp{gpgme.version.versionintlist} methods available.
+The points where \texttt{pass} is used in the above example will most likely
+also produce an \texttt{Exception} error since those results should only
+occur in versions which do not have the \texttt{gpgme.version.is\_beta} and
+\texttt{gpgme.version.versionintlist} methods available.
 
-@node Copyright and Licensing
-@chapter Copyright and Licensing
-
-@menu
-* Copyright::
-* Draft Editions of this HOWTO::
-* License GPL compatible::
-@end menu
-
-@node Copyright
-@section Copyright
 
+\section{Copyright and Licensing}
+\label{sec:org9d52a23}
+\subsection{Copyright}
+\label{sec:org26ed04d}
 Copyright © The GnuPG Project, 2018.
 
-@node Draft Editions of this HOWTO
-@section Draft Editions of this HOWTO
+Copyright (C) The GnuPG Project, 2018.
+
 
+\subsection{Draft Editions of this HOWTO}
+\label{sec:org080a94a}
 Draft editions of this HOWTO may be periodically available directly
 from the author at any of the following URLs:
 
-@itemize
-@item
-@uref{https://files.au.adversary.org/crypto/gpgme-python-howto.html, GPGME Python Bindings HOWTO draft (HTML single file, AWS S3 SSL)}
-@item
-@uref{http://files.au.adversary.org/crypto/gpgme-python-howto.html, GPGME Python Bindings HOWTO draft (HTML single file, AWS S3 no SSL)}
-@item
-@uref{https://files.au.adversary.org/crypto/gpgme-python-howto-split/index.html, GPGME Python Bindings HOWTO draft (HTML multiple files, AWS S3 SSL)}
-@item
-@uref{http://files.au.adversary.org/crypto/gpgme-python-howto/index.html, GPGME Python Bindings HOWTO draft (HTML multiple files, AWS S3 no SSL)}
-@end itemize
-
-These draft versions have been generated from this document via GNU
-Emacs @uref{https://orgmode.org/, Org mode} to @samp{.texi} and @uref{https://www.gnu.org/software/texinfo/, GNU Texinfo} to HTML.  Though it is
-likely that the specific @uref{https://files.au.adversary.org/crypto/gpgme-python-howto, file} @uref{http://files.au.adversary.org/crypto/gpgme-python-howto.org, version} used will be on the same server
-with the generated output formats.  Occasionally I may include the Org
-mode generated XHTML versions:
-
-@itemize
-@item
-@uref{https://files.au.adversary.org/crypto/gpgme-python-howto.xhtml, GPGME Python Bindings HOWTO draft (HTML single file, AWS S3 SSL)}
-@item
-@uref{http://files.au.adversary.org/crypto/gpgme-python-howto.xhtml, GPGME Python Bindings HOWTO draft (HTML single file, AWS S3 no SSL)}
-@end itemize
-
-That XHTML version, however, is exported in a way which inherits a
-colour scheme from @uref{https://github.com/holomorph/emacs-zenburn, the author's Emacs theme} (which is a higher contrast
-version of @uref{http://kippura.org/zenburnpage/, Zenburn} ported by @uref{https://github.com/holomorph, Holomorph}).  So it's fine for people who
-prefer dark themed web pages, but not so great for everyone else.
+\begin{itemize}
+\item \href{https://files.au.adversary.org/crypto/gpgme-python-howto.html}{GPGME Python Bindings HOWTO draft (XHTML single file, AWS S3 SSL)}
+\item \href{http://files.au.adversary.org/crypto/gpgme-python-howto.html}{GPGME Python Bindings HOWTO draft (XHTML single file, AWS S3 no SSL)}
+\item \href{https://files.au.adversary.org/crypto/gpgme-python-howto-split/index.html}{GPGME Python Bindings HOWTO draft (XHTML multiple files, AWS S3 SSL)}
+\item \href{http://files.au.adversary.org/crypto/gpgme-python-howto/index.html}{GPGME Python Bindings HOWTO draft (XHTML multiple files, AWS S3 no SSL)}
+\end{itemize}
+
+All of these draft versions except for one have been generated from
+this document via GNU Emacs \href{https://orgmode.org/}{Org mode} and \href{https://www.gnu.org/software/texinfo/}{GNU Texinfo}.  Though it is
+likely that the specific \href{https://files.au.adversary.org/crypto/gpgme-python-howto}{file} \href{http://files.au.adversary.org/crypto/gpgme-python-howto.org}{version} used will be on the same server
+with the generated output formats.
 
 The GNU Texinfo and reStructured Text versions ship with the software,
-while the GNU Emacs Info version is generated from the Texinfo
+while the GNU Emacs Info verseion is generated from the Texinfo
 version using GNU Texinfo or GNU Makeinfo.  The Texinfo format is
 generated from the original Org mode source file in Org mode itself
 either within GNU Emacs or via the command line by invoking Emacs in
 batch mode:
 
-@example
+\begin{verbatim}
 emacs gpgme-python-howto.org --batch -f org-texinfo-export-to-texinfo --kill
 emacs gpgme-python-howto --batch -f org-texinfo-export-to-texinfo --kill
-@end example
+\end{verbatim}
 
-The reStructuredText format is also generated from the Org mode source
-file, except it is generated using @uref{https://pandoc.org, Pandoc} with either of the following
-commands (depending on the filename):
+The reStructuredText format is also generated from the Org-mode source
+file, except it is generated using \href{https://pandoc.org}{Pandoc} with either of the following
+commands:
 
-@example
+\begin{verbatim}
 pandoc -f org -t rst+smart -o gpgme-python-howto.rst gpgme-python-howto.org
 pandoc -f org -t rst+smart -o gpgme-python-howto.rst gpgme-python-howto
-@end example
-
-Note that the Org mode source files are identified as such via a mode
-line at the top of each file and have had their @samp{.org} file extensions
-dropped in order to make scripted generation of output formats easier
-and not require renaming files post-conversion.
-
-Due to a bug in Org mode's texinfo conversion method, the recommended
-steps for generating the Texinfo files for all the files in the
-@samp{lang/python/doc/src/} directory are as follows:
-
-@example
-for x in * ; do
-    emacs $x --batch -f org-texinfo-export-to-texinfo --kill
-    cat $x.texi | sed -e 's/@@documentencoding UTF-8/@@documentencoding utf-8/g' > ../texinfo/$x.texi
-    pandoc -f org -t rst+smart -o ../rst/$x.rst $x
-done ;
-rm -fv *.texi
-cd ../texinfo
-mkdir info
-mkdir html
-for x in *.texi ; do
-    makeinfo -v $x
-    makeinfo --html --no-split $x
-done ;
-mv *.info info/
-mv *.html html/
-@end example
-
-This code snippet includes the generation of the reStructuredText
-files and would be expected to be run from the @samp{doc/src/} directory
-containing the Org mode source files.  It also assumes that the
-commands are being run on POSIX compliant systems with basic tools
-like sed, the Bourne shell and GNU Emacs@footnote{Okay, Emacs might not necessarily qualify as a basic tool, but
-it is common enough that having it installed on a system isn't too
-great an expectation, nor is it difficult to add to most POSIX
-systems, even if the users of those systems do not personally use it.} available.  The code
-snippet also includes the steps for generating the Emacs Info files
-and HTML files from the Texinfo files.  Using reStructuredText files
-with Sphinx is best left for the documentation of that project.
+\end{verbatim}
 
 In addition to these there is a significantly less frequently updated
-version as a HTML @uref{https://files.au.adversary.org/crypto/gpgme-python/dita/webhelp/index.html, WebHelp site} (AWS S3 SSL); generated from DITA XML
-source files, which can be found in @uref{https://dev.gnupg.org/source/gpgme/browse/ben%252Fhowto-dita/, an alternative branch} of the GPGME
+version as a HTML \href{https://files.au.adversary.org/crypto/gpgme-python/dita/webhelp/index.html}{WebHelp site} (AWS S3 SSL); generated from DITA XML
+source files, which can be found in \href{https://dev.gnupg.org/source/gpgme/browse/ben\%252Fhowto-dita/}{an alternative branch} of the GPGME
 git repository.
 
 Various generated output formats may occasionally be found in
-subdirectories of the @uref{https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python, gpgme-python} directory.  In particular within
-the @uref{https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python/dita, DITA}, @uref{https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python/rst, reStructuredText} and @uref{https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python/texinfo, Texinfo} subdirectories.  The @samp{rst}
-directory contains output files generated with Sphinx and may include a
-considerable number of its possible output formats, but there are no
-guarantees as to how recent these are or even if they are present.
+subdirectories of the \href{https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python}{gpgme-python} directory.  In particular within
+the \href{https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python/dita}{DITA}, \href{https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python/rst}{reStructuredText} and \href{https://s3.amazonaws.com/files.au.adversary.org/crypto/gpgme-python/texinfo}{Texinfo} subdirectories.  The \texttt{rst}
+directory contains output files generated with Sphix and may include a
+considerable number of its possible output formats.
 
 These draft editions are not official documents and the version of
 documentation in the master branch or which ships with released
@@ -3468,9 +3096,9 @@ web versions which are updated between releases.  They are provided on
 the understanding that they may contain errors or may contain content
 subject to change prior to an official release.
 
-@node License GPL compatible
-@section License GPL compatible
 
+\subsection{License GPL compatible}
+\label{sec:orge78f3b7}
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
 modifications, as long as this notice is preserved.
@@ -3479,5 +3107,4 @@ This file is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 PURPOSE.
-
-@bye
\ No newline at end of file
+\end{document}
diff --git a/lang/python/doc/texinfo/index.texi b/lang/python/doc/texinfo/index.texi
deleted file mode 100644 (file)
index 95c27c2..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-\input texinfo    @c -*- texinfo -*-
-@c %**start of header
-@setfilename index.info
-@settitle GNU Privacy Guard (GnuPG) Made Easy Python Bindings
-@documentencoding utf-8
-@documentlanguage en
-@c %**end of header
-
-@finalout
-@titlepage
-@title GNU Privacy Guard (GnuPG) Made Easy Python Bindings
-@author Ben McGinnes
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top
-@top GNU Privacy Guard (GnuPG) Made Easy Python Bindings
-@end ifnottex
-
-@menu
-* GPGME Python Bindings::
-
-@detailmenu
---- The Detailed Node Listing ---
-
-GPGME Python Bindings
-
-* Contents::
-
-@end detailmenu
-@end menu
-
-@node GPGME Python Bindings
-@chapter GPGME Python Bindings
-
-@menu
-* Contents::
-@end menu
-
-@node Contents
-@section Contents
-
-@itemize
-@item
-@uref{short-history, A short history of the project}
-@item
-@uref{what-is-new, What's New}
-@itemize
-@item
-@uref{maintenance-mode, Maintenance Mode} (from January, 2019)
-@end itemize
-@item
-@uref{what-was-new, What Was New}
-@item
-@uref{gpgme-python-howto, GPGME Python Bindings HOWTO}
-@end itemize
-
-@bye
\ No newline at end of file
diff --git a/lang/python/doc/texinfo/maintenance-mode.texi b/lang/python/doc/texinfo/maintenance-mode.texi
deleted file mode 100644 (file)
index 9245719..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-\input texinfo    @c -*- texinfo -*-
-@c %**start of header
-@setfilename maintenance-mode.info
-@settitle Maintenance Mode
-@documentencoding utf-8
-@documentlanguage en
-@c %**end of header
-
-@finalout
-@titlepage
-@title Maintenance Mode
-@author Ben McGinnes
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top
-@top Maintenance Mode
-@end ifnottex
-
-@menu
-* Maintenance Mode from 2019::
-
-@detailmenu
---- The Detailed Node Listing ---
-
-Maintenance Mode from 2019
-
-* Maintainer from 2019 onward::
-* Using the Python Bindings from 2019 and beyond::
-* Documentation formats::
-
-Documentation formats
-
-* Cautionary Notes regarding Sphinx and EPUB::
-
-@end detailmenu
-@end menu
-
-@node Maintenance Mode from 2019
-@chapter Maintenance Mode from 2019
-
-@multitable {aaaaaaaaaaaaaaa} {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
-@item Version:
-@tab 0.0.1
-@item GPGME Version:
-@tab 1.13.0
-@item Author:
-@tab Ben McGinnes <ben@@gnupg.org>
-@item Author GPG Key:
-@tab DB4724E6FA4286C92B4E55C4321E4E2373590E5D
-@item Language:
-@tab Australian English, British English
-@item xml:lang:
-@tab en-AU, en-GB, en
-@end multitable
-
-From the beginning of 2019 the Python bindings to GPGME will enter
-maintenance mode, meaning that new features will not be added and only
-bug fixes and security fixes will be made.  This also means that
-documentation beyond that existing at the end of 2018 will not be
-developed further except to correct errors.
-
-Though use of these bindings appears to have been quite well received,
-there has been no indication of what demand there is, if any for
-either financial backing of the current Python bindings development or
-support contracts with g10code GmbH citing the necessity of including
-the bindings.
-
-@menu
-* Maintainer from 2019 onward::
-* Using the Python Bindings from 2019 and beyond::
-* Documentation formats::
-@end menu
-
-@node Maintainer from 2019 onward
-@section Maintainer from 2019 onward
-
-How does this affect the position of GnuPG Python Bindings Maintainer?
-
-Well, I will remain as maintainer of the bindings; but without funding
-for that position, the amount of time I will be able to dedicate
-solely to this task will be limited and reduced to volunteered time.
-As with all volunteered time and effort in free software projects,
-this will be subject to numerous external imperatives.
-
-@node Using the Python Bindings from 2019 and beyond
-@section Using the Python Bindings from 2019 and beyond
-
-For most, if not all, Python developers using these bindings; they
-will continue to “just work” the same as they always have.  Expansions
-of GPGME itself are usually handled by SWIG with the existing code and
-thus bindings are generated properly when the bindings are installed
-alongside GPGME and when the latter is built from source.
-
-In the rare circumstances where that is not enough to address some new
-addition to GPGME, then that is a bug and thus subject to the
-maintenance mode provisions (i.e. it will be fixed following a bug
-report being raised and your humble author will need to remember where
-the timesheet template was filed, depending on how many years off such
-an event is).
-
-All the GPGME functionality will continue to be accessible via the
-lower level, dynamically generated methods which match the GPGME C
-documentation.  While the more intuitively Pythonic higher level layer
-already covers the vast majority of functionality people require with
-key generation, signatures, certifications (key signing), encryption,
-decryption, verification, validation, trust levels and so on.
-
-Any wanted features lacking in the Python bindings are usually lacking
-because they are missing from GPGME itself (e.g. revoking keys via the
-API) and in such cases they are usually deliberately excluded.  More
-discussion of these issues can be found in the archives of the
-@uref{https://lists.gnupg.org/mailman/listinfo/gnupg-devel, gnupg-devel mailing list}.
-
-Any features existing in the dynamically generated layer for which
-people want a specific, higher level function included to make it more
-Pythonic (e.g. to avoid needing to learn or memorise cryptographic
-mode values or GnuPG status code numbers), would be a feature request
-and @emph{not} a bug.
-
-It is still worthwhile requesting it, but the addition of such a
-feature would not be guaranteed and provided on a purely volunteer
-basis.  Expediting such a request would require funding that request.
-
-Those with a commercial interest in expediting such a feature request
-already know how to @uref{https://gnupg.org/cgi-bin/procdonate.cgi?mode=preset, expedite it} (use the message field to state what
-feature is being requested).
-
-@node Documentation formats
-@section Documentation formats
-
-The documentation has been written in Org mode for GNU Emacs, with
-both Texinfo and reStructuredText formats generated from that.  The
-Texinfo files are intended for use with the rest of the GnuPG
-documentation; while the reStructuredText files are intended for use
-with Docutils and Sphinx, as with other Python projects.
-
-@menu
-* Cautionary Notes regarding Sphinx and EPUB::
-@end menu
-
-@node Cautionary Notes regarding Sphinx and EPUB
-@subsection Cautionary Notes regarding Sphinx and EPUB
-
-Though Python's Docutils in conjunction with Sphinx is capable of
-generating some very useful HTML sites, as proven by @uref{https://readthedocs.org/, Read the Docs} and
-the @uref{https://docs.python.org/, Python documentation}, there are a number of output formats it does
-not handle well.  At the top of the list of things it manages to break
-so atrociously as to be embarassing is the @uref{http://idpf.org/epub, EPUB 3} format.
-
-The automatically generated EPUB of the CPython documentation always
-contains hundreds of validation errors and even the modest amount of
-documentation here @uref{https://files.au.adversary.org.s3.amazonaws.com/crypto/gpgme-python/rst/epub/GPGMEPythonBindings.epub, produced a file} with approximately thirty
-validation errors.  As the volume of documentation content increases,
-so does the induced errors.  Whereas Texinfo doesn't produce EPUB
-output at all, nor does Org-mode.
-
-Should there ever be genuine demand for this format, lodge a @uref{https://dev.gnupg.org/maniphest/task/edit/form/4/, feature
-request} case marked for @uref{https://dev.gnupg.org/p/BenM/, my} attention.  The means of generating such
-files flawlessly is already available, but is not yet part of the
-GnuPG build system.  Nor is it integrated with a means of converting
-Org mode input files to the relevant base format automatically, as can
-already be done when converting Org to reStructuredText or Org to
-Texinfo.  As a certain amount of work would be required to get it
-done, there would need to be clear demand for that work to be done.
-
-@bye
\ No newline at end of file
diff --git a/lang/python/doc/texinfo/short-history.texi b/lang/python/doc/texinfo/short-history.texi
deleted file mode 100644 (file)
index d27f68d..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-\input texinfo    @c -*- texinfo -*-
-@c %**start of header
-@setfilename short-history.info
-@settitle A Short History of the GPGME bindings for Python
-@documentencoding utf-8
-@documentlanguage en
-@c %**end of header
-
-@finalout
-@titlepage
-@title A Short History of the GPGME bindings for Python
-@author Ben McGinnes
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top
-@top A Short History of the GPGME bindings for Python
-@end ifnottex
-
-@menu
-* Overview::
-* Relics of the past::
-
-@detailmenu
---- The Detailed Node Listing ---
-
-Overview
-
-* In the beginning::
-* Keeping the flame alive::
-* Passing the torch::
-* Coming full circle::
-
-Relics of the past
-
-* The Annoyances of Git::
-* The Perils of PyPI::
-
-The Perils of PyPI
-
-* GPG 1·8·0 - Python bindings for GPGME GnuPG cryptography library::
-* PyME 0·9·0 - Python support for GPGME GnuPG cryptography library::
-
-@end detailmenu
-@end menu
-
-@node Overview
-@chapter Overview
-
-@multitable {aaaaaaaaaaaaaaa} {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
-@item Version:
-@tab 0.0.1
-@item GPGME Version:
-@tab 1.13.0
-@item Author:
-@tab Ben McGinnes <ben@@gnupg.org>
-@item Author GPG Key:
-@tab DB4724E6FA4286C92B4E55C4321E4E2373590E5D
-@item Language:
-@tab Australian English, British English
-@item xml:lang:
-@tab en-AU, en-GB, en
-@end multitable
-
-The GPGME Python bindings passed through many hands and numerous
-phases before, after a fifteen year journey, coming full circle to
-return to the source.  This is a short explanation of that journey.
-
-@menu
-* In the beginning::
-* Keeping the flame alive::
-* Passing the torch::
-* Coming full circle::
-@end menu
-
-@node In the beginning
-@section In the beginning
-
-In 2002 John Goerzen released PyME; Python bindings for the GPGME
-module which utilised the current release of Python of the time and
-SWIG.@footnote{In all likelihood this would have been Python 2.2 or possibly
-Python 2.3.}  Shortly after creating it and ensuring it worked he stopped
-supporting it, though he left his work available on his Gopher
-site.
-
-@node Keeping the flame alive
-@section Keeping the flame alive
-
-A couple of years later the project was picked up by Igor Belyi and
-actively developed and maintained by him from 2004 to 2008.  Igor's
-whereabouts at the time of this document's creation are unknown,
-but the current authors do hope he is well.  We're assuming (or
-hoping) that life did what life does and made continuing untenable.
-
-@node Passing the torch
-@section Passing the torch
-
-In 2014 Martin Albrecht wanted to patch a bug in the PyME code and
-discovered the absence of Igor.  Following a discussion on the PyME
-mailing list he became the new maintainer for PyME, releasing
-version 0.9.0 in May of that year.  He remains the maintainer of
-the original PyME release in Python 2.6 and 2.7 (available via
-PyPI).
-
-@node Coming full circle
-@section Coming full circle
-
-In 2015 Ben McGinnes approached Martin about a Python 3 version,
-while investigating how complex a task this would be the task ended
-up being completed.  A subsequent discussion with Werner Koch led
-to the decision to fold the Python 3 port back into the original
-GPGME release in the languages subdirectory for non-C bindings
-under the module name of @samp{pyme3}.
-
-In 2016 this PyME module was integrated back into the GPGME project
-by Justus Winter.  During the course of this work Justus adjusted
-the port to restore limited support for Python 2, but not as many
-minor point releases as the original PyME package supports.  During
-the course of this integration the package was renamed to more
-accurately reflect its status as a component of GPGME.  The @samp{pyme3}
-module was renamed to @samp{gpg} and adopted by the upstream GnuPG team.
-
-In 2017 Justus departed G10code and the GnuPG team.  Following this
-Ben returned to maintain of gpgme Python bindings and continue
-building them from that point.
-
-@node Relics of the past
-@chapter Relics of the past
-
-There are a few things, in addition to code specific factors, such as
-SWIG itself, which are worth noting here.
-
-@menu
-* The Annoyances of Git::
-* The Perils of PyPI::
-@end menu
-
-@node The Annoyances of Git
-@section The Annoyances of Git
-
-As anyone who has ever worked with git knows, submodules are
-horrible way to deal with pretty much anything.  In the interests
-of avoiding migraines, that was skipped with addition of the PyME
-code to GPGME.
-
-Instead the files were added to a subdirectory of the @samp{lang/}
-directory, along with a copy of the entire git log up to that point
-as a separate file within the @samp{lang/python/docs/} directory.@footnote{The entire PyME git log and other preceding VCS logs are
-located in the @samp{gpgme/lang/python/docs/old-commits.log} file.}
-As the log for PyME is nearly 100KB and the log for GPGME is
-approximately 1MB, this would cause considerable bloat, as well as
-some confusion, should the two be merged.
-
-Hence the unfortunate, but necessary, step to simply move the
-files.  A regular repository version has been maintained should it
-be possible to implement this better in the future.
-
-@node The Perils of PyPI
-@section The Perils of PyPI
-
-The early port of the Python 2 @samp{pyme} module as @samp{pyme3} was never
-added to PyPI while the focus remained on development and testing
-during 2015 and early 2016.  Later in 2016, however, when Justus
-completed his major integration work and subsequently renamed the
-module from @samp{pyme3} to @samp{gpg}, some prior releases were also
-provided through PyPI.
-
-Since these bindings require a matching release of the GPGME
-libraries in order to function, it was determined that there was
-little benefit in also providing a copy through PyPI since anyone
-obtaining the GPGME source code would obtain the Python bindings
-source code at the same time.  Whereas there was the potential to
-sew confusion amongst Python users installing the module from PyPI,
-only to discover that without the relevant C files, header files or
-SWIG compiled binaries, the Python module did them little good.
-
-There are only two files on PyPI which might turn up in a search
-for this module or a sample of its content:
-
-@enumerate
-@item
-gpg (1.8.0) - Python bindings for GPGME GnuPG cryptography library
-@item
-pyme (0.9.0) - Python support for GPGME GnuPG cryptography library
-@end enumerate
-
-@menu
-* GPG 1·8·0 - Python bindings for GPGME GnuPG cryptography library::
-* PyME 0·9·0 - Python support for GPGME GnuPG cryptography library::
-@end menu
-
-@node GPG 1·8·0 - Python bindings for GPGME GnuPG cryptography library
-@subsection GPG 1·8·0 - Python bindings for GPGME GnuPG cryptography library
-
-This is the most recent version to reach PyPI and is the version
-of the official Pyhon bindings which shipped with GPGME 1.8.0.  If
-you have GPGME 1.8.0 installed and @emph{only} 1.8.0 installed, then it
-is probably safe to use this copy from PyPI.
-
-As there have been a lot of changes since the release of GPGME
-1.8.0, the GnuPG Project recommends not using this version of the
-module and instead installing the current version of GPGME along
-with the Python bindings included with that package.
-
-@node PyME 0·9·0 - Python support for GPGME GnuPG cryptography library
-@subsection PyME 0·9·0 - Python support for GPGME GnuPG cryptography library
-
-This is the last release of the PyME bindings maintained by Martin
-Albrecht and is only compatible with Python 2, it will not work
-with Python 3.  This is the version of the software from which the
-port from Python 2 to Python 3 code was made in 2015.
-
-Users of the more recent Python bindings will recognise numerous
-points of similarity, but also significant differences.  It is
-likely that the more recent official bindings will feel "more
-pythonic."
-
-For those using Python 2, there is essentially no harm in using
-this module, but it may lack a number of more recent features
-added to GPGME.
-
-@bye
\ No newline at end of file
diff --git a/lang/python/doc/texinfo/what-is-new.texi b/lang/python/doc/texinfo/what-is-new.texi
deleted file mode 100644 (file)
index 406ab2f..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-\input texinfo    @c -*- texinfo -*-
-@c %**start of header
-@setfilename what-is-new.info
-@settitle What's New in the GPGME Python Bindings and Documentation
-@documentencoding utf-8
-@documentlanguage en
-@c %**end of header
-
-@finalout
-@titlepage
-@title What's New in the GPGME Python Bindings and Documentation
-@author Ben McGinnes
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top
-@top What's New in the GPGME Python Bindings and Documentation
-@end ifnottex
-
-@menu
-* What's New::
-
-@detailmenu
---- The Detailed Node Listing ---
-
-What's New
-
-* New in GPGME 1·13·0::
-
-@end detailmenu
-@end menu
-
-@node What's New
-@chapter What's New
-
-@multitable {aaaaaaaaaaaaaaa} {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
-@item Version:
-@tab 0.0.1
-@item GPGME Version:
-@tab 1.13.0
-@item Author:
-@tab Ben McGinnes <ben@@gnupg.org>
-@item Author GPG Key:
-@tab DB4724E6FA4286C92B4E55C4321E4E2373590E5D
-@item Language:
-@tab Australian English, British English
-@item xml:lang:
-@tab en-AU, en-GB, en
-@end multitable
-
-Last time the most obviously new thing was adding the @emph{What's New}
-section to the HOWTO.  Now it's moving it out of the HOWTO.
-
-@menu
-* New in GPGME 1·13·0::
-@end menu
-
-@node New in GPGME 1·13·0
-@section New in GPGME 1·13·0
-
-Additions since GPGME 1.12.0 include:
-
-@itemize
-@item
-Moving the @emph{What's New} section out of the basic @uref{gpgme-python-howto.org, HOWTO} document and
-into its own file so as to more readily include other documents
-beyond that HOWTO.
-@item
-Moving the preceding, archival, segments into @uref{what-was-new.org, another file}.
-@item
-Added @samp{gpg.version.versionintlist} to make it easier for Python
-developers to check for a specific version number, even with beta
-versions (it will drop the "-betaN" part).
-@item
-Added expanded detail on issues pertaining to installing for Windows
-users.
-@item
-Bindings enter @uref{maintenance-mode, maintenance mode} from January, 2019.
-@item
-Added documentation on maintenance mode and what changes can be made
-to the code when in that status.  Essentially that boils down to bug
-fixes only and no feature requests.
-@item
-The import-keys-hkp.py example script, which uses the @samp{hkp4py}
-module to search the SKS servers for a key, has been tightened up to
-search for both hexadecimal key IDs and user ID strings with reduced
-chance of unnecessary repitition.  There may still be some
-repetition if a key includes a user ID matching the hexadecimal
-value of a key ID.
-@end itemize
-
-@bye
\ No newline at end of file
diff --git a/lang/python/doc/texinfo/what-was-new.texi b/lang/python/doc/texinfo/what-was-new.texi
deleted file mode 100644 (file)
index 3f0ad9d..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-\input texinfo    @c -*- texinfo -*-
-@c %**start of header
-@setfilename what-was-new.info
-@settitle What Was New in the GPGME Python Bindings and Documentation
-@documentencoding utf-8
-@documentlanguage en
-@c %**end of header
-
-@finalout
-@titlepage
-@title What Was New in the GPGME Python Bindings and Documentation
-@author Ben McGinnes
-@end titlepage
-
-@contents
-
-@ifnottex
-@node Top
-@top What Was New in the GPGME Python Bindings and Documentation
-@end ifnottex
-
-@menu
-* What Was New::
-
-@detailmenu
---- The Detailed Node Listing ---
-
-What Was New
-
-* What Was New in GPGME 1·12·0::
-
-What Was New in GPGME 1·12·0
-
-* New in GPGME 1·12·0::
-
-@end detailmenu
-@end menu
-
-@node What Was New
-@chapter What Was New
-
-@multitable {aaaaaaaaaaaaaaa} {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
-@item Version:
-@tab 0.0.1
-@item GPGME Version:
-@tab 1.13.0
-@item Author:
-@tab Ben McGinnes <ben@@gnupg.org>
-@item Author GPG Key:
-@tab DB4724E6FA4286C92B4E55C4321E4E2373590E5D
-@item Language:
-@tab Australian English, British English
-@item xml:lang:
-@tab en-AU, en-GB, en
-@end multitable
-
-The following are all the past @emph{What's New} sections for the Python
-Bindings HOWTO and other documentation.
-
-@menu
-* What Was New in GPGME 1·12·0::
-@end menu
-
-@node What Was New in GPGME 1·12·0
-@section What Was New in GPGME 1·12·0
-
-The most obviously new point for those reading this guide is this
-section on other new things, but that’s hardly important. Not given
-all the other things which spurred the need for adding this section
-and its subsections.
-
-@menu
-* New in GPGME 1·12·0::
-@end menu
-
-@node New in GPGME 1·12·0
-@subsection New in GPGME 1·12·0
-
-There have been quite a number of additions to GPGME and the Python
-bindings to it since the last release of GPGME with versions 1.11.0
-and 1.11.1 in April, 2018.
-
-The bullet points of new additiions are:
-
-@itemize
-@item
-an expanded section on @uref{gpgme-python-howto#installation, installing} and @uref{gpgme-python-howto#snafu, troubleshooting} the Python
-bindings.
-@item
-The release of Python 3.7.0; which appears to be working just fine
-with our bindings, in spite of intermittent reports of problems for
-many other Python projects with that new release.
-@item
-Python 3.7 has been moved to the head of the specified python
-versions list in the build process.
-@item
-In order to fix some other issues, there are certain underlying
-functions which are more exposed through the @uref{gpgme-python-howto#howto-get-context, gpg.Context()}, but
-ongoing documentation ought to clarify that or otherwise provide the
-best means of using the bindings.  Some additions to @samp{gpg.core} and
-the @samp{Context()}, however, were intended (see below).
-@item
-Continuing work in identifying and confirming the cause of
-oft-reported @uref{gpgme-python-howto#snafu-runtime-not-funtime, problems installing the Python bindings on Windows}.
-@item
-GSOC: Google's Surreptitiously Ordered Conscription @dots{} erm @dots{} oh,
-right; Google's Summer of Code.  Though there were two hopeful
-candidates this year; only one ended up involved with the GnuPG
-Project directly, the other concentrated on an unrelated third party
-project with closer ties to one of the GNU/Linux distributions than
-to the GnuPG Project.  Thus the Python bindings benefited from GSOC
-participant Jacob Adams, who added the key@math{_import} function; building
-on prior work by Tobias Mueller.
-@item
-Several new methods functions were added to the gpg.Context(),
-including: @uref{gpgme-python-howto#howto-import-key, key@math{_import}}, @uref{gpgme-python-howto#howto-export-key, key@math{_export}}, @uref{gpgme-python-howto#howto-export-public-key, key@math{_export}@math{_minimal}} and
-@uref{gpgme-python-howto#howto-export-secret-key, key@math{_export}@math{_secret}}.
-@item
-Importing and exporting examples include versions integrated with
-Marcel Fest's recently released @uref{https://github.com/Selfnet/hkp4py, HKP for Python} module.  Some
-@uref{gpgme-python-howto#hkp4py, additional notes on this module} are included at the end of the HOWTO.
-@item
-Instructions for dealing with semi-walled garden implementations
-like ProtonMail are also included.  This is intended to make things
-a little easier when communicating with users of ProtonMail's
-services and should not be construed as an endorsement of said
-service.  The GnuPG Project neither favours, nor disfavours
-ProtonMail and the majority of this deals with interacting with the
-ProtonMail keyserver.
-@item
-Semi-formalised the location where @uref{gpgme-python-howto#draft-editions, draft versions} of this HOWTO may
-periodically be accessible.  This is both for the reference of
-others and testing the publishing of the document itself.  Renamed
-this file at around the same time.
-@item
-The Texinfo documentation build configuration has been replicated
-from the parent project in order to make to maintain consistency
-with that project (and actually ship with each release).
-@item
-a reStructuredText (@samp{.rst}) version is also generated for Python
-developers more used to and comfortable with that format as it is
-the standard Python documentation format and Python developers may
-wish to use it with Sphinx.  Please note that there has been no
-testing of the reStructuredText version with Sphinx at all.  The
-reST file was generated by the simple expedient of using @uref{https://pandoc.org/, Pandoc}.
-@item
-Added a new section for @uref{gpgme-python-howto#advanced-use, advanced or experimental use}.
-@item
-Began the advanced use cases with @uref{gpgme-python-howto#cython, a section} on using the module with
-@uref{https://cython.org/, Cython}.
-@item
-Added a number of new scripts to the @samp{example/howto/} directory;
-some of which may be in advance of their planned sections of the
-HOWTO (and some are just there because it seemed like a good idea at
-the time).
-@item
-Cleaned up a lot of things under the hood.
-@end itemize
-
-@bye
\ No newline at end of file
index 7300016..a674e9b 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -338,6 +338,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -423,8 +424,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -448,7 +449,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 3a0f3ed..33d7e0b 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -338,6 +338,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -396,8 +397,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -421,7 +422,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 026df03..62dddaa 100644 (file)
@@ -42,7 +42,6 @@ py_tests ?= t-wrapper.py \
        t-sig-notation.py \
        t-export.py \
        t-import.py \
-       t-trustlist.py \
        t-edit.py \
        t-keylist.py \
        t-keylist-from-data.py \
index e41c71f..306b904 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -337,6 +337,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -395,8 +396,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -420,7 +421,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -585,7 +589,6 @@ py_tests ?= t-wrapper.py \
        t-sig-notation.py \
        t-export.py \
        t-import.py \
-       t-trustlist.py \
        t-edit.py \
        t-keylist.py \
        t-keylist-from-data.py \
index 37fdba9..dc42a36 100644 (file)
@@ -38,6 +38,12 @@ def assert_gpg_version(version=(2, 1, 0)):
                 c.engine_info.version, '.'.join(map(str, version))))
             sys.exit(77)
 
+def is_gpg_version(version):
+    with gpg.Context() as c:
+        clean_version = re.match(r'\d+\.\d+\.\d+',
+                                 c.engine_info.version).group(0)
+        return tuple(map(int, clean_version.split('.'))) == version
+
 
 def have_tofu_support(ctx, some_uid):
     keys = list(
index 4389a7d..d22e010 100755 (executable)
@@ -44,8 +44,16 @@ for passphrase in ("abc", b"abc"):
     c.set_passphrase_cb(passphrase_cb, None)
 
     c.op_encrypt([], 0, source, cipher)
-    assert passphrase_cb_called == 1, \
-        "Callback called {} times".format(passphrase_cb_called)
+    # gpg 2.2.21 has a bug in that for a new passphrase the callback
+    # is called twice.  This is fixed in 2.2.22 but a patch was also
+    # distributed so that we allow both.
+    if support.is_gpg_version((2,2,21)):
+        print("Enabling GnuPG 2.2.21 bug 4991 test workaround.")
+        assert passphrase_cb_called == 1 or passphrase_cb_called == 2, \
+            "Callback called {} times".format(passphrase_cb_called)
+    else:
+        assert passphrase_cb_called == 1, \
+            "Callback called {} times".format(passphrase_cb_called)
     support.print_data(cipher)
 
     c = gpg.Context()
diff --git a/lang/python/tests/t-trustlist.py b/lang/python/tests/t-trustlist.py
deleted file mode 100755 (executable)
index 8794704..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (C) 2016 g10 Code 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 General Public License as published by
-# the Free Software Foundation; either version 2 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 <https://www.gnu.org/licenses/>.
-
-from __future__ import absolute_import, print_function, unicode_literals
-
-import gpg
-import support
-_ = support  # to appease pyflakes.
-
-del absolute_import, print_function, unicode_literals
-
-c = gpg.Context()
-
-
-def dump_item(item):
-    print("l={} k={} t={} o={} v={} u={}".format(item.level, item.keyid,
-                                                 item.type, item.owner_trust,
-                                                 item.validity, item.name))
-
-
-c.op_trustlist_start("alice", 0)
-while True:
-    item = c.op_trustlist_next()
-    if not item:
-        break
-    dump_item(item)
-c.op_trustlist_end()
-
-for item in c.op_trustlist_all("alice", 0):
-    dump_item(item)
index 526ad86..da82af8 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -161,7 +161,7 @@ am__recursive_targets = \
   $(RECURSIVE_CLEAN_TARGETS) \
   $(am__extra_recursive_targets)
 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir
+       distdir distdir-am
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -399,6 +399,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -431,8 +432,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -549,7 +550,10 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 276fa58..9b43d7f 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -338,6 +338,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -367,8 +368,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -394,7 +395,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
diff --git a/lang/qt/src/GpgCardJob b/lang/qt/src/GpgCardJob
new file mode 100644 (file)
index 0000000..217484f
--- /dev/null
@@ -0,0 +1 @@
+#include "qgpgme/gpgcardjob.h"
index 80dcde1..16a2094 100644 (file)
@@ -20,7 +20,7 @@
 # 02111-1307, USA
 lib_LTLIBRARIES = libqgpgme.la
 EXTRA_DIST = QGpgmeConfig.cmake.in.in QGpgmeConfigVersion.cmake.in \
-             gpgme_backend_debug.h qgpgme_version.h.in \
+             qgpgme_debug.h qgpgme_version.h.in \
              QGpgmeConfig.cmake.in.in
 
 qgpgme_sources = \
@@ -35,9 +35,10 @@ qgpgme_sources = \
     qgpgmesecretkeyexportjob.cpp qgpgmesignencryptjob.cpp \
     qgpgmesignjob.cpp qgpgmesignkeyjob.cpp qgpgmeverifydetachedjob.cpp \
     qgpgmeverifyopaquejob.cpp threadedjobmixin.cpp \
-    qgpgmekeyformailboxjob.cpp gpgme_backend_debug.cpp \
+    qgpgmekeyformailboxjob.cpp qgpgme_debug.cpp \
     qgpgmetofupolicyjob.cpp qgpgmequickjob.cpp \
     defaultkeygenerationjob.cpp qgpgmewkspublishjob.cpp \
+    qgpgmegpgcardjob.cpp \
     dn.cpp cryptoconfig.cpp
 
 # If you add one here make sure that you also add one in camelcase
@@ -78,6 +79,7 @@ qgpgme_headers= \
     defaultkeygenerationjob.h \
     tofupolicyjob.h \
     wkspublishjob.h \
+    gpgcardjob.h \
     dn.h
 
 camelcase_headers= \
@@ -116,7 +118,8 @@ camelcase_headers= \
     KeyForMailboxJob \
     DefaultKeyGenerationJob \
     WKSPublishJob \
-    TofuPolicyJob
+    TofuPolicyJob \
+    GpgCardJob
 
 private_qgpgme_headers = \
     qgpgme_export.h \
@@ -147,6 +150,7 @@ private_qgpgme_headers = \
     qgpgmekeyformailboxjob.h \
     qgpgmewkspublishjob.h \
     qgpgmetofupolicyjob.h \
+    qgpgmegpgcardjob.h \
     qgpgmequickjob.h \
     threadedjobmixin.h
 
@@ -207,7 +211,9 @@ qgpgme_moc_sources = \
     qgpgmekeyformailboxjob.moc \
     defaultkeygenerationjob.moc \
     quickjob.moc \
-    qgpgmequickjob.moc
+    qgpgmequickjob.moc \
+    gpgcardjob.moc \
+    qgpgmegpgcardjob.moc
 
 qgpgmeincludedir = $(includedir)/qgpgme
 qgpgmeinclude_HEADERS = $(qgpgme_headers)
index 65628bf..d24cb2d 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -157,10 +157,10 @@ am__objects_1 = dataprovider.lo job.lo multideletejob.lo \
        qgpgmerefreshkeysjob.lo qgpgmesecretkeyexportjob.lo \
        qgpgmesignencryptjob.lo qgpgmesignjob.lo qgpgmesignkeyjob.lo \
        qgpgmeverifydetachedjob.lo qgpgmeverifyopaquejob.lo \
-       threadedjobmixin.lo qgpgmekeyformailboxjob.lo \
-       gpgme_backend_debug.lo qgpgmetofupolicyjob.lo \
-       qgpgmequickjob.lo defaultkeygenerationjob.lo \
-       qgpgmewkspublishjob.lo dn.lo cryptoconfig.lo
+       threadedjobmixin.lo qgpgmekeyformailboxjob.lo qgpgme_debug.lo \
+       qgpgmetofupolicyjob.lo qgpgmequickjob.lo \
+       defaultkeygenerationjob.lo qgpgmewkspublishjob.lo \
+       qgpgmegpgcardjob.lo dn.lo cryptoconfig.lo
 am__objects_2 =
 am_libqgpgme_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
        $(am__objects_2)
@@ -188,7 +188,41 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/cryptoconfig.Plo \
+       ./$(DEPDIR)/dataprovider.Plo \
+       ./$(DEPDIR)/defaultkeygenerationjob.Plo ./$(DEPDIR)/dn.Plo \
+       ./$(DEPDIR)/job.Plo ./$(DEPDIR)/multideletejob.Plo \
+       ./$(DEPDIR)/qgpgme_debug.Plo \
+       ./$(DEPDIR)/qgpgmeadduseridjob.Plo \
+       ./$(DEPDIR)/qgpgmebackend.Plo \
+       ./$(DEPDIR)/qgpgmechangeexpiryjob.Plo \
+       ./$(DEPDIR)/qgpgmechangeownertrustjob.Plo \
+       ./$(DEPDIR)/qgpgmechangepasswdjob.Plo \
+       ./$(DEPDIR)/qgpgmedecryptjob.Plo \
+       ./$(DEPDIR)/qgpgmedecryptverifyjob.Plo \
+       ./$(DEPDIR)/qgpgmedeletejob.Plo \
+       ./$(DEPDIR)/qgpgmedownloadjob.Plo \
+       ./$(DEPDIR)/qgpgmeencryptjob.Plo \
+       ./$(DEPDIR)/qgpgmeexportjob.Plo \
+       ./$(DEPDIR)/qgpgmegpgcardjob.Plo \
+       ./$(DEPDIR)/qgpgmeimportfromkeyserverjob.Plo \
+       ./$(DEPDIR)/qgpgmeimportjob.Plo \
+       ./$(DEPDIR)/qgpgmekeyformailboxjob.Plo \
+       ./$(DEPDIR)/qgpgmekeygenerationjob.Plo \
+       ./$(DEPDIR)/qgpgmekeylistjob.Plo \
+       ./$(DEPDIR)/qgpgmelistallkeysjob.Plo \
+       ./$(DEPDIR)/qgpgmenewcryptoconfig.Plo \
+       ./$(DEPDIR)/qgpgmequickjob.Plo \
+       ./$(DEPDIR)/qgpgmerefreshkeysjob.Plo \
+       ./$(DEPDIR)/qgpgmesecretkeyexportjob.Plo \
+       ./$(DEPDIR)/qgpgmesignencryptjob.Plo \
+       ./$(DEPDIR)/qgpgmesignjob.Plo ./$(DEPDIR)/qgpgmesignkeyjob.Plo \
+       ./$(DEPDIR)/qgpgmetofupolicyjob.Plo \
+       ./$(DEPDIR)/qgpgmeverifydetachedjob.Plo \
+       ./$(DEPDIR)/qgpgmeverifyopaquejob.Plo \
+       ./$(DEPDIR)/qgpgmewkspublishjob.Plo \
+       ./$(DEPDIR)/threadedjobmixin.Plo
 am__mv = mv -f
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
@@ -450,6 +484,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -481,7 +516,7 @@ top_srcdir = @top_srcdir@
 # 02111-1307, USA
 lib_LTLIBRARIES = libqgpgme.la
 EXTRA_DIST = QGpgmeConfig.cmake.in.in QGpgmeConfigVersion.cmake.in \
-             gpgme_backend_debug.h qgpgme_version.h.in \
+             qgpgme_debug.h qgpgme_version.h.in \
              QGpgmeConfig.cmake.in.in
 
 qgpgme_sources = \
@@ -496,9 +531,10 @@ qgpgme_sources = \
     qgpgmesecretkeyexportjob.cpp qgpgmesignencryptjob.cpp \
     qgpgmesignjob.cpp qgpgmesignkeyjob.cpp qgpgmeverifydetachedjob.cpp \
     qgpgmeverifyopaquejob.cpp threadedjobmixin.cpp \
-    qgpgmekeyformailboxjob.cpp gpgme_backend_debug.cpp \
+    qgpgmekeyformailboxjob.cpp qgpgme_debug.cpp \
     qgpgmetofupolicyjob.cpp qgpgmequickjob.cpp \
     defaultkeygenerationjob.cpp qgpgmewkspublishjob.cpp \
+    qgpgmegpgcardjob.cpp \
     dn.cpp cryptoconfig.cpp
 
 
@@ -540,6 +576,7 @@ qgpgme_headers = \
     defaultkeygenerationjob.h \
     tofupolicyjob.h \
     wkspublishjob.h \
+    gpgcardjob.h \
     dn.h
 
 camelcase_headers = \
@@ -578,7 +615,8 @@ camelcase_headers = \
     KeyForMailboxJob \
     DefaultKeyGenerationJob \
     WKSPublishJob \
-    TofuPolicyJob
+    TofuPolicyJob \
+    GpgCardJob
 
 private_qgpgme_headers = \
     qgpgme_export.h \
@@ -609,6 +647,7 @@ private_qgpgme_headers = \
     qgpgmekeyformailboxjob.h \
     qgpgmewkspublishjob.h \
     qgpgmetofupolicyjob.h \
+    qgpgmegpgcardjob.h \
     qgpgmequickjob.h \
     threadedjobmixin.h
 
@@ -669,7 +708,9 @@ qgpgme_moc_sources = \
     qgpgmekeyformailboxjob.moc \
     defaultkeygenerationjob.moc \
     quickjob.moc \
-    qgpgmequickjob.moc
+    qgpgmequickjob.moc \
+    gpgcardjob.moc \
+    qgpgmegpgcardjob.moc
 
 qgpgmeincludedir = $(includedir)/qgpgme
 qgpgmeinclude_HEADERS = $(qgpgme_headers)
@@ -718,8 +759,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -783,42 +824,49 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cryptoconfig.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataprovider.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/defaultkeygenerationjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dn.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme_backend_debug.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multideletejob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeadduseridjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmebackend.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmechangeexpiryjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmechangeownertrustjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmechangepasswdjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedecryptjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedecryptverifyjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedeletejob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedownloadjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeencryptjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeexportjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeimportfromkeyserverjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeimportjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmekeyformailboxjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmekeygenerationjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmekeylistjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmelistallkeysjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmenewcryptoconfig.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmequickjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmerefreshkeysjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesecretkeyexportjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesignencryptjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesignjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesignkeyjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmetofupolicyjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeverifydetachedjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeverifyopaquejob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmewkspublishjob.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threadedjobmixin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cryptoconfig.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataprovider.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/defaultkeygenerationjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dn.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multideletejob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgme_debug.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeadduseridjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmebackend.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmechangeexpiryjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmechangeownertrustjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmechangepasswdjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedecryptjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedecryptverifyjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedeletejob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmedownloadjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeencryptjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeexportjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmegpgcardjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeimportfromkeyserverjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeimportjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmekeyformailboxjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmekeygenerationjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmekeylistjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmelistallkeysjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmenewcryptoconfig.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmequickjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmerefreshkeysjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesecretkeyexportjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesignencryptjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesignjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmesignkeyjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmetofupolicyjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeverifydetachedjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmeverifyopaquejob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qgpgmewkspublishjob.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threadedjobmixin.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .cpp.o:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -962,7 +1010,10 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -1039,7 +1090,43 @@ clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
        mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/cryptoconfig.Plo
+       -rm -f ./$(DEPDIR)/dataprovider.Plo
+       -rm -f ./$(DEPDIR)/defaultkeygenerationjob.Plo
+       -rm -f ./$(DEPDIR)/dn.Plo
+       -rm -f ./$(DEPDIR)/job.Plo
+       -rm -f ./$(DEPDIR)/multideletejob.Plo
+       -rm -f ./$(DEPDIR)/qgpgme_debug.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeadduseridjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmebackend.Plo
+       -rm -f ./$(DEPDIR)/qgpgmechangeexpiryjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmechangeownertrustjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmechangepasswdjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmedecryptjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmedecryptverifyjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmedeletejob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmedownloadjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeencryptjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeexportjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmegpgcardjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeimportfromkeyserverjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeimportjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmekeyformailboxjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmekeygenerationjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmekeylistjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmelistallkeysjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmenewcryptoconfig.Plo
+       -rm -f ./$(DEPDIR)/qgpgmequickjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmerefreshkeysjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmesecretkeyexportjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmesignencryptjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmesignjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmesignkeyjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmetofupolicyjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeverifydetachedjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeverifyopaquejob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmewkspublishjob.Plo
+       -rm -f ./$(DEPDIR)/threadedjobmixin.Plo
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -1087,7 +1174,43 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/cryptoconfig.Plo
+       -rm -f ./$(DEPDIR)/dataprovider.Plo
+       -rm -f ./$(DEPDIR)/defaultkeygenerationjob.Plo
+       -rm -f ./$(DEPDIR)/dn.Plo
+       -rm -f ./$(DEPDIR)/job.Plo
+       -rm -f ./$(DEPDIR)/multideletejob.Plo
+       -rm -f ./$(DEPDIR)/qgpgme_debug.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeadduseridjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmebackend.Plo
+       -rm -f ./$(DEPDIR)/qgpgmechangeexpiryjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmechangeownertrustjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmechangepasswdjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmedecryptjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmedecryptverifyjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmedeletejob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmedownloadjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeencryptjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeexportjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmegpgcardjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeimportfromkeyserverjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeimportjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmekeyformailboxjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmekeygenerationjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmekeylistjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmelistallkeysjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmenewcryptoconfig.Plo
+       -rm -f ./$(DEPDIR)/qgpgmequickjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmerefreshkeysjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmesecretkeyexportjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmesignencryptjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmesignjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmesignkeyjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmetofupolicyjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeverifydetachedjob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmeverifyopaquejob.Plo
+       -rm -f ./$(DEPDIR)/qgpgmewkspublishjob.Plo
+       -rm -f ./$(DEPDIR)/threadedjobmixin.Plo
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -1111,9 +1234,9 @@ uninstall-am: uninstall-camelcaseincludeHEADERS \
 
 .MAKE: all check install install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-       clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \
-       ctags-am distclean distclean-compile distclean-generic \
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+       clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \
+       ctags ctags-am distclean distclean-compile distclean-generic \
        distclean-libtool distclean-tags distdir dvi dvi-am html \
        html-am info info-am install install-am \
        install-camelcaseincludeHEADERS install-data install-data-am \
index fc1f7ae..7f79ea0 100644 (file)
@@ -79,6 +79,8 @@ public:
     */
     virtual GpgME::Error start(const QStringList &patterns) = 0;
 
+    virtual void setExportFlags (unsigned int flags);
+
 Q_SIGNALS:
     void result(const GpgME::Error &result, const QByteArray &keyData, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
 };
diff --git a/lang/qt/src/gpgcardjob.h b/lang/qt/src/gpgcardjob.h
new file mode 100644 (file)
index 0000000..63f5cf7
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+    gpgcardjob.h
+
+    This file is part of qgpgme, the Qt API binding for gpgme
+    Copyright (c) 2020 g10 Code GmbH
+
+    QGpgME is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.
+
+    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.
+*/
+#ifndef __KLEO_GPGCARDJOB_H__
+#define __KLEO_GPGCARDJOB_H__
+
+#include <QStringList>
+
+#include "job.h"
+
+namespace GpgME
+{
+class Error;
+}
+
+namespace QGpgME
+{
+
+/**
+   @short Get the best key to use for a Mailbox
+
+   To use the keyformailboxjob, first obtain an instance from the
+   CryptoBackend and either exec it or start and
+   conncet the result() signals to a suitable slot.
+   The job will be automatically deleted in which
+   case the KeylistJob instance will have schedules it's own
+   destruction with a call to QObject::deleteLater().
+
+   The best key is defined as the key with a UID that has an
+   E-Mail that matches the mailbox provided. If multiple
+   keys are found the one with the highest validity is returned.
+
+   After result() is emitted, the
+   KeyListJob will schedule it's own destruction by calling
+   QObject::deleteLater().
+*/
+class QGPGME_EXPORT GpgCardJob: public Job
+{
+    Q_OBJECT
+protected:
+    explicit GpgCardJob(QObject *parent);
+
+public:
+    ~GpgCardJob();
+
+    /**
+      Starts the operation. \a cmds are the commands to
+      execute.
+    */
+    virtual GpgME::Error start(const QStringList &cmds) = 0;
+
+    virtual GpgME::Error exec(const QStringList &cmds, QString &std_out, QString &std_err, int &exitCode) = 0;
+
+Q_SIGNALS:
+    /** The resulting stdout and stderr of gpgcard and the exitCode
+     *
+     * The auditlog params are always null / empty.
+     */
+    void result(const QString &std_out, const QString &std_err, int exitCode,
+                const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+#endif
diff --git a/lang/qt/src/gpgme_backend_debug.cpp b/lang/qt/src/gpgme_backend_debug.cpp
deleted file mode 100644 (file)
index 6efe932..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// This file is autogenerated by CMake: DO NOT EDIT
-
-#ifdef HAVE_CONFIG_H
- #include "config.h"
-#endif
-
-#include "gpgme_backend_debug.h"
-
-
-#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
-Q_LOGGING_CATEGORY(GPGPME_BACKEND_LOG, "log_gpgme_backend", QtWarningMsg)
-#else
-Q_LOGGING_CATEGORY(GPGPME_BACKEND_LOG, "log_gpgme_backend")
-#endif
diff --git a/lang/qt/src/gpgme_backend_debug.h b/lang/qt/src/gpgme_backend_debug.h
deleted file mode 100644 (file)
index 5ac93db..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// This file is autogenerated by CMake: DO NOT EDIT
-
-#ifndef GPGPME_BACKEND_LOG_H
-#define GPGPME_BACKEND_LOG_H
-
-#include <QLoggingCategory>
-
-Q_DECLARE_LOGGING_CATEGORY(GPGPME_BACKEND_LOG)
-
-
-#endif
index c427020..8ed0b57 100644 (file)
@@ -65,6 +65,7 @@
 #include "tofupolicyjob.h"
 #include "threadedjobmixin.h"
 #include "quickjob.h"
+#include "gpgcardjob.h"
 
 #include <QCoreApplication>
 #include <QDebug>
@@ -141,6 +142,7 @@ make_job_subclass(KeyForMailboxJob)
 make_job_subclass(WKSPublishJob)
 make_job_subclass(TofuPolicyJob)
 make_job_subclass(QuickJob)
+make_job_subclass(GpgCardJob)
 
 #undef make_job_subclass
 
@@ -173,3 +175,4 @@ make_job_subclass(QuickJob)
 #include "wkspublishjob.moc"
 #include "tofupolicyjob.moc"
 #include "quickjob.moc"
+#include "gpgcardjob.moc"
index 1a52097..17db68a 100644 (file)
@@ -67,6 +67,7 @@ class KeyForMailboxJob;
 class WKSPublishJob;
 class TofuPolicyJob;
 class QuickJob;
+class GpgCardJob;
 
 /** The main entry point for QGpgME Comes in OpenPGP and SMIME(CMS) flavors.
  *
@@ -184,5 +185,12 @@ QGPGME_EXPORT Protocol *smime();
  */
 QGPGME_EXPORT CryptoConfig *cryptoConfig();
 
+/** Obtain a reference to a protocol agnostic GpgCardJob.
+ *
+ * The reference is to a static object.
+ * @returns reference to a GpgCardJob following the job pattern.
+ */
+QGPGME_EXPORT GpgCardJob *gpgCardJob();
+
 }
 #endif
diff --git a/lang/qt/src/qgpgme_debug.cpp b/lang/qt/src/qgpgme_debug.cpp
new file mode 100644 (file)
index 0000000..4ed859e
--- /dev/null
@@ -0,0 +1,14 @@
+// This file is autogenerated by CMake: DO NOT EDIT
+
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include "qgpgme_debug.h"
+
+
+#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
+Q_LOGGING_CATEGORY(QGPGME_LOG, "gpg.qgpgme", QtWarningMsg)
+#else
+Q_LOGGING_CATEGORY(QGPGME_LOG, "gpg.qgpgme")
+#endif
diff --git a/lang/qt/src/qgpgme_debug.h b/lang/qt/src/qgpgme_debug.h
new file mode 100644 (file)
index 0000000..38c16ad
--- /dev/null
@@ -0,0 +1,11 @@
+// This file is autogenerated by CMake: DO NOT EDIT
+
+#ifndef QGPGME_LOG_H
+#define QGPGME_LOG_H
+
+#include <QLoggingCategory>
+
+Q_DECLARE_LOGGING_CATEGORY(QGPGME_LOG)
+
+
+#endif
index f7393f0..aa96db0 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "qgpgmebackend.h"
 
+#include "qgpgmegpgcardjob.h"
 
 #include "error.h"
 #include "engineinfo.h"
@@ -86,6 +87,11 @@ QGpgME::CryptoConfig *QGpgME::QGpgMEBackend::config() const
     return mCryptoConfig;
 }
 
+QGpgME::GpgCardJob *QGpgME::QGpgMEBackend::gpgCardJob() const
+{
+    return new QGpgME::QGpgMEGpgCardJob();
+}
+
 static bool check(GpgME::Protocol proto, QString *reason)
 {
     if (!GpgME::checkEngine(proto)) {
@@ -206,3 +212,11 @@ QGpgME::Protocol *QGpgME::smime()
     }
     return gpgmeBackend->smime();
 }
+
+QGpgME::GpgCardJob *QGpgME::gpgCardJob ()
+{
+    if (!gpgmeBackend) {
+        gpgmeBackend = new QGpgME::QGpgMEBackend();
+    }
+    return gpgmeBackend->gpgCardJob();
+}
index a69b09a..6c655e9 100644 (file)
@@ -46,6 +46,7 @@ namespace QGpgME
 {
 class CryptoConfig;
 class Protocol;
+class GpgCardJob;
 
 
 class QGpgMEBackend
@@ -58,6 +59,7 @@ public:
     QString displayName() const;
 
     CryptoConfig *config() const;
+    GpgCardJob *gpgCardJob() const;
 
     Protocol *openpgp() const;
     Protocol *smime() const;
index 9b3f73d..5f9a8ab 100644 (file)
@@ -46,7 +46,7 @@
 #include "data.h"
 
 #include <QDebug>
-#include "gpgme_backend_debug.h"
+#include "qgpgme_debug.h"
 
 #include <QBuffer>
 
@@ -68,7 +68,7 @@ static QGpgMEDecryptVerifyJob::result_type decrypt_verify(Context *ctx, QThread
                                                           const std::weak_ptr<QIODevice> &plainText_)
 {
 
-    qCDebug(GPGPME_BACKEND_LOG);
+    qCDebug(QGPGME_LOG);
 
     const std::shared_ptr<QIODevice> cipherText = cipherText_.lock();
     const std::shared_ptr<QIODevice> plainText = plainText_.lock();
@@ -86,7 +86,7 @@ static QGpgMEDecryptVerifyJob::result_type decrypt_verify(Context *ctx, QThread
         const std::pair<DecryptionResult, VerificationResult> res = ctx->decryptAndVerify(indata, outdata);
         Error ae;
         const QString log = _detail::audit_log_as_html(ctx, ae);
-        qCDebug(GPGPME_BACKEND_LOG) << "End no plainText. Error: " << ae;
+        qCDebug(QGPGME_LOG) << "End no plainText. Error: " << ae;
         return std::make_tuple(res.first, res.second, out.data(), log, ae);
     } else {
         QGpgME::QIODeviceDataProvider out(plainText);
@@ -95,7 +95,7 @@ static QGpgMEDecryptVerifyJob::result_type decrypt_verify(Context *ctx, QThread
         const std::pair<DecryptionResult, VerificationResult> res = ctx->decryptAndVerify(indata, outdata);
         Error ae;
         const QString log = _detail::audit_log_as_html(ctx, ae);
-        qCDebug(GPGPME_BACKEND_LOG) << "End plainText. Error: " << ae;
+        qCDebug(QGPGME_LOG) << "End plainText. Error: " << ae;
         return std::make_tuple(res.first, res.second, QByteArray(), log, ae);
     }
 
index e2ce1f9..bf3297a 100644 (file)
@@ -52,14 +52,15 @@ using namespace QGpgME;
 using namespace GpgME;
 
 QGpgMEExportJob::QGpgMEExportJob(Context *context)
-    : mixin_type(context)
+    : mixin_type(context),
+      m_flags(0)
 {
     lateInitialization();
 }
 
 QGpgMEExportJob::~QGpgMEExportJob() {}
 
-static QGpgMEExportJob::result_type export_qba(Context *ctx, const QStringList &patterns)
+static QGpgMEExportJob::result_type export_qba(Context *ctx, const QStringList &patterns, unsigned int flags)
 {
 
     const _detail::PatternConverter pc(patterns);
@@ -67,7 +68,7 @@ static QGpgMEExportJob::result_type export_qba(Context *ctx, const QStringList &
     QGpgME::QByteArrayDataProvider dp;
     Data data(&dp);
 
-    const Error err = ctx->exportPublicKeys(pc.patterns(), data);
+    const Error err = ctx->exportPublicKeys(pc.patterns(), data, flags);
     Error ae;
     const QString log = _detail::audit_log_as_html(ctx, ae);
     return std::make_tuple(err, dp.data(), log, ae);
@@ -75,7 +76,17 @@ static QGpgMEExportJob::result_type export_qba(Context *ctx, const QStringList &
 
 Error QGpgMEExportJob::start(const QStringList &patterns)
 {
-    run(std::bind(&export_qba, std::placeholders::_1, patterns));
+    run(std::bind(&export_qba, std::placeholders::_1, patterns, m_flags));
     return Error();
 }
+
+void QGpgMEExportJob::setExportFlags(unsigned int flags)
+{
+    m_flags = flags;
+}
+
+/* For ABI compat not pure virtual. */
+void ExportJob::setExportFlags(unsigned int)
+{
+}
 #include "qgpgmeexportjob.moc"
index d529fee..3f6bd0e 100644 (file)
@@ -59,7 +59,12 @@ public:
     ~QGpgMEExportJob();
 
     /* from ExportJob */
+    void setExportFlags (unsigned int flags) Q_DECL_OVERRIDE;
+
+    /* from ExportJob */
     GpgME::Error start(const QStringList &patterns) Q_DECL_OVERRIDE;
+private:
+    unsigned int m_flags;
 };
 
 }
diff --git a/lang/qt/src/qgpgmegpgcardjob.cpp b/lang/qt/src/qgpgmegpgcardjob.cpp
new file mode 100644 (file)
index 0000000..ae0bf72
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+    qgpgmegpgcardjob.cpp
+
+    This file is part of qgpgme, the Qt API binding for gpgme
+    Copyright (c) 2020 g10 Code GmbH
+
+    QGpgME is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.
+
+    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 "qgpgmegpgcardjob.h"
+
+#include <QStringList>
+#include <QFileInfo>
+#include <QDir>
+#include <QProcess>
+#include "util.h"
+#include "qgpgme_debug.h"
+
+/* We cannot have a timeout because key generation can
+ * take ages. Well maybe 10 minutes. */
+#define TIMEOUT_VALUE (600000)
+
+#include <tuple>
+
+using namespace GpgME;
+using namespace QGpgME;
+
+QGpgMEGpgCardJob::QGpgMEGpgCardJob()
+    : mixin_type(/* needed for the mixer */
+                 Context::createForEngine(GpgME::SpawnEngine).release())
+{
+    lateInitialization();
+}
+
+QGpgMEGpgCardJob::~QGpgMEGpgCardJob() {}
+
+static QString getGpgCardPath()
+{
+    auto bindir = QString::fromLocal8Bit(dirInfo("bindir"));
+    if (bindir.isEmpty()) {
+        return QString();
+    }
+
+    const QFileInfo fi(QDir(bindir).absoluteFilePath(QStringLiteral("gpg-card")));
+    if (fi.exists() && fi.isExecutable()) {
+        return fi.absoluteFilePath();
+    }
+    return QString();
+}
+
+static QGpgMEGpgCardJob::result_type do_work(const QStringList &cmds, const QString &path)
+{
+    QStringList args;
+    args << QStringLiteral("--with-colons");
+    args += cmds;
+
+    QProcess proc;
+
+    proc.setProgram(path);
+    proc.setArguments(args);
+
+    qCDebug(QGPGME_LOG) << "Executing:" << path << args;
+    proc.start();
+    if (!proc.waitForStarted()) {
+        return std::make_tuple (QString(), QString(), 1, QString(), Error());
+    }
+
+    if (!proc.waitForFinished(TIMEOUT_VALUE)) {
+        return std::make_tuple (QString(), QString(), 1, QString(), Error());
+    }
+    if (proc.exitStatus() == QProcess::NormalExit) {
+        return std::make_tuple (QString::fromUtf8(proc.readAllStandardOutput()),
+                                QString::fromUtf8(proc.readAllStandardError()), proc.exitCode(),
+                                QString(), Error());
+    }
+    return std::make_tuple (QString::fromUtf8(proc.readAllStandardOutput()),
+            QString::fromUtf8(proc.readAllStandardError()), 1,
+            QString(), Error());
+}
+
+Error QGpgMEGpgCardJob::start(const QStringList &cmds)
+{
+    const auto cardpath = getGpgCardPath ();
+    if (cardpath.isEmpty()) {
+        return Error(make_error(GPG_ERR_NOT_SUPPORTED));
+    }
+    run(std::bind(&do_work, cmds, cardpath));
+    return Error();
+}
+
+Error QGpgMEGpgCardJob::exec(const QStringList &cmds, QString &std_out, QString &std_err, int &exitCode)
+{
+    const auto cardpath = getGpgCardPath ();
+    if (cardpath.isEmpty()) {
+        return Error(make_error(GPG_ERR_NOT_SUPPORTED));
+    }
+    const result_type r = do_work(cmds, cardpath);
+    resultHook(r);
+    std_out = std::get<0>(r);
+    std_err = std::get<1>(r);
+    exitCode = std::get<2>(r);
+    return exitCode == 0 ? Error() : Error(make_error(GPG_ERR_GENERAL));
+}
+
+#include "qgpgmegpgcardjob.moc"
diff --git a/lang/qt/src/qgpgmegpgcardjob.h b/lang/qt/src/qgpgmegpgcardjob.h
new file mode 100644 (file)
index 0000000..bed68b2
--- /dev/null
@@ -0,0 +1,63 @@
+/*  qgpgmegpgcardjob.h
+
+    This file is part of libkleopatra, the KDE keymanagement library
+    Copyright (c) 2020 g10 Code GmbH
+
+    QGpgME is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.
+
+    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.
+*/
+
+#ifndef __QGPGME_QGPGMEGPGCARDJOB_H__
+#define __QGPGME_QGPGMEGPGCARDJOB_H__
+#include "gpgcardjob.h"
+
+#include "threadedjobmixin.h"
+
+namespace QGpgME
+{
+
+class QGpgMEGpgCardJob
+#ifdef Q_MOC_RUN
+    : public GpgCardJob
+#else
+    : public _detail::ThreadedJobMixin<GpgCardJob, std::tuple<QString, QString, int, QString, GpgME::Error> >
+#endif
+{
+    Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+    void slotFinished();
+#endif
+public:
+    explicit QGpgMEGpgCardJob();
+    ~QGpgMEGpgCardJob();
+
+    GpgME::Error start(const QStringList &cmds) Q_DECL_OVERRIDE;
+
+    GpgME::Error exec(const QStringList &cmds, QString &std_out, QString &std_err, int &exitCode) Q_DECL_OVERRIDE;
+};
+
+}
+#endif
index 070ab69..fba20fa 100644 (file)
@@ -39,7 +39,7 @@
 #include "qgpgmenewcryptoconfig.h"
 
 #include <QDebug>
-#include "gpgme_backend_debug.h"
+#include "qgpgme_debug.h"
 
 #include <QFile>
 #include <QDir>
@@ -101,14 +101,14 @@ void QGpgMENewCryptoConfig::reloadConfiguration(bool)
            << "components:\n";
         std::copy(components.begin(), components.end(),
                   std::ostream_iterator<Component>(ss, "\n"));
-        qCDebug(GPGPME_BACKEND_LOG) << ss.str().c_str();
+        qCDebug(QGPGME_LOG) << ss.str().c_str();
     }
 #endif
 #if 0
     TODO port?
     if (error && showErrors) {
         const QString wmsg = i18n("<qt>Failed to execute gpgconf:<p>%1</p></qt>", QString::fromLocal8Bit(error.asString()));
-        qCWarning(GPGPME_BACKEND_LOG) << wmsg; // to see it from test_cryptoconfig.cpp
+        qCWarning(QGPGME_LOG) << wmsg; // to see it from test_cryptoconfig.cpp
         KMessageBox::error(0, wmsg);
     }
 #endif
@@ -183,7 +183,7 @@ void QGpgMENewCryptoConfigComponent::setComponent(const Component &component)
         group->m_entryNames.push_back(name);
         group->m_entriesByName[name] = entry;
     } else {
-        qCWarning(GPGPME_BACKEND_LOG) << "found no group for entry" << o.name() << "of component" << name();
+        qCWarning(QGPGME_LOG) << "found no group for entry" << o.name() << "of component" << name();
     }
     if (group) {
         m_groupsByName[group->name()] = group;
@@ -222,7 +222,7 @@ void QGpgMENewCryptoConfigComponent::sync(bool runtime)
 {
     Q_UNUSED(runtime) // runtime is always set by engine_gpgconf
     if (const Error err = m_component.save()) {
-        qCWarning(GPGPME_BACKEND_LOG) << ":"
+        qCWarning(QGPGME_LOG) << ":"
             << "Error from gpgconf while saving configuration: %1"
             << QString::fromLocal8Bit(err.asString());
     }
@@ -279,7 +279,7 @@ static QString urlpart_encode(const QString &str)
     QString enc(str);
     enc.replace(QLatin1Char('%'), QStringLiteral("%25"));   // first!
     enc.replace(QLatin1Char(':'), QStringLiteral("%3a"));
-    //qCDebug(GPGPME_BACKEND_LOG) <<"  urlpart_encode:" << str <<" ->" << enc;
+    //qCDebug(QGPGME_LOG) <<"  urlpart_encode:" << str <<" ->" << enc;
     return enc;
 }
 
@@ -326,7 +326,7 @@ QVariant QGpgMENewCryptoConfigEntry::stringToValue(const QString &str, bool unes
             bool ok = true;
             const QVariant v = str.isEmpty() ? 0U : str.toUInt(&ok);
             if (!ok) {
-                qCWarning(GPGPME_BACKEND_LOG) << "list-of-none should have an unsigned int as value:" << str;
+                qCWarning(QGPGME_LOG) << "list-of-none should have an unsigned int as value:" << str;
             }
             return v;
         }
@@ -340,7 +340,7 @@ QVariant QGpgMENewCryptoConfigEntry::stringToValue(const QString &str, bool unes
                     continue;
                 } else if (unescape) {
                     if (val[0] != '"') { // see README.gpgconf
-                        qCWarning(GPGPME_BACKEND_LOG) << "String value should start with '\"' :" << val;
+                        qCWarning(QGPGME_LOG) << "String value should start with '\"' :" << val;
                     }
                     val = val.mid(1);
                 }
@@ -355,7 +355,7 @@ QVariant QGpgMENewCryptoConfigEntry::stringToValue(const QString &str, bool unes
                 return QVariant(QString());    // not set  [ok with lists too?]
             } else if (unescape) {
                 if (val[0] != '"') { // see README.gpgconf
-                    qCWarning(GPGPME_BACKEND_LOG) << "String value should start with '\"' :" << val;
+                    qCWarning(QGPGME_LOG) << "String value should start with '\"' :" << val;
                 }
                 val = val.mid(1);
             }
@@ -369,7 +369,7 @@ QGpgMENewCryptoConfigEntry::~QGpgMENewCryptoConfigEntry()
 {
 #ifndef NDEBUG
     if (!s_duringClear && m_option.dirty())
-        qCWarning(GPGPME_BACKEND_LOG) << "Deleting a QGpgMENewCryptoConfigEntry that was modified (" << m_option.description() << ")"
+        qCWarning(QGPGME_LOG) << "Deleting a QGpgMENewCryptoConfigEntry that was modified (" << m_option.description() << ")"
                                       << "You forgot to call sync() (to commit) or clear() (to discard)";
 #endif
 }
@@ -480,7 +480,7 @@ static QUrl parseURL(int mRealArgType, const QString &str)
             if (ok) {
                 url.setPort(port);
             } else if (!it->isEmpty()) {
-                qCWarning(GPGPME_BACKEND_LOG) << "parseURL: malformed LDAP server port, ignoring: \"" << *it << "\"";
+                qCWarning(QGPGME_LOG) << "parseURL: malformed LDAP server port, ignoring: \"" << *it << "\"";
             }
 
             const QString userName = urlpart_decode(*it++);
@@ -494,7 +494,7 @@ static QUrl parseURL(int mRealArgType, const QString &str)
             url.setQuery(urlpart_decode(*it));
             return url;
         } else {
-            qCWarning(GPGPME_BACKEND_LOG) << "parseURL: malformed LDAP server:" << str;
+            qCWarning(QGPGME_LOG) << "parseURL: malformed LDAP server:" << str;
         }
     }
     // other URLs : assume wellformed URL syntax.
@@ -700,7 +700,7 @@ QString QGpgMENewCryptoConfigEntry::toString(bool escape) const
                 }
             }
             QString res = lst.join(",");
-            //qCDebug(GPGPME_BACKEND_LOG) <<"toString:" << res;
+            //qCDebug(QGPGME_LOG) <<"toString:" << res;
             return res;
         } else { // normal string
             QString res = mValue.toString();
index ae862e0..5f78f2a 100644 (file)
@@ -41,7 +41,7 @@
 #include "qgpgmerefreshkeysjob.h"
 
 #include <QDebug>
-#include "gpgme_backend_debug.h"
+#include "qgpgme_debug.h"
 
 #include "context.h"
 
@@ -157,18 +157,18 @@ void QGpgME::QGpgMERefreshKeysJob::slotStatus(QProcess *proc, const QString &typ
     if (type == QLatin1String("ERROR")) {
 
         if (args.size() < 2) {
-            qCDebug(GPGPME_BACKEND_LOG) << "not recognising ERROR with < 2 args!";
+            qCDebug(QGPGME_LOG) << "not recognising ERROR with < 2 args!";
             return;
         }
         const int source = (*++it).toInt(&ok);
         if (!ok) {
-            qCDebug(GPGPME_BACKEND_LOG) << "expected number for first ERROR arg, got something else";
+            qCDebug(QGPGME_LOG) << "expected number for first ERROR arg, got something else";
             return;
         }
         ok = false;
         const int code = (*++it).toInt(&ok);
         if (!ok) {
-            qCDebug(GPGPME_BACKEND_LOG) << "expected number for second ERROR arg, got something else";
+            qCDebug(QGPGME_LOG) << "expected number for second ERROR arg, got something else";
             return;
         }
         mError = GpgME::Error::fromCode(code, source);
@@ -176,26 +176,26 @@ void QGpgME::QGpgMERefreshKeysJob::slotStatus(QProcess *proc, const QString &typ
     } else if (type == QLatin1String("PROGRESS")) {
 
         if (args.size() < 4) {
-            qCDebug(GPGPME_BACKEND_LOG) << "not recognising PROGRESS with < 4 args!";
+            qCDebug(QGPGME_LOG) << "not recognising PROGRESS with < 4 args!";
             return;
         }
         const QString what = *++it;
         ok = false;
         (*++it).toInt(&ok);
         if (!ok) {
-            qCDebug(GPGPME_BACKEND_LOG) << "expected number for \"type\", got something else";
+            qCDebug(QGPGME_LOG) << "expected number for \"type\", got something else";
             return;
         }
         ok = false;
         const int cur = (*++it).toInt(&ok);
         if (!ok) {
-            qCDebug(GPGPME_BACKEND_LOG) << "expected number for \"cur\", got something else";
+            qCDebug(QGPGME_LOG) << "expected number for \"cur\", got something else";
             return;
         }
         ok = false;
         const int total = (*++it).toInt(&ok);
         if (!ok) {
-            qCDebug(GPGPME_BACKEND_LOG) << "expected number for \"total\", got something else";
+            qCDebug(QGPGME_LOG) << "expected number for \"total\", got something else";
             return;
         }
         // TODO port
index d77a50a..d472bc4 100644 (file)
@@ -39,7 +39,7 @@
 #include "qgpgmesecretkeyexportjob.h"
 
 #include <QDebug>
-#include "gpgme_backend_debug.h"
+#include "qgpgme_debug.h"
 
 #include "context.h"
 #include "data.h"
index 2befe53..1d36d95 100644 (file)
@@ -57,14 +57,17 @@ QGpgMESignKeyJob::QGpgMESignKeyJob(Context *context)
       m_checkLevel(0),
       m_exportable(false),
       m_nonRevocable(false),
-      m_started(false)
+      m_started(false),
+      m_dupeOk(false)
 {
     lateInitialization();
 }
 
 QGpgMESignKeyJob::~QGpgMESignKeyJob() {}
 
-static QGpgMESignKeyJob::result_type sign_key(Context *ctx, const Key &key, const std::vector<unsigned int> &uids, unsigned int checkLevel, const Key &signer, unsigned int opts)
+static QGpgMESignKeyJob::result_type sign_key(Context *ctx, const Key &key, const std::vector<unsigned int> &uids,
+                                              unsigned int checkLevel, const Key &signer, unsigned int opts,
+                                              bool dupeOk, const QString &remark)
 {
     QGpgME::QByteArrayDataProvider dp;
     Data data(&dp);
@@ -73,6 +76,16 @@ static QGpgMESignKeyJob::result_type sign_key(Context *ctx, const Key &key, cons
     skei->setUserIDsToSign(uids);
     skei->setCheckLevel(checkLevel);
     skei->setSigningOptions(opts);
+    skei->setKey(key);
+
+    if (dupeOk) {
+        ctx->setFlag("extended-edit", "1");
+        skei->setDupeOk(true);
+    }
+
+    if (!remark.isNull()) {
+        ctx->addSignatureNotation("rem@gnupg.org", remark.toUtf8().constData());
+    }
 
     if (!signer.isNull())
         if (const Error err = ctx->addSigningKey(signer)) {
@@ -93,7 +106,8 @@ Error QGpgMESignKeyJob::start(const Key &key)
     if (m_exportable) {
         opts |= GpgSignKeyEditInteractor::Exportable;
     }
-    run(std::bind(&sign_key, std::placeholders::_1, key, m_userIDsToSign, m_checkLevel, m_signingKey, opts));
+    run(std::bind(&sign_key, std::placeholders::_1, key, m_userIDsToSign, m_checkLevel, m_signingKey, opts,
+                  m_dupeOk, m_remark));
     m_started = true;
     return Error();
 }
@@ -127,4 +141,16 @@ void QGpgMESignKeyJob::setNonRevocable(bool nonRevocable)
     assert(!m_started);
     m_nonRevocable = nonRevocable;
 }
+
+void QGpgMESignKeyJob::setRemark(const QString &remark)
+{
+    assert(!m_started);
+    m_remark = remark;
+}
+
+void QGpgMESignKeyJob::setDupeOk(bool value)
+{
+    assert(!m_started);
+    m_dupeOk = value;
+}
 #include "qgpgmesignkeyjob.moc"
index 3b31191..9c19c02 100644 (file)
@@ -39,6 +39,8 @@
 
 #include "threadedjobmixin.h"
 
+#include <QString>
+
 #ifdef BUILDING_QGPGME
 # include "key.h"
 #else
@@ -82,6 +84,12 @@ public:
     /* from SignKeyJob */
     void setNonRevocable(bool nonRevocable) Q_DECL_OVERRIDE;
 
+    /* from SignKeyJob */
+    void setRemark(const QString &remark) Q_DECL_OVERRIDE;
+
+    /* from SignKeyJob */
+    void setDupeOk(bool value) Q_DECL_OVERRIDE;
+
 private:
     std::vector<unsigned int> m_userIDsToSign;
     GpgME::Key m_signingKey;
@@ -89,6 +97,8 @@ private:
     bool m_exportable;
     bool m_nonRevocable;
     bool m_started;
+    bool m_dupeOk;
+    QString m_remark;
 };
 }
 
index 7a7800d..e3ae75f 100644 (file)
@@ -45,6 +45,8 @@ class Error;
 class Key;
 }
 
+class QString;
+
 namespace QGpgME
 {
 
@@ -109,6 +111,22 @@ public:
      */
     virtual void setNonRevocable(bool nonRevocable) = 0;
 
+    /**
+     * Set this if it is ok to overwrite an existing signature. In that
+     * case the context has to have the flag "extended-edit" set to 1 through
+     * Context::setFlag before calling edit.
+     *
+     * Not pure virtual for ABI compatibility.
+     **/
+    virtual void setDupeOk(bool) {};
+
+    /**
+     * Add a remark to the signature. This uses rem@gnupg.org as a notation.
+     *
+     * Not pure virtual for ABI compatibility.
+     **/
+    virtual void setRemark(const QString &) {};
+
 Q_SIGNALS:
     void result(const GpgME::Error &result, const QString &auditLogAsHtml = QString(), const GpgME::Error &auditLogError = GpgME::Error());
 };
index f75d64c..ace5082 100644 (file)
@@ -27,11 +27,11 @@ TESTS_ENVIRONMENT = GNUPGHOME=$(GNUPGHOME)
 EXTRA_DIST = initial.test
 
 TESTS = initial.test t-keylist t-keylocate t-ownertrust t-tofuinfo \
-        t-encrypt t-verify t-various t-config
+        t-encrypt t-verify t-various t-config t-remarks
 
 moc_files = t-keylist.moc t-keylocate.moc t-ownertrust.moc t-tofuinfo.moc \
             t-encrypt.moc t-support.hmoc t-wkspublish.moc t-verify.moc \
-            t-various.moc t-config.moc
+            t-various.moc t-config.moc t-remarks.moc
 
 AM_LDFLAGS = -no-install
 
@@ -56,6 +56,7 @@ t_wkspublish_SOURCES = t-wkspublish.cpp $(support_src)
 t_verify_SOURCES = t-verify.cpp $(support_src)
 t_various_SOURCES = t-various.cpp $(support_src)
 t_config_SOURCES = t-config.cpp $(support_src)
+t_remarks_SOURCES = t-remarks.cpp $(support_src)
 run_keyformailboxjob_SOURCES = run-keyformailboxjob.cpp
 
 nodist_t_keylist_SOURCES = $(moc_files)
@@ -63,7 +64,7 @@ nodist_t_keylist_SOURCES = $(moc_files)
 BUILT_SOURCES = $(moc_files) pubring-stamp
 
 noinst_PROGRAMS = t-keylist t-keylocate t-ownertrust t-tofuinfo t-encrypt \
-    run-keyformailboxjob t-wkspublish t-verify t-various t-config
+    run-keyformailboxjob t-wkspublish t-verify t-various t-config t-remarks
 
 CLEANFILES = secring.gpg pubring.gpg pubring.kbx trustdb.gpg dirmngr.conf \
        gpg-agent.conf pubring.kbx~ S.gpg-agent gpg.conf pubring.gpg~ \
index 801e2d8..dd7f342 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -109,11 +109,13 @@ build_triplet = @build@
 host_triplet = @host@
 TESTS = initial.test t-keylist$(EXEEXT) t-keylocate$(EXEEXT) \
        t-ownertrust$(EXEEXT) t-tofuinfo$(EXEEXT) t-encrypt$(EXEEXT) \
-       t-verify$(EXEEXT) t-various$(EXEEXT) t-config$(EXEEXT)
+       t-verify$(EXEEXT) t-various$(EXEEXT) t-config$(EXEEXT) \
+       t-remarks$(EXEEXT)
 noinst_PROGRAMS = t-keylist$(EXEEXT) t-keylocate$(EXEEXT) \
        t-ownertrust$(EXEEXT) t-tofuinfo$(EXEEXT) t-encrypt$(EXEEXT) \
        run-keyformailboxjob$(EXEEXT) t-wkspublish$(EXEEXT) \
-       t-verify$(EXEEXT) t-various$(EXEEXT) t-config$(EXEEXT)
+       t-verify$(EXEEXT) t-various$(EXEEXT) t-config$(EXEEXT) \
+       t-remarks$(EXEEXT)
 subdir = lang/qt/tests
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
@@ -173,6 +175,11 @@ t_ownertrust_OBJECTS = $(am_t_ownertrust_OBJECTS)
 t_ownertrust_LDADD = $(LDADD)
 t_ownertrust_DEPENDENCIES = ../../cpp/src/libgpgmepp.la \
        ../src/libqgpgme.la ../../../src/libgpgme.la
+am_t_remarks_OBJECTS = t-remarks.$(OBJEXT) $(am__objects_1)
+t_remarks_OBJECTS = $(am_t_remarks_OBJECTS)
+t_remarks_LDADD = $(LDADD)
+t_remarks_DEPENDENCIES = ../../cpp/src/libgpgmepp.la \
+       ../src/libqgpgme.la ../../../src/libgpgme.la
 am_t_tofuinfo_OBJECTS = t-tofuinfo.$(OBJEXT) $(am__objects_1)
 t_tofuinfo_OBJECTS = $(am_t_tofuinfo_OBJECTS)
 t_tofuinfo_LDADD = $(LDADD)
@@ -207,7 +214,14 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/run-keyformailboxjob.Po \
+       ./$(DEPDIR)/t-config.Po ./$(DEPDIR)/t-encrypt.Po \
+       ./$(DEPDIR)/t-keylist.Po ./$(DEPDIR)/t-keylocate.Po \
+       ./$(DEPDIR)/t-ownertrust.Po ./$(DEPDIR)/t-remarks.Po \
+       ./$(DEPDIR)/t-support.Po ./$(DEPDIR)/t-tofuinfo.Po \
+       ./$(DEPDIR)/t-various.Po ./$(DEPDIR)/t-verify.Po \
+       ./$(DEPDIR)/t-wkspublish.Po
 am__mv = mv -f
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
@@ -248,13 +262,14 @@ am__v_CCLD_1 =
 SOURCES = $(run_keyformailboxjob_SOURCES) $(t_config_SOURCES) \
        $(t_encrypt_SOURCES) $(t_keylist_SOURCES) \
        $(nodist_t_keylist_SOURCES) $(t_keylocate_SOURCES) \
-       $(t_ownertrust_SOURCES) $(t_tofuinfo_SOURCES) \
-       $(t_various_SOURCES) $(t_verify_SOURCES) \
+       $(t_ownertrust_SOURCES) $(t_remarks_SOURCES) \
+       $(t_tofuinfo_SOURCES) $(t_various_SOURCES) $(t_verify_SOURCES) \
        $(t_wkspublish_SOURCES)
 DIST_SOURCES = $(run_keyformailboxjob_SOURCES) $(t_config_SOURCES) \
        $(t_encrypt_SOURCES) $(t_keylist_SOURCES) \
        $(t_keylocate_SOURCES) $(t_ownertrust_SOURCES) \
-       $(t_tofuinfo_SOURCES) $(t_various_SOURCES) $(t_verify_SOURCES) \
+       $(t_remarks_SOURCES) $(t_tofuinfo_SOURCES) \
+       $(t_various_SOURCES) $(t_verify_SOURCES) \
        $(t_wkspublish_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
@@ -495,6 +510,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -509,7 +525,7 @@ TESTS_ENVIRONMENT = GNUPGHOME=$(GNUPGHOME)
 EXTRA_DIST = initial.test
 moc_files = t-keylist.moc t-keylocate.moc t-ownertrust.moc t-tofuinfo.moc \
             t-encrypt.moc t-support.hmoc t-wkspublish.moc t-verify.moc \
-            t-various.moc t-config.moc
+            t-various.moc t-config.moc t-remarks.moc
 
 AM_LDFLAGS = -no-install
 LDADD = ../../cpp/src/libgpgmepp.la ../src/libqgpgme.la \
@@ -532,6 +548,7 @@ t_wkspublish_SOURCES = t-wkspublish.cpp $(support_src)
 t_verify_SOURCES = t-verify.cpp $(support_src)
 t_various_SOURCES = t-various.cpp $(support_src)
 t_config_SOURCES = t-config.cpp $(support_src)
+t_remarks_SOURCES = t-remarks.cpp $(support_src)
 run_keyformailboxjob_SOURCES = run-keyformailboxjob.cpp
 nodist_t_keylist_SOURCES = $(moc_files)
 BUILT_SOURCES = $(moc_files) pubring-stamp
@@ -562,8 +579,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -608,6 +625,10 @@ t-ownertrust$(EXEEXT): $(t_ownertrust_OBJECTS) $(t_ownertrust_DEPENDENCIES) $(EX
        @rm -f t-ownertrust$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(t_ownertrust_OBJECTS) $(t_ownertrust_LDADD) $(LIBS)
 
+t-remarks$(EXEEXT): $(t_remarks_OBJECTS) $(t_remarks_DEPENDENCIES) $(EXTRA_t_remarks_DEPENDENCIES) 
+       @rm -f t-remarks$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(t_remarks_OBJECTS) $(t_remarks_LDADD) $(LIBS)
+
 t-tofuinfo$(EXEEXT): $(t_tofuinfo_OBJECTS) $(t_tofuinfo_DEPENDENCIES) $(EXTRA_t_tofuinfo_DEPENDENCIES) 
        @rm -f t-tofuinfo$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(t_tofuinfo_OBJECTS) $(t_tofuinfo_LDADD) $(LIBS)
@@ -630,17 +651,24 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-keyformailboxjob.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-config.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylocate.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-ownertrust.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-support.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-tofuinfo.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-various.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-verify.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-wkspublish.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-keyformailboxjob.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-config.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylocate.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-ownertrust.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-remarks.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-support.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-tofuinfo.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-various.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-verify.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-wkspublish.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .cpp.o:
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -814,7 +842,10 @@ check-TESTS: $(TESTS)
          test "$$failed" -eq 0; \
        else :; fi
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -889,7 +920,18 @@ clean-am: clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
        mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/run-keyformailboxjob.Po
+       -rm -f ./$(DEPDIR)/t-config.Po
+       -rm -f ./$(DEPDIR)/t-encrypt.Po
+       -rm -f ./$(DEPDIR)/t-keylist.Po
+       -rm -f ./$(DEPDIR)/t-keylocate.Po
+       -rm -f ./$(DEPDIR)/t-ownertrust.Po
+       -rm -f ./$(DEPDIR)/t-remarks.Po
+       -rm -f ./$(DEPDIR)/t-support.Po
+       -rm -f ./$(DEPDIR)/t-tofuinfo.Po
+       -rm -f ./$(DEPDIR)/t-various.Po
+       -rm -f ./$(DEPDIR)/t-verify.Po
+       -rm -f ./$(DEPDIR)/t-wkspublish.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -935,7 +977,18 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/run-keyformailboxjob.Po
+       -rm -f ./$(DEPDIR)/t-config.Po
+       -rm -f ./$(DEPDIR)/t-encrypt.Po
+       -rm -f ./$(DEPDIR)/t-keylist.Po
+       -rm -f ./$(DEPDIR)/t-keylocate.Po
+       -rm -f ./$(DEPDIR)/t-ownertrust.Po
+       -rm -f ./$(DEPDIR)/t-remarks.Po
+       -rm -f ./$(DEPDIR)/t-support.Po
+       -rm -f ./$(DEPDIR)/t-tofuinfo.Po
+       -rm -f ./$(DEPDIR)/t-various.Po
+       -rm -f ./$(DEPDIR)/t-verify.Po
+       -rm -f ./$(DEPDIR)/t-wkspublish.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -956,19 +1009,19 @@ uninstall-am:
 
 .MAKE: all check check-am install install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
-       clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
-       cscopelist-am ctags ctags-am distclean distclean-compile \
-       distclean-generic distclean-libtool distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags tags-am uninstall uninstall-am
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+       check-am clean clean-generic clean-libtool clean-local \
+       clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
index afbb4d1..9ec9566 100644 (file)
@@ -50,36 +50,6 @@ class CryptoConfigTest: public QGpgMETest
     Q_OBJECT
 
 private Q_SLOTS:
-    void testKeyserver()
-    {
-        // Repeatedly set a config value and clear it
-        // this was broken at some point so it gets a
-        // unit test.
-        for (int i = 0; i < 10; i++) {
-            auto conf = cryptoConfig();
-            QVERIFY(conf);
-            auto entry = conf->entry(QStringLiteral("gpg"),
-                    QStringLiteral("Keyserver"),
-                    QStringLiteral("keyserver"));
-            QVERIFY(entry);
-            const QString url(QStringLiteral("hkp://foo.bar.baz"));
-            entry->setStringValue(url);
-            conf->sync(false);
-            conf->clear();
-            entry = conf->entry(QStringLiteral("gpg"),
-                    QStringLiteral("Keyserver"),
-                    QStringLiteral("keyserver"));
-            QCOMPARE (entry->stringValue(), url);
-            entry->setStringValue(QString());
-            conf->sync(false);
-            conf->clear();
-            entry = conf->entry(QStringLiteral("gpg"),
-                    QStringLiteral("Keyserver"),
-                    QStringLiteral("keyserver"));
-            QCOMPARE (entry->stringValue(), QString());
-        }
-    }
-
     void testDefault()
     {
         if (GpgME::engineInfo(GpgME::GpgEngine).engineVersion() < "2.2.0") {
index f25da31..9ad1033 100644 (file)
 using namespace QGpgME;
 using namespace GpgME;
 
-static bool decryptSupported()
-{
-    /* With GnuPG 2.0.x (at least 2.0.26 by default on jessie)
-     * the passphrase_cb does not work. So the test popped up
-     * a pinentry. So tests requiring decryption don't work. */
-    static auto version = GpgME::engineInfo(GpgME::GpgEngine).engineVersion();
-    if (version < "2.0.0") {
-        /* With 1.4 it just works */
-        return true;
-    }
-    if (version < "2.1.0") {
-        /* With 2.1 it works with loopback mode */
-        return false;
-    }
-    return true;
-}
+
 
 class EncryptionTest : public QGpgMETest
 {
@@ -103,7 +88,7 @@ private Q_SLOTS:
         QVERIFY(cipherString.startsWith("-----BEGIN PGP MESSAGE-----"));
 
         /* Now decrypt */
-        if (!decryptSupported()) {
+        if (!loopbackSupported()) {
             return;
         }
         auto decJob = openpgp()->decryptJob();
@@ -174,7 +159,7 @@ private Q_SLOTS:
 
     void testSymmetricEncryptDecrypt()
     {
-        if (!decryptSupported()) {
+        if (!loopbackSupported()) {
             return;
         }
         auto job = openpgp()->encryptJob();
@@ -207,7 +192,7 @@ private Q_SLOTS:
     void testEncryptDecryptNowrap()
     {
         /* Now decrypt */
-        if (!decryptSupported()) {
+        if (!loopbackSupported()) {
             return;
         }
         auto listjob = openpgp()->keyListJob(false, false, false);
@@ -235,7 +220,7 @@ private Q_SLOTS:
         QVERIFY(cipherString.startsWith("-----BEGIN PGP MESSAGE-----"));
 
         /* Now decrypt */
-        if (!decryptSupported()) {
+        if (!loopbackSupported()) {
             return;
         }
 
@@ -272,7 +257,7 @@ private:
      * So this test is disabled until gnupg(?) is fixed for this. */
     void testMixedEncryptDecrypt()
     {
-        if (!decryptSupported()) {
+        if (!loopbackSupported()) {
             return;
         }
         auto listjob = openpgp()->keyListJob(false, false, false);
diff --git a/lang/qt/tests/t-remarks.cpp b/lang/qt/tests/t-remarks.cpp
new file mode 100644 (file)
index 0000000..8597372
--- /dev/null
@@ -0,0 +1,516 @@
+/* t-remarks.cpp
+
+    This file is part of qgpgme, the Qt API binding for gpgme
+    Copyright (c) 2017 by Bundesamt für Sicherheit in der Informationstechnik
+    Software engineering by Intevation GmbH
+
+    QGpgME is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.
+
+    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 <QDebug>
+#include <QTest>
+#include <QSignalSpy>
+#include <QTemporaryDir>
+#include "keylistjob.h"
+#include "protocol.h"
+#include "signkeyjob.h"
+#include "context.h"
+
+#include "t-support.h"
+
+using namespace QGpgME;
+using namespace GpgME;
+
+class TestRemarks: public QGpgMETest
+{
+    Q_OBJECT
+
+Q_SIGNALS:
+    void asyncDone();
+
+public:
+    // This test is disabled (no slot) because the behavior
+    // is not clearly defined. Better to prevent that
+    // case in the UI
+    void testRemarkOwnKey()
+    {
+        if (!loopbackSupported()) {
+            return;
+        }
+        // Get the signing key (alfa)
+        auto ctx = Context::create(OpenPGP);
+        QVERIFY (ctx);
+        Error err;
+        auto seckey = ctx->key("A0FF4590BB6122EDEF6E3C542D727CC768697734", err, true);
+        QVERIFY (!seckey.isNull());
+        QVERIFY (!err);
+
+        // Create the job
+        auto job = openpgp()->signKeyJob();
+        QVERIFY (job);
+
+        // Hack in the passphrase provider
+        auto jobCtx = Job::context(job);
+        TestPassphraseProvider provider;
+        jobCtx->setPassphraseProvider(&provider);
+        jobCtx->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the job
+        job->setExportable(false);
+        std::vector<unsigned int> uids;
+        uids.push_back(0);
+        job->setUserIDsToSign(uids);
+        job->setSigningKey(seckey);
+        job->setRemark(QStringLiteral("Just GNU it!"));
+        job->setDupeOk(true);
+
+        connect(job, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                        const QString,
+                                                        const GpgME::Error) {
+            Q_EMIT asyncDone();
+            if (err2) {
+                qDebug() << "Error: " << err2.asString();
+            }
+            QVERIFY(err2);
+        });
+
+        job->start(seckey);
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+    }
+
+
+private Q_SLOTS:
+
+    void testRemarkReplaceSingleUIDExportable()
+    {
+        if (!loopbackSupported()) {
+            return;
+        }
+        // Get the signing key (alfa)
+        auto ctx = Context::create(OpenPGP);
+        QVERIFY (ctx);
+        Error err;
+        auto seckey = ctx->key("A0FF4590BB6122EDEF6E3C542D727CC768697734", err, true);
+        QVERIFY (!seckey.isNull());
+        QVERIFY (!err);
+
+        // Get the target key (tango)
+        auto target = ctx->key("ECAC774F4EEEB0620767044A58CB9A4C85A81F38", err, false);
+        QVERIFY (!target.isNull());
+        QVERIFY (!err);
+        QVERIFY (target.numUserIDs());
+
+        // Create the job
+        auto job = openpgp()->signKeyJob();
+        QVERIFY (job);
+
+        // Hack in the passphrase provider
+        auto jobCtx = Job::context(job);
+        TestPassphraseProvider provider;
+        jobCtx->setPassphraseProvider(&provider);
+        jobCtx->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the job
+        job->setExportable(true);
+        std::vector<unsigned int> uids;
+        uids.push_back(0);
+        job->setUserIDsToSign(uids);
+        job->setSigningKey(seckey);
+        job->setRemark(QStringLiteral("The quick brown fox jumps over the lazy dog"));
+
+        connect(job, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                        const QString,
+                                                        const GpgME::Error) {
+            Q_EMIT asyncDone();
+            QVERIFY(!err2);
+        });
+
+        job->start(target);
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+
+        // At this point the remark should have been added.
+        target.update();
+        const char *remark = target.userID(0).remark(seckey, err);
+        QVERIFY(!err);
+        QVERIFY(remark);
+        QCOMPARE(QString::fromUtf8(remark), QStringLiteral("The quick brown fox "
+                                                           "jumps over the lazy dog"));
+
+        // Now replace the remark
+        auto job3 = openpgp()->signKeyJob();
+        QVERIFY (job3);
+
+        // Hack in the passphrase provider
+        auto jobCtx3 = Job::context(job3);
+        jobCtx3->setPassphraseProvider(&provider);
+        jobCtx3->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the job
+        job3->setExportable(false);
+        job3->setUserIDsToSign(uids);
+        job3->setSigningKey(seckey);
+        job3->setDupeOk(true);
+        job3->setRemark(QStringLiteral("The quick brown fox fails to jump over Frodo"));
+
+        connect(job3, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                         const QString,
+                                                         const GpgME::Error) {
+            Q_EMIT asyncDone();
+            QVERIFY(!err2);
+        });
+
+        job3->start(target);
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+
+        target.update();
+        remark = target.userID(0).remark(seckey, err);
+        QVERIFY(!err);
+        QVERIFY(remark);
+        QCOMPARE(QString::fromUtf8(remark), QStringLiteral("The quick brown fox fails "
+                                                           "to jump over Frodo"));
+    }
+
+
+    void testMultipleRemarks()
+    {
+        if (!loopbackSupported()) {
+            return;
+        }
+        // Get the signing key1 (alfa)
+        auto ctx = Context::create(OpenPGP);
+        QVERIFY (ctx);
+        Error err;
+        auto alpha = ctx->key("A0FF4590BB6122EDEF6E3C542D727CC768697734", err, true);
+        QVERIFY (!alpha.isNull());
+        QVERIFY (!err);
+
+        // Get the signing key2 (zulu)
+        auto zulu = ctx->key("23FD347A419429BACCD5E72D6BC4778054ACD246", err, true);
+        QVERIFY (!zulu.isNull());
+        QVERIFY (!err);
+
+        // Get the target key (victor)
+        auto target = ctx->key("E8143C489C8D41124DC40D0B47AF4B6961F04784", err, false);
+        QVERIFY (!target.isNull());
+        QVERIFY (!err);
+        QVERIFY (target.numUserIDs());
+
+        // Create the job
+        auto job = openpgp()->signKeyJob();
+        QVERIFY (job);
+
+        // Hack in the passphrase provider
+        auto jobCtx = Job::context(job);
+        TestPassphraseProvider provider;
+        jobCtx->setPassphraseProvider(&provider);
+        jobCtx->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the first job
+        job->setExportable(false);
+        std::vector<unsigned int> uids;
+        uids.push_back(0);
+        job->setUserIDsToSign(uids);
+        job->setSigningKey(alpha);
+        job->setRemark(QStringLiteral("String one"));
+
+        connect(job, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                        const QString,
+                                                        const GpgME::Error) {
+            Q_EMIT asyncDone();
+            QVERIFY(!err2);
+        });
+        job->start(target);
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+
+        // Now another remark from zulu
+        auto job3 = openpgp()->signKeyJob();
+        QVERIFY (job3);
+
+        // Hack in the passphrase provider
+        auto jobCtx3 = Job::context(job3);
+        jobCtx3->setPassphraseProvider(&provider);
+        jobCtx3->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the job
+        job3->setExportable(false);
+        job3->setUserIDsToSign(uids);
+        job3->setSigningKey(zulu);
+        job3->setDupeOk(true);
+        job3->setRemark(QStringLiteral("String two"));
+
+        connect(job3, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                         const QString,
+                                                         const GpgME::Error) {
+            Q_EMIT asyncDone();
+            QVERIFY(!err2);
+        });
+
+        job3->start(target);
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+
+        target.update();
+        std::vector<GpgME::Key> keys;
+        keys.push_back(alpha);
+        keys.push_back(zulu);
+
+        const auto remarks = target.userID(0).remarks(keys, err);
+
+        QVERIFY(!err);
+        QVERIFY(remarks.size() == 2);
+        QCOMPARE(remarks[0], std::string("String one"));
+        QCOMPARE(remarks[1], std::string("String two"));
+    }
+
+    void testRemarkReplaceSingleUID()
+    {
+        if (!loopbackSupported()) {
+            return;
+        }
+        // Get the signing key (alfa)
+        auto ctx = Context::create(OpenPGP);
+        QVERIFY (ctx);
+        Error err;
+        auto seckey = ctx->key("A0FF4590BB6122EDEF6E3C542D727CC768697734", err, true);
+        QVERIFY (!seckey.isNull());
+        QVERIFY (!err);
+
+        // Get the target key (xray)
+        auto target = ctx->key("04C1DF62EFA0EBB00519B06A8979A6C5567FB34A", err, false);
+        QVERIFY (!target.isNull());
+        QVERIFY (!err);
+        QVERIFY (target.numUserIDs());
+
+        // Create the job
+        auto job = openpgp()->signKeyJob();
+        QVERIFY (job);
+
+        // Hack in the passphrase provider
+        auto jobCtx = Job::context(job);
+        TestPassphraseProvider provider;
+        jobCtx->setPassphraseProvider(&provider);
+        jobCtx->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the job
+        job->setExportable(false);
+        std::vector<unsigned int> uids;
+        uids.push_back(0);
+        job->setUserIDsToSign(uids);
+        job->setSigningKey(seckey);
+        job->setRemark(QStringLiteral("The quick brown fox jumps over the lazy dog"));
+
+        connect(job, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                        const QString,
+                                                        const GpgME::Error) {
+            Q_EMIT asyncDone();
+            QVERIFY(!err2);
+        });
+
+        job->start(target);
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+
+        // At this point the remark should have been added.
+        target.update();
+        const char *remark = target.userID(0).remark(seckey, err);
+        QVERIFY(!err);
+        QVERIFY(remark);
+        QCOMPARE(QString::fromUtf8(remark), QStringLiteral("The quick brown fox "
+                                                           "jumps over the lazy dog"));
+
+        // Now replace the remark
+        auto job3 = openpgp()->signKeyJob();
+        QVERIFY (job3);
+
+        // Hack in the passphrase provider
+        auto jobCtx3 = Job::context(job3);
+        jobCtx3->setPassphraseProvider(&provider);
+        jobCtx3->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the job
+        job3->setExportable(false);
+        job3->setUserIDsToSign(uids);
+        job3->setSigningKey(seckey);
+        job3->setDupeOk(true);
+        job3->setRemark(QStringLiteral("The quick brown fox jumps over Frodo"));
+
+        connect(job3, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                         const QString,
+                                                         const GpgME::Error) {
+            Q_EMIT asyncDone();
+            QVERIFY(!err2);
+        });
+
+        job3->start(target);
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+
+        target.update();
+        remark = target.userID(0).remark(seckey, err);
+        QVERIFY(!err);
+        QVERIFY(remark);
+        QCOMPARE(QString::fromUtf8(remark), QStringLiteral("The quick brown fox "
+                                                            "jumps over Frodo"));
+    }
+
+    void testRemarkReplaceMultiUID()
+    {
+        if (!loopbackSupported()) {
+            return;
+        }
+        // Get the signing key (alfa)
+        auto ctx = Context::create(OpenPGP);
+        QVERIFY (ctx);
+        Error err;
+        auto seckey = ctx->key("A0FF4590BB6122EDEF6E3C542D727CC768697734", err, true);
+        QVERIFY (!seckey.isNull());
+        QVERIFY (!err);
+
+        // Get the target key (mallory / mike)
+        auto target = ctx->key("2686AA191A278013992C72EBBE794852BE5CF886", err, false);
+        QVERIFY (!target.isNull());
+        QVERIFY (!err);
+        QVERIFY (target.numUserIDs());
+
+        // Create the job
+        auto job = openpgp()->signKeyJob();
+        QVERIFY (job);
+
+        // Hack in the passphrase provider
+        auto jobCtx = Job::context(job);
+        TestPassphraseProvider provider;
+        jobCtx->setPassphraseProvider(&provider);
+        jobCtx->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the job
+        job->setExportable(false);
+        std::vector<unsigned int> uids;
+        uids.push_back(0);
+        job->setUserIDsToSign(uids);
+        job->setSigningKey(seckey);
+        job->setRemark(QStringLiteral("Mallory is evil 😠"));
+
+        connect(job, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                        const QString,
+                                                        const GpgME::Error) {
+            Q_EMIT asyncDone();
+            QVERIFY(!err2);
+        });
+
+        job->start(target);
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+
+        // At this point the remark should have been added.
+        target.update();
+        const char *remark = target.userID(0).remark(seckey, err);
+        QVERIFY(!err);
+        QVERIFY(remark);
+        QCOMPARE(QString::fromUtf8(remark), QStringLiteral("Mallory is evil 😠"));
+
+        // Try to replace it without dupeOK
+        auto job2 = openpgp()->signKeyJob();
+        QVERIFY (job2);
+
+        // Hack in the passphrase provider
+        auto jobCtx2 = Job::context(job2);
+        jobCtx2->setPassphraseProvider(&provider);
+        jobCtx2->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the job
+        job2->setExportable(false);
+        job2->setUserIDsToSign(uids);
+        job2->setSigningKey(seckey);
+        job2->setRemark(QStringLiteral("Mallory is nice"));
+
+        connect(job2, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                         const QString,
+                                                         const GpgME::Error) {
+            Q_EMIT asyncDone();
+            QVERIFY(err2);
+        });
+
+        job2->start(target);
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+
+        // Now replace the remark
+        auto job3 = openpgp()->signKeyJob();
+        QVERIFY (job3);
+
+        // Hack in the passphrase provider
+        auto jobCtx3 = Job::context(job3);
+        jobCtx3->setPassphraseProvider(&provider);
+        jobCtx3->setPinentryMode(Context::PinentryLoopback);
+
+        // Setup the job
+        job3->setExportable(false);
+        job3->setUserIDsToSign(uids);
+        job3->setSigningKey(seckey);
+        job3->setDupeOk(true);
+        job3->setRemark(QStringLiteral("Mallory is nice"));
+
+        connect(job3, &SignKeyJob::result, this, [this] (const GpgME::Error &err2,
+                                                         const QString,
+                                                         const GpgME::Error) {
+            Q_EMIT asyncDone();
+            QVERIFY(!err2);
+        });
+
+        job3->start(target);
+        QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT));
+
+        target.update();
+        remark = target.userID(0).remark(seckey, err);
+        QVERIFY(!err);
+        QVERIFY(remark);
+        QCOMPARE(QString::fromUtf8(remark), QStringLiteral("Mallory is nice"));
+    }
+
+    void initTestCase()
+    {
+        QGpgMETest::initTestCase();
+        const QString gpgHome = qgetenv("GNUPGHOME");
+        QVERIFY(copyKeyrings(gpgHome, mDir.path()));
+        qputenv("GNUPGHOME", mDir.path().toUtf8());
+        QFile conf(mDir.path() + QStringLiteral("/gpg.conf"));
+        QVERIFY(conf.open(QIODevice::WriteOnly));
+        conf.write("allow-weak-key-signatures");
+        conf.close();
+    }
+
+private:
+    QTemporaryDir mDir;
+};
+
+QTEST_MAIN(TestRemarks)
+
+#include "t-remarks.moc"
index 2444c70..7b16ccc 100644 (file)
@@ -44,6 +44,8 @@
 #include <QObject>
 #include <QDir>
 
+#include "engineinfo.h"
+
 void QGpgMETest::initTestCase()
 {
     GpgME::initializeLibrary();
@@ -98,5 +100,21 @@ void killAgent(const QString& dir)
     proc.waitForFinished();
 }
 
+bool loopbackSupported()
+{
+    /* With GnuPG 2.0.x (at least 2.0.26 by default on jessie)
+     * the passphrase_cb does not work. So the test popped up
+     * a pinentry. So tests requiring decryption don't work. */
+    static auto version = GpgME::engineInfo(GpgME::GpgEngine).engineVersion();
+    if (version < "2.0.0") {
+        /* With 1.4 it just works */
+        return true;
+    }
+    if (version < "2.1.0") {
+        /* With 2.1 it works with loopback mode */
+        return false;
+    }
+    return true;
+}
 
 #include "t-support.hmoc"
index 81775ca..77bef56 100644 (file)
@@ -53,6 +53,8 @@ public:
 } // namespace GpgME
 
 void killAgent(const QString &dir = qgetenv("GNUPGHOME"));
+/* Is the passphrase Provider / loopback Supported */
+bool loopbackSupported();
 
 class QGpgMETest : public QObject
 {
index f8a759c..fd0fe77 100644 (file)
@@ -38,11 +38,11 @@ AC_DEFUN([AM_PATH_PYTHON],
  [
   dnl Find a Python interpreter.  Python versions prior to 2.0 are not
   dnl supported. (2.0 was released on October 16, 2000).  Python 3.0
-  dnl through to Python 3.3 are also not supported.
+  dnl through to Python 3.9 are also not supported.
   m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
 [python2 python2.7 dnl
  python dnl
- python3 python3.7 python3.6 python3.5 python3.4 dnl python3.8
+ python3 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4
  ])
 
   AC_ARG_VAR([PYTHON], [the Python interpreter])
index d85a85c..1bbb538 100644 (file)
@@ -102,7 +102,7 @@ endif
 AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@
 
 gpgme_tool_SOURCES = gpgme-tool.c argparse.c argparse.h
-gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@
+gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ @GPG_ERROR_LIBS@
 
 gpgme_json_SOURCES = gpgme-json.c cJSON.c cJSON.h
 gpgme_json_LDADD = -lm libgpgme.la $(GPG_ERROR_LIBS)
@@ -126,6 +126,7 @@ gpgme_res = versioninfo.lo
 no_undefined = -no-undefined
 export_symbols = -export-symbols $(srcdir)/gpgme.def
 extra_ltoptions = -XCClinker -static-libgcc
+gpgme_w32_extra_libs = -lws2_32
 
 install-def-file:
        -$(INSTALL) -d $(DESTDIR)$(libdir)
@@ -152,7 +153,7 @@ libgpgme_la_LDFLAGS = $(no_undefined) $(export_symbols) $(extra_ltoptions) \
        @LIBGPGME_LT_CURRENT@:@LIBGPGME_LT_REVISION@:@LIBGPGME_LT_AGE@
 libgpgme_la_DEPENDENCIES = @LTLIBOBJS@ $(srcdir)/libgpgme.vers $(gpgme_deps)
 libgpgme_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \
-                    @GPG_ERROR_LIBS@
+                    @GPG_ERROR_LIBS@ $(gpgme_w32_extra_libs)
 
 if BUILD_W32_GLIB
 libgpgme_glib_la_LDFLAGS = \
@@ -162,7 +163,7 @@ libgpgme_glib_la_LDFLAGS = \
 libgpgme_glib_la_DEPENDENCIES =        @LTLIBOBJS@ \
        $(srcdir)/libgpgme.vers $(gpgme_deps)
 libgpgme_glib_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \
-       @GPG_ERROR_LIBS@ @GLIB_LIBS@
+       @GPG_ERROR_LIBS@ @GLIB_LIBS@ $(gpgme_w32_extra_libs)
 endif
 
 install-data-local: install-def-file
index beea485..f219399 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -134,6 +134,11 @@ CONFIG_HEADER = $(top_builddir)/conf/config.h
 CONFIG_CLEAN_FILES = versioninfo.rc gpgme.pc gpgme-glib.pc gpgme.h \
        gpgme-config
 CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \
+       "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+       "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" \
+       "$(DESTDIR)$(includedir)"
+PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS)
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -161,12 +166,9 @@ am__uninstall_files_from_dir = { \
     || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
          $(am__cd) "$$dir" && rm -f $$files; }; \
   }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
-       "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" \
-       "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" \
-       "$(DESTDIR)$(includedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 @HAVE_W32_SYSTEM_TRUE@am__DEPENDENCIES_1 = versioninfo.lo
+am__DEPENDENCIES_2 =
 am__libgpgme_glib_la_SOURCES_DIST = util.h conversion.c b64dec.c \
        get-env.c context.h ops.h parsetlv.c parsetlv.h mbox-util.c \
        mbox-util.h data.h data.c data-fd.c data-stream.c data-mem.c \
@@ -235,10 +237,8 @@ libgpgme_la_OBJECTS = $(am_libgpgme_la_OBJECTS)
 libgpgme_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
        $(libgpgme_la_LDFLAGS) $(LDFLAGS) -o $@
-PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS)
 am_gpgme_json_OBJECTS = gpgme-json.$(OBJEXT) cJSON.$(OBJEXT)
 gpgme_json_OBJECTS = $(am_gpgme_json_OBJECTS)
-am__DEPENDENCIES_2 =
 gpgme_json_DEPENDENCIES = libgpgme.la $(am__DEPENDENCIES_2)
 am_gpgme_tool_OBJECTS = gpgme-tool.$(OBJEXT) argparse.$(OBJEXT)
 gpgme_tool_OBJECTS = $(am_gpgme_tool_OBJECTS)
@@ -261,7 +261,45 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = $(DEPDIR)/setenv.Plo $(DEPDIR)/stpcpy.Plo \
+       $(DEPDIR)/ttyname_r.Plo ./$(DEPDIR)/argparse.Po \
+       ./$(DEPDIR)/assuan-support.Plo ./$(DEPDIR)/ath.Plo \
+       ./$(DEPDIR)/b64dec.Plo ./$(DEPDIR)/cJSON.Po \
+       ./$(DEPDIR)/conversion.Plo ./$(DEPDIR)/data-compat.Plo \
+       ./$(DEPDIR)/data-estream.Plo ./$(DEPDIR)/data-fd.Plo \
+       ./$(DEPDIR)/data-identify.Plo ./$(DEPDIR)/data-mem.Plo \
+       ./$(DEPDIR)/data-stream.Plo ./$(DEPDIR)/data-user.Plo \
+       ./$(DEPDIR)/data.Plo ./$(DEPDIR)/debug.Plo \
+       ./$(DEPDIR)/decrypt-verify.Plo ./$(DEPDIR)/decrypt.Plo \
+       ./$(DEPDIR)/delete.Plo ./$(DEPDIR)/dirinfo.Plo \
+       ./$(DEPDIR)/edit.Plo ./$(DEPDIR)/encrypt-sign.Plo \
+       ./$(DEPDIR)/encrypt.Plo ./$(DEPDIR)/engine-assuan.Plo \
+       ./$(DEPDIR)/engine-g13.Plo ./$(DEPDIR)/engine-gpg.Plo \
+       ./$(DEPDIR)/engine-gpgconf.Plo ./$(DEPDIR)/engine-gpgsm.Plo \
+       ./$(DEPDIR)/engine-spawn.Plo ./$(DEPDIR)/engine-uiserver.Plo \
+       ./$(DEPDIR)/engine.Plo ./$(DEPDIR)/error.Plo \
+       ./$(DEPDIR)/export.Plo ./$(DEPDIR)/genkey.Plo \
+       ./$(DEPDIR)/get-env.Plo ./$(DEPDIR)/getauditlog.Plo \
+       ./$(DEPDIR)/gpgconf.Plo ./$(DEPDIR)/gpgme-json.Po \
+       ./$(DEPDIR)/gpgme-tool.Po ./$(DEPDIR)/gpgme-w32spawn.Po \
+       ./$(DEPDIR)/gpgme.Plo ./$(DEPDIR)/import.Plo \
+       ./$(DEPDIR)/key.Plo ./$(DEPDIR)/keylist.Plo \
+       ./$(DEPDIR)/keysign.Plo ./$(DEPDIR)/mbox-util.Plo \
+       ./$(DEPDIR)/op-support.Plo ./$(DEPDIR)/opassuan.Plo \
+       ./$(DEPDIR)/parsetlv.Plo ./$(DEPDIR)/passphrase.Plo \
+       ./$(DEPDIR)/passwd.Plo ./$(DEPDIR)/posix-io.Plo \
+       ./$(DEPDIR)/posix-util.Plo ./$(DEPDIR)/progress.Plo \
+       ./$(DEPDIR)/queryswdb.Plo ./$(DEPDIR)/sig-notation.Plo \
+       ./$(DEPDIR)/sign.Plo ./$(DEPDIR)/signers.Plo \
+       ./$(DEPDIR)/spawn.Plo ./$(DEPDIR)/status-table.Plo \
+       ./$(DEPDIR)/tofupolicy.Plo ./$(DEPDIR)/trust-item.Plo \
+       ./$(DEPDIR)/trustlist.Plo ./$(DEPDIR)/verify.Plo \
+       ./$(DEPDIR)/version.Plo ./$(DEPDIR)/vfs-create.Plo \
+       ./$(DEPDIR)/vfs-mount.Plo ./$(DEPDIR)/w32-glib-io.Plo \
+       ./$(DEPDIR)/w32-io.Plo ./$(DEPDIR)/w32-util.Plo \
+       ./$(DEPDIR)/wait-global.Plo ./$(DEPDIR)/wait-private.Plo \
+       ./$(DEPDIR)/wait-user.Plo ./$(DEPDIR)/wait.Plo
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -508,6 +546,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -575,7 +614,7 @@ libgpgme_la_SOURCES = $(main_sources) $(system_components_not_extra)
 # versions, because then every object file is only compiled once.
 AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@
 gpgme_tool_SOURCES = gpgme-tool.c argparse.c argparse.h
-gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@
+gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ @GPG_ERROR_LIBS@
 gpgme_json_SOURCES = gpgme-json.c cJSON.c cJSON.h
 gpgme_json_LDADD = -lm libgpgme.la $(GPG_ERROR_LIBS)
 @HAVE_W32_SYSTEM_TRUE@RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)
@@ -589,6 +628,7 @@ gpgme_json_LDADD = -lm libgpgme.la $(GPG_ERROR_LIBS)
 @HAVE_W32_SYSTEM_TRUE@export_symbols = -export-symbols $(srcdir)/gpgme.def
 @HAVE_W32_SYSTEM_FALSE@extra_ltoptions = 
 @HAVE_W32_SYSTEM_TRUE@extra_ltoptions = -XCClinker -static-libgcc
+@HAVE_W32_SYSTEM_TRUE@gpgme_w32_extra_libs = -lws2_32
 @HAVE_W32_SYSTEM_FALSE@gpgme_deps = 
 @HAVE_W32_SYSTEM_TRUE@gpgme_deps = $(gpgme_res) gpgme.def
 libgpgme_la_LDFLAGS = $(no_undefined) $(export_symbols) $(extra_ltoptions) \
@@ -597,7 +637,7 @@ libgpgme_la_LDFLAGS = $(no_undefined) $(export_symbols) $(extra_ltoptions) \
 
 libgpgme_la_DEPENDENCIES = @LTLIBOBJS@ $(srcdir)/libgpgme.vers $(gpgme_deps)
 libgpgme_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \
-                    @GPG_ERROR_LIBS@
+                    @GPG_ERROR_LIBS@ $(gpgme_w32_extra_libs)
 
 @BUILD_W32_GLIB_TRUE@libgpgme_glib_la_LDFLAGS = \
 @BUILD_W32_GLIB_TRUE@        $(no_undefined) $(export_symbols) $(extra_ltoptions) \
@@ -608,7 +648,7 @@ libgpgme_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \
 @BUILD_W32_GLIB_TRUE@  $(srcdir)/libgpgme.vers $(gpgme_deps)
 
 @BUILD_W32_GLIB_TRUE@libgpgme_glib_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \
-@BUILD_W32_GLIB_TRUE@  @GPG_ERROR_LIBS@ @GLIB_LIBS@
+@BUILD_W32_GLIB_TRUE@  @GPG_ERROR_LIBS@ @GLIB_LIBS@ $(gpgme_w32_extra_libs)
 
 all: all-am
 
@@ -631,8 +671,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -653,47 +693,6 @@ gpgme.h: $(top_builddir)/config.status $(srcdir)/gpgme.h.in
        cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 gpgme-config: $(top_builddir)/config.status $(srcdir)/gpgme-config.in
        cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-       @$(NORMAL_INSTALL)
-       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-       list2=; for p in $$list; do \
-         if test -f $$p; then \
-           list2="$$list2 $$p"; \
-         else :; fi; \
-       done; \
-       test -z "$$list2" || { \
-         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
-         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
-         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-       }
-
-uninstall-libLTLIBRARIES:
-       @$(NORMAL_UNINSTALL)
-       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-       for p in $$list; do \
-         $(am__strip_dir) \
-         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-       done
-
-clean-libLTLIBRARIES:
-       -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-       @list='$(lib_LTLIBRARIES)'; \
-       locs=`for p in $$list; do echo $$p; done | \
-             sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
-             sort -u`; \
-       test -z "$$locs" || { \
-         echo rm -f $${locs}; \
-         rm -f $${locs}; \
-       }
-
-libgpgme-glib.la: $(libgpgme_glib_la_OBJECTS) $(libgpgme_glib_la_DEPENDENCIES) $(EXTRA_libgpgme_glib_la_DEPENDENCIES) 
-       $(AM_V_CCLD)$(libgpgme_glib_la_LINK) $(am_libgpgme_glib_la_rpath) $(libgpgme_glib_la_OBJECTS) $(libgpgme_glib_la_LIBADD) $(LIBS)
-
-libgpgme.la: $(libgpgme_la_OBJECTS) $(libgpgme_la_DEPENDENCIES) $(EXTRA_libgpgme_la_DEPENDENCIES) 
-       $(AM_V_CCLD)$(libgpgme_la_LINK) -rpath $(libdir) $(libgpgme_la_OBJECTS) $(libgpgme_la_LIBADD) $(LIBS)
 install-binPROGRAMS: $(bin_PROGRAMS)
        @$(NORMAL_INSTALL)
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
@@ -793,6 +792,47 @@ clean-libexecPROGRAMS:
        echo " rm -f" $$list; \
        rm -f $$list
 
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+       }
+
+uninstall-libLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+       done
+
+clean-libLTLIBRARIES:
+       -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+       @list='$(lib_LTLIBRARIES)'; \
+       locs=`for p in $$list; do echo $$p; done | \
+             sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+             sort -u`; \
+       test -z "$$locs" || { \
+         echo rm -f $${locs}; \
+         rm -f $${locs}; \
+       }
+
+libgpgme-glib.la: $(libgpgme_glib_la_OBJECTS) $(libgpgme_glib_la_DEPENDENCIES) $(EXTRA_libgpgme_glib_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(libgpgme_glib_la_LINK) $(am_libgpgme_glib_la_rpath) $(libgpgme_glib_la_OBJECTS) $(libgpgme_glib_la_LIBADD) $(LIBS)
+
+libgpgme.la: $(libgpgme_la_OBJECTS) $(libgpgme_la_DEPENDENCIES) $(EXTRA_libgpgme_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(libgpgme_la_LINK) -rpath $(libdir) $(libgpgme_la_OBJECTS) $(libgpgme_la_LIBADD) $(LIBS)
+
 gpgme-json$(EXEEXT): $(gpgme_json_OBJECTS) $(gpgme_json_DEPENDENCIES) $(EXTRA_gpgme_json_DEPENDENCIES) 
        @rm -f gpgme-json$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(gpgme_json_OBJECTS) $(gpgme_json_LDADD) $(LIBS)
@@ -846,82 +886,88 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/setenv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/stpcpy.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ttyname_r.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argparse.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-support.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ath.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/b64dec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cJSON.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conversion.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-compat.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-estream.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-fd.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-identify.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-mem.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-stream.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-user.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decrypt-verify.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decrypt.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delete.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirinfo.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edit.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encrypt-sign.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encrypt.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-assuan.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-g13.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-gpg.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-gpgconf.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-gpgsm.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-spawn.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-uiserver.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/export.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genkey.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-env.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getauditlog.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgconf.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme-json.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme-tool.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme-w32spawn.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/key.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keylist.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keysign.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbox-util.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-support.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opassuan.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parsetlv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passphrase.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passwd.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/posix-io.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/posix-util.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progress.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queryswdb.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sig-notation.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sign.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signers.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/status-table.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tofupolicy.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trust-item.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trustlist.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfs-create.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfs-mount.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/w32-glib-io.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/w32-io.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/w32-util.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait-global.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait-private.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait-user.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/setenv.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/stpcpy.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ttyname_r.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argparse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-support.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ath.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/b64dec.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cJSON.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conversion.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-compat.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-estream.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-fd.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-identify.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-mem.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-stream.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data-user.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decrypt-verify.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decrypt.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delete.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirinfo.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edit.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encrypt-sign.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encrypt.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-assuan.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-g13.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-gpg.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-gpgconf.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-gpgsm.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-spawn.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine-uiserver.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/export.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genkey.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-env.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getauditlog.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgconf.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme-json.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme-tool.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme-w32spawn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgme.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/key.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keylist.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keysign.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbox-util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/op-support.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opassuan.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parsetlv.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passphrase.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passwd.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/posix-io.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/posix-util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progress.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queryswdb.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sig-notation.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sign.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signers.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/status-table.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tofupolicy.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trust-item.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trustlist.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfs-create.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfs-mount.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/w32-glib-io.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/w32-io.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/w32-util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait-global.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait-private.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait-user.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -1065,7 +1111,10 @@ cscopelist-am: $(am__tagged_files)
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -1097,12 +1146,12 @@ distdir: $(DISTFILES)
        done
 check-am: all-am
 check: check-am
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \
+all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(SCRIPTS) $(DATA) \
                $(HEADERS)
 install-binPROGRAMS: install-libLTLIBRARIES
 
 installdirs:
-       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)"; do \
+       for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
 install: install-am
@@ -1141,7 +1190,82 @@ clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
        clean-libexecPROGRAMS clean-libtool mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf $(DEPDIR) ./$(DEPDIR)
+               -rm -f $(DEPDIR)/setenv.Plo
+       -rm -f $(DEPDIR)/stpcpy.Plo
+       -rm -f $(DEPDIR)/ttyname_r.Plo
+       -rm -f ./$(DEPDIR)/argparse.Po
+       -rm -f ./$(DEPDIR)/assuan-support.Plo
+       -rm -f ./$(DEPDIR)/ath.Plo
+       -rm -f ./$(DEPDIR)/b64dec.Plo
+       -rm -f ./$(DEPDIR)/cJSON.Po
+       -rm -f ./$(DEPDIR)/conversion.Plo
+       -rm -f ./$(DEPDIR)/data-compat.Plo
+       -rm -f ./$(DEPDIR)/data-estream.Plo
+       -rm -f ./$(DEPDIR)/data-fd.Plo
+       -rm -f ./$(DEPDIR)/data-identify.Plo
+       -rm -f ./$(DEPDIR)/data-mem.Plo
+       -rm -f ./$(DEPDIR)/data-stream.Plo
+       -rm -f ./$(DEPDIR)/data-user.Plo
+       -rm -f ./$(DEPDIR)/data.Plo
+       -rm -f ./$(DEPDIR)/debug.Plo
+       -rm -f ./$(DEPDIR)/decrypt-verify.Plo
+       -rm -f ./$(DEPDIR)/decrypt.Plo
+       -rm -f ./$(DEPDIR)/delete.Plo
+       -rm -f ./$(DEPDIR)/dirinfo.Plo
+       -rm -f ./$(DEPDIR)/edit.Plo
+       -rm -f ./$(DEPDIR)/encrypt-sign.Plo
+       -rm -f ./$(DEPDIR)/encrypt.Plo
+       -rm -f ./$(DEPDIR)/engine-assuan.Plo
+       -rm -f ./$(DEPDIR)/engine-g13.Plo
+       -rm -f ./$(DEPDIR)/engine-gpg.Plo
+       -rm -f ./$(DEPDIR)/engine-gpgconf.Plo
+       -rm -f ./$(DEPDIR)/engine-gpgsm.Plo
+       -rm -f ./$(DEPDIR)/engine-spawn.Plo
+       -rm -f ./$(DEPDIR)/engine-uiserver.Plo
+       -rm -f ./$(DEPDIR)/engine.Plo
+       -rm -f ./$(DEPDIR)/error.Plo
+       -rm -f ./$(DEPDIR)/export.Plo
+       -rm -f ./$(DEPDIR)/genkey.Plo
+       -rm -f ./$(DEPDIR)/get-env.Plo
+       -rm -f ./$(DEPDIR)/getauditlog.Plo
+       -rm -f ./$(DEPDIR)/gpgconf.Plo
+       -rm -f ./$(DEPDIR)/gpgme-json.Po
+       -rm -f ./$(DEPDIR)/gpgme-tool.Po
+       -rm -f ./$(DEPDIR)/gpgme-w32spawn.Po
+       -rm -f ./$(DEPDIR)/gpgme.Plo
+       -rm -f ./$(DEPDIR)/import.Plo
+       -rm -f ./$(DEPDIR)/key.Plo
+       -rm -f ./$(DEPDIR)/keylist.Plo
+       -rm -f ./$(DEPDIR)/keysign.Plo
+       -rm -f ./$(DEPDIR)/mbox-util.Plo
+       -rm -f ./$(DEPDIR)/op-support.Plo
+       -rm -f ./$(DEPDIR)/opassuan.Plo
+       -rm -f ./$(DEPDIR)/parsetlv.Plo
+       -rm -f ./$(DEPDIR)/passphrase.Plo
+       -rm -f ./$(DEPDIR)/passwd.Plo
+       -rm -f ./$(DEPDIR)/posix-io.Plo
+       -rm -f ./$(DEPDIR)/posix-util.Plo
+       -rm -f ./$(DEPDIR)/progress.Plo
+       -rm -f ./$(DEPDIR)/queryswdb.Plo
+       -rm -f ./$(DEPDIR)/sig-notation.Plo
+       -rm -f ./$(DEPDIR)/sign.Plo
+       -rm -f ./$(DEPDIR)/signers.Plo
+       -rm -f ./$(DEPDIR)/spawn.Plo
+       -rm -f ./$(DEPDIR)/status-table.Plo
+       -rm -f ./$(DEPDIR)/tofupolicy.Plo
+       -rm -f ./$(DEPDIR)/trust-item.Plo
+       -rm -f ./$(DEPDIR)/trustlist.Plo
+       -rm -f ./$(DEPDIR)/verify.Plo
+       -rm -f ./$(DEPDIR)/version.Plo
+       -rm -f ./$(DEPDIR)/vfs-create.Plo
+       -rm -f ./$(DEPDIR)/vfs-mount.Plo
+       -rm -f ./$(DEPDIR)/w32-glib-io.Plo
+       -rm -f ./$(DEPDIR)/w32-io.Plo
+       -rm -f ./$(DEPDIR)/w32-util.Plo
+       -rm -f ./$(DEPDIR)/wait-global.Plo
+       -rm -f ./$(DEPDIR)/wait-private.Plo
+       -rm -f ./$(DEPDIR)/wait-user.Plo
+       -rm -f ./$(DEPDIR)/wait.Plo
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -1189,7 +1313,82 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf $(DEPDIR) ./$(DEPDIR)
+               -rm -f $(DEPDIR)/setenv.Plo
+       -rm -f $(DEPDIR)/stpcpy.Plo
+       -rm -f $(DEPDIR)/ttyname_r.Plo
+       -rm -f ./$(DEPDIR)/argparse.Po
+       -rm -f ./$(DEPDIR)/assuan-support.Plo
+       -rm -f ./$(DEPDIR)/ath.Plo
+       -rm -f ./$(DEPDIR)/b64dec.Plo
+       -rm -f ./$(DEPDIR)/cJSON.Po
+       -rm -f ./$(DEPDIR)/conversion.Plo
+       -rm -f ./$(DEPDIR)/data-compat.Plo
+       -rm -f ./$(DEPDIR)/data-estream.Plo
+       -rm -f ./$(DEPDIR)/data-fd.Plo
+       -rm -f ./$(DEPDIR)/data-identify.Plo
+       -rm -f ./$(DEPDIR)/data-mem.Plo
+       -rm -f ./$(DEPDIR)/data-stream.Plo
+       -rm -f ./$(DEPDIR)/data-user.Plo
+       -rm -f ./$(DEPDIR)/data.Plo
+       -rm -f ./$(DEPDIR)/debug.Plo
+       -rm -f ./$(DEPDIR)/decrypt-verify.Plo
+       -rm -f ./$(DEPDIR)/decrypt.Plo
+       -rm -f ./$(DEPDIR)/delete.Plo
+       -rm -f ./$(DEPDIR)/dirinfo.Plo
+       -rm -f ./$(DEPDIR)/edit.Plo
+       -rm -f ./$(DEPDIR)/encrypt-sign.Plo
+       -rm -f ./$(DEPDIR)/encrypt.Plo
+       -rm -f ./$(DEPDIR)/engine-assuan.Plo
+       -rm -f ./$(DEPDIR)/engine-g13.Plo
+       -rm -f ./$(DEPDIR)/engine-gpg.Plo
+       -rm -f ./$(DEPDIR)/engine-gpgconf.Plo
+       -rm -f ./$(DEPDIR)/engine-gpgsm.Plo
+       -rm -f ./$(DEPDIR)/engine-spawn.Plo
+       -rm -f ./$(DEPDIR)/engine-uiserver.Plo
+       -rm -f ./$(DEPDIR)/engine.Plo
+       -rm -f ./$(DEPDIR)/error.Plo
+       -rm -f ./$(DEPDIR)/export.Plo
+       -rm -f ./$(DEPDIR)/genkey.Plo
+       -rm -f ./$(DEPDIR)/get-env.Plo
+       -rm -f ./$(DEPDIR)/getauditlog.Plo
+       -rm -f ./$(DEPDIR)/gpgconf.Plo
+       -rm -f ./$(DEPDIR)/gpgme-json.Po
+       -rm -f ./$(DEPDIR)/gpgme-tool.Po
+       -rm -f ./$(DEPDIR)/gpgme-w32spawn.Po
+       -rm -f ./$(DEPDIR)/gpgme.Plo
+       -rm -f ./$(DEPDIR)/import.Plo
+       -rm -f ./$(DEPDIR)/key.Plo
+       -rm -f ./$(DEPDIR)/keylist.Plo
+       -rm -f ./$(DEPDIR)/keysign.Plo
+       -rm -f ./$(DEPDIR)/mbox-util.Plo
+       -rm -f ./$(DEPDIR)/op-support.Plo
+       -rm -f ./$(DEPDIR)/opassuan.Plo
+       -rm -f ./$(DEPDIR)/parsetlv.Plo
+       -rm -f ./$(DEPDIR)/passphrase.Plo
+       -rm -f ./$(DEPDIR)/passwd.Plo
+       -rm -f ./$(DEPDIR)/posix-io.Plo
+       -rm -f ./$(DEPDIR)/posix-util.Plo
+       -rm -f ./$(DEPDIR)/progress.Plo
+       -rm -f ./$(DEPDIR)/queryswdb.Plo
+       -rm -f ./$(DEPDIR)/sig-notation.Plo
+       -rm -f ./$(DEPDIR)/sign.Plo
+       -rm -f ./$(DEPDIR)/signers.Plo
+       -rm -f ./$(DEPDIR)/spawn.Plo
+       -rm -f ./$(DEPDIR)/status-table.Plo
+       -rm -f ./$(DEPDIR)/tofupolicy.Plo
+       -rm -f ./$(DEPDIR)/trust-item.Plo
+       -rm -f ./$(DEPDIR)/trustlist.Plo
+       -rm -f ./$(DEPDIR)/verify.Plo
+       -rm -f ./$(DEPDIR)/version.Plo
+       -rm -f ./$(DEPDIR)/vfs-create.Plo
+       -rm -f ./$(DEPDIR)/vfs-mount.Plo
+       -rm -f ./$(DEPDIR)/w32-glib-io.Plo
+       -rm -f ./$(DEPDIR)/w32-io.Plo
+       -rm -f ./$(DEPDIR)/w32-util.Plo
+       -rm -f ./$(DEPDIR)/wait-global.Plo
+       -rm -f ./$(DEPDIR)/wait-private.Plo
+       -rm -f ./$(DEPDIR)/wait-user.Plo
+       -rm -f ./$(DEPDIR)/wait.Plo
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -1213,7 +1412,7 @@ uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
        clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
        clean-libexecPROGRAMS clean-libtool cscopelist-am ctags \
        ctags-am distclean distclean-compile distclean-generic \
index d65bf9b..25dfc79 100644 (file)
@@ -118,6 +118,12 @@ struct gpgme_context
    * flag is cleared with each operation.  */
   unsigned int redraw_suggested : 1;
 
+  /* True if the option --include-key-block shall be passed to gpg.  */
+  unsigned int include_key_block : 1;
+
+  /* True if the option --auto-key-import shall be passed to gpg.  */
+  unsigned int auto_key_import : 1;
+
   /* True if the option --auto-key-retrieve shall be passed to gpg.  */
   unsigned int auto_key_retrieve : 1;
 
@@ -128,6 +134,9 @@ struct gpgme_context
    * after the operation.  */
   unsigned int ignore_mdc_error : 1;
 
+  /* Pass --expert to gpg edit key. */
+  unsigned int extended_edit : 1;
+
   /* Flags for keylist mode.  */
   gpgme_keylist_mode_t keylist_mode;
 
index 497397d..a40328f 100644 (file)
@@ -826,7 +826,6 @@ struct engine_ops _gpgme_engine_ops_assuan =
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     NULL,               /* sign */
-    NULL,              /* trustlist */
     NULL,               /* verify */
     NULL,               /* getauditlog */
     llass_transact,     /* opassuan_transact */
index 4f33da1..c8bfad9 100644 (file)
@@ -115,7 +115,6 @@ struct engine_ops
                         gpgme_sig_mode_t mode, int use_armor,
                         int use_textmode, int include_certs,
                         gpgme_ctx_t ctx /* FIXME */);
-  gpgme_error_t (*trustlist) (void *engine, const char *pattern);
   gpgme_error_t (*verify) (void *engine, gpgme_data_t sig,
                           gpgme_data_t signed_text, gpgme_data_t plaintext,
                            gpgme_ctx_t ctx);
index 19dd8f4..45f6c94 100644 (file)
@@ -806,7 +806,6 @@ struct engine_ops _gpgme_engine_ops_g13 =
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     NULL,               /* sign */
-    NULL,              /* trustlist */
     NULL,               /* verify */
     NULL,               /* getauditlog */
     g13_transact,
index dc2d945..af2533d 100644 (file)
@@ -148,6 +148,8 @@ struct engine_gpg
     unsigned int no_symkey_cache : 1;
     unsigned int offline : 1;
     unsigned int ignore_mdc_error : 1;
+    unsigned int include_key_block : 1;
+    unsigned int auto_key_import : 1;
   } flags;
 
   /* NULL or the data object fed to --override_session_key-fd.  */
@@ -686,6 +688,13 @@ gpg_set_engine_flags (void *engine, const gpgme_ctx_t ctx)
 
   gpg->flags.ignore_mdc_error = !!ctx->ignore_mdc_error;
 
+  if (have_gpg_version (gpg, "2.2.20"))
+    {
+      if (ctx->auto_key_import)
+        gpg->flags.auto_key_import = 1;
+      if (ctx->include_key_block)
+        gpg->flags.include_key_block = 1;
+    }
 }
 
 
@@ -860,7 +869,7 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
   gpgme_error_t err;
   struct arg_and_data_s *a;
   struct fd_data_map_s *fd_data_map;
-  size_t datac=0, argc=0;
+  size_t datac=0, argc=0, allocated_argc=0;
   char **argv;
   int need_special = 0;
   int use_agent = 0;
@@ -908,18 +917,33 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
          /*   fprintf (stderr, "build_argv: arg=`%s'\n", a->arg );*/
         }
     }
+
   if (need_special)
     argc++;
   if (use_agent)
     argc++;
+  if (*gpg->request_origin)
+    argc++;
+  if (gpg->auto_key_locate)
+    argc++;
+  if (gpg->trust_model)
+    argc++;
+  if (gpg->flags.no_symkey_cache)
+    argc++;
+  if (gpg->flags.ignore_mdc_error)
+    argc++;
+  if (gpg->flags.offline)
+    argc++;
   if (gpg->pinentry_mode)
     argc++;
   if (!gpg->cmd.used)
-    argc++;    /* --batch */
-  argc += 4;   /* --no-sk-comments, --request-origin, --no-symkey-cache */
-                /* --disable-dirmngr  */
+    argc++; /* --batch */
+
+  argc++;   /* --no-sk-comments */
 
   argv = calloc (argc + 1, sizeof *argv);
+  allocated_argc = argc;
+
   if (!argv)
     return gpg_error_from_syserror ();
   fd_data_map = calloc (datac + 1, sizeof *fd_data_map);
@@ -964,6 +988,8 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
         }
       argc++;
     }
+  /* NOTE: If you add a new argument here. Ensure that
+     argc is counted up above to allocate enough memory. */
 
   if (*gpg->request_origin)
     {
@@ -1191,6 +1217,11 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
             argc++;
         }
     }
+  /* Saveguard against adding a new argument without properly
+     counting up the argc used for allocation at the beginning
+     of this function. It would be better to use a dynamically
+     allocated array like ccparray in gnupg. */
+  assert (argc <= allocated_argc);
 
   gpg->argv = argv;
   gpg->fd_data_map = fd_data_map;
@@ -1681,6 +1712,9 @@ gpg_decrypt (void *engine,
   if (!err && auto_key_retrieve)
     err = add_arg (gpg, "--auto-key-retrieve");
 
+  if (!err && gpg->flags.auto_key_import)
+    err = add_arg (gpg, "--auto-key-import");
+
   if (!err && override_session_key && *override_session_key)
     {
       if (have_gpg_version (gpg, "2.1.16"))
@@ -1695,12 +1729,15 @@ gpg_decrypt (void *engine,
                                          strlen (override_session_key), 1);
           if (!err)
             {
-              /* We add --no-keyring because a keyring is not required
-               * when we are overriding the session key.  It would
+              /* When we are not trying to verify signatures as well,
+               * we add --no-keyring because a keyring is not required
+               * for decryption when overriding the session key.  It would
                * work without that option but --no-keyring avoids that
                * gpg return a failure due to a missing key log_error()
                * diagnostic.  --no-keyring is supported since 2.1.14. */
-              err = add_arg (gpg, "--no-keyring");
+
+              if (!(flags & GPGME_DECRYPT_VERIFY))
+                  err = add_arg (gpg, "--no-keyring");
               if (!err)
                 err = add_arg (gpg, "--override-session-key-fd");
               if (!err)
@@ -1826,8 +1863,13 @@ append_args_from_sender (engine_gpg_t gpg, gpgme_ctx_t ctx)
 }
 
 
+#define NOTATION_FLAG_SIG  1 /* Use --sig-notation (default)*/
+#define NOTATION_FLAG_CERT 2 /* Use --cert-notation */
+#define NOTATION_FLAG_SET  3 /* Use --set-notation */
+
 static gpgme_error_t
-append_args_from_sig_notations (engine_gpg_t gpg, gpgme_ctx_t ctx /* FIXME */)
+append_args_from_sig_notations (engine_gpg_t gpg, gpgme_ctx_t ctx /* FIXME */,
+                                int flags)
 {
   gpgme_error_t err = 0;
   gpgme_sig_notation_t notation;
@@ -1868,7 +1910,14 @@ append_args_from_sig_notations (engine_gpg_t gpg, gpgme_ctx_t ctx /* FIXME */)
            }
 
          if (!err)
-           err = add_arg (gpg, "--sig-notation");
+            {
+              if ((flags & NOTATION_FLAG_SET))
+                err = add_arg (gpg, "--set-notation");
+              else if ((flags & NOTATION_FLAG_CERT))
+                err = add_arg (gpg, "--cert-notation");
+              else
+                err = add_arg (gpg, "--sig-notation");
+            }
          if (!err)
            err = add_arg (gpg, arg);
 
@@ -1919,10 +1968,15 @@ gpg_edit (void *engine, int type, gpgme_key_t key, gpgme_data_t out,
   gpgme_error_t err;
 
   err = add_arg (gpg, "--with-colons");
+
+  if (!err && ctx->extended_edit)
+    err = add_arg (gpg, "--expert");
   if (!err)
     err = append_args_from_signers (gpg, ctx);
   if (!err)
-  err = add_arg (gpg, type == 0 ? "--edit-key" : "--card-edit");
+    err = append_args_from_sig_notations (gpg, ctx, NOTATION_FLAG_CERT);
+  if (!err)
+    err = add_arg (gpg, type == 0 ? "--edit-key" : "--card-edit");
   if (!err)
     err = add_data (gpg, out, 1, 1);
   if (!err)
@@ -2134,6 +2188,9 @@ gpg_encrypt (void *engine, gpgme_key_t recp[], const char *recpstring,
       && have_gpg_version (gpg, "2.1.14"))
     err = add_arg (gpg, "--mimemode");
 
+  if (!err && gpg->flags.include_key_block)
+    err = add_arg (gpg, "--include-key-block");
+
   if (recp || recpstring)
     {
       /* If we know that all recipients are valid (full or ultimate trust)
@@ -2209,6 +2266,9 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[],
       && have_gpg_version (gpg, "2.1.14"))
     err = add_arg (gpg, "--mimemode");
 
+  if (!err && gpg->flags.include_key_block)
+    err = add_arg (gpg, "--include-key-block");
+
   if (recp || recpstring)
     {
       /* If we know that all recipients are valid (full or ultimate trust)
@@ -2232,7 +2292,7 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[],
     err = append_args_from_sender (gpg, ctx);
 
   if (!err)
-    err = append_args_from_sig_notations (gpg, ctx);
+    err = append_args_from_sig_notations (gpg, ctx, NOTATION_FLAG_SIG);
 
   /* Tell the gpg object about the data.  */
   if (!err)
@@ -2270,6 +2330,7 @@ export_common (engine_gpg_t gpg, gpgme_export_mode_t mode,
 
   if ((mode & ~(GPGME_EXPORT_MODE_EXTERN
                 |GPGME_EXPORT_MODE_MINIMAL
+                |GPGME_EXPORT_MODE_SSH
                 |GPGME_EXPORT_MODE_SECRET)))
     return gpg_error (GPG_ERR_NOT_SUPPORTED);
 
@@ -2285,6 +2346,15 @@ export_common (engine_gpg_t gpg, gpgme_export_mode_t mode,
 
   if (err)
     ;
+  else if ((mode & GPGME_EXPORT_MODE_SSH))
+    {
+      if (have_gpg_version (gpg, "2.1.11"))
+        err = add_arg (gpg, "--export-ssh-key");
+      else
+        err = gpg_error (GPG_ERR_NOT_SUPPORTED);
+      if (!err)
+        err = add_data (gpg, keydata, 1, 1);
+    }
   else if ((mode & GPGME_EXPORT_MODE_EXTERN))
     {
       err = add_arg (gpg, "--send-keys");
@@ -2937,7 +3007,15 @@ gpg_keylist_build_options (engine_gpg_t gpg, int secret_only,
     err = add_arg (gpg, "--with-tofu-info");
 
   if (!err && (mode & GPGME_KEYLIST_MODE_WITH_SECRET))
-    err = add_arg (gpg, "--with-secret");
+    {
+      err = add_arg (gpg, "--with-secret");
+      err = add_arg (gpg, "--with-keygrip");
+    }
+  else if (!err && (mode & GPGME_KEYLIST_MODE_WITH_KEYGRIP))
+    {
+      /* Explicitly requests the keygrip.  */
+      err = add_arg (gpg, "--with-keygrip");
+    }
 
   if (!err
       && (mode & GPGME_KEYLIST_MODE_SIGS)
@@ -3201,12 +3279,14 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
         }
     }
 
+  if (!err && gpg->flags.include_key_block)
+    err = add_arg (gpg, "--include-key-block");
   if (!err)
     err = append_args_from_signers (gpg, ctx);
   if (!err)
     err = append_args_from_sender (gpg, ctx);
   if (!err)
-    err = append_args_from_sig_notations (gpg, ctx);
+    err = append_args_from_sig_notations (gpg, ctx, NOTATION_FLAG_SIG);
 
   if (gpgme_data_get_file_name (in))
     {
@@ -3233,29 +3313,6 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
 }
 
 static gpgme_error_t
-gpg_trustlist (void *engine, const char *pattern)
-{
-  engine_gpg_t gpg = engine;
-  gpgme_error_t err;
-
-  err = add_arg (gpg, "--with-colons");
-  if (!err)
-    err = add_arg (gpg, "--list-trust-path");
-
-  /* Tell the gpg object about the data.  */
-  if (!err)
-    err = add_arg (gpg, "--");
-  if (!err)
-    err = add_arg (gpg, pattern);
-
-  if (!err)
-    err = start (gpg);
-
-  return err;
-}
-
-
-static gpgme_error_t
 gpg_verify (void *engine, gpgme_data_t sig, gpgme_data_t signed_text,
            gpgme_data_t plaintext, gpgme_ctx_t ctx)
 {
@@ -3263,6 +3320,8 @@ gpg_verify (void *engine, gpgme_data_t sig, gpgme_data_t signed_text,
   gpgme_error_t err;
 
   err = append_args_from_sender (gpg, ctx);
+  if (!err && gpg->flags.auto_key_import)
+    err = add_arg (gpg, "--auto-key-import");
   if (!err && ctx->auto_key_retrieve)
     err = add_arg (gpg, "--auto-key-retrieve");
 
@@ -3403,7 +3462,6 @@ struct engine_ops _gpgme_engine_ops_gpg =
     gpg_keysign,
     gpg_tofu_policy,    /* tofu_policy */
     gpg_sign,
-    gpg_trustlist,
     gpg_verify,
     gpg_getauditlog,
     NULL,               /* opassuan_transact */
index 303ba64..d4465e9 100644 (file)
@@ -1304,7 +1304,6 @@ struct engine_ops _gpgme_engine_ops_gpgconf =
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     NULL,              /* sign */
-    NULL,              /* trustlist */
     NULL,              /* verify */
     NULL,              /* getauditlog */
     NULL,               /* opassuan_transact */
index ae5d8ef..671b385 100644 (file)
@@ -2324,7 +2324,6 @@ struct engine_ops _gpgme_engine_ops_gpgsm =
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     gpgsm_sign,
-    NULL,              /* trustlist */
     gpgsm_verify,
     gpgsm_getauditlog,
     NULL,               /* opassuan_transact */
index 296d7f2..0eeaeb1 100644 (file)
@@ -466,7 +466,6 @@ struct engine_ops _gpgme_engine_ops_spawn =
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     NULL,              /* sign */
-    NULL,              /* trustlist */
     NULL,              /* verify */
     NULL,              /* getauditlog */
     NULL,               /* opassuan_transact */
index cb8e155..c908ad7 100644 (file)
@@ -1437,7 +1437,6 @@ struct engine_ops _gpgme_engine_ops_uiserver =
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     uiserver_sign,
-    NULL,              /* trustlist */
     uiserver_verify,
     NULL,              /* getauditlog */
     NULL,               /* opassuan_transact */
index 05979c1..ded2f4d 100644 (file)
@@ -917,13 +917,12 @@ _gpgme_engine_op_sign (engine_t engine, gpgme_data_t in, gpgme_data_t out,
 gpgme_error_t
 _gpgme_engine_op_trustlist (engine_t engine, const char *pattern)
 {
+  (void)pattern;
+
   if (!engine)
     return gpg_error (GPG_ERR_INV_VALUE);
 
-  if (!engine->ops->trustlist)
-    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
-
-  return (*engine->ops->trustlist) (engine->engine, pattern);
+  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
 }
 
 
index abf260a..7e394df 100644 (file)
@@ -123,6 +123,7 @@ export_start (gpgme_ctx_t ctx, int synchronous, const char *pattern,
   if ((mode & ~(GPGME_EXPORT_MODE_EXTERN
                 |GPGME_EXPORT_MODE_MINIMAL
                 |GPGME_EXPORT_MODE_SECRET
+                |GPGME_EXPORT_MODE_SSH
                 |GPGME_EXPORT_MODE_RAW
                 |GPGME_EXPORT_MODE_NOUID
                 |GPGME_EXPORT_MODE_PKCS12)))
@@ -218,6 +219,7 @@ export_ext_start (gpgme_ctx_t ctx, int synchronous, const char *pattern[],
   if ((mode & ~(GPGME_EXPORT_MODE_EXTERN
                 |GPGME_EXPORT_MODE_MINIMAL
                 |GPGME_EXPORT_MODE_SECRET
+                |GPGME_EXPORT_MODE_SSH
                 |GPGME_EXPORT_MODE_RAW
                 |GPGME_EXPORT_MODE_PKCS12)))
     return gpg_error (GPG_ERR_INV_VALUE); /* Invalid flags in MODE.  */
@@ -478,4 +480,3 @@ gpgme_op_export_keys (gpgme_ctx_t ctx,
 
   return TRACE_ERR (err);
 }
-
index 7957659..bcaa1fc 100644 (file)
@@ -2298,6 +2298,7 @@ static const char hlp_keylist[] =
   "sigs:          Add KEYLIST_MODE_SIGS.\n"
   "notations:     Add KEYLIST_MODE_SIG_NOTATIONS.\n"
   "tofu:          Add KEYLIST_MODE_WITH_TOFU.\n"
+  "keygrip:       Add KEYLIST_MODE_WITH_KEYGRIP.\n"
   "ephemeral:     Add KEYLIST_MODE_EPHEMERAL.\n"
   "validate:      Add KEYLIST_MODE_VALIDATE.\n"
   "locate:        Add KEYLIST_MODE_LOCATE.\n"
@@ -2463,6 +2464,11 @@ op_keylist (cjson_t request, cjson_t result)
   if (abool)
     mode |= GPGME_KEYLIST_MODE_WITH_TOFU;
 
+  if ((err = get_boolean_flag (request, "keygrip", 0, &abool)))
+    goto leave;
+  if (abool)
+    mode |= GPGME_KEYLIST_MODE_WITH_KEYGRIP;
+
   if ((err = get_boolean_flag (request, "ephemeral", 0, &abool)))
     goto leave;
   if (abool)
index 7a0bfcb..0dbc4a9 100644 (file)
@@ -2149,7 +2149,7 @@ static const char hlp_include_certs[] =
   "\n"
   "With DEFAULT or N, set how many certificates should be\n"
   "included in the next S/MIME signed message.  See the\n"
-  "GPGME documentation for details on the meaning of"
+  "GPGME documentation for details on the meaning of\n"
   "various N.  Without either, return the current setting.";
 static gpg_error_t
 cmd_include_certs (assuan_context_t ctx, char *line)
index 65a2e30..8bc11d5 100644 (file)
@@ -533,6 +533,14 @@ gpgme_set_ctx_flag (gpgme_ctx_t ctx, const char *name, const char *value)
       if (!ctx->override_session_key)
         err = gpg_error_from_syserror ();
     }
+  else if (!strcmp (name, "include-key-block"))
+    {
+      ctx->include_key_block = abool;
+    }
+  else if (!strcmp (name, "auto-key-import"))
+    {
+      ctx->auto_key_import = abool;
+    }
   else if (!strcmp (name, "auto-key-retrieve"))
     {
       ctx->auto_key_retrieve = abool;
@@ -566,6 +574,10 @@ gpgme_set_ctx_flag (gpgme_ctx_t ctx, const char *name, const char *value)
       if (!ctx->trust_model)
         err = gpg_error_from_syserror ();
     }
+  else if (!strcmp (name, "extended-edit"))
+    {
+      ctx->extended_edit = abool;
+    }
   else
     err = gpg_error (GPG_ERR_UNKNOWN_NAME);
 
@@ -603,6 +615,14 @@ gpgme_get_ctx_flag (gpgme_ctx_t ctx, const char *name)
     {
       return ctx->override_session_key? ctx->override_session_key : "";
     }
+  else if (!strcmp (name, "include-key-block"))
+    {
+      return ctx->include_key_block? "1":"";
+    }
+  else if (!strcmp (name, "auto-key-import"))
+    {
+      return ctx->auto_key_import? "1":"";
+    }
   else if (!strcmp (name, "auto-key-retrieve"))
     {
       return ctx->auto_key_retrieve? "1":"";
@@ -623,6 +643,10 @@ gpgme_get_ctx_flag (gpgme_ctx_t ctx, const char *name)
     {
       return ctx->auto_key_locate? ctx->auto_key_locate : "";
     }
+  else if (!strcmp (name, "extended-edit"))
+    {
+      return ctx->extended_edit ? "1":"";
+    }
   else
     return NULL;
 }
index 722ce68..b4f817b 100644 (file)
@@ -313,7 +313,7 @@ typedef enum
 gpgme_sig_mode_t;
 
 
-/* The available validities for a trust item or key.  */
+/* The available validities for a key.  */
 typedef enum
   {
     GPGME_VALIDITY_UNKNOWN   = 0,
@@ -379,6 +379,7 @@ gpgme_protocol_t;
 #define GPGME_KEYLIST_MODE_SIG_NOTATIONS       8
 #define GPGME_KEYLIST_MODE_WITH_SECRET         16
 #define GPGME_KEYLIST_MODE_WITH_TOFU           32
+#define GPGME_KEYLIST_MODE_WITH_KEYGRIP        64
 #define GPGME_KEYLIST_MODE_EPHEMERAL            128
 #define GPGME_KEYLIST_MODE_VALIDATE            256
 
@@ -406,6 +407,7 @@ gpgme_pinentry_mode_t;
 #define GPGME_EXPORT_MODE_RAW                  32
 #define GPGME_EXPORT_MODE_PKCS12               64
 #define GPGME_EXPORT_MODE_NOUID               128  /* Experimental(!)*/
+#define GPGME_EXPORT_MODE_SSH                 256
 
 typedef unsigned int gpgme_export_mode_t;
 
@@ -600,7 +602,7 @@ struct _gpgme_subkey
   /* The name of the curve for ECC algorithms or NULL.  */
   char *curve;
 
-  /* The keygrip of the subkey in hex digit form or NULL if not availabale.  */
+  /* The keygrip of the subkey in hex digit form or NULL if not available.  */
   char *keygrip;
 };
 typedef struct _gpgme_subkey *gpgme_subkey_t;
@@ -728,6 +730,9 @@ struct _gpgme_user_id
 
   /* Time of the last refresh of this user id.  0 if unknown.  */
   unsigned long last_update;
+
+  /* The string to exactly identify a userid.  Might be NULL.  */
+  char *uidhash;
 };
 typedef struct _gpgme_user_id *gpgme_user_id_t;
 
@@ -1050,7 +1055,7 @@ typedef enum
     GPGME_EVENT_START,
     GPGME_EVENT_DONE,
     GPGME_EVENT_NEXT_KEY,
-    GPGME_EVENT_NEXT_TRUSTITEM
+    GPGME_EVENT_NEXT_TRUSTITEM  /* NOT USED.  */
   }
 gpgme_event_io_t;
 
@@ -1998,63 +2003,32 @@ gpgme_error_t gpgme_op_passwd (gpgme_ctx_t ctx, gpgme_key_t key,
 
 \f
 /*
- * Trust items and operations.
+ * Trust items and operations.  DO NOT USE.
+ * Note: This does not work because the experimental support in the
+ * GnuPG engine has been removed a very long time; for API and ABI
+ * compatibilty we keep the functions but let them return an error.
+ * See https://dev.gnupg.org/T4834
  */
-
-/* An object to hold data of a trust item.
- * This structure shall be considered read-only and an application
- * must not allocate such a structure on its own.  */
 struct _gpgme_trust_item
 {
-  /* Internal to GPGME, do not use.  */
   unsigned int _refs;
-
-  /* The key ID to which the trust item belongs.  */
   char *keyid;
-
-  /* Internal to GPGME, do not use.  */
   char _keyid[16 + 1];
-
-  /* The type of the trust item, 1 refers to a key, 2 to a user ID.  */
   int type;
-
-  /* The trust level.  */
   int level;
-
-  /* The owner trust if TYPE is 1.  */
   char *owner_trust;
-
-  /* Internal to GPGME, do not use.  */
   char _owner_trust[2];
-
-  /* The calculated validity.  */
   char *validity;
-
-  /* Internal to GPGME, do not use.  */
   char _validity[2];
-
-  /* The user name if TYPE is 2.  */
   char *name;
 };
 typedef struct _gpgme_trust_item *gpgme_trust_item_t;
-
-/* Start a trustlist operation within CTX, searching for trust items
-   which match PATTERN.  */
 gpgme_error_t gpgme_op_trustlist_start (gpgme_ctx_t ctx,
                                        const char *pattern, int max_level);
-
-/* Return the next trust item from the trustlist in R_ITEM.  */
 gpgme_error_t gpgme_op_trustlist_next (gpgme_ctx_t ctx,
                                       gpgme_trust_item_t *r_item);
-
-/* Terminate a pending trustlist operation within CTX.  */
 gpgme_error_t gpgme_op_trustlist_end (gpgme_ctx_t ctx);
-
-/* Acquire a reference to ITEM.  */
 void gpgme_trust_item_ref (gpgme_trust_item_t item);
-
-/* Release a reference to ITEM.  If this was the last one the trust
- * item is destroyed.  */
 void gpgme_trust_item_unref (gpgme_trust_item_t item);
 
 
@@ -2736,22 +2710,16 @@ unsigned long gpgme_key_sig_get_ulong_attr (gpgme_key_t key, int uid_idx,
 gpgme_error_t gpgme_op_import_ext (gpgme_ctx_t ctx, gpgme_data_t keydata,
                                   int *nr) _GPGME_DEPRECATED(0,4);
 
-/* Release the trust item ITEM.  Deprecated, use
- * gpgme_trust_item_unref.  */
+/* DO NOT USE.  */
 void gpgme_trust_item_release (gpgme_trust_item_t item) _GPGME_DEPRECATED(0,4);
 
-/* Return the value of the attribute WHAT of ITEM, which has to be
- * representable by a string.  Deprecated, use trust item structure
- * directly.  */
+/* DO NOT USE.  */
 const char *gpgme_trust_item_get_string_attr (gpgme_trust_item_t item,
                                              _gpgme_attr_t what,
                                              const void *reserved, int idx)
      _GPGME_DEPRECATED(0,4);
 
-/* Return the value of the attribute WHAT of KEY, which has to be
- * representable by an integer.  IDX specifies a running index if the
- * attribute appears more than once in the key.  Deprecated, use trust
- * item structure directly.  */
+/* DO NOT USE.  */
 int gpgme_trust_item_get_int_attr (gpgme_trust_item_t item, _gpgme_attr_t what,
                                   const void *reserved, int idx)
      _GPGME_DEPRECATED(0,4);
index e5dbdcb..e4b8577 100644 (file)
--- a/src/key.c
+++ b/src/key.c
@@ -385,6 +385,7 @@ gpgme_key_unref (gpgme_key_t key)
         }
 
       free (uid->address);
+      free (uid->uidhash);
       free (uid);
       uid = next_uid;
     }
index cdb115f..a4de3ad 100644 (file)
@@ -621,8 +621,9 @@ keylist_colon_handler (void *priv, char *line)
 
   /* Only look at signature and trust info records immediately
      following a user ID.  For this, clear the user ID pointer when
-     encountering anything but a signature or trust record.  */
-  if (rectype != RT_SIG && rectype != RT_REV && rectype != RT_TFS)
+     encountering anything but a signature, trust record or subpacket.  */
+  if (rectype != RT_SIG && rectype != RT_REV && rectype != RT_TFS &&
+      rectype != RT_SPK)
     opd->tmp_uid = NULL;
 
   /* Only look at subpackets immediately following a signature.  For
@@ -830,6 +831,12 @@ keylist_colon_handler (void *priv, char *line)
 
           if (field[1])
             set_userid_flags (key, field[1]);
+          if (field[7] && *field[7])
+            {
+              gpgme_user_id_t uid = key->_last_uid;
+              assert (uid);
+              uid->uidhash = strdup (field[7]);
+            }
           opd->tmp_uid = key->_last_uid;
           if (fields >= 20)
             {
index 5c4f339..cf066d6 100644 (file)
@@ -79,27 +79,18 @@ _gpgme_set_override_inst_dir (const char *dir)
   return 0;
 }
 
-
-/* Find an executable program PGM along the envvar PATH.  */
+/* Find an executable program in the colon seperated paths. */
 static char *
-walk_path (const char *pgm)
+walk_path_str (const char *path_str, const char *pgm)
 {
-  const char *orig_path, *path, *s;
+  const char *path, *s;
   char *fname, *p;
 
-#ifdef FIXED_SEARCH_PATH
-  orig_path = FIXED_SEARCH_PATH;
-#else
-  orig_path = getenv ("PATH");
-  if (!orig_path)
-    orig_path = "/bin:/usr/bin";
-#endif
-
-  fname = malloc (strlen (orig_path) + 1 + strlen (pgm) + 1);
+  fname = malloc (strlen (path_str) + 1 + strlen (pgm) + 1);
   if (!fname)
     return NULL;
 
-  path = orig_path;
+  path = path_str;
   for (;;)
     {
       for (s=path, p=fname; *s && *s != ':'; s++, p++)
@@ -114,14 +105,52 @@ walk_path (const char *pgm)
       path = s + 1;
     }
 
-  _gpgme_debug (NULL, DEBUG_ENGINE, -1, NULL, NULL, NULL,
-                "gpgme-walk_path: '%s' not found in '%s'",
-                pgm, orig_path);
-
   free (fname);
   return NULL;
 }
 
+/* Find an executable program PGM. */
+static char *
+find_executable (const char *pgm)
+{
+  const char *orig_path;
+  char *ret;
+
+#ifdef FIXED_SEARCH_PATH
+  orig_path = FIXED_SEARCH_PATH;
+#else
+  orig_path = getenv ("PATH");
+  if (!orig_path)
+    orig_path = "/bin:/usr/bin";
+#endif
+  ret = walk_path_str (orig_path, pgm);
+
+  if (!ret)
+    {
+      _gpgme_debug (NULL, DEBUG_ENGINE, -1, NULL, NULL, NULL,
+                    "gpgme-walk_path: '%s' not found in '%s'",
+                    pgm, orig_path);
+    }
+#ifdef __APPLE__
+  /* On apple, especially when started through gpgme-json via
+     the browser interface we should look into some additional
+     fallback paths. */
+  const char *additional_path = "/usr/local/bin:/usr/local/MacGPG2/bin";
+  if (!ret)
+    {
+      ret = walk_path_str (additional_path, pgm);
+    }
+  if (!ret)
+    {
+      _gpgme_debug (NULL, DEBUG_ENGINE, -1, NULL, NULL, NULL,
+                    "gpgme-walk_path: '%s' not found in '%s'",
+                    pgm, additional_path);
+    }
+#endif
+
+  return ret;
+}
+
 
 /* Return the full file name of the GPG binary.  This function is used
    if gpgconf was not found and thus it can be assumed that gpg2 is
@@ -130,7 +159,7 @@ walk_path (const char *pgm)
 char *
 _gpgme_get_gpg_path (void)
 {
-  return walk_path (default_gpg_name? default_gpg_name : "gpg");
+  return find_executable (default_gpg_name? default_gpg_name : "gpg");
 }
 
 
@@ -139,7 +168,7 @@ _gpgme_get_gpg_path (void)
 char *
 _gpgme_get_gpgconf_path (void)
 {
-  return walk_path (default_gpgconf_name? default_gpgconf_name : "gpgconf");
+  return find_executable (default_gpgconf_name? default_gpgconf_name : "gpgconf");
 }
 
 /* See w32-util.c */
index 8aa9d28..81b2ff9 100644 (file)
@@ -663,7 +663,7 @@ parse_trust (gpgme_signature_t sig, gpgme_status_code_t code, char *args)
         {
           while (*args == ' ')
             args++;
-          if (!strncmp (args, "chain", 2) && (args[2] == ' ' || !args[2]))
+          if (!strncmp (args, "chain", 5) && (args[5] == ' ' || !args[5]))
             sig->chain_model = 1;
         }
     }
index c5c21f5..80978f9 100644 (file)
@@ -1643,7 +1643,7 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)
   int i;
   int any;
   int count;
-  void *dbg_help;
+  void *dbg_help = NULL;
   TRACE_BEG  (DEBUG_SYSIO, "_gpgme_io_select", fds,
              "nfds=%u, nonblock=%u", nfds, nonblock);
 
index 8207676..2631ae7 100644 (file)
@@ -308,10 +308,11 @@ _gpgme_w32_cancel_synchronous_io (HANDLE thread)
 
   if (func)
     {
-      if (!func (thread) && GetLastError() != ERROR_NOT_FOUND)
+      if (!func ((DWORD)thread) && GetLastError() != ERROR_NOT_FOUND)
         {
           TRACE (DEBUG_ENGINE, "gpgme:CancelSynchronousIo", NULL,
-                  "called for thread %p: ec=%d", thread, GetLastError ());
+                 "called for thread %p: ec=%u",
+                 thread, (unsigned int)GetLastError ());
         }
     }
   else
index 7c0b0b4..689ec3b 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -220,7 +220,16 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/run-decrypt.Po \
+       ./$(DEPDIR)/run-encrypt.Po ./$(DEPDIR)/run-export.Po \
+       ./$(DEPDIR)/run-genkey.Po ./$(DEPDIR)/run-identify.Po \
+       ./$(DEPDIR)/run-import.Po ./$(DEPDIR)/run-keylist.Po \
+       ./$(DEPDIR)/run-keysign.Po ./$(DEPDIR)/run-sign.Po \
+       ./$(DEPDIR)/run-swdb.Po ./$(DEPDIR)/run-threaded.Po \
+       ./$(DEPDIR)/run-tofu.Po ./$(DEPDIR)/run-verify.Po \
+       ./$(DEPDIR)/t-data.Po ./$(DEPDIR)/t-engine-info.Po \
+       ./$(DEPDIR)/t-version.Po
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -269,7 +278,7 @@ am__recursive_targets = \
   $(RECURSIVE_CLEAN_TARGETS) \
   $(am__extra_recursive_targets)
 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       distdir
+       distdir distdir-am
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -530,6 +539,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -574,8 +584,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -666,22 +676,28 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-decrypt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-encrypt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-export.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-genkey.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-identify.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-import.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-keylist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-keysign.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-sign.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-swdb.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-threaded.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-tofu.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-verify.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-data.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-engine-info.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-version.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-decrypt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-encrypt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-export.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-genkey.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-identify.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-import.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-keylist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-keysign.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-sign.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-swdb.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-threaded.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-tofu.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-verify.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-data.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-engine-info.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-version.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -902,7 +918,10 @@ check-TESTS: $(TESTS)
          test "$$failed" -eq 0; \
        else :; fi
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -999,7 +1018,22 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
        mostlyclean-am
 
 distclean: distclean-recursive
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/run-decrypt.Po
+       -rm -f ./$(DEPDIR)/run-encrypt.Po
+       -rm -f ./$(DEPDIR)/run-export.Po
+       -rm -f ./$(DEPDIR)/run-genkey.Po
+       -rm -f ./$(DEPDIR)/run-identify.Po
+       -rm -f ./$(DEPDIR)/run-import.Po
+       -rm -f ./$(DEPDIR)/run-keylist.Po
+       -rm -f ./$(DEPDIR)/run-keysign.Po
+       -rm -f ./$(DEPDIR)/run-sign.Po
+       -rm -f ./$(DEPDIR)/run-swdb.Po
+       -rm -f ./$(DEPDIR)/run-threaded.Po
+       -rm -f ./$(DEPDIR)/run-tofu.Po
+       -rm -f ./$(DEPDIR)/run-verify.Po
+       -rm -f ./$(DEPDIR)/t-data.Po
+       -rm -f ./$(DEPDIR)/t-engine-info.Po
+       -rm -f ./$(DEPDIR)/t-version.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -1045,7 +1079,22 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-recursive
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/run-decrypt.Po
+       -rm -f ./$(DEPDIR)/run-encrypt.Po
+       -rm -f ./$(DEPDIR)/run-export.Po
+       -rm -f ./$(DEPDIR)/run-genkey.Po
+       -rm -f ./$(DEPDIR)/run-identify.Po
+       -rm -f ./$(DEPDIR)/run-import.Po
+       -rm -f ./$(DEPDIR)/run-keylist.Po
+       -rm -f ./$(DEPDIR)/run-keysign.Po
+       -rm -f ./$(DEPDIR)/run-sign.Po
+       -rm -f ./$(DEPDIR)/run-swdb.Po
+       -rm -f ./$(DEPDIR)/run-threaded.Po
+       -rm -f ./$(DEPDIR)/run-tofu.Po
+       -rm -f ./$(DEPDIR)/run-verify.Po
+       -rm -f ./$(DEPDIR)/t-data.Po
+       -rm -f ./$(DEPDIR)/t-engine-info.Po
+       -rm -f ./$(DEPDIR)/t-version.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -1066,20 +1115,20 @@ uninstall-am:
 
 .MAKE: $(am__recursive_targets) check-am install-am install-strip
 
-.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
-       check-TESTS check-am clean clean-generic clean-libtool \
-       clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
-       distclean-compile distclean-generic distclean-libtool \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       installdirs-am maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-compile mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
-       uninstall-am
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+       am--depfiles check check-TESTS check-am clean clean-generic \
+       clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+       ctags-am distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs installdirs-am maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
index 68222fa..f79465a 100644 (file)
@@ -38,7 +38,7 @@ endif
 c_tests = \
         t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers                \
        t-decrypt t-verify t-decrypt-verify t-sig-notation t-export     \
-       t-import t-trustlist t-edit t-keylist t-keylist-sig t-wait      \
+       t-import t-edit t-keylist t-keylist-sig t-wait  \
        t-encrypt-large t-file-name t-gpgconf t-encrypt-mixed \
        $(tests_unix)
 
index 5b1ec77..bf8ad3a 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -140,9 +140,8 @@ am__EXEEXT_2 = t-encrypt$(EXEEXT) t-encrypt-sym$(EXEEXT) \
        t-encrypt-sign$(EXEEXT) t-sign$(EXEEXT) t-signers$(EXEEXT) \
        t-decrypt$(EXEEXT) t-verify$(EXEEXT) t-decrypt-verify$(EXEEXT) \
        t-sig-notation$(EXEEXT) t-export$(EXEEXT) t-import$(EXEEXT) \
-       t-trustlist$(EXEEXT) t-edit$(EXEEXT) t-keylist$(EXEEXT) \
-       t-keylist-sig$(EXEEXT) t-wait$(EXEEXT) \
-       t-encrypt-large$(EXEEXT) t-file-name$(EXEEXT) \
+       t-edit$(EXEEXT) t-keylist$(EXEEXT) t-keylist-sig$(EXEEXT) \
+       t-wait$(EXEEXT) t-encrypt-large$(EXEEXT) t-file-name$(EXEEXT) \
        t-gpgconf$(EXEEXT) t-encrypt-mixed$(EXEEXT) $(am__EXEEXT_1)
 @HAVE_W32_SYSTEM_FALSE@am__EXEEXT_3 = t-cancel$(EXEEXT)
 am__EXEEXT_4 = t-genkey$(EXEEXT) $(am__EXEEXT_3)
@@ -239,10 +238,6 @@ t_thread_keylist_verify_DEPENDENCIES = ../../src/libgpgme.la
 t_thread1_SOURCES = t-thread1.c
 t_thread1_OBJECTS = t-thread1.$(OBJEXT)
 t_thread1_DEPENDENCIES = ../../src/libgpgme.la
-t_trustlist_SOURCES = t-trustlist.c
-t_trustlist_OBJECTS = t-trustlist.$(OBJEXT)
-t_trustlist_LDADD = $(LDADD)
-t_trustlist_DEPENDENCIES = ../../src/libgpgme.la
 t_verify_SOURCES = t-verify.c
 t_verify_OBJECTS = t-verify.$(OBJEXT)
 t_verify_LDADD = $(LDADD)
@@ -265,7 +260,21 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/t-cancel.Po \
+       ./$(DEPDIR)/t-decrypt-verify.Po ./$(DEPDIR)/t-decrypt.Po \
+       ./$(DEPDIR)/t-edit.Po ./$(DEPDIR)/t-encrypt-large.Po \
+       ./$(DEPDIR)/t-encrypt-mixed.Po ./$(DEPDIR)/t-encrypt-sign.Po \
+       ./$(DEPDIR)/t-encrypt-sym.Po ./$(DEPDIR)/t-encrypt.Po \
+       ./$(DEPDIR)/t-eventloop.Po ./$(DEPDIR)/t-export.Po \
+       ./$(DEPDIR)/t-file-name.Po ./$(DEPDIR)/t-genkey.Po \
+       ./$(DEPDIR)/t-gpgconf.Po ./$(DEPDIR)/t-import.Po \
+       ./$(DEPDIR)/t-keylist-sig.Po ./$(DEPDIR)/t-keylist.Po \
+       ./$(DEPDIR)/t-sig-notation.Po ./$(DEPDIR)/t-sign.Po \
+       ./$(DEPDIR)/t-signers.Po \
+       ./$(DEPDIR)/t-thread-keylist-verify.Po \
+       ./$(DEPDIR)/t-thread-keylist.Po ./$(DEPDIR)/t-thread1.Po \
+       ./$(DEPDIR)/t-verify.Po ./$(DEPDIR)/t-wait.Po
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -291,14 +300,14 @@ SOURCES = t-cancel.c t-decrypt.c t-decrypt-verify.c t-edit.c \
        t-file-name.c t-genkey.c t-gpgconf.c t-import.c t-keylist.c \
        t-keylist-sig.c t-sig-notation.c t-sign.c t-signers.c \
        t-thread-keylist.c t-thread-keylist-verify.c t-thread1.c \
-       t-trustlist.c t-verify.c t-wait.c
+       t-verify.c t-wait.c
 DIST_SOURCES = t-cancel.c t-decrypt.c t-decrypt-verify.c t-edit.c \
        t-encrypt.c t-encrypt-large.c t-encrypt-mixed.c \
        t-encrypt-sign.c t-encrypt-sym.c t-eventloop.c t-export.c \
        t-file-name.c t-genkey.c t-gpgconf.c t-import.c t-keylist.c \
        t-keylist-sig.c t-sig-notation.c t-sign.c t-signers.c \
        t-thread-keylist.c t-thread-keylist-verify.c t-thread1.c \
-       t-trustlist.c t-verify.c t-wait.c
+       t-verify.c t-wait.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -539,6 +548,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -561,7 +571,7 @@ noinst_HEADERS = t-support.h
 c_tests = \
         t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers                \
        t-decrypt t-verify t-decrypt-verify t-sig-notation t-export     \
-       t-import t-trustlist t-edit t-keylist t-keylist-sig t-wait      \
+       t-import t-edit t-keylist t-keylist-sig t-wait  \
        t-encrypt-large t-file-name t-gpgconf t-encrypt-mixed \
        $(tests_unix)
 
@@ -618,8 +628,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -732,10 +742,6 @@ t-thread1$(EXEEXT): $(t_thread1_OBJECTS) $(t_thread1_DEPENDENCIES) $(EXTRA_t_thr
        @rm -f t-thread1$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(t_thread1_OBJECTS) $(t_thread1_LDADD) $(LIBS)
 
-t-trustlist$(EXEEXT): $(t_trustlist_OBJECTS) $(t_trustlist_DEPENDENCIES) $(EXTRA_t_trustlist_DEPENDENCIES) 
-       @rm -f t-trustlist$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(t_trustlist_OBJECTS) $(t_trustlist_LDADD) $(LIBS)
-
 t-verify$(EXEEXT): $(t_verify_OBJECTS) $(t_verify_DEPENDENCIES) $(EXTRA_t_verify_DEPENDENCIES) 
        @rm -f t-verify$(EXEEXT)
        $(AM_V_CCLD)$(LINK) $(t_verify_OBJECTS) $(t_verify_LDADD) $(LIBS)
@@ -750,32 +756,37 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-cancel.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-decrypt-verify.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-decrypt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-edit.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt-large.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt-mixed.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt-sign.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt-sym.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-eventloop.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-export.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-file-name.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-genkey.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-gpgconf.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-import.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist-sig.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-sig-notation.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-sign.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-signers.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-thread-keylist-verify.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-thread-keylist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-thread1.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-trustlist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-verify.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-wait.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-cancel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-decrypt-verify.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-decrypt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-edit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt-large.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt-mixed.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt-sign.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt-sym.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-eventloop.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-export.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-file-name.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-genkey.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-gpgconf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-import.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist-sig.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-sig-notation.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-sign.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-signers.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-thread-keylist-verify.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-thread-keylist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-thread1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-verify.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-wait.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -949,7 +960,10 @@ check-TESTS: $(TESTS)
          test "$$failed" -eq 0; \
        else :; fi
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -1024,7 +1038,31 @@ clean-am: clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
        mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/t-cancel.Po
+       -rm -f ./$(DEPDIR)/t-decrypt-verify.Po
+       -rm -f ./$(DEPDIR)/t-decrypt.Po
+       -rm -f ./$(DEPDIR)/t-edit.Po
+       -rm -f ./$(DEPDIR)/t-encrypt-large.Po
+       -rm -f ./$(DEPDIR)/t-encrypt-mixed.Po
+       -rm -f ./$(DEPDIR)/t-encrypt-sign.Po
+       -rm -f ./$(DEPDIR)/t-encrypt-sym.Po
+       -rm -f ./$(DEPDIR)/t-encrypt.Po
+       -rm -f ./$(DEPDIR)/t-eventloop.Po
+       -rm -f ./$(DEPDIR)/t-export.Po
+       -rm -f ./$(DEPDIR)/t-file-name.Po
+       -rm -f ./$(DEPDIR)/t-genkey.Po
+       -rm -f ./$(DEPDIR)/t-gpgconf.Po
+       -rm -f ./$(DEPDIR)/t-import.Po
+       -rm -f ./$(DEPDIR)/t-keylist-sig.Po
+       -rm -f ./$(DEPDIR)/t-keylist.Po
+       -rm -f ./$(DEPDIR)/t-sig-notation.Po
+       -rm -f ./$(DEPDIR)/t-sign.Po
+       -rm -f ./$(DEPDIR)/t-signers.Po
+       -rm -f ./$(DEPDIR)/t-thread-keylist-verify.Po
+       -rm -f ./$(DEPDIR)/t-thread-keylist.Po
+       -rm -f ./$(DEPDIR)/t-thread1.Po
+       -rm -f ./$(DEPDIR)/t-verify.Po
+       -rm -f ./$(DEPDIR)/t-wait.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -1070,7 +1108,31 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/t-cancel.Po
+       -rm -f ./$(DEPDIR)/t-decrypt-verify.Po
+       -rm -f ./$(DEPDIR)/t-decrypt.Po
+       -rm -f ./$(DEPDIR)/t-edit.Po
+       -rm -f ./$(DEPDIR)/t-encrypt-large.Po
+       -rm -f ./$(DEPDIR)/t-encrypt-mixed.Po
+       -rm -f ./$(DEPDIR)/t-encrypt-sign.Po
+       -rm -f ./$(DEPDIR)/t-encrypt-sym.Po
+       -rm -f ./$(DEPDIR)/t-encrypt.Po
+       -rm -f ./$(DEPDIR)/t-eventloop.Po
+       -rm -f ./$(DEPDIR)/t-export.Po
+       -rm -f ./$(DEPDIR)/t-file-name.Po
+       -rm -f ./$(DEPDIR)/t-genkey.Po
+       -rm -f ./$(DEPDIR)/t-gpgconf.Po
+       -rm -f ./$(DEPDIR)/t-import.Po
+       -rm -f ./$(DEPDIR)/t-keylist-sig.Po
+       -rm -f ./$(DEPDIR)/t-keylist.Po
+       -rm -f ./$(DEPDIR)/t-sig-notation.Po
+       -rm -f ./$(DEPDIR)/t-sign.Po
+       -rm -f ./$(DEPDIR)/t-signers.Po
+       -rm -f ./$(DEPDIR)/t-thread-keylist-verify.Po
+       -rm -f ./$(DEPDIR)/t-thread-keylist.Po
+       -rm -f ./$(DEPDIR)/t-thread1.Po
+       -rm -f ./$(DEPDIR)/t-verify.Po
+       -rm -f ./$(DEPDIR)/t-wait.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -1091,19 +1153,19 @@ uninstall-am:
 
 .MAKE: all check check-am install install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
-       clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
-       cscopelist-am ctags ctags-am distclean distclean-compile \
-       distclean-generic distclean-libtool distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags tags-am uninstall uninstall-am
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+       check-am clean clean-generic clean-libtool clean-local \
+       clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
index d7a5f1e..8e2bb3e 100644 (file)
@@ -340,7 +340,7 @@ main (void)
   }
 
   /* Now change something else.  */
-  fprintf (stderr, " gpg.keyserver ");
+  fprintf (stderr, " dirmngr.keyserver ");
   for (i = 0; i < N; i++) {
     const char *values[2] = { "hkp://foo.bar", "hkps://bar.foo" };
     gpgme_conf_arg_t arg;
@@ -349,7 +349,7 @@ main (void)
     err = gpgme_conf_arg_new (&arg, GPGME_CONF_STRING, values[i%2]);
     fail_if_err (err);
 
-    if (lookup (conf, "gpg", "keyserver", &comp, &opt))
+    if (lookup (conf, "dirmngr", "keyserver", &comp, &opt))
       {
        /* Found.  */
        test (opt->alt_type == GPGME_CONF_STRING);
@@ -361,7 +361,7 @@ main (void)
       }
     else
       {
-       fprintf (stderr, "Skipping test, option gpg.keyserver not found.\n");
+       fprintf (stderr, "Skipping test, option dirmngr.keyserver not found.\n");
        break;
       }
 
@@ -369,7 +369,7 @@ main (void)
     gpgme_conf_release (conf);
     err = gpgme_op_conf_load (ctx, &conf);
     fail_if_err (err);
-    if (lookup (conf, "gpg", "keyserver", &comp, &opt))
+    if (lookup (conf, "dirmngr", "keyserver", &comp, &opt))
       {
         /* Found.  */
         test (opt->alt_type == GPGME_CONF_STRING);
diff --git a/tests/gpg/t-trustlist.c b/tests/gpg/t-trustlist.c
deleted file mode 100644 (file)
index 54b2f70..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/* t-trustlist.c - Regression test.
- * Copyright (C) 2000 Werner Koch (dd9jn)
- * Copyright (C) 2001, 2003, 2004 g10 Code 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 <https://gnu.org/licenses/>.
- * SPDX-License-Identifier: LGPL-2.1-or-later
- */
-
-/* We need to include config.h so that we know whether we are building
-   with large file system (LFS) support. */
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <gpgme.h>
-
-#include "t-support.h"
-
-\f
-int
-main (int argc, char *argv[])
-{
-  gpgme_ctx_t ctx;
-  gpgme_error_t err;
-  gpgme_trust_item_t item;
-
-  (void)argc;
-  (void)argv;
-
-  init_gpgme (GPGME_PROTOCOL_OpenPGP);
-
-  err = gpgme_new (&ctx);
-  fail_if_err (err);
-
-  err = gpgme_op_trustlist_start (ctx, "alice", 0);
-  fail_if_err (err);
-
-  while (!(err = gpgme_op_trustlist_next (ctx, &item)))
-    {
-      printf ("l=%d k=%s t=%d o=%s v=%s u=%s\n",
-             item->level, item->keyid, item->type, item->owner_trust,
-             item->validity, item->name);
-      gpgme_trust_item_unref (item);
-    }
-  if (gpgme_err_code (err) != GPG_ERR_EOF)
-    fail_if_err (err);
-
-  gpgme_release (ctx);
-  return 0;
-}
index e8369c9..8a09fac 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -194,7 +194,13 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/cms-decrypt.Po \
+       ./$(DEPDIR)/cms-keylist.Po ./$(DEPDIR)/t-decrypt.Po \
+       ./$(DEPDIR)/t-encrypt.Po ./$(DEPDIR)/t-export.Po \
+       ./$(DEPDIR)/t-genkey.Po ./$(DEPDIR)/t-import.Po \
+       ./$(DEPDIR)/t-keylist.Po ./$(DEPDIR)/t-sign.Po \
+       ./$(DEPDIR)/t-verify.Po
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -460,6 +466,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -511,8 +518,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -579,16 +586,22 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cms-decrypt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cms-keylist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-decrypt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-export.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-genkey.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-import.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-sign.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-verify.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cms-decrypt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cms-keylist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-decrypt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-encrypt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-export.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-genkey.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-import.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-keylist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-sign.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-verify.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -762,7 +775,10 @@ check-TESTS: $(TESTS)
          test "$$failed" -eq 0; \
        else :; fi
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -837,7 +853,16 @@ clean-am: clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
        mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/cms-decrypt.Po
+       -rm -f ./$(DEPDIR)/cms-keylist.Po
+       -rm -f ./$(DEPDIR)/t-decrypt.Po
+       -rm -f ./$(DEPDIR)/t-encrypt.Po
+       -rm -f ./$(DEPDIR)/t-export.Po
+       -rm -f ./$(DEPDIR)/t-genkey.Po
+       -rm -f ./$(DEPDIR)/t-import.Po
+       -rm -f ./$(DEPDIR)/t-keylist.Po
+       -rm -f ./$(DEPDIR)/t-sign.Po
+       -rm -f ./$(DEPDIR)/t-verify.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -883,7 +908,16 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/cms-decrypt.Po
+       -rm -f ./$(DEPDIR)/cms-keylist.Po
+       -rm -f ./$(DEPDIR)/t-decrypt.Po
+       -rm -f ./$(DEPDIR)/t-encrypt.Po
+       -rm -f ./$(DEPDIR)/t-export.Po
+       -rm -f ./$(DEPDIR)/t-genkey.Po
+       -rm -f ./$(DEPDIR)/t-import.Po
+       -rm -f ./$(DEPDIR)/t-keylist.Po
+       -rm -f ./$(DEPDIR)/t-sign.Po
+       -rm -f ./$(DEPDIR)/t-verify.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -904,19 +938,19 @@ uninstall-am:
 
 .MAKE: all check check-am install install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
-       clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
-       cscopelist-am ctags ctags-am distclean distclean-compile \
-       distclean-generic distclean-libtool distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags tags-am uninstall uninstall-am
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+       check-am clean clean-generic clean-libtool clean-local \
+       clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
index ac7ef79..e5bbf9c 100644 (file)
@@ -59,37 +59,9 @@ progress (void *self, const char *what, int type, int current, int total)
 }
 
 
-int
-main (void)
+static void
+check_result (gpgme_genkey_result_t result)
 {
-  gpgme_ctx_t ctx;
-  gpgme_error_t err;
-  const char *parms = "<GnupgKeyParms format=\"internal\">\n"
-    "Key-Type: RSA\n"
-    "Key-Length: 1024\n"
-    "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester\n"
-    "Name-Email: joe@foo.bar\n"
-    "</GnupgKeyParms>\n";
-  gpgme_genkey_result_t result;
-  gpgme_data_t certreq;
-
-  init_gpgme (GPGME_PROTOCOL_CMS);
-
-  err = gpgme_data_new (&certreq);
-  fail_if_err (err);
-
-  err = gpgme_new (&ctx);
-  fail_if_err (err);
-
-  gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
-  gpgme_set_armor (ctx, 1);
-
-  gpgme_set_progress_cb (ctx, progress, NULL);
-
-  err = gpgme_op_genkey (ctx, parms, certreq, NULL);
-  fail_if_err (err);
-
-  result = gpgme_op_genkey_result (ctx);
   if (!result)
     {
       fprintf (stderr, "%s:%d: gpgme_op_genkey_result returns NULL\n",
@@ -121,10 +93,66 @@ main (void)
               __FILE__, __LINE__);
       exit (1);
     }
-  gpgme_release (ctx);
+}
 
-  print_data (certreq);
-  gpgme_data_release (certreq);
+static const char *parms[] = {
+    "<GnupgKeyParms format=\"internal\">\n"
+    "Key-Type: RSA\n"
+    "Key-Length: 1024\n"
+    "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester\n"
+    "Name-Email: joe@foo.bar\n"
+    "</GnupgKeyParms>\n",
+    "<GnupgKeyParms format=\"internal\">\n"
+    "Key-Type: ECC\n"
+    "Key-Curve: NIST P-256\n"
+    "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester\n"
+    "Name-Email: joe@foo.bar\n"
+    "</GnupgKeyParms>\n",
+    "<GnupgKeyParms format=\"internal\">\n"
+    "Key-Type: ECC\n"
+    "Key-Curve: Ed25519\n"
+    "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester\n"
+    "Name-Email: joe@foo.bar\n"
+    "</GnupgKeyParms>\n",
+};
+
+int
+main (void)
+{
+  gpgme_ctx_t ctx;
+  gpgme_error_t err;
+  gpgme_genkey_result_t result;
+  int i;
+
+  init_gpgme (GPGME_PROTOCOL_CMS);
+
+  err = gpgme_new (&ctx);
+  fail_if_err (err);
+
+  gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
+  gpgme_set_armor (ctx, 1);
+
+  gpgme_set_progress_cb (ctx, progress, NULL);
+
+  for (i = 0; i < DIM(parms); i++)
+    {
+      gpgme_data_t certreq;
+
+      progress_called = 0;
+      err = gpgme_data_new (&certreq);
+      fail_if_err (err);
+
+      err = gpgme_op_genkey (ctx, parms[i], certreq, NULL);
+      fail_if_err (err);
+
+      result = gpgme_op_genkey_result (ctx);
+      check_result (result);
+
+      print_data (certreq);
+      gpgme_data_release (certreq);
+    }
+
+  gpgme_release (ctx);
 
   return 0;
 }
index a006659..fe65364 100644 (file)
 
 #include <gpgme.h>
 
+#ifndef DIM
+#define DIM(v)              (sizeof(v)/sizeof((v)[0]))
+#endif
+
 #define fail_if_err(err)                                       \
   do                                                           \
     {                                                          \
index 3ff57ed..eef27a3 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -152,7 +152,8 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/t-json.Po
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -413,6 +414,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -492,8 +494,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -524,7 +526,13 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-json.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-json.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -698,7 +706,10 @@ check-TESTS: $(TESTS)
          test "$$failed" -eq 0; \
        else :; fi
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -773,7 +784,7 @@ clean-am: clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
        mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/t-json.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -819,7 +830,7 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/t-json.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -840,19 +851,19 @@ uninstall-am:
 
 .MAKE: all check check-am install install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
-       clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
-       cscopelist-am ctags ctags-am distclean distclean-compile \
-       distclean-generic distclean-libtool distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags tags-am uninstall uninstall-am
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+       check-am clean clean-generic clean-libtool clean-local \
+       clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
index fc60327..4371032 100644 (file)
             "pubkey_algo_name":     "ELG-E",
             "status_string":        "Success",
             "status_code":  0
-        }, {
-        "keyid":        "04071FB807287134",
-        "pubkey_algo_name":     "ELG-E",
-        "status_string":        "No secret key",
-        "status_code":  117440529
         }]
     },
     "info": {
index 5da20db..a34aa38 100644 (file)
@@ -91,7 +91,6 @@
             "can_sign":     true,
             "can_certify":  true,
             "can_authenticate":     true,
-            "secret":       true,
             "is_qualified": false,
             "protocol":     "OpenPGP",
             "fingerprint":  "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2",
                 "pubkey_algo_name":     "DSA",
                 "pubkey_algo_string":   "dsa1024",
                 "keyid":        "FE180B1DA9E3B0B2",
-                "keygrip":      "6D62909991D2331E5F4F605BC4DD738F30E6D26B",
                 "pubkey_algo":  17,
                 "length":       1024,
                 "timestamp":    920888034,
                     "pubkey_algo_name":     "ELG-E",
                     "pubkey_algo_string":   "elg1024",
                     "keyid":        "5381EA4EE29BA37F",
-                    "keygrip":      "6BBF325FADDC1109AE36CD535CA77AB9CFADD1F2",
                     "pubkey_algo":  16,
                     "length":       1024,
                     "timestamp":    920888071,
index c97585d..142a9f6 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -154,7 +154,8 @@ am__v_at_0 = @
 am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/conf
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
-am__depfiles_maybe = depfiles
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/t-command.Po
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -416,6 +417,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -452,8 +454,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -484,7 +486,13 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-command.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-command.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -658,7 +666,10 @@ check-TESTS: $(TESTS)
          test "$$failed" -eq 0; \
        else :; fi
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
@@ -730,7 +741,7 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
        mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/t-command.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -776,7 +787,7 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
+               -rm -f ./$(DEPDIR)/t-command.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -797,19 +808,19 @@ uninstall-am:
 
 .MAKE: check-am install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
-       clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \
-       ctags ctags-am distclean distclean-compile distclean-generic \
-       distclean-libtool distclean-tags distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags tags-am uninstall uninstall-am
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+       check-am clean clean-generic clean-libtool \
+       clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
index ecce80d..623c733 100644 (file)
 static int verbose;
 
 
+static gpg_error_t
+status_cb (void *opaque, const char *keyword, const char *value)
+{
+  (void)opaque;
+  fprintf (stderr, "status_cb: %s %s\n", keyword, value);
+  return 0;
+}
+
+
 static int
 show_usage (int ex)
 {
   fputs ("usage: " PGM " [options] USERIDS\n\n"
          "Options:\n"
          "  --verbose        run in verbose mode\n"
+         "  --status         print status lines from the backend\n"
          "  --openpgp        use OpenPGP protocol (default)\n"
          "  --cms            use X.509 protocol\n"
+         "  --ssh            export as ssh public key\n"
          "  --extern         send keys to the keyserver (TAKE CARE!)\n"
          "  --secret         export secret keys instead of public keys\n"
          "  --raw            use PKCS#1 as secret key format\n"
@@ -67,6 +78,7 @@ main (int argc, char **argv)
   gpgme_data_t out;
   gpgme_protocol_t protocol = GPGME_PROTOCOL_OpenPGP;
   gpgme_export_mode_t mode = 0;
+  int print_status = 0;
 
   if (argc)
     { argc--; argv++; }
@@ -86,6 +98,11 @@ main (int argc, char **argv)
           verbose = 1;
           argc--; argv++;
         }
+      else if (!strcmp (*argv, "--status"))
+        {
+          print_status = 1;
+          argc--; argv++;
+        }
       else if (!strcmp (*argv, "--openpgp"))
         {
           protocol = GPGME_PROTOCOL_OpenPGP;
@@ -101,6 +118,11 @@ main (int argc, char **argv)
           mode |= GPGME_EXPORT_MODE_EXTERN;
           argc--; argv++;
         }
+      else if (!strcmp (*argv, "--ssh"))
+        {
+          mode |= GPGME_EXPORT_MODE_SSH;
+          argc--; argv++;
+        }
       else if (!strcmp (*argv, "--secret"))
         {
           mode |= GPGME_EXPORT_MODE_SECRET;
@@ -129,52 +151,68 @@ main (int argc, char **argv)
   err = gpgme_new (&ctx);
   fail_if_err (err);
   gpgme_set_protocol (ctx, protocol);
+  if (print_status)
+    {
+      gpgme_set_status_cb (ctx, status_cb, NULL);
+      gpgme_set_ctx_flag (ctx, "full-status", "1");
+    }
 
-  /* Lookup the keys.  */
-  err = gpgme_op_keylist_ext_start (ctx, (const char**)argv, 0, 0);
+  err = gpgme_data_new (&out);
   fail_if_err (err);
 
-  while (!(err = gpgme_op_keylist_next (ctx, &key)))
+  if ((mode & GPGME_EXPORT_MODE_SSH))
     {
-      printf ("keyid: %s  (fpr: %s)\n",
-              key->subkeys?nonnull (key->subkeys->keyid):"?",
-              key->subkeys?nonnull (key->subkeys->fpr):"?");
+      mode = GPGME_EXPORT_MODE_SSH; /* Set only this bit for this test.  */
+      keyarray[0] = NULL;
 
-      if (keyidx < DIM (keyarray)-1)
-        keyarray[keyidx++] = key;
-      else
-        {
-          fprintf (stderr, PGM": too many keys"
-                   "- skipping this key\n");
-          gpgme_key_unref (key);
-        }
+      err = gpgme_op_export_ext (ctx, (const char**)argv, mode, out);
+      fail_if_err (err);
     }
-  if (gpgme_err_code (err) != GPG_ERR_EOF)
-    fail_if_err (err);
-  err = gpgme_op_keylist_end (ctx);
-  fail_if_err (err);
-  keyarray[keyidx] = NULL;
-
-  result = gpgme_op_keylist_result (ctx);
-  if (result->truncated)
+  else
     {
-      fprintf (stderr, PGM ": key listing unexpectedly truncated\n");
-      exit (1);
-    }
+      /* Lookup the keys as required by the export_keys function.  */
+      err = gpgme_op_keylist_ext_start (ctx, (const char**)argv, 0, 0);
+      fail_if_err (err);
 
-  /* Now for the actual export.  */
-  if ((mode & GPGME_EXPORT_MODE_EXTERN))
-    printf ("sending keys to keyserver\n");
-  if ((mode & GPGME_EXPORT_MODE_SECRET))
-    printf ("exporting secret keys!\n");
+      while (!(err = gpgme_op_keylist_next (ctx, &key)))
+        {
+          printf ("keyid: %s  (fpr: %s)\n",
+                  key->subkeys?nonnull (key->subkeys->keyid):"?",
+                  key->subkeys?nonnull (key->subkeys->fpr):"?");
+
+          if (keyidx < DIM (keyarray)-1)
+            keyarray[keyidx++] = key;
+          else
+            {
+              fprintf (stderr, PGM": too many keys"
+                       "- skipping this key\n");
+              gpgme_key_unref (key);
+            }
+        }
+      if (gpgme_err_code (err) != GPG_ERR_EOF)
+        fail_if_err (err);
+      err = gpgme_op_keylist_end (ctx);
+      fail_if_err (err);
+      keyarray[keyidx] = NULL;
+
+      result = gpgme_op_keylist_result (ctx);
+      if (result->truncated)
+        {
+          fprintf (stderr, PGM ": key listing unexpectedly truncated\n");
+          exit (1);
+        }
 
-  err = gpgme_data_new (&out);
-  fail_if_err (err);
+      /* Now for the actual export.  */
+      if ((mode & GPGME_EXPORT_MODE_EXTERN))
+        printf ("sending keys to keyserver\n");
+      if ((mode & GPGME_EXPORT_MODE_SECRET))
+        printf ("exporting secret keys!\n");
 
-  gpgme_set_armor (ctx, 1);
-  err = gpgme_op_export_keys (ctx, keyarray, mode,
-                              (mode & GPGME_KEYLIST_MODE_EXTERN)? NULL:out);
-  fail_if_err (err);
+      gpgme_set_armor (ctx, 1);
+      err = gpgme_op_export_keys (ctx, keyarray, mode,
+                                  (mode & GPGME_KEYLIST_MODE_EXTERN)? NULL:out);
+      fail_if_err (err);
+    }
 
   fflush (NULL);
   if (!(mode & GPGME_KEYLIST_MODE_EXTERN))
index d12e370..23c6110 100644 (file)
@@ -330,6 +330,8 @@ main (int argc, char **argv)
             printf ("    name: %s\n", uid->name);
           if (uid->comment)
             printf ("   cmmnt: %s\n", uid->comment);
+          if (uid->uidhash)
+            printf (" uidhash: %s\n", uid->uidhash);
           printf ("     upd: %lu (%u)\n", uid->last_update, uid->origin);
           printf ("   valid: %s\n",
                   uid->validity == GPGME_VALIDITY_UNKNOWN? "unknown":
index 5576b8f..55b2e48 100644 (file)
@@ -85,6 +85,7 @@ show_usage (int ex)
          "  --loopback       use a loopback pinentry\n"
          "  --key NAME       use key NAME for signing\n"
          "  --sender MBOX    use MBOX as sender address\n"
+         "  --include-key-block  use this option with gpg\n"
          , stderr);
   exit (ex);
 }
@@ -103,6 +104,7 @@ main (int argc, char **argv)
   gpgme_sign_result_t result;
   int print_status = 0;
   int use_loopback = 0;
+  int include_key_block = 0;
   const char *sender = NULL;
   const char *s;
 
@@ -165,6 +167,11 @@ main (int argc, char **argv)
           use_loopback = 1;
           argc--; argv++;
         }
+      else if (!strcmp (*argv, "--include-key-block"))
+        {
+          include_key_block = 1;
+          argc--; argv++;
+        }
       else if (!strncmp (*argv, "--", 2))
         show_usage (1);
 
@@ -197,6 +204,8 @@ main (int argc, char **argv)
       err = gpgme_get_key (ctx, key_string, &akey, 1);
       if (err)
         {
+          fprintf (stderr, PGM ": get key '%s' failed: %s\n",
+                   key_string, gpg_strerror (err));
           exit (1);
         }
       err = gpgme_signers_add (ctx, akey);
@@ -210,6 +219,17 @@ main (int argc, char **argv)
       fail_if_err (err);
     }
 
+  if (include_key_block)
+    {
+      err = gpgme_set_ctx_flag (ctx, "include-key-block", "1");
+      if (err)
+        {
+          fprintf (stderr, PGM ": error setting include-key-block:  %s\n",
+                   gpgme_strerror (err));
+          exit (1);
+        }
+    }
+
   err = gpgme_data_new_from_file (&in, *argv, 1);
   if (err)
     {
index 83a6533..e42eb6b 100644 (file)
@@ -234,6 +234,7 @@ show_usage (int ex)
          "  --sender MBOX    use MBOX as sender address\n"
          "  --repeat N       repeat the operation N times\n"
          "  --auto-key-retrieve\n"
+         "  --auto-key-import\n"
          , stderr);
   exit (ex);
 }
@@ -248,6 +249,7 @@ main (int argc, char **argv)
   int print_status = 0;
   const char *sender = NULL;
   int auto_key_retrieve = 0;
+  int auto_key_import = 0;
   int repeats = 1;
 
   if (argc)
@@ -304,7 +306,11 @@ main (int argc, char **argv)
           auto_key_retrieve = 1;
           argc--; argv++;
         }
-
+      else if (!strcmp (*argv, "--auto-key-import"))
+        {
+          auto_key_import = 1;
+          argc--; argv++;
+        }
       else if (!strncmp (*argv, "--", 2))
         show_usage (1);
 
@@ -372,6 +378,18 @@ main (int argc, char **argv)
             }
         }
 
+      if (auto_key_import)
+        {
+          gpgme_set_ctx_flag (ctx, "auto-key-import", "1");
+          s = gpgme_get_ctx_flag (ctx, "auto-key-import");
+          if (!s || strcmp (s, "1"))
+            {
+              fprintf (stderr, PGM ": gpgme_get_ctx_flag failed for '%s'\n",
+                       "auto-key-import");
+              exit (1);
+            }
+        }
+
       if (sender)
         {
           err = gpgme_set_sender (ctx, sender);