gpgme.git
15 hours agojson: Add subkey_algo and defaults to createkey master
Andre Heinecke [Mon, 20 Aug 2018 14:38:36 +0000 (16:38 +0200)]
json: Add subkey_algo and defaults to createkey

* src/gpgme-json.c (op_createkey, hlp_createkey): Add subkey_algo
handling.
(hlp_createkey): Fix documentation of expiry.
--
Due to the funny quick-gen-key interface generating a key
with an explicit algo would result in bad defaults (only an SC key),
without a subkey.

This adds handling that should probably be in GnuPG proper to fix
the semantics of createkey by adding default subkey_algo handling.

2 days agoPython bindings examples
Ben McGinnes [Sun, 19 Aug 2018 04:32:30 +0000 (14:32 +1000)]
Python bindings examples

* import-key.py: fixed a minor typo.
* pmkey-import.py: locates and imports keys from the ProtonMail keyserver.
* pmkey-import-alt.py: the same as the previous except with setting an
  alternative $GNUPGHOME directory.

2 days agoPython bindings setup file
Ben McGinnes [Sat, 18 Aug 2018 14:21:47 +0000 (00:21 +1000)]
Python bindings setup file

* Moved the build import back up where it belongs.
* Included comments indicating how to build and install for multiple
  Python versions beyond the first 2 on the same system.

2 days agoPython bindings tests: Near PEP8 compliance
Ben McGinnes [Sat, 18 Aug 2018 10:29:14 +0000 (20:29 +1000)]
Python bindings tests: Near PEP8 compliance

* PEP8 compliance for the vast majoeity of the tests.

2 days agoPython bindings examples: PEP8 conpliance
Ben McGinnes [Sat, 18 Aug 2018 08:46:47 +0000 (18:46 +1000)]
Python bindings examples: PEP8 conpliance

* Appears to be complete compliance.

2 days agoPython bindings setup: Near PEP8 compliance
Ben McGinnes [Sat, 18 Aug 2018 08:19:16 +0000 (18:19 +1000)]
Python bindings setup: Near PEP8 compliance

* lang/python/version.py.in: Fixed most things, but there's still an
  issue near the build portion with the existing Python bugs referenced.
* lang/python/setup.py.in: Now PEP8 compliant.

3 days agoPython bindings constants: PEP8 compliance (almost)
Ben McGinnes [Sat, 18 Aug 2018 05:36:23 +0000 (15:36 +1000)]
Python bindings constants: PEP8 compliance (almost)

* PEP8 compliance for all constants except the globals in
  src/constants/__init__.py depending on whether the import sequence
  affects the globals themselves.

3 days agoPython bindings src: PEP8 compliance
Ben McGinnes [Sat, 18 Aug 2018 05:05:34 +0000 (15:05 +1000)]
Python bindings src: PEP8 compliance

