summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2009-01-16 11:00:08 -0500
committerRay Strode <rstrode@redhat.com>2011-06-13 20:33:47 -0400
commit55a9a413093dbd63082752761b1776626323cab3 (patch)
treedcce8e003b8d29d7dc1082c890194e5baff2bf6f
parentdc94d6663666189a41d072dc165a557b36ca01d5 (diff)
downloadgdm-55a9a413093dbd63082752761b1776626323cab3.tar.gz
daemon: Make current pam conversation explicit throughout code
We want to eventually support having multiple simultaneous PAM conversations in one login screen (so, e.g., username/password, smart card, and fingerprint all work at the same time). This commit refactors the session code to be in terms of a conversation object. With this change, it should be easier later to have multiple conversation objects. The conversation is named by the pam service the login screen is talking to.
-rw-r--r--daemon/gdm-factory-slave.c5
-rw-r--r--daemon/gdm-product-slave.c29
-rw-r--r--daemon/gdm-session-direct.c314
-rw-r--r--daemon/gdm-session-private.h3
-rw-r--r--daemon/gdm-session-relay.c15
-rw-r--r--daemon/gdm-session-worker-job.c7
-rw-r--r--daemon/gdm-session-worker-job.h2
-rw-r--r--daemon/gdm-session.c12
-rw-r--r--daemon/gdm-session.h9
-rw-r--r--daemon/gdm-simple-slave.c3
-rw-r--r--daemon/test-session.c5
11 files changed, 260 insertions, 144 deletions
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
index 57279864..109271ad 100644
--- a/daemon/gdm-factory-slave.c
+++ b/daemon/gdm-factory-slave.c
@@ -181,7 +181,8 @@ on_session_secret_info_query (GdmSession *session,
static void
on_session_conversation_started (GdmSession *session,
- GdmFactorySlave *slave)
+ GdmFactorySlave *slave,
+ const char *service_name)
{
g_debug ("GdmFactorySlave: session conversation started");
@@ -389,7 +390,7 @@ on_session_relay_connected (GdmSessionRelay *session,
{
g_debug ("GdmFactorySlave: Relay Connected");
- gdm_session_start_conversation (GDM_SESSION (slave->priv->session));
+ gdm_session_start_conversation (GDM_SESSION (slave->priv->session), "gdm");
}
static void
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index 2d1109ea..84d5c49c 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -246,19 +246,21 @@ relay_session_started (GdmProductSlave *slave,
}
static void
-relay_session_conversation_started (GdmProductSlave *slave)
+relay_session_conversation_started (GdmProductSlave *slave,
+ const char *service_name)
{
- send_dbus_void_method (slave->priv->session_relay_connection,
- "ConversationStarted");
+ send_dbus_string_method (slave->priv->session_relay_connection,
+ "ConversationStarted", service_name);
}
static void
on_session_conversation_started (GdmSession *session,
+ const char *service_name,
GdmProductSlave *slave)
{
g_debug ("GdmProductSlave: session conversation started");
- relay_session_conversation_started (slave);
+ relay_session_conversation_started (slave, service_name);
}
static void
@@ -783,7 +785,24 @@ static void
on_relay_start_conversation (GdmProductSlave *slave,
DBusMessage *message)
{
- gdm_session_start_conversation (GDM_SESSION (slave->priv->session));
+ DBusError error;
+ char *service_name;
+ dbus_bool_t res;
+
+ dbus_error_init (&error);
+ res = dbus_message_get_args (message,
+ &error,
+ DBUS_TYPE_STRING, &service_name,
+ DBUS_TYPE_INVALID);
+ if (res) {
+ g_debug ("GdmProductSlave: Started conversation with %s service", service_name);
+ gdm_session_start_conversation (GDM_SESSION (slave->priv->session),
+ service_name);
+ } else {
+ g_warning ("Unable to get arguments: %s", error.message);
+ }
+
+ dbus_error_free (&error);
}
static void
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index c8361b4c..39ff8155 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -67,6 +67,16 @@
#define GDM_SESSION_DEFAULT_PATH "/usr/local/bin:/usr/bin:/bin"
#endif
+typedef struct
+{
+ GdmSessionDirect *session;
+ GdmSessionWorkerJob *job;
+ GPid worker_pid;
+ char *service_name;
+ DBusConnection *worker_connection;
+ DBusMessage *message_pending_reply;
+} GdmSessionConversation;
+
struct _GdmSessionDirectPrivate
{
/* per open scope */
@@ -77,8 +87,7 @@ struct _GdmSessionDirectPrivate
char *selected_user;
char *user_x11_authority_file;
- DBusMessage *message_pending_reply;
- DBusConnection *worker_connection;
+ GdmSessionConversation *conversation;
GdmSessionWorkerJob *job;
GPid session_pid;
@@ -121,39 +130,39 @@ G_DEFINE_TYPE_WITH_CODE (GdmSessionDirect,
gdm_session_iface_init))
static gboolean
-send_dbus_message (DBusConnection *connection,
- DBusMessage *message)
+send_dbus_message (GdmSessionConversation *conversation,
+ DBusMessage *message)
{
gboolean is_connected;
gboolean sent;
g_return_val_if_fail (message != NULL, FALSE);
- if (connection == NULL) {
+ if (conversation->worker_connection == NULL) {
g_warning ("There is no valid connection");
return FALSE;
}
- is_connected = dbus_connection_get_is_connected (connection);
+ is_connected = dbus_connection_get_is_connected (conversation->worker_connection);
if (! is_connected) {
g_warning ("Not connected!");
return FALSE;
}
- sent = dbus_connection_send (connection, message, NULL);
+ sent = dbus_connection_send (conversation->worker_connection, message, NULL);
return sent;
}
static void
-send_dbus_string_signal (GdmSessionDirect *session,
+send_dbus_string_signal (GdmSessionConversation *conversation,
const char *name,
const char *text)
{
DBusMessage *message;
DBusMessageIter iter;
- g_return_if_fail (session != NULL);
+ g_return_if_fail (conversation != NULL);
message = dbus_message_new_signal (GDM_SESSION_DBUS_PATH,
GDM_SESSION_DBUS_INTERFACE,
@@ -162,7 +171,7 @@ send_dbus_string_signal (GdmSessionDirect *session,
dbus_message_iter_init_append (message, &iter);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &text);
- if (! send_dbus_message (session->priv->worker_connection, message)) {
+ if (! send_dbus_message (conversation, message)) {
g_debug ("GdmSessionDirect: Could not send %s signal",
name ? name : "(null)");
}
@@ -171,18 +180,18 @@ send_dbus_string_signal (GdmSessionDirect *session,
}
static void
-send_dbus_void_signal (GdmSessionDirect *session,
- const char *name)
+send_dbus_void_signal (GdmSessionConversation *conversation,
+ const char *name)
{
DBusMessage *message;
- g_return_if_fail (session != NULL);
+ g_return_if_fail (conversation != NULL);
message = dbus_message_new_signal (GDM_SESSION_DBUS_PATH,
GDM_SESSION_DBUS_INTERFACE,
name);
- if (! send_dbus_message (session->priv->worker_connection, message)) {
+ if (! send_dbus_message (conversation, message)) {
g_debug ("GdmSessionDirect: Could not send %s signal", name);
}
@@ -194,22 +203,32 @@ on_authentication_failed (GdmSession *session,
const char *message)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
- gdm_session_record_failed (impl->priv->session_pid,
- impl->priv->selected_user,
- impl->priv->display_hostname,
- impl->priv->display_name,
- impl->priv->display_device);
+ GdmSessionConversation *conversation;
+
+ conversation = impl->priv->conversation;
+ if (conversation != NULL) {
+ gdm_session_record_failed (conversation->worker_pid,
+ impl->priv->selected_user,
+ impl->priv->display_hostname,
+ impl->priv->display_name,
+ impl->priv->display_device);
+ }
}
static void
on_session_started (GdmSession *session)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
- gdm_session_record_login (impl->priv->session_pid,
- impl->priv->selected_user,
- impl->priv->display_hostname,
- impl->priv->display_name,
- impl->priv->display_device);
+ GdmSessionConversation *conversation;
+
+ conversation = impl->priv->conversation;
+ if (conversation != NULL) {
+ gdm_session_record_login (conversation->worker_pid,
+ impl->priv->selected_user,
+ impl->priv->display_hostname,
+ impl->priv->display_name,
+ impl->priv->display_device);
+ }
}
static void
@@ -217,11 +236,16 @@ on_session_start_failed (GdmSession *session,
const char *message)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
- gdm_session_record_login (impl->priv->session_pid,
- impl->priv->selected_user,
- impl->priv->display_hostname,
- impl->priv->display_name,
- impl->priv->display_device);
+ GdmSessionConversation *conversation;
+
+ conversation = impl->priv->conversation;
+ if (conversation != NULL) {
+ gdm_session_record_login (conversation->worker_pid,
+ impl->priv->selected_user,
+ impl->priv->display_hostname,
+ impl->priv->display_name,
+ impl->priv->display_device);
+ }
}
static void
@@ -229,6 +253,7 @@ on_session_exited (GdmSession *session,
int exit_code)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+
gdm_session_record_logout (impl->priv->session_pid,
impl->priv->selected_user,
impl->priv->display_hostname,
@@ -765,54 +790,52 @@ gdm_session_direct_handle_username_changed (GdmSessionDirect *session,
}
static void
-cancel_pending_query (GdmSessionDirect *session)
+cancel_pending_query (GdmSessionConversation *conversation)
{
DBusMessage *reply;
- if (session->priv->message_pending_reply == NULL) {
+ if (conversation->message_pending_reply == NULL) {
return;
}
g_debug ("GdmSessionDirect: Cancelling pending query");
- reply = dbus_message_new_error (session->priv->message_pending_reply,
+ reply = dbus_message_new_error (conversation->message_pending_reply,
GDM_SESSION_DBUS_ERROR_CANCEL,
"Operation cancelled");
- dbus_connection_send (session->priv->worker_connection, reply, NULL);
- dbus_connection_flush (session->priv->worker_connection);
+ dbus_connection_send (conversation->worker_connection, reply, NULL);
+ dbus_connection_flush (conversation->worker_connection);
dbus_message_unref (reply);
- dbus_message_unref (session->priv->message_pending_reply);
- session->priv->message_pending_reply = NULL;
+ dbus_message_unref (conversation->message_pending_reply);
+ conversation->message_pending_reply = NULL;
}
static void
-answer_pending_query (GdmSessionDirect *session,
- const char *answer)
+answer_pending_query (GdmSessionConversation *conversation,
+ const char *answer)
{
DBusMessage *reply;
DBusMessageIter iter;
- g_assert (session->priv->message_pending_reply != NULL);
-
- reply = dbus_message_new_method_return (session->priv->message_pending_reply);
+ reply = dbus_message_new_method_return (conversation->message_pending_reply);
dbus_message_iter_init_append (reply, &iter);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &answer);
- dbus_connection_send (session->priv->worker_connection, reply, NULL);
+ dbus_connection_send (conversation->worker_connection, reply, NULL);
dbus_message_unref (reply);
- dbus_message_unref (session->priv->message_pending_reply);
- session->priv->message_pending_reply = NULL;
+ dbus_message_unref (conversation->message_pending_reply);
+ conversation->message_pending_reply = NULL;
}
static void
-set_pending_query (GdmSessionDirect *session,
- DBusMessage *message)
+set_pending_query (GdmSessionConversation *conversation,
+ DBusMessage *message)
{
- g_assert (session->priv->message_pending_reply == NULL);
+ g_assert (conversation->message_pending_reply == NULL);
- session->priv->message_pending_reply = dbus_message_ref (message);
+ conversation->message_pending_reply = dbus_message_ref (message);
}
static DBusHandlerResult
@@ -822,6 +845,9 @@ gdm_session_direct_handle_info_query (GdmSessionDirect *session,
{
DBusError error;
const char *text;
+ GdmSessionConversation *conversation;
+
+ conversation = session->priv->conversation;
dbus_error_init (&error);
if (! dbus_message_get_args (message, &error,
@@ -830,7 +856,7 @@ gdm_session_direct_handle_info_query (GdmSessionDirect *session,
g_warning ("ERROR: %s", error.message);
}
- set_pending_query (session, message);
+ set_pending_query (conversation, message);
g_debug ("GdmSessionDirect: Emitting 'info-query' signal");
_gdm_session_info_query (GDM_SESSION (session), text);
@@ -845,6 +871,9 @@ gdm_session_direct_handle_secret_info_query (GdmSessionDirect *session,
{
DBusError error;
const char *text;
+ GdmSessionConversation *conversation;
+
+ conversation = session->priv->conversation;
dbus_error_init (&error);
if (! dbus_message_get_args (message, &error,
@@ -853,7 +882,7 @@ gdm_session_direct_handle_secret_info_query (GdmSessionDirect *session,
g_warning ("ERROR: %s", error.message);
}
- set_pending_query (session, message);
+ set_pending_query (conversation, message);
g_debug ("GdmSessionDirect: Emitting 'secret-info-query' signal");
_gdm_session_secret_info_query (GDM_SESSION (session), text);
@@ -893,9 +922,13 @@ gdm_session_direct_handle_cancel_pending_query (GdmSessionDirect *session,
DBusMessage *message)
{
DBusMessage *reply;
+ GdmSessionConversation *conversation;
g_debug ("GdmSessionDirect: worker cancelling pending query");
- cancel_pending_query (session);
+
+ conversation = session->priv->conversation;
+
+ cancel_pending_query (conversation);
reply = dbus_message_new_method_return (message);
dbus_connection_send (connection, reply, NULL);
@@ -1482,16 +1515,18 @@ handle_connection (DBusServer *server,
void *user_data)
{
GdmSessionDirect *session = GDM_SESSION_DIRECT (user_data);
+ GdmSessionConversation *conversation;
g_debug ("GdmSessionDirect: Handing new connection");
- if (session->priv->worker_connection == NULL) {
+ conversation = session->priv->conversation;
+ if (conversation->worker_connection == NULL) {
DBusObjectPathVTable vtable = { &session_unregister_handler,
&session_message_handler,
NULL, NULL, NULL, NULL
};
- session->priv->worker_connection = new_connection;
+ conversation->worker_connection = new_connection;
dbus_connection_ref (new_connection);
dbus_connection_setup_with_g_main (new_connection, NULL);
@@ -1509,7 +1544,8 @@ handle_connection (DBusServer *server,
session);
g_debug ("GdmSessionDirect: Emitting conversation-started signal");
- _gdm_session_conversation_started (GDM_SESSION (session));
+ _gdm_session_conversation_started (GDM_SESSION (session),
+ conversation->service_name);
}
}
@@ -1579,8 +1615,6 @@ gdm_session_direct_init (GdmSessionDirect *session)
G_CALLBACK (on_session_exited),
NULL);
- session->priv->session_pid = -1;
-
session->priv->environment = g_hash_table_new_full (g_str_hash,
g_str_equal,
(GDestroyNotify) g_free,
@@ -1592,7 +1626,7 @@ gdm_session_direct_init (GdmSessionDirect *session)
static void
worker_started (GdmSessionWorkerJob *job,
- GdmSessionDirect *session)
+ GdmSessionConversation *conversation)
{
g_debug ("GdmSessionDirect: Worker job started");
}
@@ -1600,87 +1634,105 @@ worker_started (GdmSessionWorkerJob *job,
static void
worker_exited (GdmSessionWorkerJob *job,
int code,
- GdmSessionDirect *session)
+ GdmSessionConversation *conversation)
{
g_debug ("GdmSessionDirect: Worker job exited: %d", code);
- if (session->priv->is_running) {
- _gdm_session_session_exited (GDM_SESSION (session), code);
+ if (conversation->session->priv->is_running) {
+ _gdm_session_session_exited (GDM_SESSION (conversation->session), code);
}
}
static void
worker_died (GdmSessionWorkerJob *job,
int signum,
- GdmSessionDirect *session)
+ GdmSessionConversation *conversation)
{
g_debug ("GdmSessionDirect: Worker job died: %d", signum);
- if (session->priv->is_running) {
- _gdm_session_session_died (GDM_SESSION (session), signum);
+ if (conversation->session->priv->is_running) {
+ _gdm_session_session_died (GDM_SESSION (conversation->session), signum);
}
}
-static gboolean
-start_worker (GdmSessionDirect *session)
+static GdmSessionConversation *
+start_conversation (GdmSessionDirect *session,
+ const char *service_name)
{
- gboolean res;
+ GdmSessionConversation *conversation;
- session->priv->job = gdm_session_worker_job_new ();
- gdm_session_worker_job_set_server_address (session->priv->job, session->priv->server_address);
- g_signal_connect (session->priv->job,
+ conversation = g_new0 (GdmSessionConversation, 1);
+ conversation->session = session;
+ conversation->service_name = g_strdup (service_name);
+ conversation->worker_pid = -1;
+ conversation->job = gdm_session_worker_job_new ();
+ gdm_session_worker_job_set_server_address (conversation->job, session->priv->server_address);
+ g_signal_connect (conversation->job,
"started",
G_CALLBACK (worker_started),
- session);
- g_signal_connect (session->priv->job,
+ conversation);
+ g_signal_connect (conversation->job,
"exited",
G_CALLBACK (worker_exited),
- session);
- g_signal_connect (session->priv->job,
+ conversation);
+ g_signal_connect (conversation->job,
"died",
G_CALLBACK (worker_died),
- session);
+ conversation);
- res = gdm_session_worker_job_start (session->priv->job);
+ if (!gdm_session_worker_job_start (conversation->job)) {
+ g_object_unref (conversation->job);
+ g_free (conversation->service_name);
+ g_free (conversation);
+ return NULL;
+ }
- return res;
+ conversation->worker_pid = gdm_session_worker_job_get_pid (conversation->job);
+
+ return conversation;
}
static void
-stop_worker (GdmSessionDirect *session)
+stop_conversation (GdmSessionConversation *conversation)
{
- g_signal_handlers_disconnect_by_func (session->priv->job,
+ GdmSessionDirect *session;
+
+ session = conversation->session;
+
+ g_signal_handlers_disconnect_by_func (conversation->job,
G_CALLBACK (worker_started),
- session);
- g_signal_handlers_disconnect_by_func (session->priv->job,
+ conversation);
+ g_signal_handlers_disconnect_by_func (conversation->job,
G_CALLBACK (worker_exited),
- session);
- g_signal_handlers_disconnect_by_func (session->priv->job,
+ conversation);
+ g_signal_handlers_disconnect_by_func (conversation->job,
G_CALLBACK (worker_died),
- session);
+ conversation);
- cancel_pending_query (session);
+ cancel_pending_query (conversation);
- if (session->priv->worker_connection != NULL) {
- dbus_connection_close (session->priv->worker_connection);
- session->priv->worker_connection = NULL;
+ if (conversation->worker_connection != NULL) {
+ dbus_connection_close (conversation->worker_connection);
+ conversation->worker_connection = NULL;
}
- gdm_session_worker_job_stop (session->priv->job);
- g_object_unref (session->priv->job);
- session->priv->job = NULL;
+ gdm_session_worker_job_stop (conversation->job);
+ g_object_unref (conversation->job);
+ g_free (conversation->service_name);
+ g_free (conversation);
}
static void
-gdm_session_direct_start_conversation (GdmSession *session)
+gdm_session_direct_start_conversation (GdmSession *session,
+ const char *service_name)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
g_return_if_fail (session != NULL);
- g_debug ("GdmSessionDirect: Starting conversation");
+ g_debug ("GdmSessionDirect: starting conversation");
- start_worker (impl);
+ impl->priv->conversation = start_conversation (impl, service_name);
}
static void
@@ -1693,6 +1745,7 @@ send_setup (GdmSessionDirect *session,
const char *display_device;
const char *display_hostname;
const char *display_x11_authority_file;
+ GdmSessionConversation *conversation;
g_assert (service_name != NULL);
@@ -1730,7 +1783,8 @@ send_setup (GdmSessionDirect *session,
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file);
- if (! send_dbus_message (session->priv->worker_connection, message)) {
+ conversation = session->priv->conversation;
+ if (! send_dbus_message (conversation, message)) {
g_debug ("GdmSessionDirect: Could not send %s signal", "Setup");
}
@@ -1748,6 +1802,7 @@ send_setup_for_user (GdmSessionDirect *session,
const char *display_hostname;
const char *display_x11_authority_file;
const char *selected_user;
+ GdmSessionConversation *conversation;
g_assert (service_name != NULL);
@@ -1791,7 +1846,8 @@ send_setup_for_user (GdmSessionDirect *session,
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &selected_user);
- if (! send_dbus_message (session->priv->worker_connection, message)) {
+ conversation = session->priv->conversation;
+ if (! send_dbus_message (conversation, message)) {
g_debug ("GdmSessionDirect: Could not send %s signal", "SetupForUser");
}
@@ -1805,7 +1861,8 @@ gdm_session_direct_setup (GdmSession *session,
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
g_return_if_fail (session != NULL);
- g_return_if_fail (dbus_connection_get_is_connected (impl->priv->worker_connection));
+ g_return_if_fail (impl->priv->conversation != NULL);
+ g_return_if_fail (dbus_connection_get_is_connected (impl->priv->conversation->worker_connection));
send_setup (impl, service_name);
gdm_session_direct_defaults_changed (impl);
@@ -1819,7 +1876,8 @@ gdm_session_direct_setup_for_user (GdmSession *session,
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
g_return_if_fail (session != NULL);
- g_return_if_fail (dbus_connection_get_is_connected (impl->priv->worker_connection));
+ g_return_if_fail (impl->priv->conversation != NULL);
+ g_return_if_fail (dbus_connection_get_is_connected (impl->priv->conversation->worker_connection));
g_return_if_fail (username != NULL);
gdm_session_direct_select_user (session, username);
@@ -1832,22 +1890,28 @@ static void
gdm_session_direct_authenticate (GdmSession *session)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ GdmSessionConversation *conversation;
g_return_if_fail (session != NULL);
- g_return_if_fail (dbus_connection_get_is_connected (impl->priv->worker_connection));
+ g_return_if_fail (impl->priv->conversation != NULL);
+ g_return_if_fail (dbus_connection_get_is_connected (impl->priv->conversation->worker_connection));
- send_dbus_void_signal (impl, "Authenticate");
+ conversation = impl->priv->conversation;
+ send_dbus_void_signal (conversation, "Authenticate");
}
static void
gdm_session_direct_authorize (GdmSession *session)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ GdmSessionConversation *conversation;
g_return_if_fail (session != NULL);
- g_return_if_fail (dbus_connection_get_is_connected (impl->priv->worker_connection));
+ g_return_if_fail (impl->priv->conversation != NULL);
+ g_return_if_fail (dbus_connection_get_is_connected (impl->priv->conversation->worker_connection));
- send_dbus_void_signal (impl, "Authorize");
+ conversation = impl->priv->conversation;
+ send_dbus_void_signal (conversation, "Authorize");
}
static void
@@ -1855,16 +1919,19 @@ gdm_session_direct_accredit (GdmSession *session,
int cred_flag)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ GdmSessionConversation *conversation;
g_return_if_fail (session != NULL);
- g_return_if_fail (dbus_connection_get_is_connected (impl->priv->worker_connection));
+ g_return_if_fail (impl->priv->conversation != NULL);
+ g_return_if_fail (dbus_connection_get_is_connected (impl->priv->conversation->worker_connection));
+ conversation = impl->priv->conversation;
switch (cred_flag) {
case GDM_SESSION_CRED_ESTABLISH:
- send_dbus_void_signal (impl, "EstablishCredentials");
+ send_dbus_void_signal (conversation, "EstablishCredentials");
break;
case GDM_SESSION_CRED_REFRESH:
- send_dbus_void_signal (impl, "RefreshCredentials");
+ send_dbus_void_signal (conversation, "RefreshCredentials");
break;
default:
g_assert_not_reached ();
@@ -1878,6 +1945,7 @@ send_environment_variable (const char *key,
{
DBusMessage *message;
DBusMessageIter iter;
+ GdmSessionConversation *conversation;
message = dbus_message_new_signal (GDM_SESSION_DBUS_PATH,
GDM_SESSION_DBUS_INTERFACE,
@@ -1887,7 +1955,8 @@ send_environment_variable (const char *key,
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &key);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &value);
- if (! send_dbus_message (session->priv->worker_connection, message)) {
+ conversation = session->priv->conversation;
+ if (! send_dbus_message (conversation, message)) {
g_debug ("GdmSessionDirect: Could not send %s signal", "SetEnvironmentVariable");
}
@@ -2018,6 +2087,7 @@ static void
gdm_session_direct_start_session (GdmSession *session)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ GdmSessionConversation *conversation;
char *command;
char *program;
@@ -2037,7 +2107,8 @@ gdm_session_direct_start_session (GdmSession *session)
setup_session_environment (impl);
send_environment (impl);
- send_dbus_string_signal (impl, "StartProgram", program);
+ conversation = impl->priv->conversation;
+ send_dbus_string_signal (conversation, "StartProgram", program);
g_free (program);
}
@@ -2050,16 +2121,12 @@ gdm_session_direct_close (GdmSession *session)
g_debug ("GdmSessionDirect: Closing session");
- if (impl->priv->job != NULL) {
- if (impl->priv->is_running) {
- gdm_session_record_logout (impl->priv->session_pid,
- impl->priv->selected_user,
- impl->priv->display_hostname,
- impl->priv->display_name,
- impl->priv->display_device);
- }
-
- stop_worker (impl);
+ if (impl->priv->is_running) {
+ gdm_session_record_logout (impl->priv->session_pid,
+ impl->priv->selected_user,
+ impl->priv->display_hostname,
+ impl->priv->display_name,
+ impl->priv->display_device);
}
g_free (impl->priv->selected_user);
@@ -2091,10 +2158,13 @@ gdm_session_direct_answer_query (GdmSession *session,
const char *text)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ GdmSessionConversation *conversation;
g_return_if_fail (session != NULL);
- answer_pending_query (impl, text);
+ conversation = impl->priv->conversation;
+
+ answer_pending_query (conversation, text);
}
static void
@@ -2104,7 +2174,7 @@ gdm_session_direct_cancel (GdmSession *session)
g_return_if_fail (session != NULL);
- cancel_pending_query (impl);
+ cancel_pending_query (impl->priv->conversation);
}
char *
@@ -2176,6 +2246,7 @@ gdm_session_direct_select_session (GdmSession *session,
const char *text)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ GdmSessionConversation *conversation;
g_free (impl->priv->selected_session);
@@ -2185,7 +2256,8 @@ gdm_session_direct_select_session (GdmSession *session,
impl->priv->selected_session = g_strdup (text);
}
- send_dbus_string_signal (impl, "SetSessionName",
+ conversation = impl->priv->conversation;
+ send_dbus_string_signal (conversation, "SetSessionName",
get_session_name (impl));
}
@@ -2194,6 +2266,7 @@ gdm_session_direct_select_language (GdmSession *session,
const char *text)
{
GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ GdmSessionConversation *conversation;
g_free (impl->priv->selected_language);
@@ -2203,7 +2276,8 @@ gdm_session_direct_select_language (GdmSession *session,
impl->priv->selected_language = g_strdup (text);
}
- send_dbus_string_signal (impl, "SetLanguageName",
+ conversation = impl->priv->conversation;
+ send_dbus_string_signal (conversation, "SetLanguageName",
get_language_name (impl));
}
diff --git a/daemon/gdm-session-private.h b/daemon/gdm-session-private.h
index 88ac23c3..34adff51 100644
--- a/daemon/gdm-session-private.h
+++ b/daemon/gdm-session-private.h
@@ -27,7 +27,8 @@
G_BEGIN_DECLS
/* state changes */
-void _gdm_session_conversation_started (GdmSession *session);
+void _gdm_session_conversation_started (GdmSession *session,
+ const char *service_name);
void _gdm_session_setup_complete (GdmSession *session);
void _gdm_session_setup_failed (GdmSession *session,
const char *message);
diff --git a/daemon/gdm-session-relay.c b/daemon/gdm-session-relay.c
index 1ab4b056..d559c711 100644
--- a/daemon/gdm-session-relay.c
+++ b/daemon/gdm-session-relay.c
@@ -180,10 +180,11 @@ send_dbus_void_signal (GdmSessionRelay *session_relay,
}
static void
-gdm_session_relay_start_conversation (GdmSession *session)
+gdm_session_relay_start_conversation (GdmSession *session,
+ const char *service_name)
{
GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
- send_dbus_void_signal (impl, "StartConversation");
+ send_dbus_string_signal (impl, "StartConversation", service_name);
}
static void
@@ -720,8 +721,14 @@ handle_conversation_started (GdmSessionRelay *session_relay,
{
DBusMessage *reply;
DBusError error;
+ 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);
+ }
g_debug ("GdmSessionRelay: Conversation Started");
@@ -729,7 +736,7 @@ handle_conversation_started (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- _gdm_session_conversation_started (GDM_SESSION (session_relay));
+ _gdm_session_conversation_started (GDM_SESSION (session_relay), service_name);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -804,6 +811,7 @@ do_introspect (DBusConnection *connection,
xml = g_string_append (xml,
" <interface name=\"org.gnome.DisplayManager.SessionRelay\">\n"
" <method name=\"ConversationStarted\">\n"
+ " <arg name=\"service_name\" direction=\"in\" type=\"s\"/>\n"
" </method>\n"
" <method name=\"SetupComplete\">\n"
" </method>\n"
@@ -865,6 +873,7 @@ do_introspect (DBusConnection *connection,
" </signal>\n"
" <signal name=\"StartConversation\">\n"
+ " <arg name=\"service_name\" type=\"s\"/>\n"
" </signal>\n"
" <signal name=\"Close\">\n"
" </signal>\n"
diff --git a/daemon/gdm-session-worker-job.c b/daemon/gdm-session-worker-job.c
index c13a0a29..caa22d91 100644
--- a/daemon/gdm-session-worker-job.c
+++ b/daemon/gdm-session-worker-job.c
@@ -303,6 +303,13 @@ gdm_session_worker_job_stop (GdmSessionWorkerJob *session_worker_job)
return TRUE;
}
+GPid
+gdm_session_worker_job_get_pid (GdmSessionWorkerJob *session_worker_job)
+{
+ g_return_val_if_fail (GDM_IS_SESSION_WORKER_JOB (session_worker_job), 0);
+ return session_worker_job->priv->pid;
+}
+
void
gdm_session_worker_job_set_server_address (GdmSessionWorkerJob *session_worker_job,
const char *address)
diff --git a/daemon/gdm-session-worker-job.h b/daemon/gdm-session-worker-job.h
index 5ad1c924..d24f025d 100644
--- a/daemon/gdm-session-worker-job.h
+++ b/daemon/gdm-session-worker-job.h
@@ -60,6 +60,8 @@ void gdm_session_worker_job_set_server_address (GdmSessionWor
gboolean gdm_session_worker_job_start (GdmSessionWorkerJob *session_worker_job);
gboolean gdm_session_worker_job_stop (GdmSessionWorkerJob *session_worker_job);
+GPid gdm_session_worker_job_get_pid (GdmSessionWorkerJob *session_worker_job);
+
G_END_DECLS
#endif /* __GDM_SESSION_WORKER_JOB_H */
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index d6baa226..6a87dddc 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -79,11 +79,12 @@ gdm_session_get_type (void)
}
void
-gdm_session_start_conversation (GdmSession *session)
+gdm_session_start_conversation (GdmSession *session,
+ const char *service_name)
{
g_return_if_fail (GDM_IS_SESSION (session));
- GDM_SESSION_GET_IFACE (session)->start_conversation (session);
+ GDM_SESSION_GET_IFACE (session)->start_conversation (session, service_name);
}
void
@@ -210,7 +211,7 @@ gdm_session_class_init (gpointer g_iface)
G_STRUCT_OFFSET (GdmSessionIface, conversation_started),
NULL,
NULL,
- g_cclosure_marshal_VOID__VOID,
+ g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE,
0);
signals [SETUP_COMPLETE] =
@@ -633,10 +634,11 @@ _gdm_session_session_died (GdmSession *session,
}
void
-_gdm_session_conversation_started (GdmSession *session)
+_gdm_session_conversation_started (GdmSession *session,
+ const char *service_name)
{
g_return_if_fail (GDM_IS_SESSION (session));
- g_signal_emit (session, signals [CONVERSATION_STARTED], 0);
+ g_signal_emit (session, signals [CONVERSATION_STARTED], 0, service_name);
}
void
diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h
index a1e885d7..202da36d 100644
--- a/daemon/gdm-session.h
+++ b/daemon/gdm-session.h
@@ -45,7 +45,8 @@ struct _GdmSessionIface
GTypeInterface base_iface;
/* Methods */
- void (* start_conversation) (GdmSession *session);
+ void (* start_conversation) (GdmSession *session,
+ const char *service_name);
void (* setup) (GdmSession *session,
const char *service_name);
void (* setup_for_user) (GdmSession *session,
@@ -105,7 +106,8 @@ struct _GdmSessionIface
int exit_code);
void (* session_died) (GdmSession *session,
int signal_number);
- void (* conversation_started) (GdmSession *session);
+ void (* conversation_started) (GdmSession *session,
+ const char *service_name);
void (* closed) (GdmSession *session);
void (* selected_user_changed) (GdmSession *session,
const char *text);
@@ -118,7 +120,8 @@ struct _GdmSessionIface
GType gdm_session_get_type (void) G_GNUC_CONST;
-void gdm_session_start_conversation (GdmSession *session);
+void gdm_session_start_conversation (GdmSession *session,
+ const char *service_name);
void gdm_session_setup (GdmSession *session,
const char *service_name);
void gdm_session_setup_for_user (GdmSession *session,
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 13987edd..1554507f 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -244,7 +244,6 @@ reset_session (GdmSimpleSlave *slave)
{
destroy_session (slave);
create_new_session (slave);
- gdm_session_start_conversation (GDM_SESSION (slave->priv->session));
}
static gboolean
@@ -1041,8 +1040,6 @@ on_greeter_connected (GdmGreeterServer *greeter_server,
return;
}
- gdm_session_start_conversation (GDM_SESSION (slave->priv->session));
-
g_object_get (slave,
"display-is-local", &display_is_local,
NULL);
diff --git a/daemon/test-session.c b/daemon/test-session.c
index 8bed0856..9bfda86c 100644
--- a/daemon/test-session.c
+++ b/daemon/test-session.c
@@ -34,11 +34,12 @@ static GMainLoop *loop;
static void
on_conversation_started (GdmSession *session,
+ const char *service_name,
const char *username)
{
g_debug ("Got conversation started: calling setup...");
- gdm_session_setup (session, "gdm");
+ gdm_session_setup (session, service_name);
}
static void
@@ -267,7 +268,7 @@ main (int argc,
username = argv[1];
}
- gdm_session_start_conversation (GDM_SESSION (session));
+ gdm_session_start_conversation (GDM_SESSION (session), "gdm");
g_signal_connect (session,
"conversation-started",