diff options
Diffstat (limited to 'src/nautilus-operations-ui-manager.c')
-rw-r--r-- | src/nautilus-operations-ui-manager.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/nautilus-operations-ui-manager.c b/src/nautilus-operations-ui-manager.c index 170ee7f5a..c58844186 100644 --- a/src/nautilus-operations-ui-manager.c +++ b/src/nautilus-operations-ui-manager.c @@ -581,3 +581,99 @@ handle_unsupported_compressed_file (GtkWindow *parent_window, return; } + +typedef struct +{ + GtkWindow *parent_window; + const gchar *basename; + gchar *passphrase; + GtkWidget *passphrase_entry; + gboolean completed; +} PassphraseRequestData; + +static void +on_request_passphrase_cb (GtkDialog *dialog, + gint response_id, + gpointer user_data) +{ + PassphraseRequestData *data = user_data; + + if (response_id != GTK_RESPONSE_CANCEL && + response_id != GTK_RESPONSE_DELETE_EVENT) + { + data->passphrase = g_strdup (gtk_entry_get_text (GTK_ENTRY (data->passphrase_entry))); + } + + data->completed = TRUE; +} + +static gboolean +run_passphrase_dialog (gpointer user_data) +{ + PassphraseRequestData *data = user_data; + g_autofree gchar *label_str = NULL; + GtkWidget *dialog; + GtkWidget *entry; + GtkWidget *label; + GtkWidget *box; + + dialog = gtk_dialog_new_with_buttons (_("Password Required"), + data->parent_window, + GTK_DIALOG_USE_HEADER_BAR | GTK_DIALOG_MODAL, + _("Cancel"), GTK_RESPONSE_CANCEL, + _("Extract"), GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + + box = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + gtk_widget_set_margin_start (box, 20); + gtk_widget_set_margin_end (box, 20); + gtk_widget_set_margin_top (box, 20); + gtk_widget_set_margin_bottom (box, 20); + + label_str = g_strdup_printf (_("“%s” is password-protected."), data->basename); + label = gtk_label_new (label_str); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_label_set_max_width_chars (GTK_LABEL (label), 60); + gtk_container_add (GTK_CONTAINER (box), label); + + entry = gtk_entry_new (); + gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); + gtk_widget_set_valign (entry, GTK_ALIGN_END); + gtk_widget_set_vexpand (entry, TRUE); + gtk_entry_set_placeholder_text (GTK_ENTRY (entry), _("Enter password…")); + gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE); + gtk_entry_set_input_purpose (GTK_ENTRY (entry), GTK_INPUT_PURPOSE_PASSWORD); + gtk_container_add (GTK_CONTAINER (box), entry); + + data->passphrase_entry = entry; + g_signal_connect (dialog, "response", G_CALLBACK (on_request_passphrase_cb), data); + gtk_widget_show_all (dialog); + + while (!data->completed) + { + g_main_context_iteration (NULL, TRUE); + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); + + return G_SOURCE_REMOVE; +} + +gchar * +extract_ask_passphrase (GtkWindow *parent_window, + const gchar *archive_basename) +{ + PassphraseRequestData *data; + gchar *passphrase; + + data = g_new0 (PassphraseRequestData, 1); + data->parent_window = parent_window; + data->basename = archive_basename; + invoke_main_context_sync (NULL, run_passphrase_dialog, data); + + passphrase = g_steal_pointer (&data->passphrase); + g_free (data); + + return passphrase; +} |