|
|
@ -1225,6 +1225,101 @@ PEP_STATUS pgp_export_keydata( |
|
|
|
return PEP_STATUS_OK; |
|
|
|
} |
|
|
|
|
|
|
|
PEP_STATUS pgp_list_keyinfo(PEP_SESSION session, const char* pattern, |
|
|
|
stringpair_list_t** keyinfo_list) |
|
|
|
{ |
|
|
|
gpgme_error_t gpgme_error; |
|
|
|
assert(session); |
|
|
|
assert(keyinfo_list); |
|
|
|
|
|
|
|
if (!session || !keyinfo_list) |
|
|
|
return PEP_ILLEGAL_VALUE; |
|
|
|
|
|
|
|
*keyinfo_list = NULL; |
|
|
|
|
|
|
|
gpgme_error = gpg.gpgme_op_keylist_start(session->ctx, pattern, 0); |
|
|
|
gpgme_error = _GPGERR(gpgme_error); |
|
|
|
|
|
|
|
switch(gpgme_error) { |
|
|
|
case GPG_ERR_NO_ERROR: |
|
|
|
break; |
|
|
|
case GPG_ERR_INV_VALUE: |
|
|
|
assert(0); |
|
|
|
return PEP_UNKNOWN_ERROR; |
|
|
|
default: |
|
|
|
gpg.gpgme_op_keylist_end(session->ctx); |
|
|
|
return PEP_GET_KEY_FAILED; |
|
|
|
}; |
|
|
|
|
|
|
|
gpgme_key_t key; |
|
|
|
stringpair_list_t* _keyinfo_list = new_stringpair_list(NULL); |
|
|
|
stringpair_list_t* list_curr = _keyinfo_list; |
|
|
|
stringpair_t* pair = NULL; |
|
|
|
|
|
|
|
do { |
|
|
|
gpgme_error = gpg.gpgme_op_keylist_next(session->ctx, &key); |
|
|
|
gpgme_error = _GPGERR(gpgme_error); |
|
|
|
|
|
|
|
switch(gpgme_error) { |
|
|
|
case GPG_ERR_EOF: |
|
|
|
break; |
|
|
|
case GPG_ERR_NO_ERROR: |
|
|
|
assert(key); |
|
|
|
assert(key->subkeys); |
|
|
|
if (!key || !key->subkeys) |
|
|
|
return PEP_GET_KEY_FAILED; |
|
|
|
|
|
|
|
// first subkey is primary key |
|
|
|
char* fpr = key->subkeys->fpr; |
|
|
|
char* uid = key->uids->uid; |
|
|
|
|
|
|
|
assert(fpr); |
|
|
|
assert(uid); // ?? |
|
|
|
if (!fpr) |
|
|
|
return PEP_GET_KEY_FAILED; |
|
|
|
|
|
|
|
PEP_STATUS key_status = PEP_GET_KEY_FAILED; |
|
|
|
|
|
|
|
bool key_revoked = false; |
|
|
|
|
|
|
|
if (key->subkeys->revoked) |
|
|
|
continue; |
|
|
|
|
|
|
|
pair = new_stringpair(fpr, uid); |
|
|
|
|
|
|
|
assert(pair); |
|
|
|
|
|
|
|
if (pair) { |
|
|
|
list_curr = stringpair_list_add(list_curr, pair); |
|
|
|
pair = NULL; |
|
|
|
|
|
|
|
assert(list_curr); |
|
|
|
if (list_curr != NULL) |
|
|
|
break; |
|
|
|
else |
|
|
|
free_stringpair(pair); |
|
|
|
} |
|
|
|
// else fallthrough (list_curr or pair wasn't allocateable) |
|
|
|
case GPG_ERR_ENOMEM: |
|
|
|
free_stringpair_list(_keyinfo_list); |
|
|
|
gpg.gpgme_op_keylist_end(session->ctx); |
|
|
|
return PEP_OUT_OF_MEMORY; |
|
|
|
default: |
|
|
|
gpg.gpgme_op_keylist_end(session->ctx); |
|
|
|
return PEP_UNKNOWN_ERROR; |
|
|
|
} |
|
|
|
} while (gpgme_error != GPG_ERR_EOF); |
|
|
|
|
|
|
|
if (_keyinfo_list->value == NULL) { |
|
|
|
free_stringpair_list(_keyinfo_list); |
|
|
|
_keyinfo_list = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
*keyinfo_list = _keyinfo_list; |
|
|
|
|
|
|
|
return PEP_STATUS_OK; |
|
|
|
} |
|
|
|
|
|
|
|
static void _switch_mode(pEpSession *session, gpgme_keylist_mode_t remove_mode, |
|
|
|
gpgme_keylist_mode_t add_mode) |
|
|
|
{ |
|
|
|