2 * PGP/Core keyring autocompletion
4 * Copyright (C) 2014 Christian Hesse <mail@eworm.de>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 #include <glib/gi18n.h>
31 #include "autocompletion.h"
33 static guint autocompletion_hook_id = 0;
35 static gboolean pgp_autocompletion_hook(gpointer source, gpointer data)
42 GList *addr_list = NULL;
44 /* just return if autocompletion is disabled */
45 if (!prefs_gpg_get_config()->autocompletion)
49 gpgme_check_version(NULL);
51 if ((err = gpgme_new(&ctx)) == 0) {
52 err = gpgme_op_keylist_start(ctx, NULL, 0);
54 /* walk the available keys */
56 if ((err = gpgme_op_keylist_next(ctx, &key)) != 0)
59 /* skip keys that are revoked, expired, ... */
60 if ((key->revoked || key->expired || key->disabled || key->invalid) == FALSE) {
63 /* walk all user ids within a key */
65 if (uid->email != NULL && *uid->email != 0) {
66 ae = g_new0(address_entry, 1);
68 ae->address = g_strdup(uid->email);
69 addr_compl_add_address1(ae->address, ae);
71 if (uid->name != NULL && *uid->name != 0) {
72 ae->name = g_strdup(uid->name);
73 addr_compl_add_address1(ae->name, ae);
77 ae->grp_emails = NULL;
79 addr_list = g_list_prepend(addr_list, ae);
81 debug_print("%s <%s>\n", uid->name, uid->email);
86 gpgme_key_release(key);
91 if (gpg_err_code(err) != GPG_ERR_EOF) {
92 debug_print("can not list keys: %s\n", gpgme_strerror(err));
95 *((GList **)source) = addr_list;
100 gboolean autocompletion_done(void)
102 if (autocompletion_hook_id > 0)
104 hooks_unregister_hook(ADDDRESS_COMPLETION_BUILD_ADDRESS_LIST_HOOKLIST, autocompletion_hook_id);
106 debug_print("PGP address autocompletion hook unregistered\n");
112 gint autocompletion_init(gchar ** error)
114 if ((autocompletion_hook_id = hooks_register_hook(ADDDRESS_COMPLETION_BUILD_ADDRESS_LIST_HOOKLIST, pgp_autocompletion_hook, NULL)) == -1)
116 *error = g_strdup(_("Failed to register PGP address autocompletion hook"));
119 debug_print("PGP address autocompletion hook registered\n");