From dc3a49f93a0798b5c0c8d2fd6283f39294945045 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Mon, 01 Dec 2008 11:16:43 +0000 Subject: Removed 2008-12-01 Carlos Garcia Campos * configure.ac: * shell/Makefile.am: * shell/ev-keyring.[ch]: * shell/ev-password.[ch]: Removed * shell/ev-password-view.[ch]: (ev_password_view_finalize), (ev_password_view_class_init), (ev_password_view_clicked_cb), (ev_password_view_init), (ev_password_view_set_uri), (ev_password_dialog_got_response), (ev_password_dialog_remember_button_toggled), (ev_password_dialog_entry_changed_cb), (ev_password_dialog_entry_activated_cb), (ev_password_view_ask_password), (ev_password_view_get_password), (ev_password_view_get_password_save_flags), (ev_password_view_new): * shell/ev-window.c: (ev_window_password_view_unlock), (ev_window_load_job_cb), (ev_window_close_dialogs), (ev_window_init): Rework the password view. When the password is in the keyring it's used automatically without showing the password dialog and it's only stored in the keyring when we are sure it's correct. The password dialog has been reworked too, in order to make it more hig compliant and consistent with the GTK+ dialog used in gtkmountoperation. Fixes bug #562496. svn path=/trunk/; revision=3281 --- (limited to 'shell/ev-password-view.c') diff --git a/shell/ev-password-view.c b/shell/ev-password-view.c index b53300d..f7d0ca3 100644 --- a/shell/ev-password-view.c +++ b/shell/ev-password-view.c @@ -1,5 +1,6 @@ /* this file is part of evince, a gnome document viewer * + * Copyright (C) 2008 Carlos Garcia Campos * Copyright (C) 2005 Red Hat, Inc * * Evince is free software; you can redistribute it and/or modify it @@ -24,8 +25,9 @@ #include #include +#include -#include "ev-marshal.h" +#include "ev-keyring.h" #include "ev-password-view.h" enum { @@ -33,7 +35,14 @@ enum { LAST_SIGNAL }; struct _EvPasswordViewPrivate { - GtkWidget *label; + GtkWindow *parent_window; + GtkWidget *label; + GtkWidget *password_entry; + + gchar *password; + GPasswordSave password_save; + + GFile *uri_file; }; #define EV_PASSWORD_VIEW_GET_PRIVATE(object) \ @@ -44,6 +53,25 @@ static guint password_view_signals [LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE (EvPasswordView, ev_password_view, GTK_TYPE_VIEWPORT) +static void +ev_password_view_finalize (GObject *object) +{ + EvPasswordView *password_view = EV_PASSWORD_VIEW (object); + + if (password_view->priv->password) { + g_free (password_view->priv->password); + password_view->priv->password = NULL; + } + + password_view->priv->parent_window = NULL; + + if (password_view->priv->uri_file) { + g_object_unref (password_view->priv->uri_file); + password_view->priv->uri_file = NULL; + } + + G_OBJECT_CLASS (ev_password_view_parent_class)->finalize (object); +} static void ev_password_view_class_init (EvPasswordViewClass *class) @@ -54,23 +82,25 @@ ev_password_view_class_init (EvPasswordViewClass *class) g_object_class = G_OBJECT_CLASS (class); widget_class = GTK_WIDGET_CLASS (class); - password_view_signals [UNLOCK] = + password_view_signals[UNLOCK] = g_signal_new ("unlock", G_TYPE_FROM_CLASS (g_object_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (EvPasswordViewClass, unlock), NULL, NULL, - ev_marshal_VOID__VOID, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); g_type_class_add_private (g_object_class, sizeof (EvPasswordViewPrivate)); + + g_object_class->finalize = ev_password_view_finalize; } static void ev_password_view_clicked_cb (GtkWidget *button, EvPasswordView *password_view) { - g_signal_emit (password_view, password_view_signals [UNLOCK], 0); + ev_password_view_ask_password (password_view); } static void @@ -82,10 +112,12 @@ ev_password_view_init (EvPasswordView *password_view) GtkWidget *image; GtkWidget *button; GtkWidget *label; - gchar *markup; + gchar *markup; password_view->priv = EV_PASSWORD_VIEW_GET_PRIVATE (password_view); + password_view->priv->password_save = G_PASSWORD_SAVE_NEVER; + gtk_widget_push_composite_child (); /* set ourselves up */ @@ -126,30 +158,274 @@ ev_password_view_init (EvPasswordView *password_view) gtk_widget_pop_composite_child (); } - /* Public functions */ void -ev_password_view_set_file_name (EvPasswordView *password_view, - const char *file_name) +ev_password_view_set_uri (EvPasswordView *password_view, + const char *uri) { - gchar *markup; + gchar *markup, *file_name; + GFile *file; g_return_if_fail (EV_IS_PASSWORD_VIEW (password_view)); - g_return_if_fail (file_name != NULL); - - markup = g_markup_printf_escaped ("%s", file_name); + g_return_if_fail (uri != NULL); + + file = g_file_new_for_uri (uri); + if (password_view->priv->uri_file && + g_file_equal (file, password_view->priv->uri_file)) { + g_object_unref (file); + return; + } + if (password_view->priv->uri_file) + g_object_unref (password_view->priv->uri_file); + password_view->priv->uri_file = file; + + file_name = g_file_get_basename (password_view->priv->uri_file); + markup = g_markup_printf_escaped ("%s", + file_name); + g_free (file_name); gtk_label_set_markup (GTK_LABEL (password_view->priv->label), markup); + g_free (markup); +} + +static void +ev_password_dialog_got_response (GtkDialog *dialog, + gint response_id, + EvPasswordView *password_view) +{ + gtk_widget_set_sensitive (GTK_WIDGET (password_view), TRUE); + + if (response_id == GTK_RESPONSE_OK) { + g_free (password_view->priv->password); + password_view->priv->password = + g_strdup (gtk_entry_get_text (GTK_ENTRY (password_view->priv->password_entry))); + + g_signal_emit (password_view, password_view_signals[UNLOCK], 0); + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); +} + +static void +ev_password_dialog_remember_button_toggled (GtkToggleButton *button, + EvPasswordView *password_view) +{ + if (gtk_toggle_button_get_active (button)) { + gpointer data; + + data = g_object_get_data (G_OBJECT (button), "password-save"); + password_view->priv->password_save = GPOINTER_TO_INT (data); + } +} + +static void +ev_password_dialog_entry_changed_cb (GtkEditable *editable, + GtkDialog *dialog) +{ + const char *text; + + text = gtk_entry_get_text (GTK_ENTRY (editable)); + + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, + (text != NULL && *text != '\0')); +} + +static void +ev_password_dialog_entry_activated_cb (GtkEntry *entry, + GtkDialog *dialog) +{ + gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); +} + +void +ev_password_view_ask_password (EvPasswordView *password_view) +{ + GtkDialog *dialog; + GtkWidget *entry_container; + GtkWidget *hbox, *main_vbox, *vbox, *icon; + GtkWidget *table; + GtkWidget *label; + gchar *format, *markup, *file_name; + + gtk_widget_set_sensitive (GTK_WIDGET (password_view), FALSE); + + dialog = GTK_DIALOG (gtk_dialog_new ()); + + /* Set the dialog up with HIG properties */ + gtk_dialog_set_has_separator (dialog, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); + gtk_box_set_spacing (GTK_BOX (dialog->vbox), 2); /* 2 * 5 + 2 = 12 */ + gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 5); + gtk_box_set_spacing (GTK_BOX (dialog->action_area), 6); + + gtk_window_set_title (GTK_WINDOW (dialog), _("Enter password")); + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_DIALOG_AUTHENTICATION); + gtk_window_set_transient_for (GTK_WINDOW (dialog), password_view->priv->parent_window); + gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + + gtk_dialog_add_buttons (dialog, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + _("_Unlock Document"), GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK); + gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), + GTK_RESPONSE_OK, FALSE); + gtk_dialog_set_alternative_button_order (dialog, + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + + /* Build contents */ + hbox = gtk_hbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); + gtk_box_pack_start (GTK_BOX (dialog->vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show (hbox); + + icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION, + GTK_ICON_SIZE_DIALOG); + + gtk_misc_set_alignment (GTK_MISC (icon), 0.5, 0.0); + gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0); + gtk_widget_show (icon); + + main_vbox = gtk_vbox_new (FALSE, 18); + gtk_box_pack_start (GTK_BOX (hbox), main_vbox, TRUE, TRUE, 0); + gtk_widget_show (main_vbox); + label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + file_name = g_file_get_basename (password_view->priv->uri_file); + format = g_strdup_printf ("%s\n\n%s", + _("Password required"), + _("The document ā€œ%sā€ is locked and requires a password before it can be opened.")); + markup = g_markup_printf_escaped (format, file_name); + gtk_label_set_markup (GTK_LABEL (label), markup); + g_free (format); g_free (markup); + g_free (file_name); + gtk_box_pack_start (GTK_BOX (main_vbox), label, + FALSE, FALSE, 0); + gtk_widget_show (label); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (main_vbox), vbox, FALSE, FALSE, 0); + gtk_widget_show (vbox); + + /* The table that holds the entries */ + entry_container = gtk_alignment_new (0.0, 0.0, 1.0, 1.0); + + gtk_alignment_set_padding (GTK_ALIGNMENT (entry_container), + 0, 0, 0, 0); + + gtk_box_pack_start (GTK_BOX (vbox), entry_container, + FALSE, FALSE, 0); + gtk_widget_show (entry_container); + + table = gtk_table_new (1, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 12); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_container_add (GTK_CONTAINER (entry_container), table); + gtk_widget_show (table); + + label = gtk_label_new_with_mnemonic (_("_Password:")); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + + password_view->priv->password_entry = gtk_entry_new (); + gtk_entry_set_visibility (GTK_ENTRY (password_view->priv->password_entry), FALSE); + g_signal_connect (password_view->priv->password_entry, "changed", + G_CALLBACK (ev_password_dialog_entry_changed_cb), + dialog); + g_signal_connect (password_view->priv->password_entry, "activate", + G_CALLBACK (ev_password_dialog_entry_activated_cb), + dialog); + gtk_table_attach (GTK_TABLE (table), label, + 0, 1, 0, 1, + GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + gtk_widget_show (label); + + gtk_table_attach_defaults (GTK_TABLE (table), password_view->priv->password_entry, + 1, 2, 0, 1); + gtk_widget_show (password_view->priv->password_entry); + + gtk_label_set_mnemonic_widget (GTK_LABEL (label), + password_view->priv->password_entry); + + if (ev_keyring_is_available ()) { + GtkWidget *choice; + GtkWidget *remember_box; + GSList *group; + + remember_box = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (vbox), remember_box, + FALSE, FALSE, 0); + gtk_widget_show (remember_box); + + choice = gtk_radio_button_new_with_mnemonic (NULL, _("Forget password _immediately")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (choice), + password_view->priv->password_save == G_PASSWORD_SAVE_NEVER); + g_object_set_data (G_OBJECT (choice), "password-save", + GINT_TO_POINTER (G_PASSWORD_SAVE_NEVER)); + g_signal_connect (choice, "toggled", + G_CALLBACK (ev_password_dialog_remember_button_toggled), + password_view); + gtk_box_pack_start (GTK_BOX (remember_box), choice, FALSE, FALSE, 0); + gtk_widget_show (choice); + + group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (choice)); + choice = gtk_radio_button_new_with_mnemonic (group, _("Remember password until you _logout")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (choice), + password_view->priv->password_save == G_PASSWORD_SAVE_FOR_SESSION); + g_object_set_data (G_OBJECT (choice), "password-save", + GINT_TO_POINTER (G_PASSWORD_SAVE_FOR_SESSION)); + g_signal_connect (choice, "toggled", + G_CALLBACK (ev_password_dialog_remember_button_toggled), + password_view); + gtk_box_pack_start (GTK_BOX (remember_box), choice, FALSE, FALSE, 0); + gtk_widget_show (choice); + + group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (choice)); + choice = gtk_radio_button_new_with_mnemonic (group, _("Remember _forever")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (choice), + password_view->priv->password_save == G_PASSWORD_SAVE_PERMANENTLY); + g_object_set_data (G_OBJECT (choice), "password-save", + GINT_TO_POINTER (G_PASSWORD_SAVE_PERMANENTLY)); + g_signal_connect (choice, "toggled", + G_CALLBACK (ev_password_dialog_remember_button_toggled), + password_view); + gtk_box_pack_start (GTK_BOX (remember_box), choice, FALSE, FALSE, 0); + gtk_widget_show (choice); + } + + g_signal_connect (G_OBJECT (dialog), "response", + G_CALLBACK (ev_password_dialog_got_response), + password_view); + + gtk_widget_show (GTK_WIDGET (dialog)); +} + +const gchar * +ev_password_view_get_password (EvPasswordView *password_view) +{ + return password_view->priv->password; +} + +GPasswordSave +ev_password_view_get_password_save_flags (EvPasswordView *password_view) +{ + return password_view->priv->password_save; } GtkWidget * -ev_password_view_new (void) +ev_password_view_new (GtkWindow *parent) { - GtkWidget *retval; + EvPasswordView *retval; + + retval = EV_PASSWORD_VIEW (g_object_new (EV_TYPE_PASSWORD_VIEW, NULL)); - retval = (GtkWidget *) g_object_new (EV_TYPE_PASSWORD_VIEW, NULL); + retval->priv->parent_window = parent; - return retval; + return GTK_WIDGET (retval); } + -- cgit v0.9.1