/** * seahorse_gpgme_get_keytype_table: * * @table: The requested keytype table * * Based on the gpg version in use, sets @table * to contain the numbers that gpg uses in its CLI * for adding new subkeys. This tends to get broken * at random by new versions of gpg, but there's no good * API for this. * * Returns GPG_ERR_USER_2 if gpg is too old. * * Returns: gpgme_error_t **/ gpgme_error_t seahorse_gpgme_get_keytype_table (SeahorseKeyTypeTable *table) { gpgme_error_t gerr; gpgme_engine_info_t engine; SeahorseVersion ver; gerr = gpgme_get_engine_info (&engine); g_return_val_if_fail (GPG_IS_OK (gerr), gerr); while (engine && engine->protocol != GPGME_PROTOCOL_OpenPGP) engine = engine->next; g_return_val_if_fail (engine != NULL, GPG_E (GPG_ERR_GENERAL)); ver = seahorse_util_parse_version (engine->version); if (ver >= VER_2012 || (ver >= VER_1410 && ver < VER_190)) *table = &KEYTYPES_2012; else if (ver >= VER_140 || ver >= VER_190) *table = &KEYTYPES_140; else if (ver >= VER_124) *table = &KEYTYPES_124; else if (ver >= VER_120) *table = &KEYTYPES_120; else // older versions not supported gerr = GPG_E (GPG_ERR_USER_2); return gerr; }
/* Initializes the gpg-options static info */ static gboolean gpg_options_init (GError **err) { if (!gpg_options_inited) { gpgme_error_t gerr; gpgme_engine_info_t engine; gerr = gpgme_get_engine_info (&engine); g_return_val_if_fail (GPG_IS_OK (gerr), (bastile_gpgme_to_error (gerr, err), FALSE)); /* Look for the OpenPGP engine */ while (engine && engine->protocol != GPGME_PROTOCOL_OpenPGP) engine = engine->next; /* * Make sure it's the right version for us to be messing * around with the configuration file. */ g_return_val_if_fail (engine && engine->version && engine->file_name && (g_str_has_prefix (engine->version, GPG_VERSION_PREFIX1) || g_str_has_prefix (engine->version, GPG_VERSION_PREFIX2)), (bastile_gpgme_to_error (GPG_E (GPG_ERR_INV_ENGINE), err), FALSE)); /* Now run the binary and read in the home directory */ if (!parse_home_directory (engine, err)) return FALSE; gpg_options_inited = TRUE; } return TRUE; }
/* Initializes the gpg-options static info */ static gboolean gpg_options_init (GError **err) { gpgme_error_t gerr; gpgme_engine_info_t engine; if (gpg_options_inited) return TRUE; gerr = gpgme_get_engine_info (&engine); if (seahorse_gpgme_propagate_error (gerr, err)) return FALSE; /* Look for the OpenPGP engine */ while (engine && engine->protocol != GPGME_PROTOCOL_OpenPGP) engine = engine->next; /* * Make sure it's the right version for us to be messing * around with the configuration file. */ if (!engine || !engine->version || !engine->file_name || !(g_str_has_prefix (engine->version, GPG_VERSION_PREFIX1) || g_str_has_prefix (engine->version, GPG_VERSION_PREFIX2))) { seahorse_gpgme_propagate_error (GPG_E (GPG_ERR_INV_ENGINE), err); return FALSE; } /* Now run the binary and read in the home directory */ if (!parse_home_directory (engine, err)) return FALSE; gpg_options_inited = TRUE; return TRUE; }
static gpgme_error_t passphrase_get (gconstpointer dummy, const gchar *passphrase_hint, const char* passphrase_info, int flags, int fd) { GtkDialog *dialog; gpgme_error_t err; gchar **split_uid = NULL; gchar *label = NULL; gchar *errmsg = NULL; const gchar *pass; gboolean confirm = FALSE; if (passphrase_info && strlen(passphrase_info) < 16) { flags |= SEAHORSE_PASS_NEW; confirm = TRUE; } if (passphrase_hint) split_uid = g_strsplit (passphrase_hint, " ", 2); if (flags & SEAHORSE_PASS_BAD) errmsg = g_strdup_printf (_("Wrong passphrase.")); if (split_uid && split_uid[0] && split_uid[1]) { if (flags & SEAHORSE_PASS_NEW) label = g_strdup_printf (_("Enter new passphrase for '%s'"), split_uid[1]); else label = g_strdup_printf (_("Enter passphrase for '%s'"), split_uid[1]); } else { if (flags & SEAHORSE_PASS_NEW) label = g_strdup (_("Enter new passphrase")); else label = g_strdup (_("Enter passphrase")); } g_strfreev (split_uid); dialog = seahorse_passphrase_prompt_show (_("Passphrase"), errmsg ? errmsg : label, NULL, NULL, confirm); g_free (label); g_free (errmsg); switch (gtk_dialog_run (dialog)) { case GTK_RESPONSE_ACCEPT: pass = seahorse_passphrase_prompt_get (dialog); seahorse_util_printf_fd (fd, "%s\n", pass); err = GPG_OK; break; default: err = GPG_E (GPG_ERR_CANCELED); break; }; gtk_widget_destroy (GTK_WIDGET (dialog)); return err; }
gboolean seahorse_gpgme_photo_add (SeahorseGpgmeKey *pkey, GtkWindow *parent, const gchar *path) { gchar *filename = NULL; gchar *tempfile = NULL; GError *error = NULL; gpgme_error_t gerr; GtkWidget *chooser; gboolean res = TRUE; g_return_val_if_fail (SEAHORSE_IS_GPGME_KEY (pkey), FALSE); if (NULL == path) { chooser = gtk_file_chooser_dialog_new (_("Choose Photo to Add to Key"), parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), TRUE); add_image_files (chooser); if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT) filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); gtk_widget_destroy (chooser); if (!filename) return FALSE; } else { filename = g_strdup (path); } if (!prepare_photo_id (parent, filename, &tempfile, &error)) { seahorse_util_handle_error (&error, NULL, _("Couldn’t prepare photo")); return FALSE; } gerr = seahorse_gpgme_key_op_photo_add (pkey, tempfile ? tempfile : filename); if (!GPG_IS_OK (gerr)) { /* A special error value set by seahorse_key_op_photoid_add to denote an invalid format file */ if (gerr == GPG_E (GPG_ERR_USER_1)) seahorse_util_show_error (NULL, _("Couldn’t add photo"), _("The file could not be loaded. It may be in an invalid format")); else seahorse_gpgme_handle_error (gerr, _("Couldn’t add photo")); res = FALSE; } g_free (filename); if (tempfile) { unlink (tempfile); g_free (tempfile); } return res; }