static gpgme_key_t prompt_signer () { gpgme_error_t gerr = 0; CryptUIKeyset *keyset; CryptUIKeyStore *ckstore; gpgme_key_t key = NULL; gpgme_ctx_t ctx = NULL; gchar *signer; gchar *id; guint count; GList *keys; keyset = cryptui_keyset_new ("openpgp", TRUE); ckstore = cryptui_key_store_new (keyset, TRUE, NULL); cryptui_key_store_set_filter (ckstore, signer_filter, NULL); count = cryptui_key_store_get_count (ckstore); if (count == 0) { cryptui_need_to_get_keys (); return NULL; } else if (count == 1) { keys = cryptui_key_store_get_all_keys (ckstore); signer = (gchar*) keys->data; g_list_free (keys); } else { signer = cryptui_prompt_signer (keyset, _("Choose Signer")); } if (signer) { id = cryptui_keyset_key_raw_keyid (keyset, signer); g_free (signer); gpgme_check_version (NULL); gerr = gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP); g_return_val_if_fail (gerr == 0, NULL); gerr = gpgme_new (&ctx); g_return_val_if_fail (gerr == 0, NULL); /* Load up the GPGME secret key */ gerr = gpgme_get_key (ctx, id, &key, 1); g_free (id); gpgme_release (ctx); if (gerr != 0) seahorse_util_handle_gpgme (gerr, _("Couldn't load keys")); } g_object_unref (ckstore); g_object_unref (keyset); return key; }
static void sign_received (GtkClipboard *board, const gchar *text, SeahorseApplet *sapplet) { gchar *signer = NULL; gchar *enctext = NULL; gboolean ret; GError *err = NULL; /* No text on clipboard */ if (!text) return; if (cryptui_keyset_get_count (dbus_keyset) == 0) cryptui_need_to_get_keys (dbus_keyset); else signer = cryptui_prompt_signer (dbus_keyset, _("Choose Key to Sign with")); if (signer == NULL) return; /* Perform the signing */ ret = dbus_g_proxy_call (dbus_crypto_proxy, "SignText", &err, G_TYPE_STRING, signer, G_TYPE_INT, 0, G_TYPE_STRING, text, G_TYPE_INVALID, G_TYPE_STRING, &enctext, G_TYPE_INVALID); if (ret) { /* And finish up */ gtk_clipboard_set_text (board, enctext, strlen (enctext)); detect_received (board, enctext, sapplet); if (seahorse_gconf_get_boolean (DISPLAY_CLIPBOARD_ENC_KEY) == TRUE) display_text (_("Signed Text"), enctext, FALSE); } else { notification_error (_("Signing Failed"), _("The clipboard could not be Signed."), sapplet, err); g_clear_error (&err); } g_free (signer); g_free (enctext); }