diff options
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/display-server.c | 42 | ||||
-rw-r--r-- | src/display-server.h | 8 | ||||
-rw-r--r-- | src/display.c | 109 | ||||
-rw-r--r-- | src/display.h | 3 | ||||
-rw-r--r-- | src/ldm-marshal.list | 8 | ||||
-rw-r--r-- | src/lightdm.c | 79 | ||||
-rw-r--r-- | src/seat-xdmcp-session.c | 33 | ||||
-rw-r--r-- | src/seat-xlocal.c | 31 | ||||
-rw-r--r-- | src/seat-xremote.c | 43 | ||||
-rw-r--r-- | src/seat-xremote.h | 3 | ||||
-rw-r--r-- | src/seat-xvnc.c | 37 | ||||
-rw-r--r-- | src/seat.c | 22 | ||||
-rw-r--r-- | src/seat.h | 3 | ||||
-rw-r--r-- | src/session.c | 85 | ||||
-rw-r--r-- | src/session.h | 6 | ||||
-rw-r--r-- | src/xdisplay.c | 48 | ||||
-rw-r--r-- | src/xdisplay.h | 39 | ||||
-rw-r--r-- | src/xserver-local.c | 8 | ||||
-rw-r--r-- | src/xserver-remote.c | 5 | ||||
-rw-r--r-- | src/xserver-xvnc.c | 7 | ||||
-rw-r--r-- | src/xsession.c | 9 |
23 files changed, 280 insertions, 356 deletions
@@ -1,3 +1,9 @@ +Overview of changes in lightdm 0.9.8 + + * Remove GetSeatForCookie and GetSessionForCookie now XDG_SEAT_PATH and + XDG_SESSION_PATH exist. + * Change log filenames to be unique across different display types. + Overview of changes in lightdm 0.9.7 * Set PAM_TTY to the display name, not the tty device diff --git a/src/Makefile.am b/src/Makefile.am index b585801a..b3d1c6de 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -54,8 +54,6 @@ lightdm_SOURCES = \ vt.h \ xauthority.c \ xauthority.h \ - xdisplay.c \ - xdisplay.h \ xdmcp-protocol.c \ xdmcp-protocol.h \ xdmcp-server.c \ diff --git a/src/display-server.c b/src/display-server.c index f856873a..0644aab3 100644 --- a/src/display-server.c +++ b/src/display-server.c @@ -20,8 +20,46 @@ enum { }; static guint signals[LAST_SIGNAL] = { 0 }; +struct DisplayServerPrivate +{ + /* Unique name for this display server */ + gchar *name; + + /* TRUE if sessions should be automatically started on this display server */ + gboolean start_local_sessions; +}; + G_DEFINE_TYPE (DisplayServer, display_server, G_TYPE_OBJECT); +void +display_server_set_name (DisplayServer *server, const gchar *name) +{ + g_return_if_fail (server != NULL); + g_free (server->priv->name); + server->priv->name = g_strdup (name); +} + +const gchar * +display_server_get_name (DisplayServer *server) +{ + g_return_val_if_fail (server != NULL, NULL); + return server->priv->name; +} + +void +display_server_set_start_local_sessions (DisplayServer *server, gboolean start_local_sessions) +{ + g_return_if_fail (server != NULL); + server->priv->start_local_sessions = start_local_sessions; +} + +gboolean +display_server_get_start_local_sessions (DisplayServer *server) +{ + g_return_val_if_fail (server != NULL, FALSE); + return server->priv->start_local_sessions; +} + static gboolean display_server_real_start (DisplayServer *server) { @@ -52,6 +90,8 @@ display_server_stop (DisplayServer *server) static void display_server_init (DisplayServer *server) { + server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, DISPLAY_SERVER_TYPE, DisplayServerPrivate); + server->priv->start_local_sessions = TRUE; } static void @@ -60,6 +100,8 @@ display_server_class_init (DisplayServerClass *klass) klass->start = display_server_real_start; klass->stop = display_server_real_stop; + g_type_class_add_private (klass, sizeof (DisplayServerPrivate)); + signals[READY] = g_signal_new ("ready", G_TYPE_FROM_CLASS (klass), diff --git a/src/display-server.h b/src/display-server.h index e307e955..ffe1e176 100644 --- a/src/display-server.h +++ b/src/display-server.h @@ -42,6 +42,14 @@ typedef struct GType display_server_get_type (void); +void display_server_set_name (DisplayServer *server, const gchar *name); + +const gchar *display_server_get_name (DisplayServer *server); + +void display_server_set_start_local_sessions (DisplayServer *server, gboolean start_local_sessions); + +gboolean display_server_get_start_local_sessions (DisplayServer *server); + gboolean display_server_start (DisplayServer *server); void display_server_stop (DisplayServer *server); diff --git a/src/display.c b/src/display.c index 817d9e61..b869d231 100644 --- a/src/display.c +++ b/src/display.c @@ -17,14 +17,12 @@ #include "display.h" #include "configuration.h" -#include "user.h" -#include "pam-session.h" #include "ldm-marshal.h" +#include "pam-session.h" #include "greeter.h" -#include "xserver-local.h" // FIXME: Shouldn't know if it's an xserver -#include "console-kit.h" enum { + CREATE_SESSION, STARTED, READY, SWITCH_TO_USER, @@ -82,14 +80,6 @@ struct DisplayPrivate /* Session process */ Session *session; - /* The X display */ - // FIXME: Kill - gchar *xdisplay; - - /* TTY */ - // FIXME: Kill - gchar *tty; - /* Communication link to greeter */ Greeter *greeter; @@ -120,19 +110,14 @@ G_DEFINE_TYPE (Display, display, G_TYPE_OBJECT); static gboolean start_greeter_session (Display *display); static gboolean start_user_session (Display *display, PAMSession *authentication); -// FIXME: Should be a construct property -void -display_set_display_server (Display *display, DisplayServer *display_server) +Display * +display_new (DisplayServer *display_server) { - g_return_if_fail (display != NULL); - g_return_if_fail (display->priv->display_server == NULL); + Display *display = g_object_new (DISPLAY_TYPE, NULL); + display->priv->display_server = g_object_ref (display_server); - if (IS_XSERVER (display->priv->display_server)) - { - display->priv->xdisplay = g_strdup (xserver_get_address (XSERVER (display->priv->display_server))); - if (IS_XSERVER_LOCAL (display->priv->display_server) && xserver_local_get_vt (XSERVER_LOCAL (display->priv->display_server)) >= 0) - display->priv->tty = g_strdup_printf ("/dev/tty%d", xserver_local_get_vt (XSERVER_LOCAL (display->priv->display_server))); - } + + return display; } DisplayServer * @@ -355,13 +340,6 @@ autologin_guest (Display *display, gboolean start_greeter_if_fail) static gboolean cleanup_after_session (Display *display) { - const gchar *cookie; - - /* Close ConsoleKit session */ - cookie = session_get_cookie (display->priv->session); - if (getuid () == 0 && cookie) - ck_close_session (cookie); - g_signal_handlers_disconnect_matched (display->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display); g_object_unref (display->priv->session); display->priv->session = NULL; @@ -476,7 +454,7 @@ create_session (Display *display, PAMSession *authentication, const gchar *sessi } } - session = DISPLAY_GET_CLASS (display)->create_session (display); + g_signal_emit (display, signals[CREATE_SESSION], 0, &session); g_return_val_if_fail (session != NULL, NULL); g_signal_connect (session, "exited", G_CALLBACK (session_exited_cb), display); @@ -494,41 +472,6 @@ create_session (Display *display, PAMSession *authentication, const gchar *sessi process_set_log_file (PROCESS (session), log_filename); - /* Open ConsoleKit session */ - if (getuid () == 0) - { - GVariantBuilder parameters; - User *user; - gchar *cookie = NULL; - - user = pam_session_get_user (authentication); - - g_variant_builder_init (¶meters, G_VARIANT_TYPE ("(a(sv))")); - g_variant_builder_open (¶meters, G_VARIANT_TYPE ("a(sv)")); - g_variant_builder_add (¶meters, "(sv)", "unix-user", g_variant_new_int32 (user_get_uid (user))); - g_variant_builder_add (¶meters, "(sv)", "session-type", g_variant_new_string (is_greeter ? "LoginWindow" : "")); - if (display->priv->xdisplay) - { - g_variant_builder_add (¶meters, "(sv)", "x11-display", - g_variant_new_string (display->priv->xdisplay)); - - if (display->priv->tty) - g_variant_builder_add (¶meters, "(sv)", "x11-display-device", - g_variant_new_string (display->priv->tty)); - } - g_variant_builder_add (¶meters, "(sv)", "remote-host-name", g_variant_new_string ("")); - g_variant_builder_add (¶meters, "(sv)", "is-local", g_variant_new_boolean (TRUE)); // FIXME - - if (getuid () == 0) - { - cookie = ck_open_session (¶meters); - session_set_cookie (session, cookie); - g_free (cookie); - } - } - else - session_set_cookie (session, g_getenv ("XDG_SESSION_COOKIE")); - /* Connect using the session bus */ if (getuid () != 0) { @@ -643,10 +586,7 @@ start_greeter_session (Display *display) display->priv->in_user_session = FALSE; log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory"); - if (display->priv->xdisplay) - filename = g_strdup_printf ("%s-greeter.log", display->priv->xdisplay); - else - filename = g_strdup ("other-greeter.log"); + filename = g_strdup_printf ("%s-greeter.log", display_server_get_name (display->priv->display_server)); log_filename = g_build_filename (log_dir, filename, NULL); g_free (log_dir); g_free (filename); @@ -771,8 +711,7 @@ display_server_ready_cb (DisplayServer *display_server, Display *display) gboolean started_session = FALSE; /* Don't run any sessions on local terminals */ - // FIXME: Make display_server_get_has_local_session - if (IS_XSERVER_LOCAL (display_server) && xserver_local_get_xdmcp_server (XSERVER_LOCAL (display_server))) + if (!display_server_get_start_local_sessions (display_server)) return; /* Automatically log in */ @@ -859,21 +798,14 @@ display_get_is_ready (Display *display) void display_unlock (Display *display) { - const gchar *cookie; - g_return_if_fail (display != NULL); if (!display->priv->session) return; - cookie = session_get_cookie (display->priv->session); - if (!cookie) - return; - g_debug ("Unlocking display"); - if (getuid () == 0) - ck_unlock_session (cookie); + session_unlock (display->priv->session); } static gboolean @@ -902,12 +834,6 @@ display_init (Display *display) display->priv->pam_autologin_service = g_strdup ("lightdm-autologin"); } -static Session * -display_create_session (Display *display) -{ - return NULL; -} - static void display_finalize (GObject *object) { @@ -928,8 +854,6 @@ display_finalize (GObject *object) g_free (self->priv->autologin_user); g_free (self->priv->select_user_hint); g_free (self->priv->user_session); - g_free (self->priv->tty); - g_free (self->priv->xdisplay); G_OBJECT_CLASS (display_parent_class)->finalize (object); } @@ -942,7 +866,6 @@ display_class_init (DisplayClass *klass) klass->switch_to_user = display_real_switch_to_user; klass->switch_to_guest = display_real_switch_to_guest; klass->get_guest_username = display_real_get_guest_username; - klass->create_session = display_create_session; klass->start_display_server = display_start_display_server; klass->start_greeter = display_start_greeter; klass->start_session = display_start_session; @@ -950,6 +873,14 @@ display_class_init (DisplayClass *klass) g_type_class_add_private (klass, sizeof (DisplayPrivate)); + signals[CREATE_SESSION] = + g_signal_new ("create-session", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (DisplayClass, create_session), + NULL, NULL, + ldm_marshal_OBJECT__VOID, + SESSION_TYPE, 0); signals[STARTED] = g_signal_new ("started", G_TYPE_FROM_CLASS (klass), diff --git a/src/display.h b/src/display.h index 4e5b5506..c067dd39 100644 --- a/src/display.h +++ b/src/display.h @@ -38,7 +38,6 @@ typedef struct GObjectClass parent_class; Session *(*create_session) (Display *display); - void (*started)(Display *display); void (*ready)(Display *display); gboolean (*switch_to_user)(Display *display, User *user); @@ -52,7 +51,7 @@ typedef struct GType display_get_type (void); -void display_set_display_server (Display *display, DisplayServer *display_server); +Display *display_new (DisplayServer *display_server); DisplayServer *display_get_display_server (Display *display); diff --git a/src/ldm-marshal.list b/src/ldm-marshal.list index 00388b4b..57d376b9 100644 --- a/src/ldm-marshal.list +++ b/src/ldm-marshal.list @@ -1,7 +1,7 @@ -BOOLEAN:OBJECT VOID:INT,POINTER -VOID:OBJECT,BOOLEAN -BOOLEAN:STRING BOOLEAN:VOID -OBJECT:STRING +BOOLEAN:STRING +BOOLEAN:OBJECT STRING:VOID +OBJECT:VOID +OBJECT:STRING diff --git a/src/lightdm.c b/src/lightdm.c index 125b45b7..740811b5 100644 --- a/src/lightdm.c +++ b/src/lightdm.c @@ -146,37 +146,6 @@ display_manager_stopped_cb (DisplayManager *display_manager) exit (exit_code); } -static Session * -get_session_for_cookie (const gchar *cookie, Seat **seat) -{ - GList *link; - - for (link = display_manager_get_seats (display_manager); link; link = link->next) - { - Seat *s = link->data; - GList *l; - - for (l = seat_get_displays (s); l; l = l->next) - { - Display *display = l->data; - Session *session; - - session = display_get_session (display); - if (!session) - continue; - - if (g_strcmp0 (session_get_cookie (session), cookie) == 0) - { - if (seat) - *seat = s; - return session; - } - } - } - - return NULL; -} - static GVariant * handle_display_manager_get_property (GDBusConnection *connection, const gchar *sender, @@ -302,44 +271,6 @@ handle_display_manager_call (GDBusConnection *connection, else// FIXME: Need to make proper error g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Failed to start seat"); } - else if (g_strcmp0 (method_name, "GetSeatForCookie") == 0) - { - gchar *cookie; - Seat *seat = NULL; - BusEntry *entry = NULL; - - if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(s)"))) - return; - - g_variant_get (parameters, "(&s)", &cookie); - - get_session_for_cookie (cookie, &seat); - if (seat) - entry = g_hash_table_lookup (seat_bus_entries, seat); - if (entry) - g_dbus_method_invocation_return_value (invocation, g_variant_new ("(o)", entry->path)); - else // FIXME: Need to make proper error - g_dbus_method_invocation_return_error_literal (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Unable to find seat for cookie"); - } - else if (g_strcmp0 (method_name, "GetSessionForCookie") == 0) - { - gchar *cookie; - Session *session; - BusEntry *entry = NULL; - - if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(s)"))) - return; - - g_variant_get (parameters, "(&s)", &cookie); - - session = get_session_for_cookie (cookie, NULL); - if (session) - entry = g_hash_table_lookup (session_bus_entries, session); - if (entry) - g_dbus_method_invocation_return_value (invocation, g_variant_new ("(o)", entry->path)); - else // FIXME: Need to make proper error - g_dbus_method_invocation_return_error_literal (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Unable to find session for cookie"); - } } static GVariant * @@ -635,14 +566,6 @@ bus_acquired_cb (GDBusConnection *connection, " <arg name='properties' direction='in' type='a(ss)'/>" " <arg name='seat' direction='out' type='o'/>" " </method>" - " <method name='GetSeatForCookie'>" - " <arg name='cookie' direction='in' type='s'/>" - " <arg name='seat' direction='out' type='o'/>" - " </method>" - " <method name='GetSessionForCookie'>" - " <arg name='cookie' direction='in' type='s'/>" - " <arg name='session' direction='out' type='o'/>" - " </method>" " <signal name='SeatAdded'>" " <arg name='seat' type='o'/>" " </signal>" @@ -974,6 +897,8 @@ main (int argc, char **argv) config_set_string (config_get_instance (), "SeatDefaults", "type", "xlocal"); if (!config_has_key (config_get_instance (), "SeatDefaults", "xserver-command")) config_set_string (config_get_instance (), "SeatDefaults", "xserver-command", "X"); + if (!config_has_key (config_get_instance (), "SeatDefaults", "start-session")) + config_set_boolean (config_get_instance (), "SeatDefaults", "start-session", TRUE); if (!config_has_key (config_get_instance (), "SeatDefaults", "allow-guest")) config_set_boolean (config_get_instance (), "SeatDefaults", "allow-guest", TRUE); if (!config_has_key (config_get_instance (), "SeatDefaults", "greeter-session")) diff --git a/src/seat-xdmcp-session.c b/src/seat-xdmcp-session.c index fe5e554a..65a95e16 100644 --- a/src/seat-xdmcp-session.c +++ b/src/seat-xdmcp-session.c @@ -12,14 +12,11 @@ #include <string.h> #include "seat-xdmcp-session.h" -#include "xdisplay.h" #include "xserver-remote.h" +#include "xsession.h" struct SeatXDMCPSessionPrivate { - /* Remote display */ - XDisplay *display; - /* Session being serviced */ XDMCPSession *session; }; @@ -37,8 +34,8 @@ seat_xdmcp_session_new (XDMCPSession *session) return seat; } -static Display * -seat_xdmcp_session_add_display (Seat *seat) +static DisplayServer * +seat_xdmcp_session_create_display_server (Seat *seat) { XAuthority *authority; gchar *host; @@ -49,10 +46,23 @@ seat_xdmcp_session_add_display (Seat *seat) xserver = xserver_remote_new (host, xdmcp_session_get_display_number (SEAT_XDMCP_SESSION (seat)->priv->session), authority); g_free (host); - SEAT_XDMCP_SESSION (seat)->priv->display = xdisplay_new (XSERVER (xserver)); - g_object_unref (xserver); + return DISPLAY_SERVER (xserver); +} + +static Session * +seat_xdmcp_session_create_session (Seat *seat, Display *display) +{ + XServerRemote *xserver; + XSession *session; + + xserver = XSERVER_REMOTE (display_get_display_server (display)); + + session = xsession_new (XSERVER (xserver)); + session_set_console_kit_parameter (SESSION (session), "remote-host-name", g_variant_new_string (xserver_get_hostname (XSERVER (xserver)))); + // FIXME: Mark local seats as such + session_set_console_kit_parameter (SESSION (session), "is-local", g_variant_new_boolean (FALSE)); - return DISPLAY (SEAT_XDMCP_SESSION (seat)->priv->display); + return SESSION (session); } static void @@ -74,8 +84,6 @@ seat_xdmcp_session_finalize (GObject *object) self = SEAT_XDMCP_SESSION (object); - if (self->priv->display) - g_object_unref (self->priv->display); g_object_unref (self->priv->session); G_OBJECT_CLASS (seat_xdmcp_session_parent_class)->finalize (object); @@ -87,7 +95,8 @@ seat_xdmcp_session_class_init (SeatXDMCPSessionClass *klass) SeatClass *seat_class = SEAT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); - seat_class->add_display = seat_xdmcp_session_add_display; + seat_class->create_display_server = seat_xdmcp_session_create_display_server; + seat_class->create_session = seat_xdmcp_session_create_session; seat_class->display_removed = seat_xdmcp_session_display_removed; object_class->finalize = seat_xdmcp_session_finalize; diff --git a/src/seat-xlocal.c b/src/seat-xlocal.c index 9fad872c..996b4533 100644 --- a/src/seat-xlocal.c +++ b/src/seat-xlocal.c @@ -13,8 +13,8 @@ #include "seat-xlocal.h" #include "configuration.h" -#include "xdisplay.h" #include "xserver-local.h" +#include "xsession.h" #include "vt.h" G_DEFINE_TYPE (SeatXLocal, seat_xlocal, SEAT_TYPE); @@ -26,11 +26,10 @@ seat_xlocal_setup (Seat *seat) SEAT_CLASS (seat_xlocal_parent_class)->setup (seat); } -static Display * -seat_xlocal_add_display (Seat *seat) +static DisplayServer * +seat_xlocal_create_display_server (Seat *seat) { XServerLocal *xserver; - XDisplay *display; const gchar *command = NULL, *layout = NULL, *config_file = NULL, *xdmcp_manager = NULL, *key_name = NULL; gint port = 0; @@ -98,10 +97,25 @@ seat_xlocal_add_display (Seat *seat) g_key_file_free (keys); } - display = xdisplay_new (XSERVER (xserver)); - g_object_unref (xserver); + return DISPLAY_SERVER (xserver); +} + +static Session * +seat_xlocal_create_session (Seat *seat, Display *display) +{ + XServerLocal *xserver; + XSession *session; + gchar *tty; + + xserver = XSERVER_LOCAL (display_get_display_server (display)); + + session = xsession_new (XSERVER (xserver)); + tty = g_strdup_printf ("/dev/tty%d", xserver_local_get_vt (xserver)); + session_set_console_kit_parameter (SESSION (session), "x11-display-device", g_variant_new_string (tty)); + g_free (tty); + session_set_console_kit_parameter (SESSION (session), "is-local", g_variant_new_boolean (TRUE)); - return DISPLAY (display); + return SESSION (session); } static void @@ -147,7 +161,8 @@ seat_xlocal_class_init (SeatXLocalClass *klass) SeatClass *seat_class = SEAT_CLASS (klass); seat_class->setup = seat_xlocal_setup; - seat_class->add_display = seat_xlocal_add_display; + seat_class->create_display_server = seat_xlocal_create_display_server; + seat_class->create_session = seat_xlocal_create_session; seat_class->set_active_display = seat_xlocal_set_active_display; seat_class->display_removed = seat_xlocal_display_removed; } diff --git a/src/seat-xremote.c b/src/seat-xremote.c index 63fb142f..df648bde 100644 --- a/src/seat-xremote.c +++ b/src/seat-xremote.c @@ -13,18 +13,11 @@ #include "seat-xremote.h" #include "configuration.h" -#include "xdisplay.h" #include "xserver-remote.h" -#include "vt.h" +#include "xsession.h" G_DEFINE_TYPE (SeatXRemote, seat_xremote, SEAT_TYPE); -struct SeatXRemotePrivate -{ - /* Display being controlled by this seat */ - XDisplay *display; -}; - static void seat_xremote_setup (Seat *seat) { @@ -32,17 +25,13 @@ seat_xremote_setup (Seat *seat) SEAT_CLASS (seat_xremote_parent_class)->setup (seat); } -static Display * -seat_xremote_add_display (Seat *seat) +static DisplayServer * +seat_xremote_create_display_server (Seat *seat) { XServerRemote *xserver; const gchar *hostname; gint number; - /* Can only have one display */ - if (SEAT_XREMOTE (seat)->priv->display) - return NULL; - hostname = seat_get_string_property (seat, "xserver-hostname"); if (!hostname) hostname = "localhost"; @@ -52,10 +41,22 @@ seat_xremote_add_display (Seat *seat) xserver = xserver_remote_new (hostname, number, NULL); - SEAT_XREMOTE (seat)->priv->display = xdisplay_new (XSERVER (xserver)); - g_object_unref (xserver); - - return DISPLAY (SEAT_XREMOTE (seat)->priv->display); + return DISPLAY_SERVER (xserver); +} + +static Session * +seat_xremote_create_session (Seat *seat, Display *display) +{ + XServerRemote *xserver; + XSession *session; + + xserver = XSERVER_REMOTE (display_get_display_server (display)); + + session = xsession_new (XSERVER (xserver)); + session_set_console_kit_parameter (SESSION (session), "remote-host-name", g_variant_new_string (xserver_get_hostname (XSERVER (xserver)))); + session_set_console_kit_parameter (SESSION (session), "is-local", g_variant_new_boolean (FALSE)); + + return SESSION (session); } static void @@ -68,7 +69,6 @@ seat_xremote_display_removed (Seat *seat, Display *display) static void seat_xremote_init (SeatXRemote *seat) { - seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_XREMOTE_TYPE, SeatXRemotePrivate); } static void @@ -77,8 +77,7 @@ seat_xremote_class_init (SeatXRemoteClass *klass) SeatClass *seat_class = SEAT_CLASS (klass); seat_class->setup = seat_xremote_setup; - seat_class->add_display = seat_xremote_add_display; + seat_class->create_display_server = seat_xremote_create_display_server; + seat_class->create_session = seat_xremote_create_session; seat_class->display_removed = seat_xremote_display_removed; - - g_type_class_add_private (klass, sizeof (SeatXRemotePrivate)); } diff --git a/src/seat-xremote.h b/src/seat-xremote.h index 583923c2..947669ca 100644 --- a/src/seat-xremote.h +++ b/src/seat-xremote.h @@ -20,12 +20,9 @@ G_BEGIN_DECLS #define SEAT_XREMOTE_TYPE (seat_xremote_get_type()) #define SEAT_XREMOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEAT_XREMOTE_TYPE, SeatXRemote)) -typedef struct SeatXRemotePrivate SeatXRemotePrivate; - typedef struct { Seat parent_instance; - SeatXRemotePrivate *priv; } SeatXRemote; typedef struct diff --git a/src/seat-xvnc.c b/src/seat-xvnc.c index 82339e51..db1ae66f 100644 --- a/src/seat-xvnc.c +++ b/src/seat-xvnc.c @@ -10,16 +10,13 @@ */ #include "seat-xvnc.h" -#include "xdisplay.h" #include "xserver-xvnc.h" +#include "xsession.h" G_DEFINE_TYPE (SeatXVNC, seat_xvnc, SEAT_TYPE); struct SeatXVNCPrivate { - /* Remote display */ - XDisplay *display; - /* VNC connection */ GSocket *connection; }; @@ -34,18 +31,35 @@ SeatXVNC *seat_xvnc_new (GSocket *connection) return seat; } -static Display * -seat_xvnc_add_display (Seat *seat) +static DisplayServer * +seat_xvnc_create_display_server (Seat *seat) { XServerXVNC *xserver; xserver = xserver_xvnc_new (); xserver_xvnc_set_stdin (xserver, g_socket_get_fd (SEAT_XVNC (seat)->priv->connection)); - SEAT_XVNC (seat)->priv->display = xdisplay_new (XSERVER (xserver)); - g_object_unref (xserver); + return DISPLAY_SERVER (xserver); +} + +static Session * +seat_xvnc_create_session (Seat *seat, Display *display) +{ + XServerXVNC *xserver; + XSession *session; + GInetSocketAddress *address; + gchar *hostname; + + xserver = XSERVER_XVNC (display_get_display_server (display)); + + session = xsession_new (XSERVER (xserver)); + address = G_INET_SOCKET_ADDRESS (g_socket_get_remote_address (SEAT_XVNC (seat)->priv->connection, NULL)); + hostname = g_inet_address_to_string (g_inet_socket_address_get_address (address)); + session_set_console_kit_parameter (SESSION (session), "remote-host-name", g_variant_new_string (hostname)); + g_free (hostname); + session_set_console_kit_parameter (SESSION (session), "is-local", g_variant_new_boolean (FALSE)); - return DISPLAY (SEAT_XVNC (seat)->priv->display); + return SESSION (session); } static void @@ -67,8 +81,6 @@ seat_xdmcp_session_finalize (GObject *object) self = SEAT_XVNC (object); - if (self->priv->display) - g_object_unref (self->priv->display); g_object_unref (self->priv->connection); G_OBJECT_CLASS (seat_xvnc_parent_class)->finalize (object); @@ -80,7 +92,8 @@ seat_xvnc_class_init (SeatXVNCClass *klass) SeatClass *seat_class = SEAT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); - seat_class->add_display = seat_xvnc_add_display; + seat_class->create_display_server = seat_xvnc_create_display_server; + seat_class->create_session = seat_xvnc_create_session; seat_class->display_removed = seat_xvnc_display_removed; object_class->finalize = seat_xdmcp_session_finalize; @@ -369,6 +369,12 @@ display_start_display_server_cb (Display *display, Seat *seat) return FALSE; } +static Session * +display_create_session_cb (Display *display, Seat *seat) +{ + return SEAT_GET_CLASS (seat)->create_session (seat, display); +} + static gboolean display_start_greeter_cb (Display *display, Seat *seat) { @@ -474,7 +480,8 @@ display_stopped_cb (Display *display, Seat *seat) static gboolean switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean is_guest, const gchar *session_name, gboolean autologin) { - Display *display = NULL; + Display *display; + DisplayServer *display_server; /* Switch to existing if it exists */ if (switch_to_user (seat, username, FALSE)) @@ -500,11 +507,15 @@ switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean is_ g_debug ("Starting new display for greeter"); } - display = SEAT_GET_CLASS (seat)->add_display (seat); + display_server = SEAT_GET_CLASS (seat)->create_display_server (seat); + display = display_new (display_server); + g_object_unref (display_server); + g_signal_connect (display, "switch-to-user", G_CALLBACK (display_switch_to_user_cb), seat); g_signal_connect (display, "switch-to-guest", G_CALLBACK (display_switch_to_guest_cb), seat); g_signal_connect (display, "get-guest-username", G_CALLBACK (display_get_guest_username_cb), seat); g_signal_connect (display, "start-display-server", G_CALLBACK (display_start_display_server_cb), seat); + g_signal_connect (display, "create-session", G_CALLBACK (display_create_session_cb), seat); g_signal_connect (display, "start-greeter", G_CALLBACK (display_start_greeter_cb), seat); g_signal_connect (display, "start-session", G_CALLBACK (display_start_session_cb), seat); g_signal_connect_after (display, "start-session", G_CALLBACK (display_session_started_cb), seat); @@ -617,12 +628,6 @@ seat_real_start (Seat *seat) return switch_to_user_or_start_greeter (seat, NULL, FALSE, NULL, FALSE); } -static Display * -seat_real_add_display (Seat *seat) -{ - return NULL; -} - static void seat_real_set_active_display (Seat *seat, Display *display) { @@ -688,7 +693,6 @@ seat_class_init (SeatClass *klass) klass->setup = seat_real_setup; klass->start = seat_real_start; - klass->add_display = seat_real_add_display; klass->set_active_display = seat_real_set_active_display; klass->stop = seat_real_stop; @@ -36,7 +36,8 @@ typedef struct void (*setup)(Seat *seat); gboolean (*start)(Seat *seat); - Display *(*add_display)(Seat *seat); + DisplayServer *(*create_display_server) (Seat *seat); + Session *(*create_session) (Seat *seat, Display *display); void (*set_active_display)(Seat *seat, Display *display); void (*stop)(Seat *seat); diff --git a/src/session.c b/src/session.c index 1dbe7fae..5e588cfc 100644 --- a/src/session.c +++ b/src/session.c @@ -19,17 +19,21 @@ #include <grp.h> #include "session.h" +#include "console-kit.h" struct SessionPrivate { /* Authentication for this session */ PAMSession *authentication; - + /* Command to run for this session */ gchar *command; - /* Cookie for the session */ - gchar *cookie; + /* ConsoleKit parameters for this session */ + GHashTable *console_kit_parameters; + + /* ConsoleKit cookie for the session */ + gchar *console_kit_cookie; /* TRUE if this is a greeter session */ gboolean is_greeter; @@ -84,26 +88,10 @@ session_set_command (Session *session, const gchar *command) const gchar * session_get_command (Session *session) { - g_return_val_if_fail (session != NULL, NULL); + g_return_val_if_fail (session != NULL, NULL); return session->priv->command; } -void -session_set_cookie (Session *session, const gchar *cookie) -{ - g_return_if_fail (session != NULL); - - g_free (session->priv->cookie); - session->priv->cookie = g_strdup (cookie); -} - -const gchar * -session_get_cookie (Session *session) -{ - g_return_val_if_fail (session != NULL, NULL); - return session->priv->cookie; -} - static gchar * get_absolute_command (const gchar *command) { @@ -154,6 +142,15 @@ set_env_from_authentication (Session *session, PAMSession *authentication) } } +void +session_set_console_kit_parameter (Session *session, const gchar *name, GVariant *value) +{ + g_return_if_fail (session != NULL); + g_return_if_fail (name != NULL); + + g_hash_table_insert (session->priv->console_kit_parameters, g_strdup (name), value); +} + gboolean session_start (Session *session) { @@ -173,8 +170,8 @@ session_start (Session *session) process_set_env (PROCESS (session), "SHELL", user_get_shell (user)); set_env_from_authentication (session, session->priv->authentication); - if (session->priv->cookie) - process_set_env (PROCESS (session), "XDG_SESSION_COOKIE", session->priv->cookie); + if (session->priv->console_kit_cookie) + process_set_env (PROCESS (session), "XDG_SESSION_COOKIE", session->priv->console_kit_cookie); return SESSION_GET_CLASS (session)->start (session); } @@ -210,6 +207,34 @@ session_real_start (Session *session) } pam_session_open (session->priv->authentication); + + /* Open ConsoleKit session */ + if (getuid () == 0) + { + GVariantBuilder parameters; + User *user; + GHashTableIter iter; + gpointer key, value; + + user = pam_session_get_user (session->priv->authentication); + + g_variant_builder_init (¶meters, G_VARIANT_TYPE ("(a(sv))")); + g_variant_builder_open (¶meters, G_VARIANT_TYPE ("a(sv)")); + g_variant_builder_add (¶meters, "(sv)", "unix-user", g_variant_new_int32 (user_get_uid (user))); + if (session->priv->is_greeter) + g_variant_builder_add (¶meters, "(sv)", "session-type", g_variant_new_string ("LoginWindow")); + g_hash_table_iter_init (&iter, session->priv->console_kit_parameters); + while (g_hash_table_iter_next (&iter, &key, &value)) + g_variant_builder_add (¶meters, "(sv)", (gchar *) key, (GVariant *) value); + + g_free (session->priv->console_kit_cookie); + session->priv->console_kit_cookie = ck_open_session (¶meters); + } + else + { + g_free (session->priv->console_kit_cookie); + session->priv->console_kit_cookie = g_strdup (g_getenv ("XDG_SESSION_COOKIE")); + } user = pam_session_get_user (session->priv->authentication); process_set_user (PROCESS (session), user); @@ -218,6 +243,8 @@ session_real_start (Session *session) if (!result) pam_session_close (session->priv->authentication); + if (getuid () == 0 && session->priv->console_kit_cookie) + ck_close_session (session->priv->console_kit_cookie); return result; } @@ -229,6 +256,14 @@ session_real_stop (Session *session) } void +session_unlock (Session *session) +{ + g_return_if_fail (session != NULL); + if (getuid () == 0) + ck_unlock_session (session->priv->console_kit_cookie); +} + +void session_stop (Session *session) { g_return_if_fail (session != NULL); @@ -254,6 +289,8 @@ session_stopped (Process *process) Session *session = SESSION (process); pam_session_close (session->priv->authentication); + if (getuid () == 0 && session->priv->console_kit_cookie) + ck_close_session (session->priv->console_kit_cookie); PROCESS_CLASS (session_parent_class)->stopped (process); } @@ -262,6 +299,7 @@ static void session_init (Session *session) { session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, SESSION_TYPE, SessionPrivate); + session->priv->console_kit_parameters = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); } static void @@ -274,7 +312,8 @@ session_finalize (GObject *object) if (self->priv->authentication) g_object_unref (self->priv->authentication); g_free (self->priv->command); - g_free (self->priv->cookie); + g_hash_table_unref (self->priv->console_kit_parameters); + g_free (self->priv->console_kit_cookie); G_OBJECT_CLASS (session_parent_class)->finalize (object); } diff --git a/src/session.h b/src/session.h index b7cf233e..a2ddf231 100644 --- a/src/session.h +++ b/src/session.h @@ -55,12 +55,12 @@ void session_set_command (Session *session, const gchar *command); const gchar *session_get_command (Session *session); -void session_set_cookie (Session *session, const gchar *cookie); - -const gchar *session_get_cookie (Session *session); +void session_set_console_kit_parameter (Session *session, const gchar *name, GVariant *value); gboolean session_start (Session *session); +void session_unlock (Session *session); + void session_stop (Session *session); G_END_DECLS diff --git a/src/xdisplay.c b/src/xdisplay.c deleted file mode 100644 index 7c4f09c2..00000000 --- a/src/xdisplay.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2010-2011 Robert Ancell. - * Author: Robert Ancell <robert.ancell@canonical.com> - * - * 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 3 of the License, or (at your option) any later - * version. See http://www.gnu.org/copyleft/gpl.html the full text of the - * license. - */ - -#include <config.h> - -#include "xdisplay.h" -#include "xsession.h" - -G_DEFINE_TYPE (XDisplay, xdisplay, DISPLAY_TYPE); - -XDisplay * -xdisplay_new (XServer *server) -{ - XDisplay *self = g_object_new (XDISPLAY_TYPE, NULL); - - g_return_val_if_fail (server != NULL, NULL); - - display_set_display_server (DISPLAY (self), DISPLAY_SERVER (server)); - - return self; -} - -static Session * -xdisplay_create_session (Display *display) -{ - return SESSION (xsession_new (XSERVER (display_get_display_server (display)))); -} - -static void -xdisplay_init (XDisplay *display) -{ -} - -static void -xdisplay_class_init (XDisplayClass *klass) -{ - DisplayClass *display_class = DISPLAY_CLASS (klass); - - display_class->create_session = xdisplay_create_session; -} diff --git a/src/xdisplay.h b/src/xdisplay.h deleted file mode 100644 index bf365bc7..00000000 --- a/src/xdisplay.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2010-2011 Robert Ancell. - * Author: Robert Ancell <robert.ancell@canonical.com> - * - * 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 3 of the License, or (at your option) any later - * version. See http://www.gnu.org/copyleft/gpl.html the full text of the - * license. - */ - -#ifndef _XDISPLAY_H_ -#define _XDISPLAY_H_ - -#include "display.h" -#include "xserver.h" - -G_BEGIN_DECLS - -#define XDISPLAY_TYPE (xdisplay_get_type()) -#define XDISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XDISPLAY_TYPE, XDisplay)); - -typedef struct -{ - Display parent_instance; -} XDisplay; - -typedef struct -{ - DisplayClass parent_class; -} XDisplayClass; - -GType xdisplay_get_type (void); - -XDisplay *xdisplay_new (XServer *server); - -G_END_DECLS - -#endif /* _XDISPLAY_H_ */ diff --git a/src/xserver-local.c b/src/xserver-local.c index 188f24bd..3f5ce7b3 100644 --- a/src/xserver-local.c +++ b/src/xserver-local.c @@ -86,9 +86,14 @@ XServerLocal * xserver_local_new (void) { XServerLocal *self = g_object_new (XSERVER_LOCAL_TYPE, NULL); + gchar *name; xserver_set_display_number (XSERVER (self), get_free_display_number ()); - + + name = g_strdup_printf ("x-%d", xserver_get_display_number (XSERVER (self))); + display_server_set_name (DISPLAY_SERVER (self), name); + g_free (name); + /* Replace Plymouth if it is running */ if (plymouth_get_is_active () && plymouth_has_active_vt ()) { @@ -141,6 +146,7 @@ xserver_local_set_xdmcp_server (XServerLocal *server, const gchar *hostname) g_return_if_fail (server != NULL); g_free (server->priv->xdmcp_server); server->priv->xdmcp_server = g_strdup (hostname); + display_server_set_start_local_sessions (DISPLAY_SERVER (server), hostname == NULL); } const gchar * diff --git a/src/xserver-remote.c b/src/xserver-remote.c index 183e36b0..fcf0f293 100644 --- a/src/xserver-remote.c +++ b/src/xserver-remote.c @@ -19,11 +19,16 @@ XServerRemote * xserver_remote_new (const gchar *hostname, guint number, XAuthority *authority) { XServerRemote *self = g_object_new (XSERVER_REMOTE_TYPE, NULL); + gchar *name; xserver_set_hostname (XSERVER (self), hostname); xserver_set_display_number (XSERVER (self), number); xserver_set_authority (XSERVER (self), authority); + name = g_strdup_printf ("x-%s-%d", hostname, number); + display_server_set_name (DISPLAY_SERVER (self), name); + g_free (name); + return self; } diff --git a/src/xserver-xvnc.c b/src/xserver-xvnc.c index cbff3744..cec101c0 100644 --- a/src/xserver-xvnc.c +++ b/src/xserver-xvnc.c @@ -63,9 +63,14 @@ XServerXVNC * xserver_xvnc_new (void) { XServerXVNC *self = g_object_new (XSERVER_XVNC_TYPE, NULL); + gchar *name; xserver_set_display_number (XSERVER (self), get_free_display_number ()); - + + name = g_strdup_printf ("xvnc-%d", xserver_get_display_number (XSERVER (self))); + display_server_set_name (DISPLAY_SERVER (self), name); + g_free (name); + return self; } diff --git a/src/xsession.c b/src/xsession.c index ebbe2621..3b0201d7 100644 --- a/src/xsession.c +++ b/src/xsession.c @@ -57,10 +57,19 @@ xsession_start (Session *session) { XSession *xsession = XSESSION (session); PAMSession *authentication; + gchar *hostname; authentication = session_get_authentication (session); pam_session_set_item (authentication, PAM_TTY, xserver_get_address (xsession->priv->xserver)); + session_set_console_kit_parameter (session, "x11-display", g_variant_new_string (xserver_get_address (xsession->priv->xserver))); + hostname = xserver_get_hostname (xsession->priv->xserver); + if (hostname) + { + session_set_console_kit_parameter (session, "remote-host-name", g_variant_new_string (hostname)); + session_set_console_kit_parameter (session, "is-local", g_variant_new_boolean (FALSE)); + } + if (xserver_get_authority (xsession->priv->xserver)) { gchar *path; |