* import namespace clearance for src/*.py.
* Fixed a handful of is/is not None checks as well.

7 days agoSymmetric example
Ben McGinnes [Mon, 13 Aug 2018 16:55:56 +0000 (02:55 +1000)]
Symmetric example

* lang/python/examples/howto/symcrypt-file.py: *sigh*; passphrase was
  right the first time, just the error check that wasn't.
* I really should stop second guessing myself one of these days ...

Signed-off-by: Ben McGinnes <ben@adversary.org>
7 days agoSymmetric encryption example
Ben McGinnes [Mon, 13 Aug 2018 16:48:38 +0000 (02:48 +1000)]
Symmetric encryption example

* lang/python/examples/howto/symcrypt-file.py: Fixed the error code
  and the passphrase key word arg.

7 days agoSymmetric encryption example.
Ben McGinnes [Mon, 13 Aug 2018 16:22:36 +0000 (02:22 +1000)]
Symmetric encryption example.

* lang/python/examples/howto/symcrypt-file.py: A variation on standard
  key based encryption.

11 days agoPEP8 compliance and other code fixes
Ben McGinnes [Fri, 10 Aug 2018 01:25:01 +0000 (11:25 +1000)]
PEP8 compliance and other code fixes

* Ran all the .py files in src/ and below through Yapf.
* Included some manual edits of core.py, this time successfully making
  two notorious sections a bit more pythonic than scheming.
* Left the module imports as is.
* This will be committed if it passes the most essential test:
  compiling, installing and running it.

Signed-off-by: Ben McGinnes <ben@adversary.org>
11 days agoLink fixes
Ben McGinnes [Thu, 9 Aug 2018 17:39:46 +0000 (03:39 +1000)]
Link fixes

* lang/python/README: Fixed links in both versions of the README.

12 days agojson: Wipe memory in cJSON_Delete
Andre Heinecke [Wed, 8 Aug 2018 12:27:24 +0000 (14:27 +0200)]
json: Wipe memory in cJSON_Delete

* src/cJSON.c (cJSON_Delete): Wipe memory on deletion.

12 days agojson: Only use calloc instead of malloc
Andre Heinecke [Wed, 8 Aug 2018 12:25:28 +0000 (14:25 +0200)]
json: Only use calloc instead of malloc

* src/cJSON.c, src/gpgme-json.c (CALLOC_ONLY): New define
to change xmalloc / xtrymalloc to use calloc.

--
Some people consider malloc dangerous as it might allow an
information leak.

12 days agojson: Add checks when skipping byte
Andre Heinecke [Wed, 8 Aug 2018 11:30:01 +0000 (13:30 +0200)]
json: Add checks when skipping byte

* src/cJSON.c (parse_string, cJSON_Minify): Check for
terminating NULL byte when skipping the byte after a an escaped
quote.

12 days agojson: Don't error out if chunksize is omitted
Andre Heinecke [Wed, 8 Aug 2018 07:49:51 +0000 (09:49 +0200)]
json: Don't error out if chunksize is omitted

* src/gpgme-json.c (encode_and_chunk): Don't error out
if no chunksize is provided.

--
This fixes 82e4b900a96c837392259469a9a5821a95e7a707 which
caused every call without chunksize to error out.

12 days agocpp: Fix use after free in gencardkeyinteractor
Andre Heinecke [Wed, 8 Aug 2018 07:22:46 +0000 (09:22 +0200)]
cpp: Fix use after free in gencardkeyinteractor

* lang/cpp/src/gpggencardkeyinteractor.cpp
(GpgGenCardKeyInteractor::Private::keysize): Change to string.

--
The value is only required as string so we can save it this
way to avoid the need to convert it for the action command.

GnuPG-Bug-Id: T4094

2 weeks agoMake GNUPGHOME for tests overridable
Andre Heinecke [Mon, 6 Aug 2018 07:30:47 +0000 (09:30 +0200)]
Make GNUPGHOME for tests overridable

* lang/python/tests/Makefile.am,
lang/qt/tests/Makefile.am,
tests/Makefile.am,
tests/gpg/Makefile.am,
tests/gpgsm/Makefile.am,
tests/opassuan/Makefile.am (GNUPGHOME): Make variable explict.

--
If the build directory has too long path, gpgme could fail.
This is similar to

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=847206

In order to fix that, this patch extracts the GNUPGHOME variable
to be presented directly in the Makefile and thus overridable by
command line option.

A build system can then create a symlink to the GNUPGHOME directory
in /tmp and use that symlink as the GNUPGHOME directory
thus making the path very short.

GnuPG-Bug-Id: T4091

Patch provided by vlmarek

3 weeks agocpp: Add safety checks for key update
Andre Heinecke [Tue, 24 Jul 2018 06:40:28 +0000 (08:40 +0200)]
cpp: Add safety checks for key update

* lang/cpp/src/key.cpp (Key::update): Check that the key is
not NULL.
* lang/cpp/src/verificationresult.cpp (GpgME::Signature::key):
Check for fingerprint.

4 weeks agodocs: python bindings howto
Ben McGinnes [Sun, 22 Jul 2018 15:16:31 +0000 (01:16 +1000)]
docs: python bindings howto

* Fixed and tested the changes necessary for org-mode to correctly
  parse pythonic (Python 3) indentation.
* Updated the source blocks to recommended upper case for BEGIN_SRC
  and END_SRC.
* Tested and confirmed XHTML output matches correct examples.
* Tested against pseudo-control output via exporting from org-mode to
  org-mode and then exporting that to XHTML.  Remaining differences
  appear to be discarding the custom tags used to provide X[HT]ML id
  elements to each section which does not appear to offer any benefit.
* Exporting directly to XHTML or other HTML output should no longer
  cause problems, but if there are any then the first step should be
  exporting from org-to-org and then exporting that to XHTML.

Tested-by: Ben McGinnes <ben@adversary.org>
Signed-off-by: Ben McGinnes <ben@adversary.org>
4 weeks agodoc: python bindings howto
Ben McGinnes [Sun, 22 Jul 2018 14:21:05 +0000 (00:21 +1000)]
doc: python bindings howto

* Another retrofitting of the HOWTO Python example code, this time
  following adjustments to python-mode configuration and having
  trawled through the org-mode mailing lists for clues.

4 weeks agodoc: python bindings howto
Ben McGinnes [Sun, 22 Jul 2018 11:20:41 +0000 (21:20 +1000)]
doc: python bindings howto

* Added org-mode byline.

4 weeks agocore: Clear all flags for a new data property.
Werner Koch [Thu, 19 Jul 2018 18:38:21 +0000 (20:38 +0200)]
core: Clear all flags for a new data property.

* src/data.c (PROPERTY_TABLE_ALLOCATION_CHUNK): New.
(insert_into_property_table): Use it here.  Clear all flags.
--

Fixes-commit: 085cdeddef637cc057362fcbde13b0261b8699ec
Signed-off-by: Werner Koch <wk@gnupg.org>
4 weeks agocore: Blank out the plaintext after decryption failure.
Werner Koch [Thu, 19 Jul 2018 15:38:50 +0000 (17:38 +0200)]
core: Blank out the plaintext after decryption failure.

* src/data.h (data_prop_t): New enum.
(struct gpgme_data): Add field propidx.
* src/data.c (property_t): New.
(property_table, property_table_size, property_table_lock): New.
(insert_into_property_table): New.
(remove_from_property_table): New.
(_gpgme_data_get_dserial): New.
(_gpgme_data_set_prop): New.
(_gpgme_data_get_prop): New.
(_gpgme_data_new): Connect new object to property_table.
(_gpgme_data_release): Remove from property_table.
(gpgme_data_read): With DATA_PROP_BLANKOUT set don't fill the buffer.
* src/data-mem.c (gpgme_data_release_and_get_mem): Likewise.
* src/decrypt.c (struct op_data): Add field plaintext_dserial.
(_gpgme_op_decrypt_init_result): Add arg plaintext and init new field.
(_gpgme_decrypt_status_handler): Set DATA_PROP_BLANKOUT on decryption
failure.
(_gpgme_decrypt_start): Pass PLAIN to the init function.
* src/decrypt-verify.c (decrypt_verify_start): Ditto.
* configure.ac: Check for stdint.h and bail out if uint64_t is not
available.
--

This is a best effort feature to not output plaintext after a
decryption failure (e.g. due to no or broken authenticated
encryption).  It always work when using a memory object and reading it
after the decryption but it can't work reliable when the user is
reading from the data object while the decryption process is still
running.

This is quite a large change because the data objects and the context
objects are allowed to be owned by different threads.  Thus a
synchronization is needed and we do this with a global table of all
data objects to which the context objects can do soft-linking via a
unique data object serial number.

Signed-off-by: Werner Koch <wk@gnupg.org>
4 weeks agocpp: Print origin and last update for key/uid
Andre Heinecke [Thu, 19 Jul 2018 10:58:49 +0000 (12:58 +0200)]
cpp: Print origin and last update for key/uid

* lang/cpp/src/key.cpp: Print origin and last update in
iostream operators.

4 weeks agojson: Don't use strdup but the xtrystrdup wrapper.
Werner Koch [Thu, 19 Jul 2018 07:46:57 +0000 (09:46 +0200)]
json: Don't use strdup but the xtrystrdup wrapper.

* src/gpgme-json.c (create_keylist_patterns): Use CNT as first arg for
xcalloc.
(process_request): s/strdup/xtrystrdup/.
--

calloc takes two arguments so to be able to detect integer overflow.
Thus if we switch from malloc to calloc we should utilize that.

Signed-off-by: Werner Koch <wk@gnupg.org>
4 weeks agocore: New interface gpgme_data_new_from_estream.
Werner Koch [Thu, 19 Jul 2018 07:50:30 +0000 (09:50 +0200)]
core: New interface gpgme_data_new_from_estream.

* src/gpgme.h.in (gpgme_data_new_from_estream): New.
* src/data-estream.c: New.
* src/data.h (gpgme_data): New union member e_stream.
--

The estream functions (gpgrt_fopen et al.) are any waypart of the
required libgpg-error library and thus it makes sense to provide this
convenience interface.

Signed-off-by: Werner Koch <wk@gnupg.org>
4 weeks agojson: Fix memleak in native msging repl
Andre Heinecke [Wed, 18 Jul 2018 11:15:02 +0000 (13:15 +0200)]
json: Fix memleak in native msging repl

* src/gpgme-json.c (native_messaging_repl): Free request and
response after each loop.

--
If we only accept once request we should not loop. If we loop
we should do it properly.

4 weeks agojson: Ensure that native msging request is string
Andre Heinecke [Wed, 18 Jul 2018 11:06:08 +0000 (13:06 +0200)]
json: Ensure that native msging request is string

* src/gpgme-json.c (native_messaging_repl): Ensure that the
request is NULL terminated.

--
This avoids potential memory leaks and access to unmapped memory
in case the request was not terminated.
Other request functions use es_read_line which gurantees NULL
termination.

4 weeks agojson: Fix crash by ensuring response is never NULL
Andre Heinecke [Wed, 18 Jul 2018 11:02:32 +0000 (13:02 +0200)]
json: Fix crash by ensuring response is never NULL

* src/gpgme-json.c (encode_and_chunk): Try to always
return at least an error.
(process_request): Double check that it does not return NULL.

--
If process_request returns NULL the following strlen on it
would crash.

4 weeks agojson: Fix memory errors in create_keylist_patterns
Andre Heinecke [Wed, 18 Jul 2018 10:57:51 +0000 (12:57 +0200)]
json: Fix memory errors in create_keylist_patterns

* src/gpgme-json.c (create_keylist_patterns): Reserve two
pointers more then linefeeds.
(create_keylist_patterns): Fix loop to count linebreaks.
(create_keylist_patterns): Use calloc for good measure.

--
This fixes crashes and memory corruption as cnt did not
match i.

4 weeks agoqt: Handle encoding for diagnostics
Andre Heinecke [Wed, 18 Jul 2018 09:27:46 +0000 (11:27 +0200)]
qt: Handle encoding for diagnostics

* lang/qt/src/threadedjobmixin.cpp (fromEncoding)
(stringFromGpgOutput): New helpers.
(markupDiagnostics): Use it.

--
The Problem is that on my western windows system GnuPG
gets CP 437 as GetConsoleOutputCP and prints in that codepage.
In a W32 GUI Application we get 0 as GetConsoleOutputCP and 1252
with GetACP.

The only thing that seemed to somehow match was GetOEMCP but
that might just be luck and it might still be broken in
other windows languages.

This code is also used in Kleopatra so it might make sense
to make it public once it is demonstrated that it works on
most systems.

5 weeks agojson: Fix crash on invalid json
Andre Heinecke [Mon, 16 Jul 2018 17:47:11 +0000 (19:47 +0200)]
json: Fix crash on invalid json

* src/gpgme-json.c (process_request): Init res. Check for
json object before encode and chunk.

--
If json is invalid we can't read chunksize and would crash
in encode and chunk.

5 weeks agojson: Fix uninitialized key unref in op_delete
Andre Heinecke [Mon, 16 Jul 2018 17:46:04 +0000 (19:46 +0200)]
json: Fix uninitialized key unref in op_delete

* src/gpgme-json.c (op_delete): Init key.

5 weeks agojson: Minor cleanups in cJSON.c
Werner Koch [Mon, 16 Jul 2018 12:42:30 +0000 (14:42 +0200)]
json: Minor cleanups in cJSON.c

* src/cJSON.c: Add comments on the origin of the code.
(parse_string): Allocate an extra byte for safeness.
(cJSON_AddItemToArray): Allo ARRAY to be NULL.

Signed-off-by: Werner Koch <wk@gnupg.org>
5 weeks agojson: Fix buffer overflow in cJSON.c
Werner Koch [Mon, 16 Jul 2018 10:34:52 +0000 (12:34 +0200)]
json: Fix buffer overflow in cJSON.c

* src/cJSON.c (parse_string): Correctly detect bad hex.
--

The call to parse_hex4 checks that only hex digits follow and in the
error case returns 0.  However, by the time of the combined check for
an invalid value and the error PTR has already been set to the last
hex character and thus if the end-of-string or a quote character was
one of the bad hex digits the loop will miss the end of the string
which does not match with the simple buffer length allocation test at
the begin of the function.

Signed-off-by: Werner Koch <wk@gnupg.org>
5 weeks agopython bindings: example scripts
Ben McGinnes [Fri, 13 Jul 2018 10:36:27 +0000 (20:36 +1000)]
python bindings: example scripts

* Fixed incorrect mention of output prompt referencing secret keys
  when the scripts are only for exporting public keys in whole or
  minimised forms.

5 weeks agojson: Add with-sec-fprs param to export
Andre Heinecke [Wed, 11 Jul 2018 14:18:24 +0000 (16:18 +0200)]
json: Add with-sec-fprs param to export

* src/gpgme-json.c (add_secret_fprs): New helper.
(op_export, hlp_export): Extend for with-sec fprs.

--
This is a request from Mailvelope, to import an export
they need the information for which keys from the export
a secret key is also available. For simplicity it is
much preferred to get this information in a single call
without the need to do and parse a keylisting additionally
in a second native-messaging call.

So we make it optional to include that info in the export.

6 weeks agoexample scripts: python work-arounds
Ben McGinnes [Tue, 10 Jul 2018 03:40:18 +0000 (13:40 +1000)]
example scripts: python work-arounds

* fixed three typos which were guaranteed to break said script.

6 weeks agodocs: python bindings howto
Ben McGinnes [Mon, 9 Jul 2018 11:30:20 +0000 (21:30 +1000)]
docs: python bindings howto

* Complete typographic overhaul.
* Removed all section level indentation since it does not affect
  output formatting, but might affect source code examples.
* In text-mode stripped out all tabs which had crept in and replaced
  them with four spaces.
* Updated all code examples (again) to conform with Python-mode.
* Bumped version number in preparation for next release of GPG 2.2.9
  and corresponding GPGME release.

6 weeks agojson: Add with-secret without secret only
Andre Heinecke [Mon, 9 Jul 2018 09:36:28 +0000 (11:36 +0200)]
json: Add with-secret without secret only

* src/gpgme-json.c (op_keylist, hlp_keylist): Add "with-secret"
as a flag to do a public keylist with secret information.

6 weeks agotests: Add --with-secret to run-keylist.c
Andre Heinecke [Mon, 9 Jul 2018 09:17:27 +0000 (11:17 +0200)]
tests: Add --with-secret to run-keylist.c

* run-keylist.c (show_usage, main): Add --with-secret.

6 weeks agodoc: More explicit doc for EXTERN and LOCAL modes.
Andre Heinecke [Mon, 9 Jul 2018 09:10:19 +0000 (11:10 +0200)]
doc: More explicit doc for EXTERN and LOCAL modes.

* doc/gpgme.texi (GPGME_KEYLIST_MODE_EXTERN),
(GPGME_KEYLIST_MODE_LOCATE, GPGME_KEYLIST_MODE_LOCAL): Mention
command line flags for CMS and OpenPGP Protocol.

--
This might help new users coming to gnupg to understand what
the flags do.

6 weeks agoAdd ctx flag for auto-key-locate
Andre Heinecke [Tue, 3 Jul 2018 15:50:23 +0000 (17:50 +0200)]
Add ctx flag for auto-key-locate

* src/context.h (gpgme_context): Add auto_key_locate.
* src/engine-gpg.c (engine_gpg): Add auto_key_locate.
(gpg_set_engine_flags, build_argv): Handle auto_key_locate.
(gpg_release): Free auto_key_locate.
* src/gpgme.c (gpgme_release): Free auto_key_locate.
(gpgme_get_ctx_flag, gpgme_set_ctx_flag): Handle auto-key-locate.
* doc/gpgme.texi: Document auto-key-locate flag.
* tests/run-keylist.c (show_usage, main): Add --from-wkd option.

--
This enables users of GPGME to control more fine grained what
auto-key-locate does.  Especially for WKD lookups / refreshes
can this be useful.

GnuPG-Bug-Id: T2917
Differential Revision: https://dev.gnupg.org/D463

6 weeks agopython bindings: howto examples
Ben McGinnes [Sat, 7 Jul 2018 17:40:35 +0000 (03:40 +1000)]
python bindings: howto examples

* Made sure all example scripts meet PEP8 compliance.
* Required fixing approx. a dozen of them in minor ways.

6 weeks agoqt: Handle OpenPGP Diagnostic log
Andre Heinecke [Thu, 5 Jul 2018 09:28:08 +0000 (11:28 +0200)]
qt: Handle OpenPGP Diagnostic log

* lang/qt/src/threadedjobmixin.cpp (_detail::audit_log_as_html):
Handle OpenPGP audit log differently.

6 weeks agocpp: Add enum mapping for GPGME_AUDIT_LOG_DIAG
Andre Heinecke [Thu, 5 Jul 2018 08:22:13 +0000 (10:22 +0200)]
cpp: Add enum mapping for GPGME_AUDIT_LOG_DIAG

* src/context.cpp (to_auditlog_flags): Map DIAG value.
* src/context.h (AuditLogFlags): Add it.

6 weeks agocore: Add gpg auditlog to get diagnostics
Andre Heinecke [Wed, 4 Jul 2018 13:39:01 +0000 (15:39 +0200)]
core: Add gpg auditlog to get diagnostics

* src/engine-gpg.c (engine_gpg): Add diagnostics member.
(gpg_release): Release diagnostics data.
(gpg_new): Set up logger-fd and diagnostics.
(gpg_getauditlog): New. Copy diagnostics to a user data.
(engine_ops): Add getauditlog.
* src/engine-gpgsm.c (gpgsm_getauditlog): Return not implemented
for GPGME_AUDITLOG_DIAG.
* src/getauditlog.c (getauditlog_start): Don't reset engine
for diagnostics.
* src/gpgme.h.in (GPGME_AUDITLOG_DIAG): New.
(GPGME_AUDITLOG_DEFAULT): New alias to 0.
* tests/run-decrypt.c (show_usage, main): Add --diagnostics.
* doc/gpgme.texi(Additional Logs): Document getauditlog.

--
This enables users of GPGME to get more verbose information
from gpg which can assist users in figuring out a problem
that was before hidden behind a generalized error like
"Decryption Failed".

For GPGSM it is not yet available as it is problematic to
get it properly in server mode and GPGSM already had the
original audit log mechanism in place.

GPGME_AUDITLOG_DEFAULT was added for a more explicit
documentation.

6 weeks agocpp: Fix memory of DecryptionResult::symkeyAlgo
Andre Heinecke [Wed, 4 Jul 2018 10:15:05 +0000 (12:15 +0200)]
cpp: Fix memory of DecryptionResult::symkeyAlgo

* lang/cpp/src/decryptionresult.cpp (Private, ~Private): strdup
the symkey algo.

6 weeks agojson: Add keylist mode locate
Andre Heinecke [Wed, 4 Jul 2018 09:13:26 +0000 (11:13 +0200)]
json: Add keylist mode locate

* src/gpgme-json.c (op_keylist, hlp_keylist): Add locate.

--
The same rationale for the KEYLIST_MODE_LOCATE in GPGME
also applies here. It makes the API a little less magic.

7 weeks agopython bindings: scheming serpents
Ben McGinnes [Sun, 1 Jul 2018 19:05:09 +0000 (05:05 +1000)]
python bindings: scheming serpents

* Apparently I am wrong and Scheme is the new Python after all.
* Non-import related PEP8 compliance must wait for another day, though
  the other PEP8 fixes remain.

7 weeks agopython bindings: gpg.core
Ben McGinnes [Sun, 1 Jul 2018 17:55:19 +0000 (03:55 +1000)]
python bindings: gpg.core

* Changed id/else statements to a more pythonic form from scheme
  masquerading as python - sorry Justus, it had to go ;).
* With the added bonus of enabling PEP8 compliance in those sections.
* Fixed remaining PEP8 compliance issues with the exception of the
  imports at the beginning of the file (changing those will break the
  entire module, so we'll cope with it as it is).

7 weeks agom4 update: python 3.7
Ben McGinnes [Fri, 29 Jun 2018 04:52:37 +0000 (14:52 +1000)]
m4 update: python 3.7

* Fixed an error in arcane m4 syntax.

7 weeks agopython bindings: python 3.7
Ben McGinnes [Fri, 29 Jun 2018 04:26:30 +0000 (14:26 +1000)]
python bindings: python 3.7

* Bindings confirmed to work with the newly released 3.7.0.
* Updated M4 file to reflect this change and correct the Python binary
  search order (3.7 is not yet given priority, but will still be found
  first via the more generic python3 executable).
* Updated setup.py.in, bindings documentation and README to reflect this.

7 weeks agowhitespace police:
Ben McGinnes [Thu, 28 Jun 2018 08:46:31 +0000 (18:46 +1000)]
whitespace police:

* There's always one or, in this case, two.

7 weeks agodocs: python bindings howto
Ben McGinnes [Thu, 28 Jun 2018 08:33:51 +0000 (18:33 +1000)]
docs: python bindings howto

* Updated official doc (the org-mode file) with the instructions on
  importing and exporting both public and secret keys.

7 weeks agopython bindings examples
Ben McGinnes [Thu, 28 Jun 2018 08:14:13 +0000 (18:14 +1000)]
python bindings examples

* Added a secret key export variant which saves output as both GPG
  binary and ASCII armoured, plus saves in $GNUPGHOME and uses
  multiple methods of determining what that location is.

7 weeks agopython bindings examples
Ben McGinnes [Wed, 27 Jun 2018 17:28:07 +0000 (03:28 +1000)]
python bindings examples

* Added a key import variant which accesses the SKS keyservers in a
  RESTful fashion and then imports or attempts to import the response.

7 weeks agopython bindings examples: three export scripts
Ben McGinnes [Wed, 27 Jun 2018 10:12:27 +0000 (20:12 +1000)]
python bindings examples: three export scripts

* Example of default exporting keys.
* Example of exporting minimised keys.
* Example of exporting secret keys to a file with correct permissions.

Signed-off-by: Ben McGinnes <ben@adversary.org>
7 weeks agopython bindings: import example
Ben McGinnes [Wed, 27 Jun 2018 15:50:56 +0000 (01:50 +1000)]
python bindings: import example

* Added an example script for importing a key from a file (either
  ASCII armoured or not).

7 weeks agopython bindings: export secret keys
Ben McGinnes [Wed, 27 Jun 2018 09:16:29 +0000 (19:16 +1000)]
python bindings: export secret keys

* The holy grail: a function to export secret keys.
* GPGME will still invoke pinentry and gpg-agent as usual to authorise
  the export.
* Mostly similar to the two previous export functions for public keys
  except that it will return None if the result had a length of zero
  bytes.  Meaning that the difference between the specified pattern
  (if any) not matching available keys and an incorrect passphrase is
  not able to be determined from this function (or the underlying one
  for that matter).

Signed-off-by: Ben McGinnes <ben@adversary.org>
7 weeks agopython bindings: export public keys
Ben McGinnes [Wed, 27 Jun 2018 14:57:37 +0000 (00:57 +1000)]
python bindings: export public keys

* Updated key_export and key_export_minimal to return None where a
  pattern matched no keys in a manner simnilar to the possible result
  of key_export_secret.

7 weeks agopython bindings: export public keys
Ben McGinnes [Wed, 27 Jun 2018 08:51:09 +0000 (18:51 +1000)]
python bindings: export public keys

* Added functions for exporting public keys to gpg.core in both
  complete form and in minimised form.
* Rather than letting people need to worry about the export modes we
  are simply separating the functions as people would be more familiar
  with from the command line usage anyway.
* Functions added for Context are: ctx.key_export_minimal and
  ctx.key_export as the default or full export.

Signed-off-by: Ben McGinnes <ben@adversary.org>
2 months agojson: Add file handling for debug output
Andre Heinecke [Wed, 20 Jun 2018 07:43:19 +0000 (09:43 +0200)]
json: Add file handling for debug output

* src/gpgme-json.c (main): Add possibilty to set log file.

--
This is similar to how GPGME_DEBUG works. It takes ; on
Windows as seperator and : on linux. Followed by a file name.

For Linux it might make sense to use a different seperator
to allow setting a socket explicitly. But this is better
in line with the current GPGME_DEBUG behavior.

The change helps on Windows where we don't have a
log socket.

2 months agopython bindings: core import statements
Ben McGinnes [Sun, 17 Jun 2018 12:42:43 +0000 (22:42 +1000)]
python bindings: core import statements

* Fixed the bit I broke while fixing the PEP8 compliance issues.

2 months agopython bindings: core — PEP8 compliance
Ben McGinnes [Sun, 17 Jun 2018 05:58:44 +0000 (15:58 +1000)]
python bindings: core — PEP8 compliance

* Fixed most of the PEP8 errors in core.py
* Those remaining may need more than little edits and are a bit
  strange (too clearly the result of a programmer who has spent far
  too much time dealing with Lisp so that for Python it looks
  ... strange).

2 months agopython bindings: core - key import gsoc/jacob-key-import
Ben McGinnes [Sun, 17 Jun 2018 04:35:20 +0000 (14:35 +1000)]
python bindings: core - key import

* Wrapped the key import function in the try/exception statements
  needed to catch at least the most likely unsuccessful import attempt
  errors.
* Mostly draws on the file error and no data import statuses for
  errors, with a couple of exceptions.

Signed-off-by: Ben McGinnes <ben@adversary.org>
2 months agopython bindings: core key import
Ben McGinnes [Sat, 16 Jun 2018 23:28:30 +0000 (09:28 +1000)]
python bindings: core key import

* The foundation of a pythonic key import function authored by Jacob
  Adams.
* A unit testing script for the same function originally authored by
  Tobias Mueller
* Added DCO reference for Jacob Adams to the GPGME AUTHORS file.
* Additional details regarding this patch are available here:
  https://dev.gnupg.org/T4001

Signed-off-by: Ben McGinnes <ben@adversary.org>
2 months agoscript: groups.py
Ben McGinnes [Sun, 10 Jun 2018 15:03:58 +0000 (01:03 +1000)]
script: groups.py

* Added check for if it is run on a Windows system so that the correct
  binary filename is invoked.

2 months agocpp: Add proper gpgme_op_createkey
Andre Heinecke [Fri, 8 Jun 2018 14:19:47 +0000 (16:19 +0200)]
cpp: Add proper gpgme_op_createkey

* lang/cpp/src/context.cpp, lang/cpp/src/context.h
(Context::createKeyEx): New.

--
The createKeyEx function follows the usual pattern that the
synchronous call returns a result directly while for the
async an extra call is neccessary.

2 months agojson: Return fingerprint as createkey result
Andre Heinecke [Fri, 8 Jun 2018 12:52:41 +0000 (14:52 +0200)]
json: Return fingerprint as createkey result

* src/gpgme-json.c (op_createkey): Return fingerprint of new key.

2 months agojson: Add op_createkey
Andre Heinecke [Fri, 8 Jun 2018 11:55:21 +0000 (13:55 +0200)]
json: Add op_createkey

* src/gpgme-json.c (hlp_createkey, op_createkey): New.
(process_request, hlp_help): Add it.

--
This uses an unrestricted context for now until

GnuPG-Bug-Id: T4010
is implemented in GnuPG.

2 months agojson: Generalize chunking and getmore
Andre Heinecke [Thu, 7 Jun 2018 15:48:55 +0000 (17:48 +0200)]
json: Generalize chunking and getmore

* src/gpgme-json.c (MIN_REPLY_CHUNK_SIZE): Lower value to
new real minimum.
(DEF_REPLY_CHUNK_SIZE): Don't chunk by default.
(pending_data): Remove type and base64.
(make_data_object): Remove chunksize handling as this is now
generic.
(encode_and_chunk): Setup the pending_data buffer for chunking
if required.
(op_getmore): Changed to generically work on a response.
(hlp_getmore): Update accordingly.
(hlp_help): Document chunksize as generic parameter for all commands.
(process_request): Use encode_and_chunk on the response.
(hlp_encrypt, op_encrypt, hlp_decrypt, op_decrypt),
(hlp_verify, op_verify, hlp_sign, op_sign),
(op_keylist, hlp_keylist, hlp_export, op_export): Update accordingly.

--
To include handling for json properties e.g. in a keylist in
the chunk mechanism the mechanism is now more general.

If the chunksize property is provided the response will
always look exactly like a "getmore" response. E.g.

e.g.:
{
    "op": "keylist",
    "chunksize": 64
}
Results in:
{
   "more": true,
   "base64": true,
   "response": "ewoJImtleXMiOglbewoJCQkicmV2b2tlZCI6"
}

For simplicity this is even true if the chunksize is larger
then the response.

The client has to combine all "response" chunks and base64
decode them to get valid json.

The complete response (including json) is never larger then
the chunksize but might be smaller. Except for interactive
use due to additional format characters.

2 months agojson: Rework verify_result_to_json
Andre Heinecke [Thu, 7 Jun 2018 14:05:15 +0000 (16:05 +0200)]
json: Rework verify_result_to_json

* src/gpgme-json.c (sigsum_to_json): Add bool repr.
(signature_to_json, verify_result_to_json): Extend and follow better
pattern.
(hlp_decrypt, hlp_verify): Expand doc.

--
This should make it more clear which values are mapped as
the naming is more direct and clear and help to use
the gpgme documentation to understand the verify_result values.

2 months agojson: Add direct way to query a config option
Andre Heinecke [Thu, 7 Jun 2018 09:42:47 +0000 (11:42 +0200)]
json: Add direct way to query a config option

* src/gpgme-json.c (op_config_opt, hlp_config_opt): New operation.
(process_request, hlp_help): Add it.

--
This is more conveniant API for most query operations where
a single option is required.

An example would be:
{
    "op": "config_opt",
    "component": "gpg",
    "option": "default-key"
}

Which results in:
{
   "option":       {
           "name": "default-key",
           "description":  "use NAME as default secret key",
           "argname":      "NAME",
           "flags":        0,
           "level":        0,
           "type": 1,
           "alt_type":     1,
           "value":        [{
                           "string":       "F462B6B1",
                           "is_none":      false
                   }]
   }
}

2 months agojson: Add op_config to query gpgconf
Andre Heinecke [Thu, 7 Jun 2018 09:23:14 +0000 (11:23 +0200)]
json: Add op_config to query gpgconf

* src/gpgme-json.c (op_config, hlp_config): New.
(hlp_help, process_request): Add config.
(conf_arg_to_json, conf_opt_to_json, conf_comp_to_json): New
helpers.

2 months agoexamples: python howto
Ben McGinnes [Thu, 7 Jun 2018 05:06:20 +0000 (15:06 +1000)]
examples: python howto

* Uses the groups module to prepare a list of recipients and encrypt
  to those.
* The main version (encrypt-to-group.py) tries to check for invalid
  recipients, but still falls back to always trust for the second
  encryption attempt.
* The gullible version doesn't try pruning the recipient list at all,
  it just tries to encrypt and if it fails, switches straight to
  always trust.
* The trustno1 version doesn't use the always trust model at all and
  only attempts pruning the list of invalid recipients.

2 months agocore: Return a better error code on certain decryption failures.
Werner Koch [Wed, 6 Jun 2018 14:20:27 +0000 (16:20 +0200)]
core: Return a better error code on certain decryption failures.

* src/decrypt.c (op_data_t): Add field first_status_error.
(parse_status_error): Set it.
(_gpgme_decrypt_status_handler): Prefer an ERROR code over a
NO_SECKEY.
--

GnuPG-bug-id: 3983
Signed-off-by: Werner Koch <wk@gnupg.org>
2 months agojson: Allow to compile with libgpg-error < 1.28
Werner Koch [Tue, 5 Jun 2018 07:40:17 +0000 (09:40 +0200)]
json: Allow to compile with libgpg-error < 1.28

* src/cJSON.c: Use gpgrt fucntion only if available.
--

We have a hack in gpgme-json to allow building with older libgpg-error
versions.  That whole thing will not work but the instead the binary
will print an error at runtime that it needs to be build with a newer
libgcrypt.  There was a little bug here for the Debian packages
libgpg-error versions which failed to build cJSON.  cJSON is only
needed be the full gpgme-json but nevertheless the Makefile wants to
build it.  The fix is straightforward.

GnuPG-bug-id: 3971
Signed-off-by: Werner Koch <wk@gnupg.org>
2 months agodocs: python bindings howto
Ben McGinnes [Sat, 2 Jun 2018 14:46:46 +0000 (00:46 +1000)]
docs: python bindings howto

* Another attempt at fixing the org-mode version.
* A proof reader ascertained there were tabs in it instead of whitespace.
* Stripped the lot out and replaced with standard 4 spaces, fixed
  every incorrect example ... and it still breaks upon save and/or export.
* Added the reference to the mutt-groups.py script to demonstrate the
  groups.py module/code.

2 months agoAuthors: DCO
Ben McGinnes [Sat, 2 Jun 2018 07:15:40 +0000 (17:15 +1000)]
Authors: DCO

* Added mine to the GPGME AUTHORS file.  Mainly so I'm doing what I
  say myself when about to request another from someone ...  ;)

2 months agocpp: Add gpgme_(get)set_ctx_flag
Andre Heinecke [Fri, 1 Jun 2018 09:08:12 +0000 (11:08 +0200)]
cpp: Add gpgme_(get)set_ctx_flag

* NEWS: Mention API extensions.
* lang/cpp/src/context.cpp, lang/cpp/src/context.h
(Context::setFlag, Context::getFlag): New.

2 months agocpp: Add legacy_cipher_nomdc
Andre Heinecke [Fri, 1 Jun 2018 08:58:24 +0000 (10:58 +0200)]
cpp: Add legacy_cipher_nomdc

* lang/cpp/src/decryptionresult.cpp, lang/cpp/src/decryptionresult.h
(DecryptionResult::isLegacyCipherNoMDC): New.

--

2 months agocore: New context flag "ignore-mdc-error".
Werner Koch [Thu, 31 May 2018 23:29:20 +0000 (01:29 +0200)]
core: New context flag "ignore-mdc-error".

* src/context.h (gpgme_context): Add field ignore_mdc_error.
* src/gpgme.c (gpgme_set_ctx_flag, gpgme_get_ctx_flag): Set/get it.
* src/engine-gpg.c (engine_gpg): Add flags.ignore_mdc_error.
(gpg_set_engine_flags): Set it.
(build_argv): Pass option to gpg.
* src/decrypt.c (_gpgme_decrypt_status_handler): Take care of flag.
(gpgme_op_decrypt_result): Clear flag.
(gpgme_op_decrypt): Clear flag.
* src/decrypt-verify.c (gpgme_op_decrypt_verify): Clear flag
(gpgme_op_decrypt_ext): Clear flag.

* tests/run-decrypt.c (show_usage): Add option --ignore-mdc-error.

Signed-off-by: Werner Koch <wk@gnupg.org>
2 months agocore: New decryption result flag 'legacy_cipher_nomdc'.
Werner Koch [Thu, 31 May 2018 23:01:08 +0000 (01:01 +0200)]
core: New decryption result flag 'legacy_cipher_nomdc'.

* src/gpgme.h.in (_gpgme_op_decrypt_result): Add flag
legacy_cipher_nomdc.
* src/decrypt.c (parse_status_error): Set this flag.
* tests/run-decrypt.c (print_result): print it.
(main): Print the result even on error.

Signed-off-by: Werner Koch <wk@gnupg.org>
2 months agocore: Remove cruft from the engine-gpg code.
Werner Koch [Thu, 31 May 2018 22:13:18 +0000 (00:13 +0200)]
core: Remove cruft from the engine-gpg code.

* src/engine-gpg.c (read_status): Remove the handling of
GPGME_STATUS_END_STREAM; this was used only by the former experimental
--pipemode of gpg but that is not even anymore invoked here.
(struct engine_gpg): Remove cmd.linked_data and .linked_idx.
(build_argv): Remove code for linked_data.
(gpg_new): Ditto.
(gpg_set_command_handler): Remove arr linked_data.
* src/engine-backend.h (engine_ops): Remove arg data from
set_command_handler.
* src/engine.c (_gpgme_engine_set_command_handler): Remove arg
linked_data and adjust all callers.

Signed-off-by: Werner Koch <wk@gnupg.org>
2 months agocore: Minor cleanup in engine-gpg and -gpgsm.
Werner Koch [Thu, 31 May 2018 21:56:06 +0000 (23:56 +0200)]
core: Minor cleanup in engine-gpg and -gpgsm.

* src/engine-gpg.c: Remove errno.h.
(build_argv): Use gpg_error_from_syserror instead of ERRNO.
* src/engine-gpgsm.c: Remove errno.h.
(status_handler): Remove check for EINTR; gpgme_data_write already
handles EINTR.

Signed-off-by: Werner Koch <wk@gnupg.org>
2 months agocpp: Add gpgme_data_rewind to cpp API
Andre Heinecke [Tue, 29 May 2018 07:16:22 +0000 (09:16 +0200)]
cpp: Add gpgme_data_rewind to cpp API

* lang/cpp/src/data.h, lang/cpp/src/data.cpp (Data::rewind): New.
* lang/qt/tests/t-various.cpp (testDataRewind): Test it.

--
The advantage of this convieniance function in GPGME is that
it avoids the messiness that are declarations with off_t.

GnuPG-Bug-Id: T3996

2 months agojson: Fix compiler warning.
Werner Koch [Mon, 28 May 2018 07:58:02 +0000 (09:58 +0200)]
json: Fix compiler warning.

* src/gpgme-json.c (op_version): Mark request as unused.

Signed-off-by: Werner Koch <wk@gnupg.org>
2 months agojson: Do not allow to export or delete secret keys.
Werner Koch [Mon, 28 May 2018 07:56:49 +0000 (09:56 +0200)]
json: Do not allow to export or delete secret keys.

* src/gpgme-json.c (op_export, op_delete): Return GPG_ERR_FORBIDDEN if
"secret" is used.
--

This should not be possible from a browser and we need to make this
fully clear.  Actually gpg-agent won't allow that anyway but having
this explicitly is better.

If that is ever needed a dedicated command line option may enable
this, for example when used by regular programs and not by the browser.
But that requires other changes as well.

Signed-off-by: Werner Koch <wk@gnupg.org>
2 months agojson: Fix use of get_context.
Werner Koch [Mon, 28 May 2018 07:53:32 +0000 (09:53 +0200)]
json: Fix use of get_context.

* src/gpgme-json.c (create_onetime_context): New.
(release_onetime_context): New.
(op_sign): Use the new fucntions to create a separate context.
(op_encrypt): Use a separate context for key listings.
(create_keylist_patterns): Remove unneeded cast.
--

get_context retruns a static per-process context and can thus not be
used as a separate context.  Use dedicated fucntions for this.

Signed-off-by: Werner Koch <wk@gnupg.org>
2 months agojson: Implement encrypt-sign
Andre Heinecke [Fri, 25 May 2018 13:48:39 +0000 (15:48 +0200)]
json: Implement encrypt-sign

* src/gpgme-json.c (op_encrypt): Add optional signing_keys param.
(get_keys, create_keylist_patterns): Add param for json object name.

--
If the optional parameter signing_keys is provided to encrypt
it becomes an encrypt-sign operation.

2 months agojson: Implement delete command
Andre Heinecke [Fri, 25 May 2018 13:24:03 +0000 (15:24 +0200)]
json: Implement delete command

* src/gpgme-json.c (op_delete): New.
(hlp_help, process_request): Add it.

--
As with import / export delete also does not work for
the browser origin.

2 months agojson: Implement op_export
Andre Heinecke [Fri, 25 May 2018 12:52:51 +0000 (14:52 +0200)]
json: Implement op_export

* src/gpgme-json.c (op_export): New.
(hlp_getmore, process_request): Add it.

--
Secret key export does not work with request-origin browser.

2 months agojson: Fix double ctx alloc
Andre Heinecke [Fri, 25 May 2018 12:50:59 +0000 (14:50 +0200)]
json: Fix double ctx alloc

* src/gpgme-json.c (op_keylist): Only get one ctx.

2 months agojson: Add guard in create_keylist_patterns
Andre Heinecke [Fri, 25 May 2018 12:50:20 +0000 (14:50 +0200)]
json: Add guard in create_keylist_patterns

* src/gpgme-json.c (create_keylist_patterns): Guard against
a string ending with a linbreak.

2 months agojson: Implement import operation
Andre Heinecke [Fri, 25 May 2018 12:19:41 +0000 (14:19 +0200)]
json: Implement import operation

* src/gpgme-json.c (op_import): New.
(import_status_to_json, import_result_to_json): New.
(hlp_help, process_request): Add import.

2 months agojson: Improve keylist help
Andre Heinecke [Fri, 25 May 2018 11:09:34 +0000 (13:09 +0200)]
json: Improve keylist help

* src/gpgme-json.c (hlp_keylist): Clarify doc about keys parameter.

2 months agojson: Fix keylist pattern handling
Andre Heinecke [Fri, 25 May 2018 11:06:44 +0000 (13:06 +0200)]
json: Fix keylist pattern handling

* src/gpgme-json.c (xfree_array): New helper.
(create_keylist_patterns): Convert keystring to gpgme patterns.
(op_sign, op_keylist): Use it.