static void prefs_gpg_account_save_func(PrefsPage *_page) { struct GPGAccountPage *page = (struct GPGAccountPage *) _page; GPGAccountConfig *config; config = prefs_gpg_account_get_config(page->account); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_default))) config->sign_key = SIGN_KEY_DEFAULT; else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_by_from))) config->sign_key = SIGN_KEY_BY_FROM; else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->key_custom))) { config->sign_key = SIGN_KEY_CUSTOM; g_free(config->sign_key_id); config->sign_key_id = gtk_editable_get_chars(GTK_EDITABLE(page->keyid), 0, -1); } prefs_gpg_account_set_config(page->account, config); prefs_gpg_account_free_config(config); }
gboolean sgpgme_setup_signers(gpgme_ctx_t ctx, PrefsAccount *account, const gchar *from_addr) { GPGAccountConfig *config; const gchar *signer_addr = account->address; gpgme_signers_clear(ctx); if (from_addr) signer_addr = from_addr; config = prefs_gpg_account_get_config(account); switch(config->sign_key) { case SIGN_KEY_DEFAULT: debug_print("using default gnupg key\n"); break; case SIGN_KEY_BY_FROM: debug_print("using key for %s\n", signer_addr); break; case SIGN_KEY_CUSTOM: debug_print("using key for %s\n", config->sign_key_id); break; } if (config->sign_key != SIGN_KEY_DEFAULT) { const gchar *keyid; gpgme_key_t key, found_key; gpgme_error_t err; if (config->sign_key == SIGN_KEY_BY_FROM) keyid = signer_addr; else if (config->sign_key == SIGN_KEY_CUSTOM) keyid = config->sign_key_id; else goto bail; found_key = NULL; /* Look for any key, not just private ones, or GPGMe doesn't * correctly set the revoked flag. */ err = gpgme_op_keylist_start(ctx, keyid, 0); while ((err = gpgme_op_keylist_next(ctx, &key)) == 0) { if (key == NULL) continue; if (!key->can_sign) continue; if (key->protocol != gpgme_get_protocol(ctx)) { debug_print("skipping a key (wrong protocol %d)\n", key->protocol); gpgme_key_release(key); continue; } if (key->expired) { debug_print("skipping a key, expired"); gpgme_key_release(key); continue; } if (key->revoked) { debug_print("skipping a key, revoked"); gpgme_key_release(key); continue; } if (key->disabled) { debug_print("skipping a key, disabled"); gpgme_key_release(key); continue; } if (found_key != NULL) { gpgme_key_release(key); gpgme_op_keylist_end(ctx); g_warning("ambiguous specification of secret key '%s'\n", keyid); privacy_set_error(_("Secret key specification is ambiguous")); goto bail; } found_key = key; } gpgme_op_keylist_end(ctx); if (found_key == NULL) { g_warning("setup_signers start: %s", gpgme_strerror(err)); privacy_set_error(_("Secret key not found (%s)"), gpgme_strerror(err)); goto bail; } err = gpgme_signers_add(ctx, found_key); debug_print("got key (proto %d (pgp %d, smime %d).\n", found_key->protocol, GPGME_PROTOCOL_OpenPGP, GPGME_PROTOCOL_CMS); gpgme_key_release(found_key); if (err) { g_warning("error adding secret key: %s\n", gpgme_strerror(err)); privacy_set_error(_("Error setting secret key: %s"), gpgme_strerror(err)); goto bail; } } prefs_gpg_account_free_config(config); return TRUE; bail: prefs_gpg_account_free_config(config); return FALSE; }
static void prefs_gpg_account_create_widget_func(PrefsPage *_page, GtkWindow *window, gpointer data) { struct GPGAccountPage *page = (struct GPGAccountPage *) _page; PrefsAccount *account = (PrefsAccount *) data; GPGAccountConfig *config; GtkWidget *vbox; GtkWidget *frame1; GtkWidget *vbox2; GtkWidget *hbox; GSList *key_group = NULL; GtkWidget *key_default; GtkWidget *key_by_from; GtkWidget *key_custom; GtkWidget *keyid_label; GtkWidget *keyid; GtkWidget *image; GtkWidget *new_key_label; GtkWidget *new_key_btn; GtkWidget *new_key_box; vbox = gtk_vbox_new(FALSE, VSPACING); gtk_container_set_border_width (GTK_CONTAINER (vbox), VBOX_BORDER); gtk_widget_show(vbox); vbox2 = gtkut_get_options_frame(vbox, &frame1, _("Sign key")); hbox = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); key_default = gtk_radio_button_new_with_label(key_group, _("Use default GnuPG key")); key_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(key_default)); gtk_widget_show(key_default); gtk_box_pack_start(GTK_BOX(hbox), key_default, FALSE, FALSE, 0); hbox = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); key_by_from = gtk_radio_button_new_with_label(key_group, _("Select key by your email address")); key_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(key_by_from)); gtk_widget_show(key_by_from); gtk_box_pack_start(GTK_BOX(hbox), key_by_from, FALSE, FALSE, 0); hbox = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); key_custom = gtk_radio_button_new_with_label(key_group, _("Specify key manually")); key_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(key_custom)); gtk_widget_show(key_custom); gtk_box_pack_start(GTK_BOX(hbox), key_custom, FALSE, FALSE, 0); hbox = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (hbox), 0); keyid_label = gtk_label_new(_("User or key ID:")); gtk_widget_show(keyid_label); gtk_label_set_justify(GTK_LABEL(keyid_label), GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(hbox), keyid_label, FALSE, FALSE, 0); keyid = gtk_entry_new(); gtk_widget_show(keyid); gtk_box_pack_start(GTK_BOX(hbox), keyid, FALSE, FALSE, 0); config = prefs_gpg_account_get_config(account); switch (config->sign_key) { case SIGN_KEY_DEFAULT: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(key_default), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(keyid_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(keyid), FALSE); break; case SIGN_KEY_BY_FROM: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(key_by_from), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(keyid_label), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(keyid), FALSE); break; case SIGN_KEY_CUSTOM: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(key_custom), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(keyid_label), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(keyid), TRUE); break; } hbox = gtk_hbox_new (FALSE, 5); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); new_key_box = gtk_hbox_new(FALSE, 6); gtk_widget_show(new_key_box); gtk_box_pack_start(GTK_BOX(hbox), new_key_box, FALSE, FALSE, 0); image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_box_pack_start(GTK_BOX(new_key_box), image, FALSE, FALSE, 0); new_key_label = gtk_label_new( _("No secret key found.")); gtk_box_pack_start(GTK_BOX(new_key_box), new_key_label, FALSE, FALSE, 0); new_key_btn = gtk_button_new_with_label(_("Generate a new key pair")); gtk_widget_show(new_key_btn); gtk_box_pack_start(GTK_BOX(hbox), new_key_btn, FALSE, FALSE, 0); if (config->sign_key_id != NULL) gtk_entry_set_text(GTK_ENTRY(keyid), config->sign_key_id); g_signal_connect(G_OBJECT(key_custom), "toggled", G_CALLBACK(key_custom_toggled), page); g_signal_connect(G_OBJECT(new_key_btn), "clicked", G_CALLBACK(new_key_clicked), page); page->key_default = key_default; page->key_by_from = key_by_from; page->key_custom = key_custom; page->keyid = keyid; page->keyid_label = keyid_label; page->new_key_box = new_key_box; page->page.widget = vbox; page->account = account; prefs_gpg_update_sens(page); }
gboolean sgpgme_setup_signers(gpgme_ctx_t ctx, PrefsAccount *account, const gchar *from_addr) { GPGAccountConfig *config; const gchar *signer_addr = account->address; gpgme_signers_clear(ctx); if (from_addr) signer_addr = from_addr; config = prefs_gpg_account_get_config(account); switch(config->sign_key) { case SIGN_KEY_DEFAULT: debug_print("using default gnupg key\n"); break; case SIGN_KEY_BY_FROM: debug_print("using key for %s\n", signer_addr); break; case SIGN_KEY_CUSTOM: debug_print("using key for %s\n", config->sign_key_id); break; } if (config->sign_key != SIGN_KEY_DEFAULT) { const gchar *keyid; gpgme_key_t key, key2; gpgme_error_t err; if (config->sign_key == SIGN_KEY_BY_FROM) keyid = signer_addr; else if (config->sign_key == SIGN_KEY_CUSTOM) keyid = config->sign_key_id; else goto bail; err = gpgme_op_keylist_start(ctx, keyid, 1); if (!err) { do { err = gpgme_op_keylist_next(ctx, &key); if (!err && key && key->protocol == gpgme_get_protocol(ctx) && !key->expired && !key->revoked && !key->disabled) break; if (!err && key && key->protocol != gpgme_get_protocol(ctx)) { debug_print("skipping a key (wrong protocol %d)\n", key->protocol); gpgme_key_release(key); } if (!err && key && (key->expired || key->revoked || key->disabled)) { debug_print("skipping a key"); if (key->expired) debug_print(" expired"); if (key->revoked) debug_print(" revoked"); if (key->disabled) debug_print(" disabled"); debug_print("\n"); gpgme_key_release(key); } } while (!err); } if (err) { g_warning("setup_signers start: %s", gpgme_strerror(err)); privacy_set_error(_("Secret key not found (%s)"), gpgme_strerror(err)); goto bail; } do { err = gpgme_op_keylist_next(ctx, &key2); if (!err && key2 && key2->protocol == gpgme_get_protocol(ctx) && !key2->expired && !key2->revoked && !key2->disabled) break; if (!err && key2 && key2->protocol != gpgme_get_protocol(ctx)) { debug_print("skipping a key (wrong protocol %d)\n", key2->protocol); gpgme_key_release(key2); } if (!err && key2 && (key2->expired || key2->revoked || key2->disabled)) { debug_print("skipping a key"); if (key2->expired) debug_print(" expired"); if (key2->revoked) debug_print(" revoked"); if (key2->disabled) debug_print(" disabled"); debug_print("\n"); gpgme_key_release(key2); } } while (!err); if (!err) { gpgme_key_release(key2); g_warning("ambiguous specification of secret key '%s'\n", keyid); privacy_set_error(_("Secret key specification is ambiguous")); goto bail; } gpgme_op_keylist_end(ctx); err = gpgme_signers_add(ctx, key); debug_print("got key (proto %d (pgp %d, smime %d).\n", key->protocol, GPGME_PROTOCOL_OpenPGP, GPGME_PROTOCOL_CMS); gpgme_key_release(key); if (err) { g_warning("error adding secret key: %s\n", gpgme_strerror(err)); privacy_set_error(_("Error setting secret key: %s"), gpgme_strerror(err)); goto bail; } } prefs_gpg_account_free_config(config); return TRUE; bail: prefs_gpg_account_free_config(config); return FALSE; }