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/sign.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/sign.c')
-rw-r--r-- | src/sign.c | 25 |
1 files changed, 24 insertions, 1 deletions
@@ -42,6 +42,12 @@ typedef struct /* The error code from a FAILURE status line or 0. */ gpg_error_t failure_code; + /* The fingerprint from the last KEY_CONSIDERED status line. */ + char *kc_fpr; + + /* The flags from the last KEY_CONSIDERED status line. */ + unsigned int kc_flags; + /* A pointer to the next pointer of the last invalid signer in the list. This makes appending new invalid signers painless while preserving the order. */ @@ -86,6 +92,7 @@ release_op_data (void *hook) } release_signatures (opd->result.signatures); + free (opd->kc_fpr); } @@ -316,6 +323,17 @@ _gpgme_sign_status_handler (void *priv, gpgme_status_code_t code, char *args) opd->last_sig_p = &(*opd->last_sig_p)->next; break; + case GPGME_STATUS_KEY_CONSIDERED: + /* This is emitted during gpg's key lookup to give information + * about the lookup results. We store the last one so it can be + * used in connection with INV_RECP. */ + free (opd->kc_fpr); + opd->kc_fpr = NULL; + err = _gpgme_parse_key_considered (args, &opd->kc_fpr, &opd->kc_flags); + if (err) + return err; + break; + case GPGME_STATUS_INV_RECP: if (opd->inv_sgnr_seen && opd->ignore_inv_recp) break; @@ -323,11 +341,16 @@ _gpgme_sign_status_handler (void *priv, gpgme_status_code_t code, char *args) case GPGME_STATUS_INV_SGNR: if (code == GPGME_STATUS_INV_SGNR) opd->inv_sgnr_seen = 1; - err = _gpgme_parse_inv_recp (args, opd->last_signer_p); + free (opd->kc_fpr); + opd->kc_fpr = NULL; + err = _gpgme_parse_inv_recp (args, 1, opd->kc_fpr, opd->kc_flags, + opd->last_signer_p); if (err) return err; opd->last_signer_p = &(*opd->last_signer_p)->next; + free (opd->kc_fpr); + opd->kc_fpr = NULL; break; case GPGME_STATUS_FAILURE: |