diff options
Diffstat (limited to 'src/keylist.c')
-rw-r--r-- | src/keylist.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/keylist.c b/src/keylist.c index 582b241b..36ee3eaa 100644 --- a/src/keylist.c +++ b/src/keylist.c @@ -367,7 +367,7 @@ set_ownertrust (gpgme_key_t key, const char *src) reference to smartcards. FIELD is the content of the field and we are allowed to modify it. */ static gpg_error_t -parse_sec_field15 (gpgme_subkey_t subkey, char *field) +parse_sec_field15 (gpgme_key_t key, gpgme_subkey_t subkey, char *field) { if (!*field) ; /* Empty. */ @@ -375,17 +375,25 @@ parse_sec_field15 (gpgme_subkey_t subkey, char *field) { /* This is a stub for an offline key. We reset the SECRET flag of the subkey here. Note that the secret flag of the entire - key will be true even then. */ + key will be true even then. We even explicitly set + key->secret to make it works for GPGME_KEYLIST_MODE_WITH_SECRET. */ subkey->secret = 0; + key->secret = 1; } else if (strchr ("01234567890ABCDEFabcdef", *field)) { /* Fields starts with a hex digit; thus it is a serial number. */ + key->secret = 1; subkey->is_cardkey = 1; subkey->card_number = strdup (field); if (!subkey->card_number) return gpg_error_from_syserror (); } + else if (*field == '+') + { + key->secret = 1; + subkey->secret = 1; + } else { /* RFU. */ @@ -578,9 +586,11 @@ keylist_colon_handler (void *priv, char *line) set_mainkey_capability (key, field[11]); /* Field 15 carries special flags of a secret key. */ - if (fields >= 15 && key->secret) + if (fields >= 15 + && (key->secret + || (ctx->keylist_mode & GPGME_KEYLIST_MODE_WITH_SECRET))) { - err = parse_sec_field15 (subkey, field[14]); + err = parse_sec_field15 (key, subkey, field[14]); if (err) return err; } @@ -649,9 +659,11 @@ keylist_colon_handler (void *priv, char *line) set_subkey_capability (subkey, field[11]); /* Field 15 carries special flags of a secret key. */ - if (fields >= 15 && key->secret) + if (fields >= 15 + && (key->secret + || (ctx->keylist_mode & GPGME_KEYLIST_MODE_WITH_SECRET))) { - err = parse_sec_field15 (subkey, field[14]); + err = parse_sec_field15 (key, subkey, field[14]); if (err) return err; } |