diff options
author | Werner Koch <[email protected]> | 2016-05-17 18:21:01 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2016-05-17 18:23:28 +0000 |
commit | 315fb73d4a774e2c699ac1804f5377559b4d0027 (patch) | |
tree | 4194a0bc9390b89686ce42d7e39f6412d225f10b /src/op-support.c | |
parent | Qt / Cpp: Port auto_ptr to unique_ptr (diff) | |
download | gpgme-315fb73d4a774e2c699ac1804f5377559b4d0027.tar.gz gpgme-315fb73d4a774e2c699ac1804f5377559b4d0027.zip |
Return dedicated error code for all subkeys expired or revoked.
* src/gpgme.h.in (GPGME_STATUS_KEY_CONSIDERED): New.
(GPGME_SIGSUM_TOFU_CONFLICT): New.
* src/status-table.c (KEY_CONSIDERED): New.
* src/op-support.c (_gpgme_parse_inv_recp): Add argc KC_FPR and
KC_FLAGS. Use calloc. Detect all expired or revoked subkeys.
(_gpgme_parse_key_considered): New.
* src/sign.c (op_data_t): Add fields KC_FPR and KC_FLAGS.
(release_op_data): Free KC_FPR.
(_gpgme_sign_status_handler): Handle STATUS_KEY_CONSIDERED.
* src/encrypt.c (op_data_t): Add fields KC_FPR and KC_FLAGS.
(release_op_data): Free KC_FPR.
(_gpgme_encrypt_status_handler): Handle STATUS_KEY_CONSIDERED.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/op-support.c')
-rw-r--r-- | src/op-support.c | 65 |
1 files changed, 57 insertions, 8 deletions
diff --git a/src/op-support.c b/src/op-support.c index 02940efd..d51d643b 100644 --- a/src/op-support.c +++ b/src/op-support.c @@ -33,6 +33,11 @@ #include "util.h" #include "debug.h" +#if GPG_ERROR_VERSION_NUMBER < 0x011700 /* 1.23 */ +# define GPG_ERR_SUBKEYS_EXP_REV 217 +#endif + + gpgme_error_t _gpgme_op_data_lookup (gpgme_ctx_t ctx, ctx_op_data_id_t type, void **hook, @@ -190,16 +195,19 @@ _gpgme_op_reset (gpgme_ctx_t ctx, int type) } -/* Parse the INV_RECP or INV-SNDR status line in ARGS and return the - result in KEY. */ +/* Parse the INV_RECP or INV_SNDR status line in ARGS and return the + result in KEY. If KC_FPR (from the KEY_CONSIDERED status line) is + not NULL take the KC_FLAGS in account. */ gpgme_error_t -_gpgme_parse_inv_recp (char *args, gpgme_invalid_key_t *key) +_gpgme_parse_inv_recp (char *args, int for_signing, + const char *kc_fpr, unsigned int kc_flags, + gpgme_invalid_key_t *key) { gpgme_invalid_key_t inv_key; char *tail; long int reason; - inv_key = malloc (sizeof (*inv_key)); + inv_key = calloc (1, sizeof (*inv_key)); if (!inv_key) return gpg_error_from_syserror (); inv_key->next = NULL; @@ -214,9 +222,11 @@ _gpgme_parse_inv_recp (char *args, gpgme_invalid_key_t *key) switch (reason) { - default: case 0: - inv_key->reason = gpg_error (GPG_ERR_GENERAL); + if (kc_fpr && (kc_flags & 2)) + inv_key->reason = gpg_error (GPG_ERR_SUBKEYS_EXP_OR_REV); + else + inv_key->reason = gpg_error (GPG_ERR_GENERAL); break; case 1: @@ -274,6 +284,10 @@ _gpgme_parse_inv_recp (char *args, gpgme_invalid_key_t *key) case 14: inv_key->reason = gpg_error (GPG_ERR_INV_USER_ID); break; + + default: + inv_key->reason = gpg_error (GPG_ERR_GENERAL); + break; } while (*tail && *tail == ' ') @@ -287,14 +301,49 @@ _gpgme_parse_inv_recp (char *args, gpgme_invalid_key_t *key) return gpg_error_from_syserror (); } } - else - inv_key->fpr = NULL; *key = inv_key; return 0; } + +/* Parse a KEY_CONSIDERED status line in ARGS and store the + * fingerprint and the flags at R_FPR and R_FLAGS. The caller must + * free the value at R_FPR on success. */ +gpgme_error_t +_gpgme_parse_key_considered (const char *args, + char **r_fpr, unsigned int *r_flags) +{ + char *pend; + size_t n; + + *r_fpr = NULL; + + pend = strchr (args, ' '); + if (!pend || pend == args) + return trace_gpg_error (GPG_ERR_INV_ENGINE); /* Bogus status line. */ + n = pend - args; + *r_fpr = malloc (n + 1); + if (!*r_fpr) + return gpg_error_from_syserror (); + memcpy (*r_fpr, args, n); + (*r_fpr)[n] = 0; + args = pend + 1; + + gpg_err_set_errno (0); + *r_flags = strtoul (args, &pend, 0); + if (errno || args == pend || (*pend && *pend != ' ')) + { + free (*r_fpr); + *r_fpr = NULL; + return trace_gpg_error (GPG_ERR_INV_ENGINE); + } + + return 0; +} + + /* Parse the PLAINTEXT status line in ARGS and return the result in FILENAMEP. */ gpgme_error_t |