diff options
| author | mbkma <[email protected]> | 2026-04-02 01:22:18 +0200 |
|---|---|---|
| committer | mbkma <[email protected]> | 2026-04-02 20:30:17 +0200 |
| commit | 7aa5368bbe6ebadbbed14afc548e0e37e920a708 (patch) | |
| tree | 56729cb9f9776e7835350d5f7f83e9d0e9230501 /shell | |
| parent | e906330f6a199086cc2eb135e9eac9f92cfba04f (diff) | |
| download | atril-7aa5368bbe6ebadbbed14afc548e0e37e920a708.tar.bz2 atril-7aa5368bbe6ebadbbed14afc548e0e37e920a708.tar.xz | |
make signing more robust
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ev-window.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/shell/ev-window.c b/shell/ev-window.c index bb8054b3..f5011c37 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -401,6 +401,7 @@ static gchar *caja_sendto = NULL; static char *ev_window_signature_password_callback (const char *text); static void ev_window_show_signature_message (EvWindow *window); static void ev_window_cmd_digital_signing (GtkAction *action, EvWindow *ev_window); +static void ev_window_clear_signature_state (EvWindow *window); G_DEFINE_TYPE_WITH_PRIVATE (EvWindow, ev_window, GTK_TYPE_APPLICATION_WINDOW) @@ -972,6 +973,14 @@ ev_window_show_signature_message (EvWindow *window) ev_window_set_message_area (window, area); } +static void +ev_window_clear_signature_state (EvWindow *window) +{ + window->priv->certificate_listbox = NULL; + g_clear_pointer (&window->priv->signature_bounding_box, ev_rectangle_free); + g_clear_pointer (&window->priv->signature_certificate_info, ev_certificate_info_free); +} + static gboolean show_loading_message_cb (EvWindow *window) { @@ -3421,6 +3430,7 @@ ev_window_signature_password_callback (const char *text) GtkWidget *entry; char *ret; GtkWindow *parent; + gint response; parent = gtk_application_get_active_window (GTK_APPLICATION (g_application_get_default ())); @@ -3438,8 +3448,8 @@ ev_window_signature_password_callback (const char *text) gtk_box_pack_end (GTK_BOX (box), entry, TRUE, TRUE, 6); gtk_widget_show_all (box); - gtk_dialog_run (GTK_DIALOG (dialog)); - ret = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); + response = gtk_dialog_run (GTK_DIALOG (dialog)); + ret = response == GTK_RESPONSE_OK ? g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))) : NULL; gtk_widget_destroy (dialog); return ret; @@ -3451,8 +3461,22 @@ on_document_signed (GObject *source_object, gpointer user_data) { char *file = user_data; - gchar *uri = g_strdup_printf ("file://%s", file); + gchar *uri; GtkWidget *new_window; + GError *error = NULL; + + if (!ev_document_signatures_sign_finish (EV_DOCUMENT_SIGNATURES (source_object), result, &error)) { + g_warning ("Failed to sign document: %s", error->message); + g_error_free (error); + g_free (file); + return; + } + + uri = g_filename_to_uri (file, NULL, NULL); + if (!uri) { + g_free (file); + return; + } new_window = ev_window_new (); ev_window_open_uri (EV_WINDOW (new_window), uri, NULL, EV_WINDOW_MODE_NORMAL, NULL); @@ -3470,6 +3494,8 @@ ev_window_certificate_save_file (EvWindow *window, EvSignaturesData *data; time_t t; gchar *tmp; + gchar *saved_filename; + GError *error = NULL; data = ev_document_signatures_data_new (); ev_document_signatures_data_set_certificate_info (data, certificate_info); @@ -3484,8 +3510,16 @@ ev_window_certificate_save_file (EvWindow *window, ev_document_signatures_data_set_signature (data, tmp); g_free (tmp); ev_document_signatures_data_set_signature_left (data, ev_certificate_info_get_subject_common_name (certificate_info)); + saved_filename = g_strdup (filename); - ev_document_signatures_sign (EV_DOCUMENT_SIGNATURES (priv->document), data, NULL, on_document_signed, g_strdup (filename)); + if (!ev_document_signatures_sign (EV_DOCUMENT_SIGNATURES (priv->document), data, NULL, + on_document_signed, saved_filename, &error)) { + ev_window_error_message (window, error, "%s", _("Failed to sign document")); + g_error_free (error); + g_free (saved_filename); + } + + ev_document_signatures_data_free (data); } static void @@ -3507,6 +3541,8 @@ ev_window_on_save_signed_file_response (GtkWidget *dialog, g_clear_pointer (&priv->signature_certificate_info, ev_certificate_info_free); } + priv->certificate_listbox = NULL; + gtk_widget_destroy (dialog); } @@ -3548,6 +3584,7 @@ ev_window_certificate_selection_response (GtkWidget *dialog, EvWindowPrivate *priv = window->priv; if (response != GTK_RESPONSE_OK) { + priv->certificate_listbox = NULL; gtk_widget_destroy (dialog); return; } @@ -3560,6 +3597,7 @@ ev_window_certificate_selection_response (GtkWidget *dialog, } gtk_widget_destroy (dialog); + priv->certificate_listbox = NULL; if (!priv->signature_certificate_info) return; @@ -6871,6 +6909,8 @@ ev_window_dispose (GObject *object) priv->print_queue = NULL; } + ev_window_clear_signature_state (window); + if (priv->toolbars_model) { g_object_unref (priv->toolbars_model); priv->toolbars_model = NULL; |
