[gdm/multi-stack: 7/35] Make greeter explicitly request PAM conversation
- From: Ray Strode <halfline src gnome org>
- To: svn-commits-list gnome org
- Subject: [gdm/multi-stack: 7/35] Make greeter explicitly request PAM conversation
- Date: Mon, 20 Jul 2009 14:04:26 +0000 (UTC)
commit bae5bb00c77b693ab31d58aba416ec4a103f8501
Author: Ray Strode <rstrode redhat com>
Date: Fri Jan 16 13:01:48 2009 -0500
Make greeter explicitly request PAM conversation
Now the greeter 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.
daemon/gdm-factory-slave.c | 3 +-
daemon/gdm-greeter-server.c | 53 ++++++++++++++++++++++++++++--
daemon/gdm-greeter-server.h | 5 ++-
daemon/gdm-simple-slave.c | 32 ++++++++++++++----
gui/simple-greeter/gdm-greeter-client.c | 18 ++++++----
gui/simple-greeter/gdm-greeter-client.h | 4 ++-
gui/simple-greeter/gdm-greeter-session.c | 4 ++
7 files changed, 99 insertions(+), 20 deletions(-)
---
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
index 6497293..d1bb5dd 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 cecce83..ffca7ec 100644
--- a/daemon/gdm-greeter-server.c
+++ b/daemon/gdm-greeter-server.c
@@ -69,6 +69,7 @@ enum {
};
enum {
+ START_CONVERSATION,
BEGIN_AUTO_LOGIN,
BEGIN_VERIFICATION,
BEGIN_VERIFICATION_FOR_USER,
@@ -246,9 +247,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)
@@ -645,7 +675,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);
@@ -699,7 +731,11 @@ 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"
" </method>\n"
" <method name=\"BeginVerificationForUser\">\n"
@@ -759,6 +795,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"
@@ -1121,6 +1158,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 6e92100..7333db1 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,
@@ -85,7 +87,8 @@ gboolean gdm_greeter_server_info (GdmGreeterServer *
gboolean gdm_greeter_server_problem (GdmGreeterServer *greeter_server,
const char *text);
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 12e514e..8863fd4 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -484,17 +484,19 @@ on_session_secret_info_query (GdmSession *session,
}
static void
-on_session_opened (GdmSession *session,
- GdmSimpleSlave *slave)
+on_session_conversation_started (GdmSession *session,
+ const char *service_name,
+ GdmSimpleSlave *slave)
{
gboolean res;
gboolean enabled;
char *username;
int delay;
- g_debug ("GdmSimpleSlave: session opened");
+ g_debug ("GdmSimpleSlave: 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");
}
@@ -510,8 +512,10 @@ on_session_opened (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);
}
@@ -603,8 +607,8 @@ create_new_session (GdmSimpleSlave *slave)
g_free (display_hostname);
g_signal_connect (slave->priv->session,
- "opened",
- G_CALLBACK (on_session_opened),
+ "conversation-started",
+ G_CALLBACK (on_session_conversation_started),
slave);
g_signal_connect (slave->priv->session,
"setup-complete",
@@ -735,6 +739,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)
{
@@ -909,6 +923,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 461b85c..1e2c55d 100644
--- a/gui/simple-greeter/gdm-greeter-client.c
+++ b/gui/simple-greeter/gdm-greeter-client.c
@@ -237,11 +237,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
@@ -400,6 +396,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)
{
@@ -879,9 +883,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 08deabd..88b0281 100644
--- a/gui/simple-greeter/gdm-greeter-client.h
+++ b/gui/simple-greeter/gdm-greeter-client.h
@@ -84,13 +84,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 fe2de48..ec99c12 100644
--- a/gui/simple-greeter/gdm-greeter-session.c
+++ b/gui/simple-greeter/gdm-greeter-session.c
@@ -85,6 +85,7 @@ on_problem (GdmGreeterClient *client,
static void
on_ready (GdmGreeterClient *client,
+ const char *service_name,
GdmGreeterSession *session)
{
g_debug ("GdmGreeterSession: Ready");
@@ -264,6 +265,7 @@ on_cancelled (GdmGreeterLoginWindow *login_window,
{
gdm_greeter_panel_hide_user_options (GDM_GREETER_PANEL (session->priv->panel));
gdm_greeter_client_call_cancel (session->priv->client);
+ gdm_greeter_client_call_start_conversation (session->priv->client, "gdm");
}
static void
@@ -426,6 +428,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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]