diff options
author | William Jon McCann <mccann@jhu.edu> | 2007-10-30 03:52:16 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2007-10-30 03:52:16 +0000 |
commit | becfcf5d1e774031b2091c100d3a5f508360789f (patch) | |
tree | 2de527ba903064de8405fa6e262a4559278201c6 | |
parent | 613d29b63282b97e0a7a35514e1989a854e8566f (diff) | |
download | gdm-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-- | ChangeLog | 115 | ||||
-rw-r--r-- | daemon/Makefile.am | 14 | ||||
-rw-r--r-- | daemon/gdm-factory-slave.c | 146 | ||||
-rw-r--r-- | daemon/gdm-product-slave.c | 397 | ||||
-rw-r--r-- | daemon/gdm-session-direct.c | 1227 | ||||
-rw-r--r-- | daemon/gdm-session-direct.h | 64 | ||||
-rw-r--r-- | daemon/gdm-session-private.h | 65 | ||||
-rw-r--r-- | daemon/gdm-session-relay.c | 234 | ||||
-rw-r--r-- | daemon/gdm-session-relay.h | 49 | ||||
-rw-r--r-- | daemon/gdm-session.c | 402 | ||||
-rw-r--r-- | daemon/gdm-session.h | 105 | ||||
-rw-r--r-- | daemon/gdm-simple-slave.c | 471 | ||||
-rw-r--r-- | daemon/test-session.c | 88 | ||||
-rw-r--r-- | po/ChangeLog | 6 | ||||
-rw-r--r-- | po/POTFILES.in | 1 |
15 files changed, 1836 insertions, 1548 deletions
@@ -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 |