diff options
author | Ray Strode <rstrode@redhat.com> | 2009-03-02 17:09:16 -0500 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2009-04-17 10:24:50 -0400 |
commit | 996f22a0da8d207932f1efc1b30b337c485fa681 (patch) | |
tree | e7643ed7797b69bd11d73699909f869c75c15d6d | |
parent | adf32974d4fb816688498552727d664c80653064 (diff) | |
download | gdm-996f22a0da8d207932f1efc1b30b337c485fa681.tar.gz |
Notify plugins if their user choose requests fail
This allows the smart card plugin to cancel pending
conversations when a card gets inserted.
This isn't perfect. We really want to only cancel
the conversations if they're for a user other
than the user the smartcard is for.
-rw-r--r-- | common/gdm-marshal.list | 1 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-login-window.c | 12 | ||||
-rw-r--r-- | gui/simple-greeter/libgdmsimplegreeter/Makefile.am | 2 | ||||
-rw-r--r-- | gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.c | 19 | ||||
-rw-r--r-- | gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.h | 6 | ||||
-rw-r--r-- | gui/simple-greeter/plugins/smartcard/gdm-smartcard-extension.c | 23 |
6 files changed, 47 insertions, 16 deletions
diff --git a/common/gdm-marshal.list b/common/gdm-marshal.list index d5455e1d..d8a9e728 100644 --- a/common/gdm-marshal.list +++ b/common/gdm-marshal.list @@ -5,3 +5,4 @@ VOID:STRING,STRING VOID:UINT,UINT VOID:STRING,INT VOID:DOUBLE +BOOLEAN:STRING diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c index ed009a47..a16948f9 100644 --- a/gui/simple-greeter/gdm-greeter-login-window.c +++ b/gui/simple-greeter/gdm-greeter-login-window.c @@ -2389,7 +2389,7 @@ on_conversation_cancel (GdmGreeterLoginWindow *login_window, do_cancel (login_window); } -static void +static gboolean on_conversation_chose_user (GdmGreeterLoginWindow *login_window, const char *username, GdmConversation *conversation) @@ -2400,7 +2400,13 @@ on_conversation_chose_user (GdmGreeterLoginWindow *login_window, name = gdm_task_get_name (GDM_TASK (conversation)); g_warning ("Task %s is trying to choose user before list is loaded", name); g_free (name); - return; + return FALSE; + } + + /* If we're already authenticating then we can't pick a user + */ + if (login_window->priv->dialog_mode == MODE_AUTHENTICATION) { + return FALSE; } if (gdm_task_list_set_active_task (GDM_TASK_LIST (login_window->priv->conversation_list), @@ -2408,6 +2414,8 @@ on_conversation_chose_user (GdmGreeterLoginWindow *login_window, gdm_user_chooser_widget_set_chosen_user_name (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), username); } + + return TRUE; } void diff --git a/gui/simple-greeter/libgdmsimplegreeter/Makefile.am b/gui/simple-greeter/libgdmsimplegreeter/Makefile.am index 1ef5725a..0d7a0bd0 100644 --- a/gui/simple-greeter/libgdmsimplegreeter/Makefile.am +++ b/gui/simple-greeter/libgdmsimplegreeter/Makefile.am @@ -3,6 +3,7 @@ NULL = AM_CPPFLAGS = \ -I. \ -I.. \ + -I$(top_srcdir)/common \ -DBINDIR=\"$(bindir)\" \ -DDATADIR=\"$(datadir)\" \ -DLIBDIR=\"$(libdir)\" \ @@ -28,6 +29,7 @@ libgdmsimplegreeter_la_SOURCES = \ libgdmsimplegreeter_la_LIBADD = \ $(GTK_LIBS) \ + $(top_builddir)/common/libgdmcommon.la \ $(NULL) libgdmsimplegreeter_la_LDFLAGS = \ diff --git a/gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.c b/gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.c index cef435c6..ee763ef6 100644 --- a/gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.c +++ b/gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.c @@ -25,9 +25,9 @@ #include <gtk/gtk.h> #include "gdm-conversation.h" +#include "gdm-marshal.h" #include "gdm-task.h" - enum { ANSWER, USER_CHOSEN, @@ -76,12 +76,12 @@ gdm_conversation_class_init (gpointer g_iface) signals [USER_CHOSEN] = g_signal_new ("user-chosen", iface_type, - G_SIGNAL_RUN_FIRST, + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GdmConversationIface, user_chosen), NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, + gdm_marshal_BOOLEAN__STRING, + G_TYPE_BOOLEAN, 1, G_TYPE_STRING); signals [CANCEL] = g_signal_new ("cancel", @@ -171,9 +171,16 @@ gdm_conversation_cancel (GdmConversation *conversation) { g_signal_emit (conversation, signals [CANCEL], 0); } -void + +gboolean gdm_conversation_choose_user (GdmConversation *conversation, const char *username) { - g_signal_emit (conversation, signals [USER_CHOSEN], 0, username); + gboolean was_chosen; + + was_chosen = FALSE; + + g_signal_emit (conversation, signals [USER_CHOSEN], 0, username, &was_chosen); + + return was_chosen; } diff --git a/gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.h b/gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.h index fb4bf492..b37b21e1 100644 --- a/gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.h +++ b/gui/simple-greeter/libgdmsimplegreeter/gdm-conversation.h @@ -61,7 +61,7 @@ struct _GdmConversationIface /* signals */ char * (* answer) (GdmConversation *conversation); void (* cancel) (GdmConversation *conversation); - void (* user_chosen) (GdmConversation *conversation); + gboolean (* user_chosen) (GdmConversation *conversation); }; GType gdm_conversation_get_type (void) G_GNUC_CONST; @@ -85,8 +85,8 @@ gboolean gdm_conversation_focus (GdmConversation *conversation); void gdm_conversation_answer (GdmConversation *conversation, const char *answer); void gdm_conversation_cancel (GdmConversation *conversation); -void gdm_conversation_choose_user (GdmConversation *conversation, - const char *username); +gboolean gdm_conversation_choose_user (GdmConversation *conversation, + const char *username); G_END_DECLS diff --git a/gui/simple-greeter/plugins/smartcard/gdm-smartcard-extension.c b/gui/simple-greeter/plugins/smartcard/gdm-smartcard-extension.c index d3641ba1..73e0f84f 100644 --- a/gui/simple-greeter/plugins/smartcard/gdm-smartcard-extension.c +++ b/gui/simple-greeter/plugins/smartcard/gdm-smartcard-extension.c @@ -53,6 +53,7 @@ struct _GdmSmartcardExtensionPrivate int number_of_tokens; guint answer_pending : 1; + guint select_when_ready : 1; }; static void gdm_smartcard_extension_finalize (GObject *object); @@ -102,8 +103,14 @@ on_smartcard_event (GIOChannel *io_channel, } if (extension->priv->number_of_tokens == 1) { - gdm_conversation_choose_user (GDM_CONVERSATION (extension), - PAMSERVICENAME); + if (!gdm_conversation_choose_user (GDM_CONVERSATION (extension), + PAMSERVICENAME)) { + g_debug ("could not choose smart card user, cancelling..."); + gdm_conversation_cancel (GDM_CONVERSATION (extension)); + extension->priv->select_when_ready = TRUE; + } else { + g_debug ("chose smart card user!"); + } } else if (extension->priv->number_of_tokens == 0) { gdm_conversation_cancel (GDM_CONVERSATION (extension)); } @@ -210,10 +217,16 @@ gdm_smartcard_extension_set_ready (GdmConversation *conversation) GdmSmartcardExtension *extension = GDM_SMARTCARD_EXTENSION (conversation); gdm_task_set_enabled (GDM_TASK (conversation), TRUE); - if (extension->priv->worker_pid <= 0) - { + if (extension->priv->worker_pid <= 0) { watch_for_smartcards (extension); - } + } + + if (extension->priv->select_when_ready) { + if (gdm_conversation_choose_user (GDM_CONVERSATION (extension), + PAMSERVICENAME)) { + extension->priv->select_when_ready = FALSE; + } + } } char * |