summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gregory <andrew.gregory.8@gmail.com>2014-09-30 15:00:03 -0400
committerAllan McRae <allan@archlinux.org>2014-10-01 09:12:54 +1000
commit7ee01c86669327b2af63c8ed9390bcbf071cdac5 (patch)
tree72f1a5f494025d24e231451913024ab7a999de30
parentaec4241af24a1c68dacadb31ae38f05bdccfe799 (diff)
_alpm_key_in_keychain: cache known keys
Implements FS#38042 Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
-rw-r--r--lib/libalpm/handle.c4
-rw-r--r--lib/libalpm/handle.h4
-rw-r--r--lib/libalpm/signing.c6
3 files changed, 14 insertions, 0 deletions
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index dd284ac5..6545592b 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -71,6 +71,10 @@ void _alpm_handle_free(alpm_handle_t *handle)
curl_easy_cleanup(handle->curl);
#endif
+#ifdef HAVE_LIBGPGME
+ FREELIST(handle->known_keys);
+#endif
+
regfree(&handle->delta_regex);
/* free memory */
diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
index b92d3cfb..2888f0f3 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -62,6 +62,10 @@ struct __alpm_handle_t {
CURL *curl; /* reusable curl_easy handle */
#endif
+#ifdef HAVE_LIBGPGME
+ alpm_list_t *known_keys; /* keys verified to be in our keychain */
+#endif
+
/* callback functions */
alpm_cb_log logcb; /* Log callback function */
alpm_cb_download dlcb; /* Download callback function */
diff --git a/lib/libalpm/signing.c b/lib/libalpm/signing.c
index c0fb006e..8391315a 100644
--- a/lib/libalpm/signing.c
+++ b/lib/libalpm/signing.c
@@ -221,6 +221,11 @@ int _alpm_key_in_keychain(alpm_handle_t *handle, const char *fpr)
gpgme_key_t key;
int ret = -1;
+ if(alpm_list_find_str(handle->known_keys, fpr)) {
+ _alpm_log(handle, ALPM_LOG_DEBUG, "key %s found in cache\n", fpr);
+ return 1;
+ }
+
if(init_gpgme(handle)) {
/* pm_errno was set in gpgme_init() */
goto error;
@@ -238,6 +243,7 @@ int _alpm_key_in_keychain(alpm_handle_t *handle, const char *fpr)
ret = 0;
} else if(gpg_err_code(gpg_err) == GPG_ERR_NO_ERROR) {
_alpm_log(handle, ALPM_LOG_DEBUG, "key lookup success, key exists\n");
+ handle->known_keys = alpm_list_add(handle->known_keys, strdup(fpr));
ret = 1;
} else {
_alpm_log(handle, ALPM_LOG_DEBUG, "gpg error: %s\n", gpgme_strerror(gpg_err));