void seahorse_gpgme_add_revoker_new (SeahorseGpgmeKey *pkey, GtkWindow *parent) { SeahorseGpgmeKey *revoker; GtkWidget *dialog; gint response; gpgme_error_t err; const gchar *userid1, *userid2; g_return_if_fail (pkey != NULL && SEAHORSE_IS_GPGME_KEY (pkey)); revoker = SEAHORSE_GPGME_KEY (seahorse_signer_get (parent)); if (revoker == NULL) return; userid1 = seahorse_object_get_label (SEAHORSE_OBJECT (revoker)); userid2 = seahorse_object_get_label (SEAHORSE_OBJECT (pkey)); dialog = gtk_message_dialog_new (parent, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _("You are about to add %s as a revoker for %s." " This operation cannot be undone! Are you sure you want to continue?"), userid1, userid2); response = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); if (response != GTK_RESPONSE_YES) return; err = seahorse_gpgme_key_op_add_revoker (pkey, revoker); if (!GPG_IS_OK (err)) seahorse_gpgme_handle_error (err, _("Couldn't add revoker")); }
G_MODULE_EXPORT void on_gpgme_revoke_ok_clicked (GtkButton *button, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); SeahorseRevokeReason reason; SeahorseGpgmeSubkey *subkey; const gchar *description; gpgme_error_t err; GtkWidget *widget; GtkTreeModel *model; GtkTreeIter iter; GValue value; widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "reason")); model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget)); gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter); memset (&value, 0, sizeof(value)); gtk_tree_model_get_value (model, &iter, COLUMN_INT, &value); reason = g_value_get_int (&value); g_value_unset (&value); description = gtk_entry_get_text (GTK_ENTRY (seahorse_widget_get_widget (swidget, "description"))); subkey = g_object_get_data (G_OBJECT (swidget), "subkey"); g_return_if_fail (SEAHORSE_IS_GPGME_SUBKEY (subkey)); err = seahorse_gpgme_key_op_revoke_subkey (subkey, reason, description); if (!GPG_IS_OK (err)) seahorse_gpgme_handle_error (err, _("Couldn't revoke subkey")); seahorse_widget_destroy (swidget); }
gboolean seahorse_gpgme_photo_delete (SeahorseGpgmePhoto *photo, GtkWindow *parent) { gpgme_error_t gerr; GtkWidget *dlg; gint response; g_return_val_if_fail (SEAHORSE_IS_GPGME_PHOTO (photo), FALSE); dlg = gtk_message_dialog_new (parent, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Are you sure you want to remove the current photo from your key?")); gtk_dialog_add_button (GTK_DIALOG (dlg), GTK_STOCK_DELETE, GTK_RESPONSE_ACCEPT); gtk_dialog_add_button (GTK_DIALOG (dlg), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); response = gtk_dialog_run (GTK_DIALOG (dlg)); gtk_widget_destroy (dlg); if (response != GTK_RESPONSE_ACCEPT) return FALSE; gerr = seahorse_gpgme_key_op_photo_delete (photo); if (!GPG_IS_OK (gerr)) { seahorse_gpgme_handle_error (gerr, _("Couldn’t delete photo")); return FALSE; } return TRUE; }
G_MODULE_EXPORT void on_gpgme_expire_ok_clicked (GtkButton *button, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); GtkWidget *widget; SeahorseGpgmeSubkey *subkey; gpgme_error_t err; time_t expiry = 0; struct tm when; subkey = SEAHORSE_GPGME_SUBKEY (g_object_get_data (G_OBJECT (swidget), "subkey")); widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "expire")); if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) { memset (&when, 0, sizeof (when)); widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, "calendar")); gtk_calendar_get_date (GTK_CALENDAR (widget), (guint*)&(when.tm_year), (guint*)&(when.tm_mon), (guint*)&(when.tm_mday)); when.tm_year -= 1900; expiry = mktime (&when); if (expiry <= time (NULL)) { seahorse_util_show_error (widget, _("Invalid expiry date"), _("The expiry date must be in the future")); return; } } widget = seahorse_widget_get_widget (swidget, "all-controls"); gtk_widget_set_sensitive (widget, FALSE); g_object_ref (swidget); g_object_ref (subkey); if (expiry != (time_t)seahorse_pgp_subkey_get_expires (SEAHORSE_PGP_SUBKEY (subkey))) { err = seahorse_gpgme_key_op_set_expires (subkey, expiry); if (!GPG_IS_OK (err)) seahorse_gpgme_handle_error (err, _("Couldn't change expiry date")); } g_object_unref (subkey); g_object_unref (swidget); seahorse_widget_destroy (swidget); }
/** * data: optional, will be added to the title, can be NULL * status: the gpgme status * * Basing on the status a notification is created an displayed * */ static void notify_signatures (const gchar* data, gpgme_verify_result_t status) { const gchar *icon = NULL; SeahorseObject *object; gchar *title, *body, *unesc_data; gboolean sig = FALSE; GSList *rawids; GList *keys; /* Discover the key in question */ rawids = g_slist_append (NULL, status->signatures->fpr); keys = seahorse_context_discover_objects (SCTX_APP (), SEAHORSE_PGP, rawids); g_slist_free (rawids); g_return_if_fail (keys != NULL); object = SEAHORSE_OBJECT (keys->data); g_list_free (keys); /* Figure out what to display */ switch (gpgme_err_code (status->signatures->status)) { case GPG_ERR_KEY_EXPIRED: /* TRANSLATORS: <key id='xxx'> is a custom markup tag, do not translate. */ body = _("Signed by <i><key id='%s'/> <b>expired</b></i> on %s."); title = _("Invalid Signature"); icon = ICON_PREFIX "seahorse-sign-bad.png"; sig = TRUE; break; /* TRANSLATORS: <key id='xxx'> is a custom markup tag, do not translate. */ case GPG_ERR_SIG_EXPIRED: body = _("Signed by <i><key id='%s'/></i> on %s <b>Expired</b>."); title = _("Expired Signature"); icon = ICON_PREFIX "seahorse-sign-bad.png"; sig = TRUE; break; /* TRANSLATORS: <key id='xxx'> is a custom markup tag, do not translate. */ case GPG_ERR_CERT_REVOKED: body = _("Signed by <i><key id='%s'/> <b>Revoked</b></i> on %s."); title = _("Revoked Signature"); icon = ICON_PREFIX "seahorse-sign-bad.png"; sig = TRUE; break; case GPG_ERR_NO_ERROR: /* TRANSLATORS: <key id='xxx'> is a custom markup tag, do not translate. */ body = _("Signed by <i><key id='%s'/></i> on %s."); title = _("Good Signature"); icon = ICON_PREFIX "seahorse-sign-ok.png"; sig = TRUE; break; case GPG_ERR_NO_PUBKEY: body = _("Signing key not in keyring."); title = _("Unknown Signature"); icon = ICON_PREFIX "seahorse-sign-unknown.png"; break; case GPG_ERR_BAD_SIGNATURE: body = _("Bad or forged signature. The signed data was modified."); title = _("Bad Signature"); icon = ICON_PREFIX "seahorse-sign-bad.png"; break; case GPG_ERR_NO_DATA: return; default: if (!GPG_IS_OK (status->signatures->status)) seahorse_gpgme_handle_error (status->signatures->status, _("Couldn't verify signature.")); return; }; if (sig) { gchar *date = seahorse_util_get_display_date_string (status->signatures->timestamp); gchar *id = seahorse_context_id_to_dbus (SCTX_APP (), seahorse_object_get_id (object)); body = g_markup_printf_escaped (body, id, date); g_free (date); g_free (id); } else { body = g_strdup (body); } if (data) { data = seahorse_util_uri_get_last (data); unesc_data = g_uri_unescape_string (data, NULL); title = g_strdup_printf ("%s: %s", unesc_data, title); g_free (unesc_data); } else { title = g_strdup (title); } seahorse_notification_display (title, body, !sig, icon, NULL); g_free(title); g_free(body); }
G_MODULE_EXPORT void on_gpgme_add_subkey_ok_clicked (GtkButton *button, gpointer user_data) { SeahorseWidget *swidget = SEAHORSE_WIDGET (user_data); SeahorseObjectWidget *skwidget; SeahorseKeyEncType real_type; gint type; guint length; time_t expires; gpgme_error_t err; GtkWidget *widget; GtkComboBox *combo; GtkTreeModel *model; GtkTreeIter iter; skwidget = SEAHORSE_OBJECT_WIDGET (swidget); combo = GTK_COMBO_BOX (seahorse_widget_get_widget (swidget, "type")); gtk_combo_box_get_active_iter (combo, &iter); model = gtk_combo_box_get_model (combo); gtk_tree_model_get (model, &iter, COMBO_INT, &type, -1); length = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON ( seahorse_widget_get_widget (swidget, LENGTH))); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON ( seahorse_widget_get_widget (swidget, "never_expires")))) expires = 0; else { widget = GTK_WIDGET (g_object_get_data (G_OBJECT (swidget), "expires-datetime")); g_return_if_fail (widget); egg_datetime_get_as_time_t (EGG_DATETIME (widget), &expires); } switch (type) { case 0: real_type = DSA; break; case 1: real_type = ELGAMAL; break; case 2: real_type = RSA_SIGN; break; default: real_type = RSA_ENCRYPT; break; } widget = GTK_WIDGET (seahorse_widget_get_widget (swidget, swidget->name)); gtk_widget_set_sensitive (widget, FALSE); err = seahorse_gpgme_key_op_add_subkey (SEAHORSE_GPGME_KEY (skwidget->object), real_type, length, expires); gtk_widget_set_sensitive (widget, TRUE); if (!GPG_IS_OK (err)) seahorse_gpgme_handle_error (err, _("Couldn't add subkey")); seahorse_widget_destroy (swidget); }
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; }