From 1994d674ad7b35e8b4a5db7f431c31414d1230f3 Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Wed, 1 Dec 2010 14:48:13 +0000 Subject: auth-client: listen for new sasl handlers and pop up a password dialog Signed-off-by: Jonny Lamb --- src/empathy-auth-client.c | 71 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/empathy-auth-client.c b/src/empathy-auth-client.c index 17b66a57d..864253bbf 100644 --- a/src/empathy-auth-client.c +++ b/src/empathy-auth-client.c @@ -29,6 +29,7 @@ #define DEBUG_FLAG EMPATHY_DEBUG_TLS #include #include +#include #include #include @@ -180,7 +181,7 @@ verifier_verify_cb (GObject *source, } static void -auth_factory_new_handler_cb (EmpathyAuthFactory *factory, +auth_factory_new_tls_handler_cb (EmpathyAuthFactory *factory, EmpathyServerTLSHandler *handler, gpointer user_data) { @@ -204,6 +205,69 @@ auth_factory_new_handler_cb (EmpathyAuthFactory *factory, g_free (hostname); } +typedef struct +{ + EmpathyServerSASLHandler *handler; + GtkWidget *entry; +} PasswordDialogData; + +static void +password_dialog_response_cb (GtkDialog *dialog, + gint response, + gpointer user_data) +{ + PasswordDialogData *data = user_data; + + if (response == GTK_RESPONSE_ACCEPT) + { + empathy_server_sasl_handler_provide_password (data->handler, + gtk_entry_get_text (GTK_ENTRY (data->entry))); + } + else + { + empathy_server_sasl_handler_cancel (data->handler); + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); + + g_object_unref (data->handler); + g_slice_free (PasswordDialogData, data); +} + +static void +auth_factory_new_sasl_handler_cb (EmpathyAuthFactory *factory, + EmpathyServerSASLHandler *handler, + gpointer user_data) +{ + GtkWidget *dialog, *entry; + PasswordDialogData *data; + + DEBUG ("New SASL server handler received from the factory"); + + dialog = gtk_dialog_new_with_buttons (_("Enter password"), NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + NULL); + + entry = gtk_entry_new (); + gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE); + + gtk_box_pack_start (GTK_BOX ( + gtk_dialog_get_content_area (GTK_DIALOG (dialog))), + entry, FALSE, FALSE, 10); + gtk_widget_show (entry); + + data = g_slice_new0 (PasswordDialogData); + data->handler = g_object_ref (handler); + data->entry = entry; + + g_signal_connect (dialog, "response", + G_CALLBACK (password_dialog_response_cb), data); + + gtk_widget_show (dialog); +} + int main (int argc, char **argv) @@ -238,7 +302,10 @@ main (int argc, factory = empathy_auth_factory_dup_singleton (); g_signal_connect (factory, "new-server-tls-handler", - G_CALLBACK (auth_factory_new_handler_cb), NULL); + G_CALLBACK (auth_factory_new_tls_handler_cb), NULL); + + g_signal_connect (factory, "new-server-sasl-handler", + G_CALLBACK (auth_factory_new_sasl_handler_cb), NULL); if (!empathy_auth_factory_register (factory, &error)) { -- cgit From fd337e4163b26ea7e284473817a1d17946ab12d4 Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Fri, 3 Dec 2010 13:04:04 +0000 Subject: auth-client: improve the password request dialog Signed-off-by: Jonny Lamb --- src/empathy-auth-client.c | 74 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/empathy-auth-client.c b/src/empathy-auth-client.c index 864253bbf..6b03a03d1 100644 --- a/src/empathy-auth-client.c +++ b/src/empathy-auth-client.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -209,6 +210,7 @@ typedef struct { EmpathyServerSASLHandler *handler; GtkWidget *entry; + GtkWidget *ticky; } PasswordDialogData; static void @@ -218,10 +220,11 @@ password_dialog_response_cb (GtkDialog *dialog, { PasswordDialogData *data = user_data; - if (response == GTK_RESPONSE_ACCEPT) + if (response == GTK_RESPONSE_OK) { empathy_server_sasl_handler_provide_password (data->handler, - gtk_entry_get_text (GTK_ENTRY (data->entry))); + gtk_entry_get_text (GTK_ENTRY (data->entry)), + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->ticky))); } else { @@ -234,33 +237,82 @@ password_dialog_response_cb (GtkDialog *dialog, g_slice_free (PasswordDialogData, data); } +static void +clear_icon_released_cb (GtkEntry *entry, + GtkEntryIconPosition icon_pos, + GdkEvent *event, + gpointer user_data) +{ + gtk_entry_set_text (entry, ""); +} + +static void +password_entry_changed_cb (GtkEditable *entry, + gpointer user_data) +{ + const gchar *str; + + str = gtk_entry_get_text (GTK_ENTRY (entry)); + + gtk_entry_set_icon_sensitive (GTK_ENTRY (entry), + GTK_ENTRY_ICON_SECONDARY, !EMP_STR_EMPTY (str)); +} + static void auth_factory_new_sasl_handler_cb (EmpathyAuthFactory *factory, EmpathyServerSASLHandler *handler, gpointer user_data) { - GtkWidget *dialog, *entry; + GtkWidget *dialog, *entry, *icon, *ticky; + GtkBox *box; + TpAccount *account; PasswordDialogData *data; DEBUG ("New SASL server handler received from the factory"); - dialog = gtk_dialog_new_with_buttons (_("Enter password"), NULL, - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, - NULL); + account = empathy_server_sasl_handler_get_account (handler); + + dialog = gtk_message_dialog_new_with_markup (NULL, 0, + GTK_MESSAGE_OTHER, GTK_BUTTONS_OK_CANCEL, + _("Enter your password for account\n%s"), + tp_account_get_display_name (account)); + + box = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))); + /* dialog icon */ + icon = gtk_image_new_from_icon_name (tp_account_get_icon_name (account), + GTK_ICON_SIZE_DIALOG); + gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), icon); + gtk_widget_show (icon); + + /* entry */ entry = gtk_entry_new (); gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE); - gtk_box_pack_start (GTK_BOX ( - gtk_dialog_get_content_area (GTK_DIALOG (dialog))), - entry, FALSE, FALSE, 10); + /* entry clear icon */ + gtk_entry_set_icon_from_stock (GTK_ENTRY (entry), + GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); + gtk_entry_set_icon_sensitive (GTK_ENTRY (entry), + GTK_ENTRY_ICON_SECONDARY, FALSE); + + g_signal_connect (entry, "icon-release", + G_CALLBACK (clear_icon_released_cb), NULL); + g_signal_connect (entry, "changed", + G_CALLBACK (password_entry_changed_cb), NULL); + + gtk_box_pack_start (box, entry, FALSE, FALSE, 0); gtk_widget_show (entry); + /* remember password ticky */ + ticky = gtk_check_button_new_with_label (_("Remember password")); + + gtk_box_pack_start (box, ticky, FALSE, FALSE, 0); + gtk_widget_show (ticky); + data = g_slice_new0 (PasswordDialogData); data->handler = g_object_ref (handler); data->entry = entry; + data->ticky = ticky; g_signal_connect (dialog, "response", G_CALLBACK (password_dialog_response_cb), data); -- cgit From ee8f480f660963c7d26872a27ba9889bbed6a000 Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Fri, 3 Dec 2010 14:25:46 +0000 Subject: auth-client: grab the keyboard focus when popping up the password dialog I like this. Signed-off-by: Jonny Lamb --- src/empathy-auth-client.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) (limited to 'src') diff --git a/src/empathy-auth-client.c b/src/empathy-auth-client.c index 6b03a03d1..d4e1cd64a 100644 --- a/src/empathy-auth-client.c +++ b/src/empathy-auth-client.c @@ -258,6 +258,69 @@ password_entry_changed_cb (GtkEditable *entry, GTK_ENTRY_ICON_SECONDARY, !EMP_STR_EMPTY (str)); } +#define KEYBOARD_GRABBED \ + g_quark_from_static_string ("password-entry-keyboard-grabbed") + +static gboolean +password_dialog_grab_keyboard (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + if (g_object_get_qdata (G_OBJECT (widget), KEYBOARD_GRABBED) == NULL) + { + GdkGrabStatus status = gdk_keyboard_grab (gtk_widget_get_window (widget), + FALSE, gdk_event_get_time (event)); + + if (status != GDK_GRAB_SUCCESS) + { + DEBUG ("Could not grab keyboard; grab status was %u", status); + } + else + { + g_object_set_qdata (G_OBJECT (widget), KEYBOARD_GRABBED, + GINT_TO_POINTER (TRUE)); + } + } + + return FALSE; +} + +static gboolean +password_dialog_ungrab_keyboard (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + if (g_object_get_qdata (G_OBJECT (widget), KEYBOARD_GRABBED) != NULL) + { + gdk_keyboard_ungrab (gdk_event_get_time (event)); + g_object_set_qdata (G_OBJECT (widget), KEYBOARD_GRABBED, NULL); + } + + return FALSE; +} + +static gboolean +password_dialog_window_state_changed (GtkWidget *widget, + GdkEventWindowState *event, + gpointer data) +{ + GdkWindowState state = gdk_window_get_state (gtk_widget_get_window (widget)); + + if (state & GDK_WINDOW_STATE_WITHDRAWN + || state & GDK_WINDOW_STATE_ICONIFIED + || state & GDK_WINDOW_STATE_FULLSCREEN + || state & GDK_WINDOW_STATE_MAXIMIZED) + { + password_dialog_ungrab_keyboard (widget, (GdkEvent*) event, data); + } + else + { + password_dialog_grab_keyboard (widget, (GdkEvent*) event, data); + } + + return FALSE; +} + static void auth_factory_new_sasl_handler_cb (EmpathyAuthFactory *factory, EmpathyServerSASLHandler *handler, @@ -272,10 +335,13 @@ auth_factory_new_sasl_handler_cb (EmpathyAuthFactory *factory, account = empathy_server_sasl_handler_get_account (handler); + /* dialog */ dialog = gtk_message_dialog_new_with_markup (NULL, 0, GTK_MESSAGE_OTHER, GTK_BUTTONS_OK_CANCEL, _("Enter your password for account\n%s"), tp_account_get_display_name (account)); + gtk_window_set_icon_name (GTK_WINDOW (dialog), + GTK_STOCK_DIALOG_AUTHENTICATION); box = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))); @@ -316,8 +382,15 @@ auth_factory_new_sasl_handler_cb (EmpathyAuthFactory *factory, g_signal_connect (dialog, "response", G_CALLBACK (password_dialog_response_cb), data); + g_signal_connect (dialog, "window-state-event", + G_CALLBACK (password_dialog_window_state_changed), NULL); + g_signal_connect (dialog, "map-event", + G_CALLBACK (password_dialog_grab_keyboard), NULL); + g_signal_connect (dialog, "unmap-event", + G_CALLBACK (password_dialog_ungrab_keyboard), NULL); gtk_widget_show (dialog); + gtk_widget_grab_focus (entry); } int -- cgit From 5c2ae48c27de994ba418bf759bbf011c8101943d Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Fri, 3 Dec 2010 15:58:05 +0000 Subject: auth-client: move the password dialog into a new file Signed-off-by: Jonny Lamb --- src/empathy-auth-client.c | 180 ++-------------------------------------------- 1 file changed, 4 insertions(+), 176 deletions(-) (limited to 'src') diff --git a/src/empathy-auth-client.c b/src/empathy-auth-client.c index d4e1cd64a..f6cc9def8 100644 --- a/src/empathy-auth-client.c +++ b/src/empathy-auth-client.c @@ -34,6 +34,7 @@ #include #include +#include #include #include @@ -206,191 +207,18 @@ auth_factory_new_tls_handler_cb (EmpathyAuthFactory *factory, g_free (hostname); } -typedef struct -{ - EmpathyServerSASLHandler *handler; - GtkWidget *entry; - GtkWidget *ticky; -} PasswordDialogData; - -static void -password_dialog_response_cb (GtkDialog *dialog, - gint response, - gpointer user_data) -{ - PasswordDialogData *data = user_data; - - if (response == GTK_RESPONSE_OK) - { - empathy_server_sasl_handler_provide_password (data->handler, - gtk_entry_get_text (GTK_ENTRY (data->entry)), - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->ticky))); - } - else - { - empathy_server_sasl_handler_cancel (data->handler); - } - - gtk_widget_destroy (GTK_WIDGET (dialog)); - - g_object_unref (data->handler); - g_slice_free (PasswordDialogData, data); -} - -static void -clear_icon_released_cb (GtkEntry *entry, - GtkEntryIconPosition icon_pos, - GdkEvent *event, - gpointer user_data) -{ - gtk_entry_set_text (entry, ""); -} - -static void -password_entry_changed_cb (GtkEditable *entry, - gpointer user_data) -{ - const gchar *str; - - str = gtk_entry_get_text (GTK_ENTRY (entry)); - - gtk_entry_set_icon_sensitive (GTK_ENTRY (entry), - GTK_ENTRY_ICON_SECONDARY, !EMP_STR_EMPTY (str)); -} - -#define KEYBOARD_GRABBED \ - g_quark_from_static_string ("password-entry-keyboard-grabbed") - -static gboolean -password_dialog_grab_keyboard (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - if (g_object_get_qdata (G_OBJECT (widget), KEYBOARD_GRABBED) == NULL) - { - GdkGrabStatus status = gdk_keyboard_grab (gtk_widget_get_window (widget), - FALSE, gdk_event_get_time (event)); - - if (status != GDK_GRAB_SUCCESS) - { - DEBUG ("Could not grab keyboard; grab status was %u", status); - } - else - { - g_object_set_qdata (G_OBJECT (widget), KEYBOARD_GRABBED, - GINT_TO_POINTER (TRUE)); - } - } - - return FALSE; -} - -static gboolean -password_dialog_ungrab_keyboard (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - if (g_object_get_qdata (G_OBJECT (widget), KEYBOARD_GRABBED) != NULL) - { - gdk_keyboard_ungrab (gdk_event_get_time (event)); - g_object_set_qdata (G_OBJECT (widget), KEYBOARD_GRABBED, NULL); - } - - return FALSE; -} - -static gboolean -password_dialog_window_state_changed (GtkWidget *widget, - GdkEventWindowState *event, - gpointer data) -{ - GdkWindowState state = gdk_window_get_state (gtk_widget_get_window (widget)); - - if (state & GDK_WINDOW_STATE_WITHDRAWN - || state & GDK_WINDOW_STATE_ICONIFIED - || state & GDK_WINDOW_STATE_FULLSCREEN - || state & GDK_WINDOW_STATE_MAXIMIZED) - { - password_dialog_ungrab_keyboard (widget, (GdkEvent*) event, data); - } - else - { - password_dialog_grab_keyboard (widget, (GdkEvent*) event, data); - } - - return FALSE; -} - static void auth_factory_new_sasl_handler_cb (EmpathyAuthFactory *factory, EmpathyServerSASLHandler *handler, gpointer user_data) { - GtkWidget *dialog, *entry, *icon, *ticky; - GtkBox *box; - TpAccount *account; - PasswordDialogData *data; + GtkWidget *dialog; DEBUG ("New SASL server handler received from the factory"); - account = empathy_server_sasl_handler_get_account (handler); - - /* dialog */ - dialog = gtk_message_dialog_new_with_markup (NULL, 0, - GTK_MESSAGE_OTHER, GTK_BUTTONS_OK_CANCEL, - _("Enter your password for account\n%s"), - tp_account_get_display_name (account)); - gtk_window_set_icon_name (GTK_WINDOW (dialog), - GTK_STOCK_DIALOG_AUTHENTICATION); - - box = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))); - - /* dialog icon */ - icon = gtk_image_new_from_icon_name (tp_account_get_icon_name (account), - GTK_ICON_SIZE_DIALOG); - gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), icon); - gtk_widget_show (icon); - - /* entry */ - entry = gtk_entry_new (); - gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE); - - /* entry clear icon */ - gtk_entry_set_icon_from_stock (GTK_ENTRY (entry), - GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); - gtk_entry_set_icon_sensitive (GTK_ENTRY (entry), - GTK_ENTRY_ICON_SECONDARY, FALSE); - - g_signal_connect (entry, "icon-release", - G_CALLBACK (clear_icon_released_cb), NULL); - g_signal_connect (entry, "changed", - G_CALLBACK (password_entry_changed_cb), NULL); - - gtk_box_pack_start (box, entry, FALSE, FALSE, 0); - gtk_widget_show (entry); - - /* remember password ticky */ - ticky = gtk_check_button_new_with_label (_("Remember password")); - - gtk_box_pack_start (box, ticky, FALSE, FALSE, 0); - gtk_widget_show (ticky); - - data = g_slice_new0 (PasswordDialogData); - data->handler = g_object_ref (handler); - data->entry = entry; - data->ticky = ticky; - - g_signal_connect (dialog, "response", - G_CALLBACK (password_dialog_response_cb), data); - g_signal_connect (dialog, "window-state-event", - G_CALLBACK (password_dialog_window_state_changed), NULL); - g_signal_connect (dialog, "map-event", - G_CALLBACK (password_dialog_grab_keyboard), NULL); - g_signal_connect (dialog, "unmap-event", - G_CALLBACK (password_dialog_ungrab_keyboard), NULL); - + /* TODO: check whether to show the dialog */ + dialog = empathy_password_dialog_new (handler); gtk_widget_show (dialog); - gtk_widget_grab_focus (entry); } int -- cgit From bc099434f22a78d09d0dad3d5006ad836ab11d02 Mon Sep 17 00:00:00 2001 From: Jonny Lamb Date: Mon, 6 Dec 2010 09:43:34 +0000 Subject: server-sasl-handler: make a GAsyncInitable and get the password Signed-off-by: Jonny Lamb --- src/empathy-auth-client.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/empathy-auth-client.c b/src/empathy-auth-client.c index f6cc9def8..98a736fb9 100644 --- a/src/empathy-auth-client.c +++ b/src/empathy-auth-client.c @@ -216,9 +216,12 @@ auth_factory_new_sasl_handler_cb (EmpathyAuthFactory *factory, DEBUG ("New SASL server handler received from the factory"); - /* TODO: check whether to show the dialog */ - dialog = empathy_password_dialog_new (handler); - gtk_widget_show (dialog); + /* If the handler has the password it will deal with it itself. */ + if (!empathy_server_sasl_handler_has_password (handler)) + { + dialog = empathy_password_dialog_new (handler); + gtk_widget_show (dialog); + } } int -- cgit