summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-10-30 03:52:16 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2007-10-30 03:52:16 +0000
commitbecfcf5d1e774031b2091c100d3a5f508360789f (patch)
tree2de527ba903064de8405fa6e262a4559278201c6
parent613d29b63282b97e0a7a35514e1989a854e8566f (diff)
downloadgdm-becfcf5d1e774031b2091c100d3a5f508360789f.tar.gz
Make SessionRelay and SessionDirect (was Session) implement a common
2007-10-29 William Jon McCann <mccann@jhu.edu> * daemon/Makefile.am: * daemon/gdm-factory-slave.c: (on_session_info), (on_session_problem), (on_session_info_query), (on_session_secret_info_query), (on_session_opened), (on_session_user_verified), (on_session_user_verification_error), (on_session_session_started), (create_product_display), (on_session_relay_disconnected), (on_session_relay_connected), (on_greeter_begin_verification), (on_greeter_begin_verification_for_user), (on_greeter_answer), (on_greeter_session_selected), (on_greeter_language_selected), (on_greeter_user_selected), (on_greeter_cancel), (gdm_factory_slave_start), (gdm_factory_slave_stop): * daemon/gdm-product-slave.c: (setup_server), (add_user_authorization), (setup_session), (on_session_user_verified), (on_relay_start_session), (on_relay_begin_verification), (on_relay_begin_verification_for_user), (on_relay_answer), (reset_session), (on_relay_open), (create_new_session), (on_relay_cancelled), (connect_to_session_relay), (gdm_product_slave_stop): * daemon/gdm-session-direct.c: (on_user_verification_error), (on_session_started), (on_session_startup_error), (on_session_exited), (gdm_session_direct_handle_verified), (gdm_session_direct_handle_verification_failed), (gdm_session_direct_handle_username_changed), (gdm_session_direct_handle_info_query), (gdm_session_direct_handle_secret_info_query), (gdm_session_direct_handle_info), (gdm_session_direct_handle_problem), (gdm_session_direct_handle_session_started), (gdm_session_direct_handle_startup_failed), (gdm_session_direct_handle_session_exited), (gdm_session_direct_handle_session_died), (handle_connection), (gdm_session_direct_init), (worker_exited), (worker_died), (gdm_session_direct_open), (send_begin_verification), (send_begin_verification_for_user), (gdm_session_direct_begin_verification), (gdm_session_direct_begin_verification_for_user), (is_prog_in_path), (get_session_command_for_file), (get_session_command), (open_ck_session), (setup_session_environment), (gdm_session_direct_start_session), (gdm_session_direct_close), (gdm_session_direct_answer_query), (gdm_session_direct_cancel), (gdm_session_direct_get_username), (gdm_session_direct_select_session), (gdm_session_direct_select_language), (gdm_session_direct_select_user), (_gdm_session_direct_set_display_name), (_gdm_session_direct_set_display_hostname), (_gdm_session_direct_set_display_device), (_gdm_session_direct_set_user_x11_authority_file), (_gdm_session_direct_set_display_is_local), (gdm_session_direct_set_property), (gdm_session_direct_get_property), (gdm_session_direct_dispose), (gdm_session_direct_finalize), (gdm_session_iface_init), (gdm_session_direct_class_init), (gdm_session_direct_new): * daemon/gdm-session-direct.h: * daemon/gdm-session-private.h: * daemon/gdm-session-relay.c: (gdm_session_relay_open), (gdm_session_relay_close), (gdm_session_relay_begin_verification), (gdm_session_relay_begin_verification_for_user), (gdm_session_relay_answer_query), (gdm_session_relay_select_session), (gdm_session_relay_select_language), (gdm_session_relay_select_user), (gdm_session_relay_cancel), (gdm_session_relay_start_session), (handle_info_query), (handle_secret_info_query), (handle_info), (handle_problem), (handle_user_verified), (handle_user_verification_error), (handle_session_started), (handle_session_stopped), (handle_opened), (handle_reset), (do_introspect), (handle_connection), (gdm_session_iface_init), (gdm_session_relay_class_init): * daemon/gdm-session-relay.h: * daemon/gdm-session.c: (gdm_session_get_type), (gdm_session_open), (gdm_session_close), (gdm_session_begin_verification), (gdm_session_begin_verification_for_user), (gdm_session_answer_query), (gdm_session_select_session), (gdm_session_select_language), (gdm_session_select_user), (gdm_session_cancel), (gdm_session_start_session), (gdm_session_class_init), (_gdm_session_user_verified), (_gdm_session_user_verification_error), (_gdm_session_info_query), (_gdm_session_secret_info_query), (_gdm_session_info), (_gdm_session_problem), (_gdm_session_session_started), (_gdm_session_session_startup_error), (_gdm_session_session_exited), (_gdm_session_session_died), (_gdm_session_opened), (_gdm_session_closed), (_gdm_session_selected_user_changed): * daemon/gdm-session.h: * daemon/gdm-simple-slave.c: (on_session_started), (on_session_exited), (on_session_died), (on_session_user_verified), (on_session_user_verification_error), (on_session_info), (on_session_problem), (on_session_info_query), (on_session_secret_info_query), (on_session_opened), (on_session_selected_user_changed), (create_new_session), (on_greeter_begin_verification), (on_greeter_begin_verification_for_user), (on_greeter_answer), (on_greeter_session_selected), (on_greeter_language_selected), (on_greeter_cancel), (on_greeter_connected), (gdm_simple_slave_stop), (gdm_simple_slave_init): * daemon/test-session.c: (on_open), (on_session_started), (on_session_exited), (on_session_died), (on_user_verified), (on_user_verification_error), (on_info_query), (on_info), (on_problem), (on_secret_info_query), (import_environment), (main): Make SessionRelay and SessionDirect (was Session) implement a common interface GdmSession. Push some code that lived in the simple and product slaves into the SessionDirect class. Using an interface has a few advantages besides ensuring consistency: makes it easier to do some abstraction in the slave classes, makes it possible to more easily implement other non-pam backends. Add a stub for a selected-user-changed signal from the session interface. This will be used to update the user selection in the greeter when the user is set from the backend. svn path=/trunk/; revision=5452
-rw-r--r--ChangeLog115
-rw-r--r--daemon/Makefile.am14
-rw-r--r--daemon/gdm-factory-slave.c146
-rw-r--r--daemon/gdm-product-slave.c397
-rw-r--r--daemon/gdm-session-direct.c1227
-rw-r--r--daemon/gdm-session-direct.h64
-rw-r--r--daemon/gdm-session-private.h65
-rw-r--r--daemon/gdm-session-relay.c234
-rw-r--r--daemon/gdm-session-relay.h49
-rw-r--r--daemon/gdm-session.c402
-rw-r--r--daemon/gdm-session.h105
-rw-r--r--daemon/gdm-simple-slave.c471
-rw-r--r--daemon/test-session.c88
-rw-r--r--po/ChangeLog6
-rw-r--r--po/POTFILES.in1
15 files changed, 1836 insertions, 1548 deletions
diff --git a/ChangeLog b/ChangeLog
index 89c7ac88..e45fa605 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,121 @@
2007-10-29 William Jon McCann <mccann@jhu.edu>
* daemon/Makefile.am:
+ * daemon/gdm-factory-slave.c: (on_session_info),
+ (on_session_problem), (on_session_info_query),
+ (on_session_secret_info_query), (on_session_opened),
+ (on_session_user_verified), (on_session_user_verification_error),
+ (on_session_session_started), (create_product_display),
+ (on_session_relay_disconnected), (on_session_relay_connected),
+ (on_greeter_begin_verification),
+ (on_greeter_begin_verification_for_user), (on_greeter_answer),
+ (on_greeter_session_selected), (on_greeter_language_selected),
+ (on_greeter_user_selected), (on_greeter_cancel),
+ (gdm_factory_slave_start), (gdm_factory_slave_stop):
+ * daemon/gdm-product-slave.c: (setup_server),
+ (add_user_authorization), (setup_session),
+ (on_session_user_verified), (on_relay_start_session),
+ (on_relay_begin_verification),
+ (on_relay_begin_verification_for_user), (on_relay_answer),
+ (reset_session), (on_relay_open), (create_new_session),
+ (on_relay_cancelled), (connect_to_session_relay),
+ (gdm_product_slave_stop):
+ * daemon/gdm-session-direct.c: (on_user_verification_error),
+ (on_session_started), (on_session_startup_error),
+ (on_session_exited), (gdm_session_direct_handle_verified),
+ (gdm_session_direct_handle_verification_failed),
+ (gdm_session_direct_handle_username_changed),
+ (gdm_session_direct_handle_info_query),
+ (gdm_session_direct_handle_secret_info_query),
+ (gdm_session_direct_handle_info),
+ (gdm_session_direct_handle_problem),
+ (gdm_session_direct_handle_session_started),
+ (gdm_session_direct_handle_startup_failed),
+ (gdm_session_direct_handle_session_exited),
+ (gdm_session_direct_handle_session_died), (handle_connection),
+ (gdm_session_direct_init), (worker_exited), (worker_died),
+ (gdm_session_direct_open), (send_begin_verification),
+ (send_begin_verification_for_user),
+ (gdm_session_direct_begin_verification),
+ (gdm_session_direct_begin_verification_for_user),
+ (is_prog_in_path), (get_session_command_for_file),
+ (get_session_command), (open_ck_session),
+ (setup_session_environment), (gdm_session_direct_start_session),
+ (gdm_session_direct_close), (gdm_session_direct_answer_query),
+ (gdm_session_direct_cancel), (gdm_session_direct_get_username),
+ (gdm_session_direct_select_session),
+ (gdm_session_direct_select_language),
+ (gdm_session_direct_select_user),
+ (_gdm_session_direct_set_display_name),
+ (_gdm_session_direct_set_display_hostname),
+ (_gdm_session_direct_set_display_device),
+ (_gdm_session_direct_set_user_x11_authority_file),
+ (_gdm_session_direct_set_display_is_local),
+ (gdm_session_direct_set_property),
+ (gdm_session_direct_get_property), (gdm_session_direct_dispose),
+ (gdm_session_direct_finalize), (gdm_session_iface_init),
+ (gdm_session_direct_class_init), (gdm_session_direct_new):
+ * daemon/gdm-session-direct.h:
+ * daemon/gdm-session-private.h:
+ * daemon/gdm-session-relay.c: (gdm_session_relay_open),
+ (gdm_session_relay_close), (gdm_session_relay_begin_verification),
+ (gdm_session_relay_begin_verification_for_user),
+ (gdm_session_relay_answer_query),
+ (gdm_session_relay_select_session),
+ (gdm_session_relay_select_language),
+ (gdm_session_relay_select_user), (gdm_session_relay_cancel),
+ (gdm_session_relay_start_session), (handle_info_query),
+ (handle_secret_info_query), (handle_info), (handle_problem),
+ (handle_user_verified), (handle_user_verification_error),
+ (handle_session_started), (handle_session_stopped),
+ (handle_opened), (handle_reset), (do_introspect),
+ (handle_connection), (gdm_session_iface_init),
+ (gdm_session_relay_class_init):
+ * daemon/gdm-session-relay.h:
+ * daemon/gdm-session.c: (gdm_session_get_type), (gdm_session_open),
+ (gdm_session_close), (gdm_session_begin_verification),
+ (gdm_session_begin_verification_for_user),
+ (gdm_session_answer_query), (gdm_session_select_session),
+ (gdm_session_select_language), (gdm_session_select_user),
+ (gdm_session_cancel), (gdm_session_start_session),
+ (gdm_session_class_init), (_gdm_session_user_verified),
+ (_gdm_session_user_verification_error), (_gdm_session_info_query),
+ (_gdm_session_secret_info_query), (_gdm_session_info),
+ (_gdm_session_problem), (_gdm_session_session_started),
+ (_gdm_session_session_startup_error),
+ (_gdm_session_session_exited), (_gdm_session_session_died),
+ (_gdm_session_opened), (_gdm_session_closed),
+ (_gdm_session_selected_user_changed):
+ * daemon/gdm-session.h:
+ * daemon/gdm-simple-slave.c: (on_session_started),
+ (on_session_exited), (on_session_died), (on_session_user_verified),
+ (on_session_user_verification_error), (on_session_info),
+ (on_session_problem), (on_session_info_query),
+ (on_session_secret_info_query), (on_session_opened),
+ (on_session_selected_user_changed), (create_new_session),
+ (on_greeter_begin_verification),
+ (on_greeter_begin_verification_for_user), (on_greeter_answer),
+ (on_greeter_session_selected), (on_greeter_language_selected),
+ (on_greeter_cancel), (on_greeter_connected),
+ (gdm_simple_slave_stop), (gdm_simple_slave_init):
+ * daemon/test-session.c: (on_open), (on_session_started),
+ (on_session_exited), (on_session_died), (on_user_verified),
+ (on_user_verification_error), (on_info_query), (on_info),
+ (on_problem), (on_secret_info_query), (import_environment), (main):
+ Make SessionRelay and SessionDirect (was Session) implement a common
+ interface GdmSession. Push some code that lived in the simple and product
+ slaves into the SessionDirect class. Using an interface has a few
+ advantages besides ensuring consistency: makes it easier to do some
+ abstraction in the slave classes, makes it possible to more easily
+ implement other non-pam backends.
+
+ Add a stub for a selected-user-changed signal from the session interface.
+ This will be used to update the user selection in the greeter when the
+ user is set from the backend.
+
+2007-10-29 William Jon McCann <mccann@jhu.edu>
+
+ * daemon/Makefile.am:
* daemon/gdm-product-slave.c: (on_session_opened),
(on_session_started), (on_session_exited), (on_session_died),
(slave_open_ck_session), (setup_session_environment),
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index d3fa98dd..a9407c6f 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -66,6 +66,11 @@ noinst_PROGRAMS = \
test_session_SOURCES = \
test-session.c \
+ ck-connector.h \
+ ck-connector.c \
+ gdm-session.c \
+ gdm-session.h \
+ gdm-session-private.h \
gdm-session-direct.c \
gdm-session-direct.h \
gdm-session-record.c \
@@ -96,6 +101,9 @@ gdm_simple_slave_SOURCES = \
ck-connector.c \
gdm-server.c \
gdm-server.h \
+ gdm-session.c \
+ gdm-session.h \
+ gdm-session-private.h \
gdm-session-direct.c \
gdm-session-direct.h \
gdm-session-record.c \
@@ -130,6 +138,9 @@ gdm_factory_slave_SOURCES = \
ck-connector.c \
gdm-server.c \
gdm-server.h \
+ gdm-session.c \
+ gdm-session.h \
+ gdm-session-private.h \
gdm-session-relay.c \
gdm-session-relay.h \
gdm-slave.c \
@@ -153,6 +164,9 @@ gdm_product_slave_SOURCES = \
gdm-server.h \
ck-connector.h \
ck-connector.c \
+ gdm-session.c \
+ gdm-session.h \
+ gdm-session-private.h \
gdm-session-direct.c \
gdm-session-direct.h \
gdm-session-record.c \
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
index 19c2c916..c33ae9b2 100644
--- a/daemon/gdm-factory-slave.c
+++ b/daemon/gdm-factory-slave.c
@@ -50,6 +50,7 @@
#include "gdm-server.h"
#include "gdm-greeter-session.h"
#include "gdm-greeter-server.h"
+
#include "gdm-session-relay.h"
extern char **environ;
@@ -74,7 +75,7 @@ struct GdmFactorySlavePrivate
guint connection_attempts;
GdmServer *server;
- GdmSessionRelay *session_relay;
+ GdmSessionRelay *session;
GdmGreeterServer *greeter_server;
GdmGreeterSession *greeter;
DBusGProxy *factory_display_proxy;
@@ -106,27 +107,27 @@ on_greeter_stop (GdmGreeterSession *greeter,
}
static void
-on_session_relay_info (GdmSessionRelay *relay,
- const char *text,
- GdmFactorySlave *slave)
+on_session_info (GdmSession *session,
+ const char *text,
+ GdmFactorySlave *slave)
{
g_debug ("Info: %s", text);
gdm_greeter_server_info (slave->priv->greeter_server, text);
}
static void
-on_session_relay_problem (GdmSessionRelay *relay,
- const char *text,
- GdmFactorySlave *slave)
+on_session_problem (GdmSession *session,
+ const char *text,
+ GdmFactorySlave *slave)
{
g_debug ("Problem: %s", text);
gdm_greeter_server_problem (slave->priv->greeter_server, text);
}
static void
-on_session_relay_info_query (GdmSessionRelay *relay,
- const char *text,
- GdmFactorySlave *slave)
+on_session_info_query (GdmSession *session,
+ const char *text,
+ GdmFactorySlave *slave)
{
g_debug ("Info query: %s", text);
@@ -134,28 +135,28 @@ on_session_relay_info_query (GdmSessionRelay *relay,
}
static void
-on_session_relay_secret_info_query (GdmSessionRelay *relay,
- const char *text,
- GdmFactorySlave *slave)
+on_session_secret_info_query (GdmSession *session,
+ const char *text,
+ GdmFactorySlave *slave)
{
g_debug ("Secret info query: %s", text);
gdm_greeter_server_secret_info_query (slave->priv->greeter_server, text);
}
static void
-on_session_relay_opened (GdmSessionRelay *relay,
- GdmFactorySlave *slave)
+on_session_opened (GdmSession *session,
+ GdmFactorySlave *slave)
{
- g_debug ("Relay session opened");
+ g_debug (" session opened");
gdm_greeter_server_ready (slave->priv->greeter_server);
}
static void
-on_session_relay_user_verified (GdmSessionRelay *relay,
+on_session_user_verified (GdmSession *session,
GdmFactorySlave *slave)
{
- g_debug ("Relay session user verified");
+ g_debug (" session user verified");
gdm_greeter_server_reset (slave->priv->greeter_server);
}
@@ -179,9 +180,9 @@ queue_greeter_reset (GdmFactorySlave *slave)
}
static void
-on_session_relay_user_verification_error (GdmSessionRelay *relay,
- const char *message,
- GdmFactorySlave *slave)
+on_session_user_verification_error (GdmSession *session,
+ const char *message,
+ GdmFactorySlave *slave)
{
g_debug ("could not successfully authenticate user: %s",
message);
@@ -191,6 +192,14 @@ on_session_relay_user_verification_error (GdmSessionRelay *relay,
queue_greeter_reset (slave);
}
+static void
+on_session_session_started (GdmSession *session,
+ GdmFactorySlave *slave)
+{
+ g_debug ("Relay session started");
+ gdm_greeter_server_reset (slave->priv->greeter_server);
+}
+
static gboolean
create_product_display (GdmFactorySlave *slave)
{
@@ -221,7 +230,7 @@ create_product_display (GdmFactorySlave *slave)
goto out;
}
- server_address = gdm_session_relay_get_address (slave->priv->session_relay);
+ server_address = gdm_session_relay_get_address (slave->priv->session);
error = NULL;
res = dbus_g_proxy_call (slave->priv->factory_display_proxy,
@@ -250,7 +259,7 @@ create_product_display (GdmFactorySlave *slave)
}
static void
-on_session_relay_disconnected (GdmSessionRelay *relay,
+on_session_relay_disconnected (GdmSessionRelay *session,
GdmFactorySlave *slave)
{
g_debug ("Relay disconnected");
@@ -261,11 +270,12 @@ on_session_relay_disconnected (GdmSessionRelay *relay,
}
static void
-on_session_relay_session_started (GdmSessionRelay *relay,
- GdmFactorySlave *slave)
+on_session_relay_connected (GdmSessionRelay *session,
+ GdmFactorySlave *slave)
{
- g_debug ("Relay session started");
- gdm_greeter_server_reset (slave->priv->greeter_server);
+ g_debug ("Relay Connected");
+
+ gdm_session_open (GDM_SESSION (slave->priv->session));
}
static void
@@ -274,7 +284,7 @@ on_greeter_begin_verification (GdmGreeterServer *greeter_server,
{
g_debug ("begin verification");
- gdm_session_relay_begin_verification (slave->priv->session_relay);
+ gdm_session_begin_verification (GDM_SESSION (slave->priv->session));
}
static void
@@ -284,8 +294,8 @@ on_greeter_begin_verification_for_user (GdmGreeterServer *greeter_server,
{
g_debug ("begin verification for user");
- gdm_session_relay_begin_verification_for_user (slave->priv->session_relay,
- username);
+ gdm_session_begin_verification_for_user (GDM_SESSION (slave->priv->session),
+ username);
}
static void
@@ -294,7 +304,7 @@ on_greeter_answer (GdmGreeterServer *greeter_server,
GdmFactorySlave *slave)
{
g_debug ("Greeter answer");
- gdm_session_relay_answer_query (slave->priv->session_relay, text);
+ gdm_session_answer_query (GDM_SESSION (slave->priv->session), text);
}
static void
@@ -302,7 +312,7 @@ on_greeter_session_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmFactorySlave *slave)
{
- gdm_session_relay_select_session (slave->priv->session_relay, text);
+ gdm_session_select_session (GDM_SESSION (slave->priv->session), text);
}
static void
@@ -310,7 +320,7 @@ on_greeter_language_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmFactorySlave *slave)
{
- gdm_session_relay_select_language (slave->priv->session_relay, text);
+ gdm_session_select_language (GDM_SESSION (slave->priv->session), text);
}
static void
@@ -318,14 +328,14 @@ on_greeter_user_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmFactorySlave *slave)
{
- gdm_session_relay_select_user (slave->priv->session_relay, text);
+ gdm_session_select_user (GDM_SESSION (slave->priv->session), text);
}
static void
on_greeter_cancel (GdmGreeterServer *greeter_server,
GdmFactorySlave *slave)
{
- gdm_session_relay_cancel (slave->priv->session_relay);
+ gdm_session_cancel (GDM_SESSION (slave->priv->session));
}
static void
@@ -538,46 +548,50 @@ gdm_factory_slave_start (GdmSlave *slave)
res = GDM_SLAVE_CLASS (gdm_factory_slave_parent_class)->start (slave);
-
- GDM_FACTORY_SLAVE (slave)->priv->session_relay = gdm_session_relay_new ();
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session_relay,
+ GDM_FACTORY_SLAVE (slave)->priv->session = gdm_session_relay_new ();
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
"info",
- G_CALLBACK (on_session_relay_info),
+ G_CALLBACK (on_session_info),
slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session_relay,
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
"problem",
- G_CALLBACK (on_session_relay_problem),
+ G_CALLBACK (on_session_problem),
slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session_relay,
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
"info-query",
- G_CALLBACK (on_session_relay_info_query),
+ G_CALLBACK (on_session_info_query),
slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session_relay,
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
"secret-info-query",
- G_CALLBACK (on_session_relay_secret_info_query),
+ G_CALLBACK (on_session_secret_info_query),
slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session_relay,
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
"user-verified",
- G_CALLBACK (on_session_relay_user_verified),
+ G_CALLBACK (on_session_user_verified),
slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session_relay,
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
"user-verification-error",
- G_CALLBACK (on_session_relay_user_verification_error),
+ G_CALLBACK (on_session_user_verification_error),
slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session_relay,
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
"opened",
- G_CALLBACK (on_session_relay_opened),
+ G_CALLBACK (on_session_opened),
+ slave);
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
+ "session-started",
+ G_CALLBACK (on_session_session_started),
slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session_relay,
+
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
+ "connected",
+ G_CALLBACK (on_session_relay_connected),
+ slave);
+ g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
"disconnected",
G_CALLBACK (on_session_relay_disconnected),
slave);
- g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session_relay,
- "session-started",
- G_CALLBACK (on_session_relay_session_started),
- slave);
- gdm_session_relay_start (GDM_FACTORY_SLAVE (slave)->priv->session_relay);
+ gdm_session_relay_start (GDM_FACTORY_SLAVE (slave)->priv->session);
gdm_factory_slave_run (GDM_FACTORY_SLAVE (slave));
@@ -595,10 +609,10 @@ gdm_factory_slave_stop (GdmSlave *slave)
res = GDM_SLAVE_CLASS (gdm_factory_slave_parent_class)->stop (slave);
- if (GDM_FACTORY_SLAVE (slave)->priv->session_relay != NULL) {
- gdm_session_relay_stop (GDM_FACTORY_SLAVE (slave)->priv->session_relay);
- g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->session_relay);
- GDM_FACTORY_SLAVE (slave)->priv->session_relay = NULL;
+ if (GDM_FACTORY_SLAVE (slave)->priv->session != NULL) {
+ gdm_session_relay_stop (GDM_FACTORY_SLAVE (slave)->priv->session);
+ g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->session);
+ GDM_FACTORY_SLAVE (slave)->priv->session = NULL;
}
if (GDM_FACTORY_SLAVE (slave)->priv->greeter_server != NULL) {
@@ -645,9 +659,9 @@ gdm_factory_slave_set_property (GObject *object,
static void
gdm_factory_slave_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
GdmFactorySlave *self;
@@ -662,8 +676,8 @@ gdm_factory_slave_get_property (GObject *object,
static GObject *
gdm_factory_slave_constructor (GType type,
- guint n_construct_properties,
- GObjectConstructParam *construct_properties)
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
{
GdmFactorySlave *factory_slave;
GdmFactorySlaveClass *klass;
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index 56957127..9360cfd6 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -50,8 +50,6 @@
#include "gdm-server.h"
#include "gdm-session-direct.h"
-#include "ck-connector.h"
-
extern char **environ;
#define GDM_PRODUCT_SLAVE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_PRODUCT_SLAVE, GdmProductSlavePrivate))
@@ -82,7 +80,6 @@ struct GdmProductSlavePrivate
char *selected_language;
char *selected_user;
- CkConnector *ckc;
GdmServer *server;
GdmSessionDirect *session;
DBusGProxy *session_relay_proxy;
@@ -191,287 +188,52 @@ on_session_died (GdmSessionDirect *session,
gdm_slave_stopped (GDM_SLAVE (slave));
}
-static gboolean
-is_prog_in_path (const char *prog)
+static void
+setup_server (GdmProductSlave *slave)
{
- char *f;
- gboolean ret;
-
- f = g_find_program_in_path (prog);
- ret = (f != NULL);
- g_free (f);
- return ret;
+ /* Set the busy cursor */
+ gdm_slave_set_busy_cursor (GDM_SLAVE (slave));
}
static gboolean
-get_session_command (const char *file,
- char **command)
+add_user_authorization (GdmProductSlave *slave,
+ char **filename)
{
- GKeyFile *key_file;
- GError *error;
- char *full_path;
- char *exec;
- gboolean ret;
- gboolean res;
- const char *search_dirs[] = {
- "/etc/X11/sessions/",
- DMCONFDIR "/Sessions/",
- DATADIR "/gdm/BuiltInSessions/",
- DATADIR "/xsessions/",
- NULL
- };
-
- exec = NULL;
- ret = FALSE;
- if (command != NULL) {
- *command = NULL;
- }
-
- key_file = g_key_file_new ();
-
- error = NULL;
- full_path = NULL;
- res = g_key_file_load_from_dirs (key_file,
- file,
- search_dirs,
- &full_path,
- G_KEY_FILE_NONE,
- &error);
- if (! res) {
- g_debug ("File '%s' not found: %s", file, error->message);
- g_error_free (error);
- if (command != NULL) {
- *command = NULL;
- }
- goto out;
- }
-
- error = NULL;
- res = g_key_file_get_boolean (key_file,
- G_KEY_FILE_DESKTOP_GROUP,
- G_KEY_FILE_DESKTOP_KEY_HIDDEN,
- &error);
- if (error == NULL && res) {
- g_debug ("Session %s is marked as hidden", file);
- goto out;
- }
-
- error = NULL;
- exec = g_key_file_get_string (key_file,
- G_KEY_FILE_DESKTOP_GROUP,
- G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
- &error);
- if (exec == NULL) {
- g_debug ("%s key not found", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
- goto out;
- }
-
- res = is_prog_in_path (exec);
- g_free (exec);
-
- if (! res) {
- g_debug ("Command not found: %s", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
- goto out;
- }
-
- error = NULL;
- exec = g_key_file_get_string (key_file,
- G_KEY_FILE_DESKTOP_GROUP,
- G_KEY_FILE_DESKTOP_KEY_EXEC,
- &error);
- if (error != NULL) {
- g_debug ("%s key not found: %s",
- G_KEY_FILE_DESKTOP_KEY_EXEC,
- error->message);
- g_error_free (error);
- goto out;
- }
-
- if (command != NULL) {
- *command = g_strdup (exec);
- }
- ret = TRUE;
+ char *username;
+ gboolean ret;
-out:
- g_free (exec);
+ username = gdm_session_direct_get_username (slave->priv->session);
+ ret = gdm_slave_add_user_authorization (GDM_SLAVE (slave),
+ username,
+ filename);
+ g_free (username);
return ret;
}
static gboolean
-slave_open_ck_session (GdmProductSlave *slave,
- const char *display_name,
- const char *display_hostname,
- gboolean display_is_local)
+setup_session (GdmProductSlave *slave)
{
- char *username;
- char *x11_display_device;
- struct passwd *pwent;
- gboolean ret;
- int res;
- DBusError error;
-
- g_return_val_if_fail (GDM_IS_SLAVE (slave), FALSE);
-
- username = gdm_session_direct_get_username (slave->priv->session);
-
- x11_display_device = NULL;
-
- pwent = getpwnam (username);
- if (pwent == NULL) {
- return FALSE;
- }
-
- slave->priv->ckc = ck_connector_new ();
- if (slave->priv->ckc == NULL) {
- g_warning ("Couldn't create new ConsoleKit connector");
- goto out;
- }
-
- if (slave->priv->server != NULL) {
- x11_display_device = gdm_server_get_display_device (slave->priv->server);
- }
-
- if (x11_display_device == NULL) {
- x11_display_device = g_strdup ("");
- }
-
- dbus_error_init (&error);
- res = ck_connector_open_session_with_parameters (slave->priv->ckc,
- &error,
- "unix-user", &pwent->pw_uid,
- "x11-display", &display_name,
- "x11-display-device", &x11_display_device,
- "remote-host-name", &display_hostname,
- "is-local", &display_is_local,
- NULL);
- g_free (x11_display_device);
-
- if (! res) {
- if (dbus_error_is_set (&error)) {
- g_warning ("%s\n", error.message);
- dbus_error_free (&error);
- } else {
- g_warning ("cannot open CK session: OOM, D-Bus system bus not available,\n"
- "ConsoleKit not available or insufficient privileges.\n");
- }
- goto out;
- }
-
- ret = TRUE;
-
- out:
- return ret;
-}
+ char *auth_file;
+ char *display_device;
-static void
-setup_session_environment (GdmProductSlave *slave)
-{
- int display_number;
- char *display_x11_cookie;
- char *display_name;
- char *display_hostname;
- char *auth_file;
- const char *session_cookie;
- gboolean display_is_local;
-
- display_name = NULL;
- display_hostname = NULL;
- display_x11_cookie = NULL;
auth_file = NULL;
- session_cookie = NULL;
- display_is_local = FALSE;
-
- g_object_get (slave,
- "display-number", &display_number,
- "display-name", &display_name,
- "display-hostname", &display_hostname,
- "display-is-local", &display_is_local,
- "display-x11-cookie", &display_x11_cookie,
- "display-x11-authority-file", &auth_file,
- NULL);
+ add_user_authorization (slave, &auth_file);
- if (slave_open_ck_session (slave,
- display_name,
- display_hostname,
- display_is_local)) {
- session_cookie = ck_connector_get_cookie (slave->priv->ckc);
+ display_device = NULL;
+ if (slave->priv->server != NULL) {
+ display_device = gdm_server_get_display_device (slave->priv->server);
}
- g_object_get (slave,
- "display-name", &display_name,
- "display-x11-authority-file", &auth_file,
+ g_object_set (slave->priv->session,
+ "display-device", display_device,
+ "user-x11-authority-file", auth_file,
NULL);
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "GDMSESSION",
- slave->priv->selected_session);
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "DESKTOP_SESSION",
- slave->priv->selected_session);
-
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "LANG",
- slave->priv->selected_language);
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "GDM_LANG",
- slave->priv->selected_language);
-
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "DISPLAY",
- display_name);
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "XAUTHORITY",
- auth_file);
-
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "PATH",
- "/bin:/usr/bin:" BINDIR);
-
- g_free (display_name);
+ g_free (display_device);
g_free (auth_file);
-}
-
-static void
-setup_server (GdmProductSlave *slave)
-{
- /* Set the busy cursor */
- gdm_slave_set_busy_cursor (GDM_SLAVE (slave));
-}
-
-static gboolean
-setup_session (GdmProductSlave *slave)
-{
- char *username;
- char *command;
- char *filename;
- gboolean res;
-
- username = gdm_session_direct_get_username (slave->priv->session);
-
- g_debug ("%s%ssuccessfully authenticated\n",
- username ? username : "",
- username ? " " : "");
- g_free (username);
-
- if (slave->priv->selected_session != NULL) {
- filename = g_strdup (slave->priv->selected_session);
- } else {
- filename = g_strdup ("gnome.desktop");
- }
- setup_session_environment (slave);
-
- res = get_session_command (filename, &command);
- if (! res) {
- g_warning ("Could find session file: %s", filename);
- return FALSE;
- }
-
- gdm_session_direct_start_program (slave->priv->session, command);
-
- g_free (filename);
- g_free (command);
+ gdm_session_start_session (GDM_SESSION (slave->priv->session));
return TRUE;
}
@@ -571,7 +333,11 @@ on_session_user_verified (GdmSessionDirect *session,
g_warning ("Unable to send UserVerified: %s", error->message);
g_error_free (error);
}
+}
+static void
+on_relay_start_session (GdmProductSlave *slave)
+{
gdm_product_slave_create_server (slave);
}
@@ -705,19 +471,10 @@ on_relay_begin_verification (DBusGProxy *proxy,
gpointer data)
{
GdmProductSlave *slave = GDM_PRODUCT_SLAVE (data);
- GError *error;
- gboolean res;
g_debug ("Relay BeginVerification");
- error = NULL;
- res = gdm_session_direct_begin_verification (slave->priv->session,
- NULL,
- &error);
- if (! res) {
- g_warning ("Unable to begin verification: %s", error->message);
- g_error_free (error);
- }
+ gdm_session_begin_verification (GDM_SESSION (slave->priv->session));
}
static void
@@ -726,19 +483,10 @@ on_relay_begin_verification_for_user (DBusGProxy *proxy,
gpointer data)
{
GdmProductSlave *slave = GDM_PRODUCT_SLAVE (data);
- GError *error;
- gboolean res;
g_debug ("Relay BeginVerificationForUser");
- error = NULL;
- res = gdm_session_direct_begin_verification (slave->priv->session,
- username,
- &error);
- if (! res) {
- g_warning ("Unable to begin verification for user: %s", error->message);
- g_error_free (error);
- }
+ gdm_session_begin_verification_for_user (GDM_SESSION (slave->priv->session), username);
}
static void
@@ -750,7 +498,7 @@ on_relay_answer (DBusGProxy *proxy,
g_debug ("Relay Answer");
- gdm_session_direct_answer_query (slave->priv->session, text);
+ gdm_session_answer_query (GDM_SESSION (slave->priv->session), text);
}
static void
@@ -782,29 +530,9 @@ on_relay_language_selected (DBusGProxy *proxy,
static gboolean
reset_session (GdmProductSlave *slave)
{
- char *display_name;
- gboolean res;
- GError *error;
-
- g_object_get (slave,
- "display-name", &display_name,
- NULL);
-
- gdm_session_direct_close (slave->priv->session);
- res = gdm_session_direct_open (slave->priv->session,
- "gdm",
- "",
- display_name,
- "/dev/console",
- &error);
- if (! res) {
- g_warning ("Unable to open session: %s", error->message);
- g_error_free (error);
- }
-
- g_free (display_name);
-
- return res;
+ gdm_session_close (GDM_SESSION (slave->priv->session));
+ gdm_session_open (GDM_SESSION (slave->priv->session));
+ return TRUE;
}
static void
@@ -827,35 +555,36 @@ on_relay_open (DBusGProxy *proxy,
gpointer data)
{
GdmProductSlave *slave = GDM_PRODUCT_SLAVE (data);
- char *display_name;
- gboolean res;
- GError *error;
- g_debug ("Relay open: opening session");
+ gdm_session_open (GDM_SESSION (slave->priv->session));
+}
+
+static void
+create_new_session (GdmProductSlave *slave)
+{
+ gboolean display_is_local;
+ char *display_name;
+ char *display_hostname;
+ char *display_device;
+
+ g_debug ("Creating new session");
g_object_get (slave,
"display-name", &display_name,
+ "display-hostname", &display_hostname,
+ "display-is-local", &display_is_local,
NULL);
- error = NULL;
- res = gdm_session_direct_open (slave->priv->session,
- "gdm",
- "",
- display_name,
- "/dev/console",
- &error);
- if (! res) {
- g_warning ("Unable to open session: %s", error->message);
- g_error_free (error);
- }
+ /* FIXME: we don't yet have a display device! */
+ display_device = g_strdup ("");
+ slave->priv->session = gdm_session_direct_new (display_name,
+ display_hostname,
+ display_device,
+ display_is_local);
g_free (display_name);
-}
-
-static void
-create_new_session (GdmProductSlave *slave)
-{
- slave->priv->session = gdm_session_direct_new ();
+ g_free (display_hostname);
+ g_free (display_device);
g_signal_connect (slave->priv->session,
"opened",
@@ -915,7 +644,7 @@ on_relay_cancelled (DBusGProxy *proxy,
g_debug ("Relay cancelled");
if (slave->priv->session != NULL) {
- gdm_session_direct_close (slave->priv->session);
+ gdm_session_close (GDM_SESSION (slave->priv->session));
g_object_unref (slave->priv->session);
}
@@ -1019,6 +748,9 @@ connect_to_session_relay (GdmProductSlave *slave)
dbus_g_proxy_add_signal (slave->priv->session_relay_proxy,
"Cancelled",
G_TYPE_INVALID);
+ dbus_g_proxy_add_signal (slave->priv->session_relay_proxy,
+ "StartSession",
+ G_TYPE_INVALID);
dbus_g_proxy_connect_signal (slave->priv->session_relay_proxy,
"BeginVerification",
@@ -1060,6 +792,11 @@ connect_to_session_relay (GdmProductSlave *slave)
G_CALLBACK (on_relay_cancelled),
slave,
NULL);
+ dbus_g_proxy_connect_signal (slave->priv->session_relay_proxy,
+ "StartSession",
+ G_CALLBACK (on_relay_start_session),
+ slave,
+ NULL);
g_signal_connect (slave->priv->session_relay_proxy,
"destroy",
@@ -1133,7 +870,7 @@ gdm_product_slave_stop (GdmSlave *slave)
res = GDM_SLAVE_CLASS (gdm_product_slave_parent_class)->stop (slave);
if (GDM_PRODUCT_SLAVE (slave)->priv->session != NULL) {
- gdm_session_direct_close (GDM_PRODUCT_SLAVE (slave)->priv->session);
+ gdm_session_close (GDM_SESSION (GDM_PRODUCT_SLAVE (slave)->priv->session));
g_object_unref (GDM_PRODUCT_SLAVE (slave)->priv->session);
GDM_PRODUCT_SLAVE (slave)->priv->session = NULL;
}
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index 5cf948d9..493302b0 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -36,6 +36,8 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <pwd.h>
+#include <grp.h>
#include <glib.h>
#include <glib/gi18n.h>
@@ -46,55 +48,63 @@
#include <dbus/dbus-glib-lowlevel.h>
#include "gdm-session-direct.h"
+#include "gdm-session.h"
+#include "gdm-session-private.h"
+
#include "gdm-session-record.h"
#include "gdm-session-worker-job.h"
+#include "ck-connector.h"
+
#define GDM_SESSION_DBUS_PATH "/org/gnome/DisplayManager/Session"
#define GDM_SESSION_DBUS_INTERFACE "org.gnome.DisplayManager.Session"
#define GDM_SESSION_DBUS_ERROR_CANCEL "org.gnome.DisplayManager.Session.Error.Cancel"
struct _GdmSessionDirectPrivate
{
+ /* per open scope */
+ char *selected_session;
+ char *selected_language;
+ char *selected_user;
+ char *user_x11_authority_file;
+
+ DBusMessage *message_pending_reply;
+ DBusConnection *worker_connection;
+ CkConnector *ckc;
+
GdmSessionWorkerJob *job;
GPid session_pid;
+ guint32 is_verified : 1;
+ guint32 is_running : 1;
+ /* object lifetime scope */
char *service_name;
- char *username;
- char *hostname;
- char *x11_display_name;
+ char *display_name;
+ char *display_hostname;
char *display_device;
-
- DBusMessage *message_pending_reply;
-
- GHashTable *environment;
+ gboolean display_is_local;
DBusServer *server;
char *server_address;
- DBusConnection *worker_connection;
-
- guint32 is_verified : 1;
- guint32 is_running : 1;
+ GHashTable *environment;
};
enum {
- USER_VERIFIED = 0,
- USER_VERIFICATION_ERROR,
- INFO,
- PROBLEM,
- INFO_QUERY,
- SECRET_INFO_QUERY,
- SESSION_STARTED,
- SESSION_STARTUP_ERROR,
- SESSION_EXITED,
- SESSION_DIED,
- OPENED,
- CLOSED,
- LAST_SIGNAL
+ PROP_0,
+ PROP_DISPLAY_NAME,
+ PROP_DISPLAY_HOSTNAME,
+ PROP_DISPLAY_IS_LOCAL,
+ PROP_DISPLAY_DEVICE,
+ PROP_USER_X11_AUTHORITY_FILE,
};
-static guint gdm_session_direct_signals [LAST_SIGNAL];
+static void gdm_session_iface_init (GdmSessionIface *iface);
-G_DEFINE_TYPE (GdmSessionDirect, gdm_session_direct, G_TYPE_OBJECT);
+G_DEFINE_TYPE_WITH_CODE (GdmSessionDirect,
+ gdm_session_direct,
+ G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GDM_TYPE_SESSION,
+ gdm_session_iface_init));
GQuark
gdm_session_direct_error_quark (void)
@@ -157,248 +167,56 @@ send_dbus_string_signal (GdmSessionDirect *session,
}
static void
-gdm_session_direct_user_verification_error_handler (GdmSessionDirect *session,
- GError *error)
+on_user_verification_error (GdmSession *session,
+ const char *message)
{
- gdm_session_record_failed (session->priv->session_pid,
- session->priv->username,
- session->priv->hostname,
- session->priv->x11_display_name,
- session->priv->display_device);
+ 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);
}
static void
-gdm_session_direct_started_handler (GdmSessionDirect *session,
- GPid pid)
+on_session_started (GdmSession *session)
{
-
- gdm_session_record_login (session->priv->session_pid,
- session->priv->username,
- session->priv->hostname,
- session->priv->x11_display_name,
- session->priv->display_device);
+ 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);
}
static void
-gdm_session_direct_startup_error_handler (GdmSessionDirect *session,
- GError *error)
+on_session_startup_error (GdmSession *session,
+ const char *message)
{
- gdm_session_record_login (session->priv->session_pid,
- session->priv->username,
- session->priv->hostname,
- session->priv->x11_display_name,
- session->priv->display_device);
-}
-
-static void
-gdm_session_direct_exited_handler (GdmSessionDirect *session,
- int exit_code)
-{
- gdm_session_record_logout (session->priv->session_pid,
- session->priv->username,
- session->priv->hostname,
- session->priv->x11_display_name,
- session->priv->display_device);
-}
-
-static void
-gdm_session_direct_class_install_signals (GdmSessionDirectClass *session_class)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (session_class);
-
- gdm_session_direct_signals[OPENED] =
- g_signal_new ("opened",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, opened),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
- gdm_session_direct_signals[CLOSED] =
- g_signal_new ("closed",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, closed),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
- session_class->user_verified = NULL;
- gdm_session_direct_signals[USER_VERIFIED] =
- g_signal_new ("user-verified",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, user_verified),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
- session_class->user_verified = NULL;
-
- gdm_session_direct_signals[USER_VERIFICATION_ERROR] =
- g_signal_new ("user-verification-error",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, user_verification_error),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE,
- 1,
- G_TYPE_POINTER);
- session_class->user_verification_error = gdm_session_direct_user_verification_error_handler;
-
- gdm_session_direct_signals[INFO_QUERY] =
- g_signal_new ("info-query",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, info_query),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
- session_class->info_query = NULL;
-
- gdm_session_direct_signals[SECRET_INFO_QUERY] =
- g_signal_new ("secret-info-query",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, secret_info_query),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
- session_class->secret_info_query = NULL;
-
- gdm_session_direct_signals[INFO] =
- g_signal_new ("info",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, info),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
- session_class->info = NULL;
-
- gdm_session_direct_signals[PROBLEM] =
- g_signal_new ("problem",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, problem),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
- session_class->problem = NULL;
-
- gdm_session_direct_signals[SESSION_STARTED] =
- g_signal_new ("session-started",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, session_started),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE,
- 1,
- G_TYPE_INT);
- session_class->session_started = gdm_session_direct_started_handler;
-
- gdm_session_direct_signals[SESSION_STARTUP_ERROR] =
- g_signal_new ("session-startup-error",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, session_startup_error),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE,
- 1,
- G_TYPE_POINTER);
- session_class->session_startup_error = gdm_session_direct_startup_error_handler;
-
- gdm_session_direct_signals[SESSION_EXITED] =
- g_signal_new ("session-exited",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, session_exited),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE,
- 1,
- G_TYPE_INT);
- session_class->session_exited = gdm_session_direct_exited_handler;
-
- gdm_session_direct_signals[SESSION_DIED] =
- g_signal_new ("session-died",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionDirectClass, session_died),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE,
- 1,
- G_TYPE_INT);
- session_class->session_died = NULL;
-}
-
-static void
-gdm_session_direct_finalize (GObject *object)
-{
- GdmSessionDirect *session;
- GObjectClass *parent_class;
-
- session = GDM_SESSION_DIRECT (object);
-
- g_free (session->priv->username);
-
- parent_class = G_OBJECT_CLASS (gdm_session_direct_parent_class);
-
- if (session->priv->environment != NULL) {
- g_hash_table_destroy (session->priv->environment);
- session->priv->environment = NULL;
- }
-
- if (parent_class->finalize != NULL)
- parent_class->finalize (object);
+ 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);
}
static void
-gdm_session_direct_class_init (GdmSessionDirectClass *session_class)
+on_session_exited (GdmSession *session,
+ int exit_code)
{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (session_class);
-
- object_class->finalize = gdm_session_direct_finalize;
-
- gdm_session_direct_class_install_signals (session_class);
-
- g_type_class_add_private (session_class,
- sizeof (GdmSessionDirectPrivate));
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ gdm_session_record_logout (impl->priv->session_pid,
+ impl->priv->selected_user,
+ impl->priv->display_hostname,
+ impl->priv->display_name,
+ impl->priv->display_device);
}
static DBusHandlerResult
-gdm_session_direct_handle_verified (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_verified (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusMessage *reply;
@@ -409,21 +227,19 @@ gdm_session_direct_handle_verified (GdmSessionDirect *session,
dbus_message_unref (reply);
session->priv->is_verified = TRUE;
- g_signal_emit (session,
- gdm_session_direct_signals[USER_VERIFIED],
- 0);
+
+ _gdm_session_user_verified (GDM_SESSION (session));
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult
-gdm_session_direct_handle_verification_failed (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_verification_failed (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusMessage *reply;
DBusError error;
- GError *gerror;
const char *text;
dbus_error_init (&error);
@@ -439,23 +255,15 @@ gdm_session_direct_handle_verification_failed (GdmSessionDirect *session,
g_debug ("Emitting 'verification-failed' signal");
- gerror = g_error_new (GDM_SESSION_DIRECT_ERROR,
- GDM_SESSION_DIRECT_ERROR_AUTHENTICATING,
- "%s",
- text);
-
- g_signal_emit (session,
- gdm_session_direct_signals[USER_VERIFICATION_ERROR],
- 0, gerror);
- g_error_free (gerror);
+ _gdm_session_user_verification_error (GDM_SESSION (session), NULL);
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult
-gdm_session_direct_handle_username_changed (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_username_changed (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusMessage *reply;
DBusError error;
@@ -473,11 +281,13 @@ gdm_session_direct_handle_username_changed (GdmSessionDirect *session,
dbus_message_unref (reply);
g_debug ("changing username from '%s' to '%s'",
- session->priv->username != NULL ? session->priv->username : "<unset>",
+ session->priv->selected_user != NULL ? session->priv->selected_user : "<unset>",
(strlen (text)) ? text : "<unset>");
- g_free (session->priv->username);
- session->priv->username = (strlen (text) > 0) ? g_strdup (text) : NULL;
+ g_free (session->priv->selected_user);
+ session->priv->selected_user = (strlen (text) > 0) ? g_strdup (text) : NULL;
+
+ _gdm_session_selected_user_changed (GDM_SESSION (session), session->priv->selected_user);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -485,7 +295,7 @@ gdm_session_direct_handle_username_changed (GdmSessionDirect *session,
static void
cancel_pending_query (GdmSessionDirect *session)
{
- DBusMessage *reply;
+ DBusMessage *reply;
if (session->priv->message_pending_reply == NULL) {
return;
@@ -506,7 +316,7 @@ cancel_pending_query (GdmSessionDirect *session)
static void
answer_pending_query (GdmSessionDirect *session,
- const char *answer)
+ const char *answer)
{
DBusMessage *reply;
DBusMessageIter iter;
@@ -525,8 +335,8 @@ answer_pending_query (GdmSessionDirect *session,
}
static void
-set_pending_query (GdmSessionDirect *session,
- DBusMessage *message)
+set_pending_query (GdmSessionDirect *session,
+ DBusMessage *message)
{
g_assert (session->priv->message_pending_reply == NULL);
@@ -534,9 +344,9 @@ set_pending_query (GdmSessionDirect *session,
}
static DBusHandlerResult
-gdm_session_direct_handle_info_query (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_info_query (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusError error;
const char *text;
@@ -551,17 +361,15 @@ gdm_session_direct_handle_info_query (GdmSessionDirect *session,
set_pending_query (session, message);
g_debug ("Emitting 'info-query' signal");
- g_signal_emit (session,
- gdm_session_direct_signals[INFO_QUERY],
- 0, text);
+ _gdm_session_info_query (GDM_SESSION (session), text);
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult
-gdm_session_direct_handle_secret_info_query (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_secret_info_query (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusError error;
const char *text;
@@ -576,18 +384,15 @@ gdm_session_direct_handle_secret_info_query (GdmSessionDirect *session,
set_pending_query (session, message);
g_debug ("Emitting 'secret-info-query' signal");
-
- g_signal_emit (session,
- gdm_session_direct_signals[SECRET_INFO_QUERY],
- 0, text);
+ _gdm_session_secret_info_query (GDM_SESSION (session), text);
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult
-gdm_session_direct_handle_info (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_info (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusMessage *reply;
DBusError error;
@@ -605,17 +410,15 @@ gdm_session_direct_handle_info (GdmSessionDirect *session,
dbus_message_unref (reply);
g_debug ("Emitting 'info' signal");
- g_signal_emit (session,
- gdm_session_direct_signals[INFO],
- 0, text);
+ _gdm_session_info (GDM_SESSION (session), text);
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult
-gdm_session_direct_handle_problem (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_problem (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusMessage *reply;
DBusError error;
@@ -633,16 +436,15 @@ gdm_session_direct_handle_problem (GdmSessionDirect *session,
dbus_message_unref (reply);
g_debug ("Emitting 'problem' signal");
- g_signal_emit (session,
- gdm_session_direct_signals[PROBLEM],
- 0, text);
+ _gdm_session_problem (GDM_SESSION (session), text);
+
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult
-gdm_session_direct_handle_session_started (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_session_started (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusMessage *reply;
DBusError error;
@@ -665,17 +467,15 @@ gdm_session_direct_handle_session_started (GdmSessionDirect *session,
session->priv->session_pid = pid;
session->priv->is_running = TRUE;
- g_signal_emit (session,
- gdm_session_direct_signals[SESSION_STARTED],
- 0, pid);
+ _gdm_session_session_started (GDM_SESSION (session));
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult
-gdm_session_direct_handle_startup_failed (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_startup_failed (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusMessage *reply;
DBusError error;
@@ -693,18 +493,15 @@ gdm_session_direct_handle_startup_failed (GdmSessionDirect *session,
dbus_message_unref (reply);
g_debug ("Emitting 'session-startup-error' signal");
-
- g_signal_emit (session,
- gdm_session_direct_signals[SESSION_STARTUP_ERROR],
- 0, text);
+ _gdm_session_session_startup_error (GDM_SESSION (session), text);
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult
-gdm_session_direct_handle_session_exited (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_session_exited (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusMessage *reply;
DBusError error;
@@ -725,17 +522,15 @@ gdm_session_direct_handle_session_exited (GdmSessionDirect *session,
code);
session->priv->is_running = FALSE;
- g_signal_emit (session,
- gdm_session_direct_signals[SESSION_EXITED],
- 0, code);
+ _gdm_session_session_exited (GDM_SESSION (session), code);
return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult
-gdm_session_direct_handle_session_died (GdmSessionDirect *session,
- DBusConnection *connection,
- DBusMessage *message)
+gdm_session_direct_handle_session_died (GdmSessionDirect *session,
+ DBusConnection *connection,
+ DBusMessage *message)
{
DBusMessage *reply;
DBusError error;
@@ -756,9 +551,8 @@ gdm_session_direct_handle_session_died (GdmSessionDirect *session,
code);
session->priv->is_running = FALSE;
- g_signal_emit (session,
- gdm_session_direct_signals[SESSION_DIED],
- 0, code);
+ _gdm_session_session_died (GDM_SESSION (session), code);
+
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -1032,7 +826,7 @@ handle_connection (DBusServer *server,
session);
g_debug ("Emitting opened signal");
- g_signal_emit (session, gdm_session_direct_signals [OPENED], 0);
+ _gdm_session_opened (GDM_SESSION (session));
}
}
@@ -1081,10 +875,38 @@ setup_server (GdmSessionDirect *session)
static void
gdm_session_direct_init (GdmSessionDirect *session)
{
+ const char * const *languages;
+
session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session,
GDM_TYPE_SESSION_DIRECT,
GdmSessionDirectPrivate);
+ g_signal_connect (session,
+ "user-verification-error",
+ G_CALLBACK (on_user_verification_error),
+ NULL);
+ g_signal_connect (session,
+ "session-started",
+ G_CALLBACK (on_session_started),
+ NULL);
+ g_signal_connect (session,
+ "session-startup-error",
+ G_CALLBACK (on_session_startup_error),
+ NULL);
+ g_signal_connect (session,
+ "session-exited",
+ G_CALLBACK (on_session_exited),
+ NULL);
+
+ languages = g_get_language_names ();
+ if (languages != NULL) {
+ session->priv->selected_language = g_strdup (languages[0]);
+ }
+
+ session->priv->session_pid = -1;
+ session->priv->selected_session = g_strdup ("gnome.desktop");
+ session->priv->service_name = g_strdup ("gdm");
+
session->priv->environment = g_hash_table_new_full (g_str_hash,
g_str_equal,
(GDestroyNotify) g_free,
@@ -1093,26 +915,16 @@ gdm_session_direct_init (GdmSessionDirect *session)
setup_server (session);
}
-GdmSessionDirect *
-gdm_session_direct_new (void)
-{
- GdmSessionDirect *session;
-
- session = g_object_new (GDM_TYPE_SESSION_DIRECT, NULL);
-
- return session;
-}
-
static void
worker_stopped (GdmSessionWorkerJob *job,
- GdmSessionDirect *session)
+ GdmSessionDirect *session)
{
g_debug ("Worker job stopped");
}
static void
worker_started (GdmSessionWorkerJob *job,
- GdmSessionDirect *session)
+ GdmSessionDirect *session)
{
g_debug ("Worker job started");
}
@@ -1120,50 +932,36 @@ worker_started (GdmSessionWorkerJob *job,
static void
worker_exited (GdmSessionWorkerJob *job,
int code,
- GdmSessionDirect *session)
+ GdmSessionDirect *session)
{
g_debug ("Worker job exited: %d", code);
if (!session->priv->is_verified) {
- GError *error;
-
- error = g_error_new (GDM_SESSION_DIRECT_ERROR,
- GDM_SESSION_DIRECT_ERROR_WORKER_DIED,
- _("worker exited with status %d"),
- code);
+ char *msg;
- g_signal_emit (session,
- gdm_session_direct_signals [USER_VERIFICATION_ERROR],
- 0, error);
- g_error_free (error);
+ msg = g_strdup_printf (_("worker exited with status %d"), code);
+ _gdm_session_user_verification_error (GDM_SESSION (session), msg);
+ g_free (msg);
} else if (session->priv->is_running) {
- g_signal_emit (session,
- gdm_session_direct_signals [SESSION_EXITED],
- 0, code);
+ _gdm_session_session_exited (GDM_SESSION (session), code);
}
}
static void
worker_died (GdmSessionWorkerJob *job,
int signum,
- GdmSessionDirect *session)
+ GdmSessionDirect *session)
{
g_debug ("Worker job died: %d", signum);
if (!session->priv->is_verified) {
- GError *error;
- error = g_error_new (GDM_SESSION_DIRECT_ERROR,
- GDM_SESSION_DIRECT_ERROR_WORKER_DIED,
- _("worker got signal '%s' and was subsequently killed"),
- g_strsignal (signum));
- g_signal_emit (session,
- gdm_session_direct_signals[USER_VERIFICATION_ERROR],
- 0, error);
- g_error_free (error);
+ char *msg;
+
+ msg = g_strdup_printf (_("worker exited with status %d"), signum);
+ _gdm_session_user_verification_error (GDM_SESSION (session), msg);
+ g_free (msg);
} else if (session->priv->is_running) {
- g_signal_emit (session,
- gdm_session_direct_signals[SESSION_EXITED],
- 0, signum);
+ _gdm_session_session_died (GDM_SESSION (session), signum);
}
}
@@ -1196,32 +994,17 @@ start_worker (GdmSessionDirect *session)
return res;
}
-gboolean
-gdm_session_direct_open (GdmSessionDirect *session,
- const char *service_name,
- const char *hostname,
- const char *x11_display_name,
- const char *display_device,
- GError **error)
+static void
+gdm_session_direct_open (GdmSession *session)
{
- gboolean res;
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ gboolean res;
- g_return_val_if_fail (session != NULL, FALSE);
- g_return_val_if_fail (service_name != NULL, FALSE);
- g_return_val_if_fail (x11_display_name != NULL, FALSE);
- g_return_val_if_fail (display_device != NULL, FALSE);
- g_return_val_if_fail (hostname != NULL, FALSE);
+ g_return_if_fail (session != NULL);
g_debug ("Openning session");
- res = start_worker (session);
-
- session->priv->service_name = g_strdup (service_name);
- session->priv->hostname = g_strdup (hostname);
- session->priv->x11_display_name = g_strdup (x11_display_name);
- session->priv->display_device = g_strdup (display_device);
-
- return res;
+ res = start_worker (impl);
}
static void
@@ -1238,9 +1021,9 @@ send_begin_verification (GdmSessionDirect *session)
dbus_message_iter_init_append (message, &iter);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->service_name);
- dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->x11_display_name);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->display_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->display_device);
- dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->hostname);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->display_hostname);
if (! send_dbus_message (session->priv->worker_connection, message)) {
g_debug ("Could not send %s signal", "BeginVerification");
@@ -1255,7 +1038,7 @@ send_begin_verification_for_user (GdmSessionDirect *session)
DBusMessage *message;
DBusMessageIter iter;
- g_debug ("Beginning verification for user %s", session->priv->username);
+ g_debug ("Beginning verification for user %s", session->priv->selected_user);
message = dbus_message_new_signal (GDM_SESSION_DBUS_PATH,
GDM_SESSION_DBUS_INTERFACE,
@@ -1263,10 +1046,10 @@ send_begin_verification_for_user (GdmSessionDirect *session)
dbus_message_iter_init_append (message, &iter);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->service_name);
- dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->x11_display_name);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->display_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->display_device);
- dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->hostname);
- dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->username);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->display_hostname);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->selected_user);
if (! send_dbus_message (session->priv->worker_connection, message)) {
g_debug ("Could not send %s signal", "BeginVerificationForUser");
@@ -1275,28 +1058,35 @@ send_begin_verification_for_user (GdmSessionDirect *session)
dbus_message_unref (message);
}
-gboolean
-gdm_session_direct_begin_verification (GdmSessionDirect *session,
- const char *username,
- GError **error)
+static void
+gdm_session_direct_begin_verification (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));
+
+ send_begin_verification (impl);
+}
+
+static void
+gdm_session_direct_begin_verification_for_user (GdmSession *session,
+ const char *username)
{
- g_return_val_if_fail (session != NULL, FALSE);
- g_return_val_if_fail (dbus_connection_get_is_connected (session->priv->worker_connection), FALSE);
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
- session->priv->username = g_strdup (username);
+ g_return_if_fail (session != NULL);
+ g_return_if_fail (dbus_connection_get_is_connected (impl->priv->worker_connection));
+ g_return_if_fail (username != NULL);
- if (username == NULL) {
- send_begin_verification (session);
- } else {
- send_begin_verification_for_user (session);
- }
+ impl->priv->selected_user = g_strdup (username);
- return TRUE;
+ send_begin_verification_for_user (impl);
}
static void
-send_environment_variable (const char *key,
- const char *value,
+send_environment_variable (const char *key,
+ const char *value,
GdmSessionDirect *session)
{
DBusMessage *message;
@@ -1326,77 +1116,180 @@ send_environment (GdmSessionDirect *session)
session);
}
-void
-gdm_session_direct_start_program (GdmSessionDirect *session,
- const char *command)
+static gboolean
+is_prog_in_path (const char *prog)
{
- g_return_if_fail (session != NULL);
- g_return_if_fail (session != NULL);
- g_return_if_fail (gdm_session_direct_is_running (session) == FALSE);
- g_return_if_fail (command != NULL);
+ char *f;
+ gboolean ret;
- send_environment (session);
-
- send_dbus_string_signal (session, "StartProgram", command);
+ f = g_find_program_in_path (prog);
+ ret = (f != NULL);
+ g_free (f);
+ return ret;
}
-void
-gdm_session_direct_close (GdmSessionDirect *session)
+static gboolean
+get_session_command_for_file (const char *file,
+ char **command)
{
- g_return_if_fail (session != NULL);
-
- g_debug ("Closing session");
+ GKeyFile *key_file;
+ GError *error;
+ char *full_path;
+ char *exec;
+ gboolean ret;
+ gboolean res;
+ const char *search_dirs[] = {
+ "/etc/X11/sessions/",
+ DMCONFDIR "/Sessions/",
+ DATADIR "/gdm/BuiltInSessions/",
+ DATADIR "/xsessions/",
+ NULL
+ };
+
+ exec = NULL;
+ ret = FALSE;
+ if (command != NULL) {
+ *command = NULL;
+ }
- if (session->priv->job != NULL) {
- if (session->priv->is_running) {
- gdm_session_record_logout (session->priv->session_pid,
- session->priv->username,
- session->priv->hostname,
- session->priv->x11_display_name,
- session->priv->display_device);
+ key_file = g_key_file_new ();
+
+ error = NULL;
+ full_path = NULL;
+ res = g_key_file_load_from_dirs (key_file,
+ file,
+ search_dirs,
+ &full_path,
+ G_KEY_FILE_NONE,
+ &error);
+ if (! res) {
+ g_debug ("File '%s' not found: %s", file, error->message);
+ g_error_free (error);
+ if (command != NULL) {
+ *command = NULL;
}
+ goto out;
+ }
- cancel_pending_query (session);
+ error = NULL;
+ res = g_key_file_get_boolean (key_file,
+ G_KEY_FILE_DESKTOP_GROUP,
+ G_KEY_FILE_DESKTOP_KEY_HIDDEN,
+ &error);
+ if (error == NULL && res) {
+ g_debug ("Session %s is marked as hidden", file);
+ goto out;
+ }
- if (session->priv->worker_connection != NULL) {
- dbus_connection_close (session->priv->worker_connection);
- }
+ error = NULL;
+ exec = g_key_file_get_string (key_file,
+ G_KEY_FILE_DESKTOP_GROUP,
+ G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
+ &error);
+ if (exec == NULL) {
+ g_debug ("%s key not found", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
+ goto out;
+ }
- gdm_session_worker_job_stop (session->priv->job);
+ res = is_prog_in_path (exec);
+ g_free (exec);
+ if (! res) {
+ g_debug ("Command not found: %s", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
+ goto out;
}
- session->priv->is_running = FALSE;
- session->priv->is_verified = FALSE;
-
- if (session->priv->service_name) {
- g_free (session->priv->service_name);
- session->priv->service_name = NULL;
+ error = NULL;
+ exec = g_key_file_get_string (key_file,
+ G_KEY_FILE_DESKTOP_GROUP,
+ G_KEY_FILE_DESKTOP_KEY_EXEC,
+ &error);
+ if (error != NULL) {
+ g_debug ("%s key not found: %s",
+ G_KEY_FILE_DESKTOP_KEY_EXEC,
+ error->message);
+ g_error_free (error);
+ goto out;
}
- if (session->priv->hostname) {
- g_free (session->priv->hostname);
- session->priv->hostname = NULL;
+ if (command != NULL) {
+ *command = g_strdup (exec);
}
+ ret = TRUE;
+
+out:
+ g_free (exec);
+
+ return ret;
+}
- if (session->priv->username) {
- g_free (session->priv->username);
- session->priv->username = NULL;
+static char *
+get_session_command (GdmSessionDirect *session)
+{
+ gboolean res;
+ char *command;
+
+ command = NULL;
+ res = get_session_command_for_file (session->priv->selected_session,
+ &command);
+ if (! res) {
+ g_critical ("Cannot read specified session file: %s", session->priv->selected_session);
+ exit (1);
}
+
+ return command;
}
-gboolean
-gdm_session_direct_is_running (GdmSessionDirect *session)
+static gboolean
+open_ck_session (GdmSessionDirect *session)
{
- g_return_val_if_fail (session != NULL, FALSE);
+ struct passwd *pwent;
+ gboolean ret;
+ int res;
+ DBusError error;
- return session->priv->is_running;
+ pwent = getpwnam (session->priv->selected_user);
+ if (pwent == NULL) {
+ return FALSE;
+ }
+
+ session->priv->ckc = ck_connector_new ();
+ if (session->priv->ckc == NULL) {
+ g_warning ("Couldn't create new ConsoleKit connector");
+ goto out;
+ }
+
+ dbus_error_init (&error);
+ res = ck_connector_open_session_with_parameters (session->priv->ckc,
+ &error,
+ "unix-user", &pwent->pw_uid,
+ "x11-display", &session->priv->display_name,
+ "x11-display-device", &session->priv->display_device,
+ "remote-host-name", &session->priv->display_hostname,
+ "is-local", &session->priv->display_is_local,
+ NULL);
+
+ if (! res) {
+ if (dbus_error_is_set (&error)) {
+ g_warning ("%s\n", error.message);
+ dbus_error_free (&error);
+ } else {
+ g_warning ("cannot open CK session: OOM, D-Bus system bus not available,\n"
+ "ConsoleKit not available or insufficient privileges.\n");
+ }
+ goto out;
+ }
+
+ ret = TRUE;
+
+ out:
+ return ret;
}
-void
+static void
gdm_session_direct_set_environment_variable (GdmSessionDirect *session,
- const char *key,
- const char *value)
+ const char *key,
+ const char *value)
{
g_return_if_fail (session != NULL);
g_return_if_fail (session != NULL);
@@ -1408,13 +1301,146 @@ gdm_session_direct_set_environment_variable (GdmSessionDirect *session,
g_strdup (value));
}
-void
-gdm_session_direct_answer_query (GdmSessionDirect *session,
- const char *answer)
+static void
+setup_session_environment (GdmSessionDirect *session)
{
+ const char *session_cookie;
+ gboolean res;
+
+ session_cookie = NULL;
+ res = open_ck_session (session);
+ if (res) {
+ session_cookie = ck_connector_get_cookie (session->priv->ckc);
+ }
+
+ gdm_session_direct_set_environment_variable (session,
+ "GDMSESSION",
+ session->priv->selected_session);
+ gdm_session_direct_set_environment_variable (session,
+ "DESKTOP_SESSION",
+ session->priv->selected_session);
+
+ gdm_session_direct_set_environment_variable (session,
+ "LANG",
+ session->priv->selected_language);
+ gdm_session_direct_set_environment_variable (session,
+ "GDM_LANG",
+ session->priv->selected_language);
+
+ gdm_session_direct_set_environment_variable (session,
+ "DISPLAY",
+ session->priv->display_name);
+ if (session_cookie != NULL) {
+ gdm_session_direct_set_environment_variable (session,
+ "XDG_SESSION_COOKIE",
+ session_cookie);
+ }
+
+ if (session->priv->user_x11_authority_file != NULL) {
+ gdm_session_direct_set_environment_variable (session,
+ "XAUTHORITY",
+ session->priv->user_x11_authority_file);
+ }
+
+ gdm_session_direct_set_environment_variable (session,
+ "PATH",
+ "/bin:/usr/bin:" BINDIR);
+
+}
+
+static void
+gdm_session_direct_start_session (GdmSession *session)
+{
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ char *command;
+
+ g_return_if_fail (session != NULL);
+ g_return_if_fail (impl->priv->is_running == FALSE);
+
+ command = get_session_command (impl);
+
+ setup_session_environment (impl);
+ send_environment (impl);
+
+ send_dbus_string_signal (impl, "StartProgram", command);
+}
+
+static void
+gdm_session_direct_close (GdmSession *session)
+{
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+
+ g_return_if_fail (session != NULL);
+
+ g_debug ("Closing session");
+
+ if (impl->priv->ckc != NULL) {
+ ck_connector_close_session (impl->priv->ckc, NULL);
+ ck_connector_unref (impl->priv->ckc);
+ impl->priv->ckc = NULL;
+ }
+
+ 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);
+ }
+
+ cancel_pending_query (impl);
+
+ if (impl->priv->worker_connection != NULL) {
+ dbus_connection_close (impl->priv->worker_connection);
+ impl->priv->worker_connection = NULL;
+ }
+
+ gdm_session_worker_job_stop (impl->priv->job);
+ impl->priv->job = NULL;
+ }
+
+ impl->priv->is_running = FALSE;
+ impl->priv->is_verified = FALSE;
+
+ g_free (impl->priv->selected_user);
+ impl->priv->selected_user = NULL;
+
+ g_free (impl->priv->selected_session);
+ impl->priv->selected_session = NULL;
+
+ g_free (impl->priv->selected_language);
+ impl->priv->selected_language = NULL;
+
+ g_free (impl->priv->user_x11_authority_file);
+ impl->priv->user_x11_authority_file = NULL;
+
+ g_hash_table_remove_all (impl->priv->environment);
+
+ impl->priv->session_pid = -1;
+ impl->priv->is_verified = FALSE;
+ impl->priv->is_running = FALSE;
+}
+
+static void
+gdm_session_direct_answer_query (GdmSession *session,
+ const char *text)
+{
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+
+ g_return_if_fail (session != NULL);
+
+ answer_pending_query (impl, text);
+}
+
+static void
+gdm_session_direct_cancel (GdmSession *session)
+{
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+
g_return_if_fail (session != NULL);
- answer_pending_query (session, answer);
+ cancel_pending_query (impl);
}
char *
@@ -1422,5 +1448,284 @@ gdm_session_direct_get_username (GdmSessionDirect *session)
{
g_return_val_if_fail (session != NULL, NULL);
- return g_strdup (session->priv->username);
+ return g_strdup (session->priv->selected_user);
+}
+
+static void
+gdm_session_direct_select_session (GdmSession *session,
+ const char *text)
+{
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+
+ g_free (impl->priv->selected_session);
+ impl->priv->selected_session = g_strdup (text);
+}
+
+static void
+gdm_session_direct_select_language (GdmSession *session,
+ const char *text)
+{
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+
+ g_free (impl->priv->selected_language);
+ impl->priv->selected_language = g_strdup (text);
+}
+
+static void
+gdm_session_direct_select_user (GdmSession *session,
+ const char *text)
+{
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+
+ g_free (impl->priv->selected_user);
+ impl->priv->selected_user = g_strdup (text);
+}
+
+/* At some point we may want to read these right from
+ * the slave but for now I don't want the dependency */
+static void
+_gdm_session_direct_set_display_name (GdmSessionDirect *session,
+ const char *name)
+{
+ g_free (session->priv->display_name);
+ session->priv->display_name = g_strdup (name);
+}
+
+static void
+_gdm_session_direct_set_display_hostname (GdmSessionDirect *session,
+ const char *name)
+{
+ g_free (session->priv->display_hostname);
+ session->priv->display_hostname = g_strdup (name);
+}
+
+static void
+_gdm_session_direct_set_display_device (GdmSessionDirect *session,
+ const char *name)
+{
+ g_debug ("Setting display device: %s", name);
+ g_free (session->priv->display_device);
+ session->priv->display_device = g_strdup (name);
+}
+
+static void
+_gdm_session_direct_set_user_x11_authority_file (GdmSessionDirect *session,
+ const char *name)
+{
+ g_free (session->priv->user_x11_authority_file);
+ session->priv->user_x11_authority_file = g_strdup (name);
+}
+
+static void
+_gdm_session_direct_set_display_is_local (GdmSessionDirect *session,
+ gboolean is)
+{
+ session->priv->display_is_local = is;
+}
+
+static void
+gdm_session_direct_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GdmSessionDirect *self;
+
+ self = GDM_SESSION_DIRECT (object);
+
+ switch (prop_id) {
+ case PROP_DISPLAY_NAME:
+ _gdm_session_direct_set_display_name (self, g_value_get_string (value));
+ break;
+ case PROP_DISPLAY_HOSTNAME:
+ _gdm_session_direct_set_display_hostname (self, g_value_get_string (value));
+ break;
+ case PROP_DISPLAY_DEVICE:
+ _gdm_session_direct_set_display_device (self, g_value_get_string (value));
+ break;
+ case PROP_USER_X11_AUTHORITY_FILE:
+ _gdm_session_direct_set_user_x11_authority_file (self, g_value_get_string (value));
+ break;
+ case PROP_DISPLAY_IS_LOCAL:
+ _gdm_session_direct_set_display_is_local (self, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gdm_session_direct_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GdmSessionDirect *self;
+
+ self = GDM_SESSION_DIRECT (object);
+
+ switch (prop_id) {
+ case PROP_DISPLAY_NAME:
+ g_value_set_string (value, self->priv->display_name);
+ break;
+ case PROP_DISPLAY_HOSTNAME:
+ g_value_set_string (value, self->priv->display_hostname);
+ break;
+ case PROP_DISPLAY_DEVICE:
+ g_value_set_string (value, self->priv->display_device);
+ break;
+ case PROP_USER_X11_AUTHORITY_FILE:
+ g_value_set_string (value, self->priv->user_x11_authority_file);
+ break;
+ case PROP_DISPLAY_IS_LOCAL:
+ g_value_set_boolean (value, self->priv->display_is_local);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gdm_session_direct_dispose (GObject *object)
+{
+ GdmSessionDirect *session;
+
+ session = GDM_SESSION_DIRECT (object);
+
+ g_debug ("Disposing session");
+
+ gdm_session_direct_close (GDM_SESSION (session));
+
+ g_free (session->priv->service_name);
+ session->priv->service_name = NULL;
+
+ g_free (session->priv->display_name);
+ session->priv->display_name = NULL;
+
+ g_free (session->priv->display_hostname);
+ session->priv->display_hostname = NULL;
+
+ g_free (session->priv->display_device);
+ session->priv->display_device = NULL;
+
+ g_free (session->priv->server_address);
+ session->priv->server_address = NULL;
+
+ if (session->priv->server != NULL) {
+ dbus_server_disconnect (session->priv->server);
+ dbus_server_unref (session->priv->server);
+ session->priv->server = NULL;
+ }
+
+ if (session->priv->environment != NULL) {
+ g_hash_table_destroy (session->priv->environment);
+ session->priv->environment = NULL;
+ }
+
+ G_OBJECT_CLASS (gdm_session_direct_parent_class)->dispose (object);
+}
+
+static void
+gdm_session_direct_finalize (GObject *object)
+{
+ GdmSessionDirect *session;
+ GObjectClass *parent_class;
+
+ session = GDM_SESSION_DIRECT (object);
+
+ g_free (session->priv->selected_user);
+
+ parent_class = G_OBJECT_CLASS (gdm_session_direct_parent_class);
+
+ if (parent_class->finalize != NULL)
+ parent_class->finalize (object);
+}
+
+static void
+gdm_session_iface_init (GdmSessionIface *iface)
+{
+ iface->begin_verification = gdm_session_direct_begin_verification;
+ iface->begin_verification_for_user = gdm_session_direct_begin_verification_for_user;
+ iface->open = gdm_session_direct_open;
+ iface->close = gdm_session_direct_close;
+ iface->cancel = gdm_session_direct_cancel;
+ iface->start_session = gdm_session_direct_start_session;
+ iface->answer_query = gdm_session_direct_answer_query;
+ iface->select_session = gdm_session_direct_select_session;
+ iface->select_language = gdm_session_direct_select_language;
+ iface->select_user = gdm_session_direct_select_user;
+}
+
+static void
+gdm_session_direct_class_init (GdmSessionDirectClass *session_class)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (session_class);
+
+ object_class->get_property = gdm_session_direct_get_property;
+ object_class->set_property = gdm_session_direct_set_property;
+ object_class->dispose = gdm_session_direct_dispose;
+ object_class->finalize = gdm_session_direct_finalize;
+
+ g_type_class_add_private (session_class, sizeof (GdmSessionDirectPrivate));
+
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_NAME,
+ g_param_spec_string ("display-name",
+ "display name",
+ "display name",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_HOSTNAME,
+ g_param_spec_string ("display-hostname",
+ "display hostname",
+ "display hostname",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_IS_LOCAL,
+ g_param_spec_boolean ("display-is-local",
+ "display is local",
+ "display is local",
+ TRUE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ /* not construct only */
+ g_object_class_install_property (object_class,
+ PROP_USER_X11_AUTHORITY_FILE,
+ g_param_spec_string ("user-x11-authority-file",
+ "",
+ "",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_DEVICE,
+ g_param_spec_string ("display-device",
+ "display device",
+ "display device",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+
+}
+
+GdmSessionDirect *
+gdm_session_direct_new (const char *display_name,
+ const char *display_hostname,
+ const char *display_device,
+ gboolean display_is_local)
+{
+ GdmSessionDirect *session;
+
+ session = g_object_new (GDM_TYPE_SESSION_DIRECT,
+ "display-name", display_name,
+ "display-hostname", display_hostname,
+ "display-device", display_device,
+ "display-is-local", display_is_local,
+ NULL);
+
+ return session;
}
diff --git a/daemon/gdm-session-direct.h b/daemon/gdm-session-direct.h
index d4eea4c4..51083789 100644
--- a/daemon/gdm-session-direct.h
+++ b/daemon/gdm-session-direct.h
@@ -22,6 +22,7 @@
#define __GDM_SESSION_DIRECT_H
#include <glib-object.h>
+#include "gdm-session.h"
G_BEGIN_DECLS
@@ -37,48 +38,13 @@ typedef struct _GdmSessionDirectPrivate GdmSessionDirectPrivate;
typedef struct
{
- GObject parent;
-
- /*< private > */
+ GObject parent;
GdmSessionDirectPrivate *priv;
} GdmSessionDirect;
typedef struct
{
GObjectClass parent_class;
-
- /* signals */
- void (* opened) (GdmSessionDirect *session_direct);
- void (* closed) (GdmSessionDirect *session_direct);
-
- void (* user_verified) (GdmSessionDirect *session_direct);
-
- void (* user_verification_error) (GdmSessionDirect *session_direct,
- GError *error);
-
- void (* info_query) (GdmSessionDirect *session_direct,
- const char *query_text);
-
- void (* secret_info_query) (GdmSessionDirect *session_direct,
- const char *query_text);
-
- void (* info) (GdmSessionDirect *session_direct,
- const char *info);
-
- void (* problem) (GdmSessionDirect *session_direct,
- const char *problem);
-
- void (* session_started) (GdmSessionDirect *session_direct,
- GPid pid);
-
- void (* session_startup_error) (GdmSessionDirect *session_direct,
- GError *error);
-
- void (* session_exited) (GdmSessionDirect *session_direct,
- int exit_code);
-
- void (* session_died) (GdmSessionDirect *session_direct,
- int signal_number);
} GdmSessionDirectClass;
typedef enum _GdmSessionDirectError {
@@ -97,31 +63,13 @@ typedef enum _GdmSessionDirectError {
GType gdm_session_direct_get_type (void);
GQuark gdm_session_direct_error_quark (void);
-GdmSessionDirect * gdm_session_direct_new (void) G_GNUC_MALLOC;
-
-gboolean gdm_session_direct_open (GdmSessionDirect *session_direct,
- const char *service_name,
- const char *hostname,
- const char *x11_display_name,
- const char *console_name,
- GError **error);
-void gdm_session_direct_close (GdmSessionDirect *session_direct);
-gboolean gdm_session_direct_begin_verification (GdmSessionDirect *session_direct,
- const char *username,
- GError **error);
-void gdm_session_direct_start_program (GdmSessionDirect *session_direct,
- const char *command);
-void gdm_session_direct_set_environment_variable (GdmSessionDirect *session_direct,
- const char *key,
- const char *value);
-
-void gdm_session_direct_answer_query (GdmSessionDirect *session_direct,
- const char *answer);
+GdmSessionDirect * gdm_session_direct_new (const char *display_name,
+ const char *display_hostname,
+ const char *display_device,
+ gboolean display_is_local) G_GNUC_MALLOC;
char * gdm_session_direct_get_username (GdmSessionDirect *session_direct);
-gboolean gdm_session_direct_is_running (GdmSessionDirect *session_direct);
-
G_END_DECLS
#endif /* GDM_SESSION_DIRECT_H */
diff --git a/daemon/gdm-session-private.h b/daemon/gdm-session-private.h
new file mode 100644
index 00000000..caa2331d
--- /dev/null
+++ b/daemon/gdm-session-private.h
@@ -0,0 +1,65 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef __GDM_SESSION_PRIVATE_H
+#define __GDM_SESSION_PRIVATE_H
+
+#include <glib-object.h>
+#include "gdm-session.h"
+
+G_BEGIN_DECLS
+
+void _gdm_session_user_verified (GdmSession *session);
+
+void _gdm_session_user_verification_error (GdmSession *session,
+ const char *text);
+
+void _gdm_session_info_query (GdmSession *session,
+ const char *text);
+
+void _gdm_session_secret_info_query (GdmSession *session,
+ const char *text);
+
+void _gdm_session_info (GdmSession *session,
+ const char *text);
+
+void _gdm_session_problem (GdmSession *session,
+ const char *text);
+
+void _gdm_session_session_started (GdmSession *session);
+
+void _gdm_session_session_startup_error (GdmSession *session,
+ const char *message);
+
+void _gdm_session_session_exited (GdmSession *session,
+ int exit_code);
+
+void _gdm_session_session_died (GdmSession *session,
+ int signal_number);
+
+void _gdm_session_opened (GdmSession *session);
+void _gdm_session_closed (GdmSession *session);
+
+void _gdm_session_selected_user_changed (GdmSession *session,
+ const char *text);
+
+G_END_DECLS
+
+#endif /* __GDM_SESSION_PRIVATE_H */
diff --git a/daemon/gdm-session-relay.c b/daemon/gdm-session-relay.c
index 5baf3246..59575361 100644
--- a/daemon/gdm-session-relay.c
+++ b/daemon/gdm-session-relay.c
@@ -43,6 +43,7 @@
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-lowlevel.h>
+#include "gdm-session-private.h"
#include "gdm-session-relay.h"
#define GDM_SESSION_RELAY_DBUS_PATH "/org/gnome/DisplayManager/SessionRelay"
@@ -62,16 +63,6 @@ enum {
};
enum {
- USER_VERIFIED = 0,
- USER_VERIFICATION_ERROR,
- INFO,
- PROBLEM,
- INFO_QUERY,
- SECRET_INFO_QUERY,
- SESSION_STARTED,
- SESSION_STOPPED,
- OPENED,
- CLOSED,
CONNECTED,
DISCONNECTED,
LAST_SIGNAL
@@ -82,8 +73,13 @@ static guint signals [LAST_SIGNAL] = { 0, };
static void gdm_session_relay_class_init (GdmSessionRelayClass *klass);
static void gdm_session_relay_init (GdmSessionRelay *session_relay);
static void gdm_session_relay_finalize (GObject *object);
+static void gdm_session_iface_init (GdmSessionIface *iface);
-G_DEFINE_TYPE (GdmSessionRelay, gdm_session_relay, G_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_CODE (GdmSessionRelay,
+ gdm_session_relay,
+ G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GDM_TYPE_SESSION,
+ gdm_session_iface_init))
static gboolean
send_dbus_message (DBusConnection *connection,
@@ -153,60 +149,84 @@ send_dbus_void_signal (GdmSessionRelay *session_relay,
dbus_message_unref (message);
}
-void
-gdm_session_relay_open (GdmSessionRelay *session_relay)
+static void
+gdm_session_relay_open (GdmSession *session)
+{
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
+ send_dbus_void_signal (impl, "Open");
+}
+
+static void
+gdm_session_relay_close (GdmSession *session)
{
- send_dbus_void_signal (session_relay, "Open");
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
+ send_dbus_void_signal (impl, "Close");
}
-void
-gdm_session_relay_begin_verification (GdmSessionRelay *session_relay)
+static void
+gdm_session_relay_begin_verification (GdmSession *session)
{
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
g_debug ("Sending signal BeginVerification");
- send_dbus_void_signal (session_relay, "BeginVerification");
+ send_dbus_void_signal (impl, "BeginVerification");
}
-void
-gdm_session_relay_begin_verification_for_user (GdmSessionRelay *session_relay,
- const char *username)
+static void
+gdm_session_relay_begin_verification_for_user (GdmSession *session,
+ const char *username)
{
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
g_debug ("Sending signal BeginVerificationForUser");
- send_dbus_string_signal (session_relay, "BeginVerificationForUser", username);
+ send_dbus_string_signal (impl, "BeginVerificationForUser", username);
}
-void
-gdm_session_relay_answer_query (GdmSessionRelay *session_relay,
- const char *text)
+static void
+gdm_session_relay_answer_query (GdmSession *session,
+ const char *text)
{
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
g_debug ("Sending signal AnswerQuery");
- send_dbus_string_signal (session_relay, "AnswerQuery", text);
+ send_dbus_string_signal (impl, "AnswerQuery", text);
}
-void
-gdm_session_relay_select_session (GdmSessionRelay *session_relay,
- const char *text)
+static void
+gdm_session_relay_select_session (GdmSession *session,
+ const char *text)
{
- send_dbus_string_signal (session_relay, "SessionSelected", text);
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
+ send_dbus_string_signal (impl, "SessionSelected", text);
}
-void
-gdm_session_relay_select_language (GdmSessionRelay *session_relay,
- const char *text)
+static void
+gdm_session_relay_select_language (GdmSession *session,
+ const char *text)
{
- send_dbus_string_signal (session_relay, "LanguageSelected", text);
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
+ send_dbus_string_signal (impl, "LanguageSelected", text);
}
-void
-gdm_session_relay_select_user (GdmSessionRelay *session_relay,
- const char *text)
+static void
+gdm_session_relay_select_user (GdmSession *session,
+ const char *text)
{
- send_dbus_string_signal (session_relay, "UserSelected", text);
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
+ send_dbus_string_signal (impl, "UserSelected", text);
}
-void
-gdm_session_relay_cancel (GdmSessionRelay *session_relay)
+static void
+gdm_session_relay_cancel (GdmSession *session)
{
- send_dbus_void_signal (session_relay, "Cancelled");
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
+
+ send_dbus_void_signal (impl, "Cancelled");
+}
+
+static void
+gdm_session_relay_start_session (GdmSession *session)
+{
+ GdmSessionRelay *impl = GDM_SESSION_RELAY (session);
+
+ send_dbus_void_signal (impl, "StartSession");
}
/* Note: Use abstract sockets like dbus does by default on Linux. Abstract
@@ -259,7 +279,7 @@ handle_info_query (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (session_relay, signals [INFO_QUERY], 0, text);
+ _gdm_session_info_query (GDM_SESSION (session_relay), text);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -286,7 +306,7 @@ handle_secret_info_query (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (session_relay, signals [SECRET_INFO_QUERY], 0, text);
+ _gdm_session_secret_info_query (GDM_SESSION (session_relay), text);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -313,7 +333,7 @@ handle_info (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (session_relay, signals [INFO], 0, text);
+ _gdm_session_info (GDM_SESSION (session_relay), text);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -340,7 +360,7 @@ handle_problem (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (session_relay, signals [PROBLEM], 0, text);
+ _gdm_session_problem (GDM_SESSION (session_relay), text);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -361,7 +381,7 @@ handle_user_verified (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (session_relay, signals [USER_VERIFIED], 0);
+ _gdm_session_user_verified (GDM_SESSION (session_relay));
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -382,7 +402,7 @@ handle_user_verification_error (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (session_relay, signals [USER_VERIFICATION_ERROR], 0);
+ _gdm_session_user_verification_error (GDM_SESSION (session_relay), NULL);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -403,7 +423,7 @@ handle_session_started (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (session_relay, signals [SESSION_STARTED], 0);
+ _gdm_session_session_started (GDM_SESSION (session_relay));
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -424,7 +444,9 @@ handle_session_stopped (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (session_relay, signals [SESSION_STOPPED], 0);
+#if 0
+ _gdm_session_session_stopped (GDM_SESSION (session_relay));
+#endif
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -445,7 +467,7 @@ handle_opened (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- g_signal_emit (session_relay, signals [OPENED], 0);
+ _gdm_session_opened (GDM_SESSION (session_relay));
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -466,8 +488,9 @@ handle_reset (GdmSessionRelay *session_relay,
dbus_connection_send (connection, reply, NULL);
dbus_message_unref (reply);
- /* FIXME: */
- /*g_signal_emit (session_relay, signals [RESET], 0);*/
+#if 0
+ _gdm_session_reset (GDM_SESSION (session_relay));
+#endif
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -554,6 +577,10 @@ do_introspect (DBusConnection *connection,
" </method>\n"
" <signal name=\"Open\">\n"
" </signal>\n"
+ " <signal name=\"Close\">\n"
+ " </signal>\n"
+ " <signal name=\"StartSession\">\n"
+ " </signal>\n"
" <signal name=\"BeginVerification\">\n"
" <arg name=\"username\" type=\"s\"/>\n"
" </signal>\n"
@@ -737,8 +764,6 @@ handle_connection (DBusServer *server,
session_relay);
g_signal_emit (session_relay, signals[CONNECTED], 0);
-
- gdm_session_relay_open (session_relay);
}
}
@@ -854,9 +879,25 @@ gdm_session_relay_constructor (GType type,
}
static void
+gdm_session_iface_init (GdmSessionIface *iface)
+{
+ iface->begin_verification = gdm_session_relay_begin_verification;
+ iface->begin_verification_for_user = gdm_session_relay_begin_verification_for_user;
+ iface->open = gdm_session_relay_open;
+ iface->close = gdm_session_relay_close;
+ iface->cancel = gdm_session_relay_cancel;
+ iface->start_session = gdm_session_relay_start_session;
+ iface->answer_query = gdm_session_relay_answer_query;
+ iface->select_session = gdm_session_relay_select_session;
+ iface->select_language = gdm_session_relay_select_language;
+ iface->select_user = gdm_session_relay_select_user;
+
+}
+
+static void
gdm_session_relay_class_init (GdmSessionRelayClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->get_property = gdm_session_relay_get_property;
object_class->set_property = gdm_session_relay_set_property;
@@ -865,91 +906,6 @@ gdm_session_relay_class_init (GdmSessionRelayClass *klass)
g_type_class_add_private (klass, sizeof (GdmSessionRelayPrivate));
- signals [USER_VERIFIED] =
- g_signal_new ("user-verified",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, user_verified),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
- signals [USER_VERIFICATION_ERROR] =
- g_signal_new ("user-verification-error",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, user_verification_error),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE,
- 1,
- G_TYPE_POINTER);
- signals [INFO_QUERY] =
- g_signal_new ("info-query",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, info_query),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
- signals [SECRET_INFO_QUERY] =
- g_signal_new ("secret-info-query",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, secret_info_query),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
- signals [INFO] =
- g_signal_new ("info",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, info),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
- signals [PROBLEM] =
- g_signal_new ("problem",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, problem),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1,
- G_TYPE_STRING);
- signals [SESSION_STARTED] =
- g_signal_new ("session-started",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, session_started),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
- signals [OPENED] =
- g_signal_new ("opened",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GdmSessionRelayClass, opened),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
signals [CONNECTED] =
g_signal_new ("connected",
G_OBJECT_CLASS_TYPE (object_class),
diff --git a/daemon/gdm-session-relay.h b/daemon/gdm-session-relay.h
index a1d664e7..5efd2bd3 100644
--- a/daemon/gdm-session-relay.h
+++ b/daemon/gdm-session-relay.h
@@ -24,6 +24,8 @@
#include <glib-object.h>
+#include "gdm-session.h"
+
G_BEGIN_DECLS
#define GDM_TYPE_SESSION_RELAY (gdm_session_relay_get_type ())
@@ -45,59 +47,14 @@ typedef struct
{
GObjectClass parent_class;
- void (* user_verified) (GdmSessionRelay *session_relay);
-
- void (* user_verification_error) (GdmSessionRelay *session_relay,
- GError *error);
-
- void (* info_query) (GdmSessionRelay *session_relay,
- const char *query_text);
-
- void (* secret_info_query) (GdmSessionRelay *session_relay,
- const char *query_text);
-
- void (* info) (GdmSessionRelay *session_relay,
- const char *info);
-
- void (* problem) (GdmSessionRelay *session_relay,
- const char *problem);
-
- void (* session_started) (GdmSessionRelay *session_relay,
- GPid pid);
-
- void (* session_startup_error) (GdmSessionRelay *session_relay,
- GError *error);
-
- void (* session_exited) (GdmSessionRelay *session_relay,
- int exit_code);
-
- void (* session_died) (GdmSessionRelay *session_relay,
- int signal_number);
-
- void (* opened) (GdmSessionRelay *session_relay);
+ /* Signals */
void (* connected) (GdmSessionRelay *session_relay);
void (* disconnected) (GdmSessionRelay *session_relay);
-
} GdmSessionRelayClass;
GType gdm_session_relay_get_type (void);
GdmSessionRelay * gdm_session_relay_new (void);
-void gdm_session_relay_begin_verification (GdmSessionRelay *session_relay);
-void gdm_session_relay_begin_verification_for_user (GdmSessionRelay *session_relay,
- const char *username);
-void gdm_session_relay_answer_query (GdmSessionRelay *session_relay,
- const char *text);
-void gdm_session_relay_open (GdmSessionRelay *session_relay);
-
-void gdm_session_relay_select_session (GdmSessionRelay *session_relay,
- const char *session);
-void gdm_session_relay_select_language (GdmSessionRelay *session_relay,
- const char *language);
-void gdm_session_relay_select_user (GdmSessionRelay *session_relay,
- const char *user);
-void gdm_session_relay_cancel (GdmSessionRelay *session_relay);
-
gboolean gdm_session_relay_start (GdmSessionRelay *session_relay);
gboolean gdm_session_relay_stop (GdmSessionRelay *session_relay);
char * gdm_session_relay_get_address (GdmSessionRelay *session_relay);
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
new file mode 100644
index 00000000..5d048b2b
--- /dev/null
+++ b/daemon/gdm-session.c
@@ -0,0 +1,402 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+
+#include "gdm-session.h"
+#include "gdm-session-private.h"
+
+enum {
+ USER_VERIFIED = 0,
+ USER_VERIFICATION_ERROR,
+ INFO,
+ PROBLEM,
+ INFO_QUERY,
+ SECRET_INFO_QUERY,
+ SESSION_STARTED,
+ SESSION_STARTUP_ERROR,
+ SESSION_EXITED,
+ SESSION_DIED,
+ OPENED,
+ CLOSED,
+ CONNECTED,
+ DISCONNECTED,
+ SELECTED_USER_CHANGED,
+ LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0, };
+
+static void gdm_session_class_init (gpointer g_iface);
+
+GType
+gdm_session_get_type (void)
+{
+ static GType session_type = 0;
+
+ if (!session_type) {
+ session_type = g_type_register_static_simple (G_TYPE_INTERFACE,
+ "GdmSession",
+ sizeof (GdmSessionIface),
+ (GClassInitFunc) gdm_session_class_init,
+ 0, NULL, 0);
+
+ g_type_interface_add_prerequisite (session_type, G_TYPE_OBJECT);
+ }
+
+ return session_type;
+}
+
+void
+gdm_session_open (GdmSession *session)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->open (session);
+}
+
+void
+gdm_session_close (GdmSession *session)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->close (session);
+}
+
+void
+gdm_session_begin_verification (GdmSession *session)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->begin_verification (session);
+}
+
+void
+gdm_session_begin_verification_for_user (GdmSession *session,
+ const char *username)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->begin_verification_for_user (session, username);
+}
+
+void
+gdm_session_answer_query (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->answer_query (session, text);
+}
+
+void
+gdm_session_select_session (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->select_session (session, text);
+}
+
+void
+gdm_session_select_language (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->select_language (session, text);
+}
+
+void
+gdm_session_select_user (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->select_user (session, text);
+}
+
+void
+gdm_session_cancel (GdmSession *session)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->cancel (session);
+}
+
+void
+gdm_session_start_session (GdmSession *session)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->start_session (session);
+}
+
+static void
+gdm_session_class_init (gpointer g_iface)
+{
+ GType iface_type = G_TYPE_FROM_INTERFACE (g_iface);
+
+ signals [USER_VERIFIED] =
+ g_signal_new ("user-verified",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, user_verified),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+ signals [USER_VERIFICATION_ERROR] =
+ g_signal_new ("user-verification-error",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, user_verification_error),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+ signals [INFO_QUERY] =
+ g_signal_new ("info-query",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, info_query),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+ signals [SECRET_INFO_QUERY] =
+ g_signal_new ("secret-info-query",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, secret_info_query),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+ signals [INFO] =
+ g_signal_new ("info",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, info),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+ signals [PROBLEM] =
+ g_signal_new ("problem",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, problem),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+ signals [SESSION_STARTED] =
+ g_signal_new ("session-started",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, session_started),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+ signals [SESSION_STARTUP_ERROR] =
+ g_signal_new ("session-startup-error",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, session_startup_error),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+ signals [SESSION_EXITED] =
+ g_signal_new ("session-exited",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, session_exited),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+ signals [SESSION_DIED] =
+ g_signal_new ("session-died",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, session_died),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__INT,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_INT);
+ signals [OPENED] =
+ g_signal_new ("opened",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, opened),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+ signals [CLOSED] =
+ g_signal_new ("closed",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, closed),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+ signals [SELECTED_USER_CHANGED] =
+ g_signal_new ("selected-user-changed",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, selected_user_changed),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+
+}
+
+void
+_gdm_session_user_verified (GdmSession *session)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ g_signal_emit (session, signals [USER_VERIFIED], 0);
+}
+
+void
+_gdm_session_user_verification_error (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [USER_VERIFICATION_ERROR], 0, text);
+}
+
+void
+_gdm_session_info_query (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [INFO_QUERY], 0, text);
+}
+
+void
+_gdm_session_secret_info_query (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [SECRET_INFO_QUERY], 0, text);
+}
+
+void
+_gdm_session_info (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [INFO], 0, text);
+}
+
+void
+_gdm_session_problem (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [PROBLEM], 0, text);
+}
+
+void
+_gdm_session_session_started (GdmSession *session)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [SESSION_STARTED], 0);
+}
+
+void
+_gdm_session_session_startup_error (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [SESSION_STARTUP_ERROR], 0, text);
+}
+
+void
+_gdm_session_session_exited (GdmSession *session,
+ int exit_code)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [SESSION_EXITED], 0, exit_code);
+}
+
+void
+_gdm_session_session_died (GdmSession *session,
+ int signal_number)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [SESSION_DIED], 0, signal_number);
+}
+
+void
+_gdm_session_opened (GdmSession *session)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [OPENED], 0);
+}
+
+void
+_gdm_session_closed (GdmSession *session)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [CLOSED], 0);
+}
+
+void
+_gdm_session_selected_user_changed (GdmSession *session,
+ const char *text)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [SELECTED_USER_CHANGED], 0, text);
+}
diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h
new file mode 100644
index 00000000..5a14f54b
--- /dev/null
+++ b/daemon/gdm-session.h
@@ -0,0 +1,105 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#ifndef __GDM_SESSION_H
+#define __GDM_SESSION_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GDM_TYPE_SESSION (gdm_session_get_type ())
+#define GDM_SESSION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_SESSION, GdmSession))
+#define GDM_SESSION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_SESSION, GdmSessionClass))
+#define GDM_IS_SESSION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_SESSION))
+#define GDM_SESSION_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), GDM_TYPE_SESSION, GdmSessionIface))
+
+typedef struct _GdmSession GdmSession; /* Dummy typedef */
+typedef struct _GdmSessionIface GdmSessionIface;
+
+struct _GdmSessionIface
+{
+ GTypeInterface base_iface;
+
+ /* Methods */
+ void (* begin_verification) (GdmSession *session);
+ void (* begin_verification_for_user) (GdmSession *session,
+ const char *username);
+ void (* answer_query) (GdmSession *session,
+ const char *text);
+ void (* select_language) (GdmSession *session,
+ const char *text);
+ void (* select_session) (GdmSession *session,
+ const char *text);
+ void (* select_user) (GdmSession *session,
+ const char *text);
+ void (* open) (GdmSession *session);
+ void (* close) (GdmSession *session);
+ void (* cancel) (GdmSession *session);
+ void (* start_session) (GdmSession *session);
+
+ /* Signals */
+ void (* user_verified) (GdmSession *session);
+ void (* user_verification_error) (GdmSession *session,
+ const char *message);
+ void (* info_query) (GdmSession *session,
+ const char *query_text);
+ void (* secret_info_query) (GdmSession *session,
+ const char *query_text);
+ void (* info) (GdmSession *session,
+ const char *info);
+ void (* problem) (GdmSession *session,
+ const char *problem);
+ void (* session_started) (GdmSession *session);
+ void (* session_startup_error) (GdmSession *session,
+ const char *message);
+ void (* session_exited) (GdmSession *session,
+ int exit_code);
+ void (* session_died) (GdmSession *session,
+ int signal_number);
+ void (* opened) (GdmSession *session);
+ void (* closed) (GdmSession *session);
+ void (* selected_user_changed) (GdmSession *session,
+ const char *text);
+
+};
+
+GType gdm_session_get_type (void) G_GNUC_CONST;
+
+void gdm_session_begin_verification (GdmSession *session);
+void gdm_session_begin_verification_for_user (GdmSession *session,
+ const char *username);
+void gdm_session_answer_query (GdmSession *session,
+ const char *text);
+void gdm_session_select_session (GdmSession *session,
+ const char *session_name);
+void gdm_session_select_language (GdmSession *session,
+ const char *language);
+void gdm_session_select_user (GdmSession *session,
+ const char *username);
+void gdm_session_open (GdmSession *session);
+void gdm_session_close (GdmSession *session);
+void gdm_session_cancel (GdmSession *session);
+void gdm_session_start_session (GdmSession *session);
+
+G_END_DECLS
+
+#endif /* __GDM_SESSION_H */
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index ea82be34..4377e877 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -28,8 +28,6 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
-#include <pwd.h>
-#include <grp.h>
#include <glib.h>
#include <glib/gi18n.h>
@@ -48,12 +46,11 @@
#include "gdm-simple-slave-glue.h"
#include "gdm-server.h"
+#include "gdm-session.h"
#include "gdm-session-direct.h"
#include "gdm-greeter-server.h"
#include "gdm-greeter-session.h"
-#include "ck-connector.h"
-
#define GDM_SIMPLE_SLAVE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SIMPLE_SLAVE, GdmSimpleSlavePrivate))
#define GDM_DBUS_NAME "org.gnome.DisplayManager"
@@ -75,12 +72,6 @@ struct GdmSimpleSlavePrivate
GPid server_pid;
guint connection_attempts;
- /* user selected */
- char *selected_session;
- char *selected_language;
- char *selected_user;
-
- CkConnector *ckc;
GdmServer *server;
GdmGreeterServer *greeter_server;
GdmGreeterSession *greeter;
@@ -99,17 +90,16 @@ static void gdm_simple_slave_finalize (GObject *object);
G_DEFINE_TYPE (GdmSimpleSlave, gdm_simple_slave, GDM_TYPE_SLAVE)
static void
-on_session_started (GdmSessionDirect *session,
- GPid pid,
+on_session_started (GdmSession *session,
GdmSimpleSlave *slave)
{
- g_debug ("session started on pid %d\n", (int) pid);
+ g_debug ("session started");
/* FIXME: should we do something here? */
}
static void
-on_session_exited (GdmSessionDirect *session,
+on_session_exited (GdmSession *session,
int exit_code,
GdmSimpleSlave *slave)
{
@@ -119,7 +109,7 @@ on_session_exited (GdmSessionDirect *session,
}
static void
-on_session_died (GdmSessionDirect *session,
+on_session_died (GdmSession *session,
int signal_number,
GdmSimpleSlave *slave)
{
@@ -131,113 +121,6 @@ on_session_died (GdmSessionDirect *session,
}
static gboolean
-is_prog_in_path (const char *prog)
-{
- char *f;
- gboolean ret;
-
- f = g_find_program_in_path (prog);
- ret = (f != NULL);
- g_free (f);
- return ret;
-}
-
-static gboolean
-get_session_command (const char *file,
- char **command)
-{
- GKeyFile *key_file;
- GError *error;
- char *full_path;
- char *exec;
- gboolean ret;
- gboolean res;
- const char *search_dirs[] = {
- "/etc/X11/sessions/",
- DMCONFDIR "/Sessions/",
- DATADIR "/gdm/BuiltInSessions/",
- DATADIR "/xsessions/",
- NULL
- };
-
- exec = NULL;
- ret = FALSE;
- if (command != NULL) {
- *command = NULL;
- }
-
- key_file = g_key_file_new ();
-
- error = NULL;
- full_path = NULL;
- res = g_key_file_load_from_dirs (key_file,
- file,
- search_dirs,
- &full_path,
- G_KEY_FILE_NONE,
- &error);
- if (! res) {
- g_debug ("File '%s' not found: %s", file, error->message);
- g_error_free (error);
- if (command != NULL) {
- *command = NULL;
- }
- goto out;
- }
-
- error = NULL;
- res = g_key_file_get_boolean (key_file,
- G_KEY_FILE_DESKTOP_GROUP,
- G_KEY_FILE_DESKTOP_KEY_HIDDEN,
- &error);
- if (error == NULL && res) {
- g_debug ("Session %s is marked as hidden", file);
- goto out;
- }
-
- error = NULL;
- exec = g_key_file_get_string (key_file,
- G_KEY_FILE_DESKTOP_GROUP,
- G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
- &error);
- if (exec == NULL) {
- g_debug ("%s key not found", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
- goto out;
- }
-
- res = is_prog_in_path (exec);
- g_free (exec);
-
- if (! res) {
- g_debug ("Command not found: %s", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
- goto out;
- }
-
- error = NULL;
- exec = g_key_file_get_string (key_file,
- G_KEY_FILE_DESKTOP_GROUP,
- G_KEY_FILE_DESKTOP_KEY_EXEC,
- &error);
- if (error != NULL) {
- g_debug ("%s key not found: %s",
- G_KEY_FILE_DESKTOP_KEY_EXEC,
- error->message);
- g_error_free (error);
- goto out;
- }
-
- if (command != NULL) {
- *command = g_strdup (exec);
- }
- ret = TRUE;
-
-out:
- g_free (exec);
-
- return ret;
-}
-
-static gboolean
add_user_authorization (GdmSimpleSlave *slave,
char **filename)
{
@@ -253,180 +136,25 @@ add_user_authorization (GdmSimpleSlave *slave,
return ret;
}
-static gboolean
-slave_open_ck_session (GdmSimpleSlave *slave,
- const char *display_name,
- const char *display_hostname,
- gboolean display_is_local)
-{
- char *username;
- char *x11_display_device;
- struct passwd *pwent;
- gboolean ret;
- int res;
- DBusError error;
-
- g_return_val_if_fail (GDM_IS_SLAVE (slave), FALSE);
-
- username = gdm_session_direct_get_username (slave->priv->session);
-
- x11_display_device = NULL;
-
- pwent = getpwnam (username);
- if (pwent == NULL) {
- return FALSE;
- }
-
- slave->priv->ckc = ck_connector_new ();
- if (slave->priv->ckc == NULL) {
- g_warning ("Couldn't create new ConsoleKit connector");
- goto out;
- }
-
- if (slave->priv->server != NULL) {
- x11_display_device = gdm_server_get_display_device (slave->priv->server);
- }
-
- if (x11_display_device == NULL) {
- x11_display_device = g_strdup ("");
- }
-
- dbus_error_init (&error);
- res = ck_connector_open_session_with_parameters (slave->priv->ckc,
- &error,
- "unix-user", &pwent->pw_uid,
- "x11-display", &display_name,
- "x11-display-device", &x11_display_device,
- "remote-host-name", &display_hostname,
- "is-local", &display_is_local,
- NULL);
- g_free (x11_display_device);
-
- if (! res) {
- if (dbus_error_is_set (&error)) {
- g_warning ("%s\n", error.message);
- dbus_error_free (&error);
- } else {
- g_warning ("cannot open CK session: OOM, D-Bus system bus not available,\n"
- "ConsoleKit not available or insufficient privileges.\n");
- }
- goto out;
- }
-
- ret = TRUE;
-
- out:
- return ret;
-}
-
-static void
-setup_session_environment (GdmSimpleSlave *slave)
-{
- int display_number;
- char *display_x11_cookie;
- char *display_name;
- char *display_hostname;
- char *auth_file;
- const char *session_cookie;
- gboolean display_is_local;
-
- display_name = NULL;
- display_hostname = NULL;
- display_x11_cookie = NULL;
- auth_file = NULL;
- session_cookie = NULL;
- display_is_local = FALSE;
-
- g_object_get (slave,
- "display-number", &display_number,
- "display-name", &display_name,
- "display-hostname", &display_hostname,
- "display-is-local", &display_is_local,
- "display-x11-cookie", &display_x11_cookie,
- NULL);
-
- add_user_authorization (slave, &auth_file);
-
- if (slave_open_ck_session (slave,
- display_name,
- display_hostname,
- display_is_local)) {
- session_cookie = ck_connector_get_cookie (slave->priv->ckc);
- }
-
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "GDMSESSION",
- slave->priv->selected_session);
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "DESKTOP_SESSION",
- slave->priv->selected_session);
-
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "LANG",
- slave->priv->selected_language);
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "GDM_LANG",
- slave->priv->selected_language);
-
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "DISPLAY",
- display_name);
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "XAUTHORITY",
- auth_file);
- if (session_cookie != NULL) {
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "XDG_SESSION_COOKIE",
- session_cookie);
- }
-
- gdm_session_direct_set_environment_variable (slave->priv->session,
- "PATH",
- "/bin:/usr/bin:" BINDIR);
-
- g_free (display_name);
- g_free (display_hostname);
- g_free (display_x11_cookie);
- g_free (auth_file);
-}
-
static void
-on_session_user_verified (GdmSessionDirect *session,
+on_session_user_verified (GdmSession *session,
GdmSimpleSlave *slave)
{
- char *username;
- char *command;
- char *filename;
- gboolean res;
+ char *auth_file;
gdm_greeter_session_stop (slave->priv->greeter);
gdm_greeter_server_stop (slave->priv->greeter_server);
- username = gdm_session_direct_get_username (session);
-
- g_debug ("%s%ssuccessfully authenticated\n",
- username ? username : "",
- username ? " " : "");
- g_free (username);
-
- if (slave->priv->selected_session != NULL) {
- filename = g_strdup (slave->priv->selected_session);
- } else {
- filename = g_strdup ("gnome.desktop");
- }
-
- setup_session_environment (slave);
+ auth_file = NULL;
+ add_user_authorization (slave, &auth_file);
- res = get_session_command (filename, &command);
- if (! res) {
- g_warning ("Could find session file: %s", filename);
- return;
- }
+ g_object_set (session,
+ "user-x11-authority-file", auth_file,
+ NULL);
- gdm_session_direct_start_program (session, command);
+ g_free (auth_file);
- g_free (filename);
- g_free (command);
+ gdm_session_start_session (session);
}
static gboolean
@@ -448,27 +176,17 @@ queue_greeter_reset (GdmSimpleSlave *slave)
}
static void
-on_session_user_verification_error (GdmSessionDirect *session,
- GError *error,
+on_session_user_verification_error (GdmSession *session,
+ const char *message,
GdmSimpleSlave *slave)
{
- char *username;
-
- username = gdm_session_direct_get_username (session);
-
- g_debug ("could not successfully authenticate user '%s': %s",
- username,
- error->message);
-
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to authenticate user"));
- g_free (username);
-
queue_greeter_reset (slave);
}
static void
-on_session_info (GdmSessionDirect *session,
+on_session_info (GdmSession *session,
const char *text,
GdmSimpleSlave *slave)
{
@@ -477,7 +195,7 @@ on_session_info (GdmSessionDirect *session,
}
static void
-on_session_problem (GdmSessionDirect *session,
+on_session_problem (GdmSession *session,
const char *text,
GdmSimpleSlave *slave)
{
@@ -486,7 +204,7 @@ on_session_problem (GdmSessionDirect *session,
}
static void
-on_session_info_query (GdmSessionDirect *session,
+on_session_info_query (GdmSession *session,
const char *text,
GdmSimpleSlave *slave)
{
@@ -496,7 +214,7 @@ on_session_info_query (GdmSessionDirect *session,
}
static void
-on_session_secret_info_query (GdmSessionDirect *session,
+on_session_secret_info_query (GdmSession *session,
const char *text,
GdmSimpleSlave *slave)
{
@@ -505,7 +223,7 @@ on_session_secret_info_query (GdmSessionDirect *session,
}
static void
-on_session_opened (GdmSessionDirect *session,
+on_session_opened (GdmSession *session,
GdmSimpleSlave *slave)
{
gboolean res;
@@ -518,17 +236,55 @@ on_session_opened (GdmSessionDirect *session,
}
static void
+on_session_selected_user_changed (GdmSession *session,
+ const char *text,
+ GdmSimpleSlave *slave)
+{
+ g_debug ("Selected user changed: %s", text);
+
+ /* FIXME: send this over to the greeter */
+}
+
+
+static void
create_new_session (GdmSimpleSlave *slave)
{
+ gboolean display_is_local;
+ char *display_name;
+ char *display_hostname;
+ char *display_device;
+
g_debug ("Creating new session");
- slave->priv->session = gdm_session_direct_new ();
+ g_object_get (slave,
+ "display-name", &display_name,
+ "display-hostname", &display_hostname,
+ "display-is-local", &display_is_local,
+ NULL);
+
+ display_device = NULL;
+ if (slave->priv->server != NULL) {
+ display_device = gdm_server_get_display_device (slave->priv->server);
+ }
+
+ slave->priv->session = gdm_session_direct_new (display_name,
+ display_hostname,
+ display_device,
+ display_is_local);
+ g_free (display_name);
+ g_free (display_device);
+ g_free (display_hostname);
g_signal_connect (slave->priv->session,
"opened",
G_CALLBACK (on_session_opened),
slave);
-
+#if 0
+ g_signal_connect (slave->priv->session,
+ "closed",
+ G_CALLBACK (on_session_closed),
+ slave);
+#endif
g_signal_connect (slave->priv->session,
"info",
G_CALLBACK (on_session_info),
@@ -571,6 +327,11 @@ create_new_session (GdmSimpleSlave *slave)
"session-died",
G_CALLBACK (on_session_died),
slave);
+
+ g_signal_connect (slave->priv->session,
+ "selected-user-changed",
+ G_CALLBACK (on_session_selected_user_changed),
+ slave);
}
static void
@@ -591,18 +352,8 @@ static void
on_greeter_begin_verification (GdmGreeterServer *greeter_server,
GdmSimpleSlave *slave)
{
- GError *error;
- gboolean res;
-
g_debug ("begin verification");
- error = NULL;
- res = gdm_session_direct_begin_verification (slave->priv->session,
- NULL,
- &error);
- if (! res) {
- g_warning ("Unable to begin verification: %s", error->message);
- g_error_free (error);
- }
+ gdm_session_begin_verification (GDM_SESSION (slave->priv->session));
}
static void
@@ -610,18 +361,9 @@ on_greeter_begin_verification_for_user (GdmGreeterServer *greeter_server,
const char *username,
GdmSimpleSlave *slave)
{
- GError *error;
- gboolean res;
-
g_debug ("begin verification");
- error = NULL;
- res = gdm_session_direct_begin_verification (slave->priv->session,
- username,
- &error);
- if (! res) {
- g_warning ("Unable to begin verification for user: %s", error->message);
- g_error_free (error);
- }
+ gdm_session_begin_verification_for_user (GDM_SESSION (slave->priv->session),
+ username);
}
static void
@@ -629,7 +371,7 @@ on_greeter_answer (GdmGreeterServer *greeter_server,
const char *text,
GdmSimpleSlave *slave)
{
- gdm_session_direct_answer_query (slave->priv->session, text);
+ gdm_session_answer_query (GDM_SESSION (slave->priv->session), text);
}
static void
@@ -637,8 +379,7 @@ on_greeter_session_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmSimpleSlave *slave)
{
- g_free (slave->priv->selected_session);
- slave->priv->selected_session = g_strdup (text);
+ gdm_session_select_session (GDM_SESSION (slave->priv->session), text);
}
static void
@@ -646,8 +387,7 @@ on_greeter_language_selected (GdmGreeterServer *greeter_server,
const char *text,
GdmSimpleSlave *slave)
{
- g_free (slave->priv->selected_language);
- slave->priv->selected_language = g_strdup (text);
+ gdm_session_select_language (GDM_SESSION (slave->priv->session), text);
}
static void
@@ -662,76 +402,36 @@ static void
on_greeter_cancel (GdmGreeterServer *greeter_server,
GdmSimpleSlave *slave)
{
- gboolean display_is_local;
- char *display_name;
- char *display_device;
-
g_debug ("Greeter cancelled");
- g_object_get (slave,
- "display-name", &display_name,
- "display-is-local", &display_is_local,
- NULL);
-
if (slave->priv->session != NULL) {
- gdm_session_direct_close (slave->priv->session);
+ gdm_session_close (GDM_SESSION (slave->priv->session));
g_object_unref (slave->priv->session);
}
create_new_session (slave);
- if (display_is_local) {
- display_device = gdm_server_get_display_device (slave->priv->server);
- } else {
- display_device = g_strdup ("");
- }
-
- gdm_session_direct_open (slave->priv->session,
- "gdm",
- "" /* hostname */,
- display_name,
- display_device,
- NULL);
-
- g_free (display_device);
- g_free (display_name);
+ gdm_session_open (GDM_SESSION (slave->priv->session));
}
static void
on_greeter_connected (GdmGreeterServer *greeter_server,
GdmSimpleSlave *slave)
{
- gboolean display_is_local;
- char *display_name;
- char *display_device;
-
- g_object_get (slave,
- "display-name", &display_name,
- "display-is-local", &display_is_local,
- NULL);
+ gboolean display_is_local;
g_debug ("Greeter started");
- if (display_is_local) {
- display_device = gdm_server_get_display_device (slave->priv->server);
- } else {
- display_device = g_strdup ("");
- }
+ gdm_session_open (GDM_SESSION (slave->priv->session));
- gdm_session_direct_open (slave->priv->session,
- "gdm",
- "" /* hostname */,
- display_name,
- display_device,
- NULL);
- g_free (display_device);
+ g_object_get (slave,
+ "display-is-local", &display_is_local,
+ NULL);
/* If XDMCP stop pinging */
if ( ! display_is_local) {
alarm (0);
}
-
- g_free (display_name);
}
static void
@@ -954,7 +654,7 @@ gdm_simple_slave_stop (GdmSlave *slave)
}
if (GDM_SIMPLE_SLAVE (slave)->priv->session != NULL) {
- gdm_session_direct_close (GDM_SIMPLE_SLAVE (slave)->priv->session);
+ gdm_session_close (GDM_SESSION (GDM_SIMPLE_SLAVE (slave)->priv->session));
g_object_unref (GDM_SIMPLE_SLAVE (slave)->priv->session);
GDM_SIMPLE_SLAVE (slave)->priv->session = NULL;
}
@@ -1041,18 +741,7 @@ gdm_simple_slave_class_init (GdmSimpleSlaveClass *klass)
static void
gdm_simple_slave_init (GdmSimpleSlave *slave)
{
- const char * const *languages;
-
slave->priv = GDM_SIMPLE_SLAVE_GET_PRIVATE (slave);
-
- slave->priv->pid = -1;
-
- languages = g_get_language_names ();
- if (languages != NULL) {
- slave->priv->selected_language = g_strdup (languages[0]);
- }
-
- slave->priv->selected_session = g_strdup ("gnome.desktop");
}
static void
diff --git a/daemon/test-session.c b/daemon/test-session.c
index 7bbdd5e4..c229a415 100644
--- a/daemon/test-session.c
+++ b/daemon/test-session.c
@@ -33,33 +33,22 @@
static GMainLoop *loop;
static void
-on_open (GdmSessionDirect *session,
+on_open (GdmSession *session,
const char *username)
{
- GError *error;
- gboolean res;
-
g_debug ("Got opened: begin auth for %s", username ? username : "(null)");
- error = NULL;
- res = gdm_session_direct_begin_verification (session,
- username,
- &error);
- if (! res) {
- g_warning ("Unable to begin verification: %s", error->message);
- g_error_free (error);
- }
+ gdm_session_begin_verification (session);
}
static void
-on_session_started (GdmSessionDirect *session,
- GPid pid)
+on_session_started (GdmSession *session)
{
- g_print ("session started on pid %d\n", (int) pid);
+ g_print ("session started");
}
static void
-on_session_exited (GdmSessionDirect *session,
+on_session_exited (GdmSession *session,
int exit_code)
{
g_print ("session exited with code %d\n", exit_code);
@@ -67,7 +56,7 @@ on_session_exited (GdmSessionDirect *session,
}
static void
-on_session_died (GdmSessionDirect *session,
+on_session_died (GdmSession *session,
int signal_number)
{
g_print ("session died with signal %d, (%s)",
@@ -77,38 +66,36 @@ on_session_died (GdmSessionDirect *session,
}
static void
-on_user_verified (GdmSessionDirect *session)
+on_user_verified (GdmSession *session)
{
char *username;
- const char *command = "/usr/bin/gedit /tmp/foo.log";
- username = gdm_session_direct_get_username (session);
+ username = gdm_session_direct_get_username (GDM_SESSION_DIRECT (session));
g_print ("%s%ssuccessfully authenticated\n",
username ? username : "", username ? " " : "");
g_free (username);
- gdm_session_direct_start_program (session, command);
+ gdm_session_start_session (session);
}
static void
-on_user_verification_error (GdmSessionDirect *session,
- GError *error)
+on_user_verification_error (GdmSession *session,
+ const char *message)
{
char *username;
- username = gdm_session_direct_get_username (session);
+ username = gdm_session_direct_get_username (GDM_SESSION_DIRECT (session));
g_print ("%s%scould not be successfully authenticated: %s\n",
username ? username : "", username ? " " : "",
- error->message);
-
+ message);
g_free (username);
exit (1);
}
static void
-on_info_query (GdmSessionDirect *session,
+on_info_query (GdmSession *session,
const char *query_text)
{
char answer[1024];
@@ -119,29 +106,29 @@ on_info_query (GdmSessionDirect *session,
answer[strlen(answer) - 1] = '\0';
if (answer[0] == '\0') {
- gdm_session_direct_close (session);
+ gdm_session_close (session);
g_main_loop_quit (loop);
} else {
- gdm_session_direct_answer_query (session, answer);
+ gdm_session_answer_query (session, answer);
}
}
static void
-on_info (GdmSessionDirect *session,
+on_info (GdmSession *session,
const char *info)
{
g_print ("\n** NOTE: %s\n", info);
}
static void
-on_problem (GdmSessionDirect *session,
+on_problem (GdmSession *session,
const char *problem)
{
g_print ("\n** WARNING: %s\n", problem);
}
static void
-on_secret_info_query (GdmSessionDirect *session,
+on_secret_info_query (GdmSession *session,
const char *query_text)
{
char answer[1024];
@@ -166,23 +153,12 @@ on_secret_info_query (GdmSessionDirect *session,
g_print ("\n");
- gdm_session_direct_answer_query (session, answer);
+ gdm_session_answer_query (session, answer);
}
static void
import_environment (GdmSessionDirect *session)
{
- if (g_getenv ("PATH") != NULL)
- gdm_session_direct_set_environment_variable (session, "PATH",
- g_getenv ("PATH"));
-
- if (g_getenv ("DISPLAY") != NULL)
- gdm_session_direct_set_environment_variable (session, "DISPLAY",
- g_getenv ("DISPLAY"));
-
- if (g_getenv ("XAUTHORITY") != NULL)
- gdm_session_direct_set_environment_variable (session, "XAUTHORITY",
- g_getenv ("XAUTHORITY"));
}
int
@@ -190,8 +166,8 @@ main (int argc,
char *argv[])
{
GdmSessionDirect *session;
- char *username;
- int exit_code;
+ char *username;
+ int exit_code;
exit_code = 0;
@@ -200,9 +176,12 @@ main (int argc,
g_type_init ();
do {
- g_message ("creating instance of 'user session' object...");
- session = gdm_session_direct_new ();
- g_message ("'user session' object created successfully");
+ g_debug ("creating instance of GdmSessionDirect object...");
+ session = gdm_session_direct_new (":0",
+ g_get_host_name (),
+ ttyname (STDIN_FILENO),
+ TRUE);
+ g_debug ("GdmSessionDirect object created successfully");
if (argc <= 1) {
username = NULL;
@@ -210,12 +189,7 @@ main (int argc,
username = argv[1];
}
- gdm_session_direct_open (session,
- "gdm",
- "",
- ":0",
- ttyname (STDIN_FILENO),
- NULL);
+ gdm_session_open (GDM_SESSION (session));
g_signal_connect (session, "opened",
G_CALLBACK (on_open),
@@ -263,9 +237,9 @@ main (int argc,
g_main_loop_run (loop);
g_main_loop_unref (loop);
- g_message ("destroying previously created 'user session' object...");
+ g_message ("destroying previously created GdmSessionDirect object...");
g_object_unref (session);
- g_message ("'user session' object destroyed successfully");
+ g_message ("GdmSessionDirect object destroyed successfully");
} while (1);
return exit_code;
diff --git a/po/ChangeLog b/po/ChangeLog
index 8d00d586..7479e95f 100644
--- a/po/ChangeLog
+++ b/po/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-29 William Jon McCann <mccann@jhu.edu>
+
+ reviewed by: <delete if not using a buddy>
+
+ * POTFILES.in:
+
2007-10-29 Kjartan Maraas <kmaraas@gnome.org>
* nb.po: Updated Norwegian bokmål translation.
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 11343a1c..8f6c5fd9 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -28,6 +28,7 @@ daemon/gdm-product-slave.c
daemon/gdm-server.c
daemon/gdm-session.c
daemon/gdm-session-relay.c
+daemon/gdm-session-direct.c
daemon/gdm-session-worker.c
daemon/gdm-session-worker-job.c
daemon/gdm-simple-slave.c