summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--src/Makefile.am2
-rw-r--r--src/display-server.c42
-rw-r--r--src/display-server.h8
-rw-r--r--src/display.c109
-rw-r--r--src/display.h3
-rw-r--r--src/ldm-marshal.list8
-rw-r--r--src/lightdm.c79
-rw-r--r--src/seat-xdmcp-session.c33
-rw-r--r--src/seat-xlocal.c31
-rw-r--r--src/seat-xremote.c43
-rw-r--r--src/seat-xremote.h3
-rw-r--r--src/seat-xvnc.c37
-rw-r--r--src/seat.c22
-rw-r--r--src/seat.h3
-rw-r--r--src/session.c85
-rw-r--r--src/session.h6
-rw-r--r--src/xdisplay.c48
-rw-r--r--src/xdisplay.h39
-rw-r--r--src/xserver-local.c8
-rw-r--r--src/xserver-remote.c5
-rw-r--r--src/xserver-xvnc.c7
-rw-r--r--src/xsession.c9
23 files changed, 280 insertions, 356 deletions
diff --git a/NEWS b/NEWS
index f7f3e0c6..e0418262 100644
--- a/NEWS
+++ b/NEWS
@@ -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 (&parameters, G_VARIANT_TYPE ("(a(sv))"));
- g_variant_builder_open (&parameters, G_VARIANT_TYPE ("a(sv)"));
- g_variant_builder_add (&parameters, "(sv)", "unix-user", g_variant_new_int32 (user_get_uid (user)));
- g_variant_builder_add (&parameters, "(sv)", "session-type", g_variant_new_string (is_greeter ? "LoginWindow" : ""));
- if (display->priv->xdisplay)
- {
- g_variant_builder_add (&parameters, "(sv)", "x11-display",
- g_variant_new_string (display->priv->xdisplay));
-
- if (display->priv->tty)
- g_variant_builder_add (&parameters, "(sv)", "x11-display-device",
- g_variant_new_string (display->priv->tty));
- }
- g_variant_builder_add (&parameters, "(sv)", "remote-host-name", g_variant_new_string (""));
- g_variant_builder_add (&parameters, "(sv)", "is-local", g_variant_new_boolean (TRUE)); // FIXME
-
- if (getuid () == 0)
- {
- cookie = ck_open_session (&parameters);
- 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;
diff --git a/src/seat.c b/src/seat.c
index 8db2d2fd..ffeb6ea1 100644
--- a/src/seat.c
+++ b/src/seat.c
@@ -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;
diff --git a/src/seat.h b/src/seat.h
index 72cebeda..23069a33 100644
--- a/src/seat.h
+++ b/src/seat.h
@@ -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 (&parameters, G_VARIANT_TYPE ("(a(sv))"));
+ g_variant_builder_open (&parameters, G_VARIANT_TYPE ("a(sv)"));
+ g_variant_builder_add (&parameters, "(sv)", "unix-user", g_variant_new_int32 (user_get_uid (user)));
+ if (session->priv->is_greeter)
+ g_variant_builder_add (&parameters, "(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 (&parameters, "(sv)", (gchar *) key, (GVariant *) value);
+
+ g_free (session->priv->console_kit_cookie);
+ session->priv->console_kit_cookie = ck_open_session (&parameters);
+ }
+ 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;