diff options
author | Ray Strode <rstrode@redhat.com> | 2009-01-16 13:01:48 -0500 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2011-06-13 20:33:47 -0400 |
commit | c48494034587fcea734a2fb69631590edd54dd15 (patch) | |
tree | c3b3a107bbc3fbeee52f846898cefe746b67782b | |
parent | 8b597446d585cde5ad5826c200d4bb8eff1a75b9 (diff) | |
download | gdm-c48494034587fcea734a2fb69631590edd54dd15.tar.gz |
daemon,greeter: Make greeter/autologin session initiate PAM conversation
Now the greeter (and also the autologin code) has to say what
PAM stack it wants the slave to run. When that stack is ready,
we emit the Ready signal as before, but now the Ready signal
carries a string argument saying which service is ready to
converse.
When we support multiple PAM stacks, the greeter will call
StartConversation for each stack, and will keep the UI
associated with each stack disabled until the Ready signals
come back one-by-one.
-rw-r--r-- | daemon/gdm-factory-slave.c | 3 | ||||
-rw-r--r-- | daemon/gdm-greeter-server.c | 52 | ||||
-rw-r--r-- | daemon/gdm-greeter-server.h | 5 | ||||
-rw-r--r-- | daemon/gdm-simple-slave.c | 39 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-client.c | 18 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-client.h | 4 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-session.c | 4 |
7 files changed, 110 insertions, 15 deletions
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c index 109271ad..9bae5503 100644 --- a/daemon/gdm-factory-slave.c +++ b/daemon/gdm-factory-slave.c @@ -186,7 +186,8 @@ on_session_conversation_started (GdmSession *session, { g_debug ("GdmFactorySlave: session conversation started"); - gdm_greeter_server_ready (slave->priv->greeter_server); + gdm_greeter_server_ready (slave->priv->greeter_server, + service_name); } static void diff --git a/daemon/gdm-greeter-server.c b/daemon/gdm-greeter-server.c index 6fc17b76..287b3daf 100644 --- a/daemon/gdm-greeter-server.c +++ b/daemon/gdm-greeter-server.c @@ -70,6 +70,7 @@ enum { }; enum { + START_CONVERSATION, BEGIN_AUTO_LOGIN, BEGIN_VERIFICATION, BEGIN_VERIFICATION_FOR_USER, @@ -253,9 +254,10 @@ gdm_greeter_server_reset (GdmGreeterServer *greeter_server) } gboolean -gdm_greeter_server_ready (GdmGreeterServer *greeter_server) +gdm_greeter_server_ready (GdmGreeterServer *greeter_server, + const char *service_name) { - send_dbus_void_signal (greeter_server, "Ready"); + send_dbus_string_signal (greeter_server, "Ready", service_name); return TRUE; } @@ -323,6 +325,34 @@ generate_address (void) } static DBusHandlerResult +handle_start_conversation (GdmGreeterServer *greeter_server, + DBusConnection *connection, + DBusMessage *message) +{ + DBusMessage *reply; + DBusError error; + const char *service_name; + + dbus_error_init (&error); + if (! dbus_message_get_args (message, &error, + DBUS_TYPE_STRING, &service_name, + DBUS_TYPE_INVALID)) { + g_warning ("ERROR: %s", error.message); + } + dbus_error_free (&error); + + g_debug ("GreeterServer: StartConversation"); + + reply = dbus_message_new_method_return (message); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + + g_signal_emit (greeter_server, signals [START_CONVERSATION], 0, service_name); + + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult handle_begin_verification (GdmGreeterServer *greeter_server, DBusConnection *connection, DBusMessage *message) @@ -618,7 +648,9 @@ greeter_handle_child_message (DBusConnection *connection, { GdmGreeterServer *greeter_server = GDM_GREETER_SERVER (user_data); - if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "BeginVerification")) { + if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "StartConversation")) { + return handle_start_conversation (greeter_server, connection, message); + } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "BeginVerification")) { return handle_begin_verification (greeter_server, connection, message); } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "BeginVerificationForUser")) { return handle_begin_verification_for_user (greeter_server, connection, message); @@ -670,6 +702,9 @@ do_introspect (DBusConnection *connection, /* interface */ xml = g_string_append (xml, " <interface name=\"org.gnome.DisplayManager.GreeterServer\">\n" + " <method name=\"StartConversation\">\n" + " <arg name=\"service_name\" direction=\"in\" type=\"s\"/>\n" + " </method>\n" " <method name=\"BeginVerification\">\n" " </method>\n" " <method name=\"BeginTimedLogin\">\n" @@ -728,6 +763,7 @@ do_introspect (DBusConnection *connection, " <arg name=\"delay\" type=\"i\"/>\n" " </signal>\n" " <signal name=\"Ready\">\n" + " <arg name=\"service-name\" type=\"s\"/>\n" " </signal>\n" " <signal name=\"Reset\">\n" " </signal>\n" @@ -1092,6 +1128,16 @@ gdm_greeter_server_class_init (GdmGreeterServerClass *klass) "group name", GDM_GROUPNAME, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + signals [START_CONVERSATION] = + g_signal_new ("start-conversation", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GdmGreeterServerClass, start_conversation), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, G_TYPE_STRING); signals [BEGIN_VERIFICATION] = g_signal_new ("begin-verification", G_OBJECT_CLASS_TYPE (object_class), diff --git a/daemon/gdm-greeter-server.h b/daemon/gdm-greeter-server.h index 78722013..d4fc9dd3 100644 --- a/daemon/gdm-greeter-server.h +++ b/daemon/gdm-greeter-server.h @@ -45,6 +45,8 @@ typedef struct { GObjectClass parent_class; + void (* start_conversation) (GdmGreeterServer *greeter_server, + const char *service_name); void (* begin_auto_login) (GdmGreeterServer *greeter_server); void (* begin_verification) (GdmGreeterServer *greeter_server); void (* begin_verification_for_user)(GdmGreeterServer *greeter_server, @@ -84,7 +86,8 @@ gboolean gdm_greeter_server_problem (GdmGreeterServer * const char *text); gboolean gdm_greeter_server_authentication_failed (GdmGreeterServer *greeter_server); gboolean gdm_greeter_server_reset (GdmGreeterServer *greeter_server); -gboolean gdm_greeter_server_ready (GdmGreeterServer *greeter_server); +gboolean gdm_greeter_server_ready (GdmGreeterServer *greeter_server, + const char *service_name); void gdm_greeter_server_selected_user_changed (GdmGreeterServer *greeter_server, const char *text); void gdm_greeter_server_default_language_name_changed (GdmGreeterServer *greeter_server, diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c index 1554507f..fafc9588 100644 --- a/daemon/gdm-simple-slave.c +++ b/daemon/gdm-simple-slave.c @@ -614,6 +614,7 @@ on_session_secret_info_query (GdmSession *session, static void on_session_conversation_started (GdmSession *session, + const char *service_name, GdmSimpleSlave *slave) { gboolean res; @@ -623,7 +624,8 @@ on_session_conversation_started (GdmSession *session, g_debug ("GdmSimpleSlave: session conversation started"); if (slave->priv->greeter_server != NULL) { - res = gdm_greeter_server_ready (slave->priv->greeter_server); + res = gdm_greeter_server_ready (slave->priv->greeter_server, + service_name); if (! res) { g_warning ("Unable to send ready"); } @@ -639,8 +641,10 @@ on_session_conversation_started (GdmSession *session, gdm_greeter_server_request_timed_login (slave->priv->greeter_server, username, delay); } else { g_debug ("GdmSimpleSlave: begin auto login for user '%s'", username); + /* service_name will be "gdm-autologin" + */ gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), - "gdm-autologin", + service_name, username); } @@ -684,6 +688,21 @@ on_default_session_name_changed (GdmSession *session, } static void +start_autologin_conversation_if_necessary (GdmSimpleSlave *slave) +{ + gboolean enabled; + gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, NULL); + + if (!enabled) { + return; + } + + g_debug ("GdmSimpleSlave: Starting automatic login conversation"); + gdm_session_start_conversation (GDM_SESSION (slave->priv->session), + "gdm-autologin"); +} + +static void create_new_session (GdmSimpleSlave *slave) { gboolean display_is_local; @@ -819,6 +838,8 @@ create_new_session (GdmSimpleSlave *slave) "default-session-name-changed", G_CALLBACK (on_default_session_name_changed), slave); + + start_autologin_conversation_if_necessary (slave); } static void @@ -944,6 +965,16 @@ on_greeter_session_died (GdmGreeterSession *greeter, } static void +on_greeter_start_conversation (GdmGreeterServer *greeter_server, + const char *service_name, + GdmSimpleSlave *slave) +{ + g_debug ("GdmSimpleSlave: starting conversation with '%s' pam service'", service_name); + gdm_session_start_conversation (GDM_SESSION (slave->priv->session), + service_name); +} + +static void on_greeter_begin_verification (GdmGreeterServer *greeter_server, GdmSimpleSlave *slave) { @@ -1157,6 +1188,10 @@ start_greeter (GdmSimpleSlave *slave) slave->priv->greeter_server = gdm_greeter_server_new (display_id); g_signal_connect (slave->priv->greeter_server, + "start-conversation", + G_CALLBACK (on_greeter_start_conversation), + slave); + g_signal_connect (slave->priv->greeter_server, "begin-auto-login", G_CALLBACK (on_greeter_begin_auto_login), slave); diff --git a/gui/simple-greeter/gdm-greeter-client.c b/gui/simple-greeter/gdm-greeter-client.c index 853d054a..5fed6f9b 100644 --- a/gui/simple-greeter/gdm-greeter-client.c +++ b/gui/simple-greeter/gdm-greeter-client.c @@ -230,11 +230,7 @@ static void on_ready (GdmGreeterClient *client, DBusMessage *message) { - g_debug ("GdmGreeterClient: Ready"); - - g_signal_emit (client, - gdm_greeter_client_signals[READY], - 0); + emit_string_signal_for_message (client, "Ready", message, READY); } static void @@ -404,6 +400,14 @@ send_dbus_void_method (DBusConnection *connection, } void +gdm_greeter_client_call_start_conversation (GdmGreeterClient *client, + const char *service_name) +{ + send_dbus_string_method (client->priv->connection, + "StartConversation", service_name); +} + +void gdm_greeter_client_call_begin_auto_login (GdmGreeterClient *client, const char *username) { @@ -866,9 +870,9 @@ gdm_greeter_client_class_init (GdmGreeterClientClass *klass) G_STRUCT_OFFSET (GdmGreeterClientClass, ready), NULL, NULL, - g_cclosure_marshal_VOID__VOID, + g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, - 0); + 1, G_TYPE_STRING); gdm_greeter_client_signals[RESET] = g_signal_new ("reset", diff --git a/gui/simple-greeter/gdm-greeter-client.h b/gui/simple-greeter/gdm-greeter-client.h index 9e093cfc..8982214a 100644 --- a/gui/simple-greeter/gdm-greeter-client.h +++ b/gui/simple-greeter/gdm-greeter-client.h @@ -83,13 +83,15 @@ GQuark gdm_greeter_client_error_quark (void); GdmGreeterClient * gdm_greeter_client_new (void); gboolean gdm_greeter_client_start (GdmGreeterClient *client, - GError **error); + GError **error); void gdm_greeter_client_stop (GdmGreeterClient *client); gboolean gdm_greeter_client_get_display_is_local (GdmGreeterClient *client); char * gdm_greeter_client_call_get_display_id (GdmGreeterClient *client); +void gdm_greeter_client_call_start_conversation (GdmGreeterClient *client, + const char *service_name); void gdm_greeter_client_call_begin_auto_login (GdmGreeterClient *client, const char *username); void gdm_greeter_client_call_begin_verification (GdmGreeterClient *client); diff --git a/gui/simple-greeter/gdm-greeter-session.c b/gui/simple-greeter/gdm-greeter-session.c index bf2dd2e6..94473446 100644 --- a/gui/simple-greeter/gdm-greeter-session.c +++ b/gui/simple-greeter/gdm-greeter-session.c @@ -89,6 +89,7 @@ on_problem (GdmGreeterClient *client, static void on_ready (GdmGreeterClient *client, + const char *service_name, GdmGreeterSession *session) { g_debug ("GdmGreeterSession: Ready"); @@ -262,6 +263,7 @@ on_cancelled (GdmGreeterLoginWindow *login_window, GdmGreeterSession *session) { gdm_greeter_client_call_cancel (session->priv->client); + gdm_greeter_client_call_start_conversation (session->priv->client, "gdm"); } static void @@ -415,6 +417,8 @@ gdm_greeter_session_start (GdmGreeterSession *session, toggle_panel (session, TRUE); toggle_login_window (session, TRUE); + gdm_greeter_client_call_start_conversation (session->priv->client, "gdm"); + gdm_profile_end (NULL); return res; |