summaryrefslogtreecommitdiff
path: root/daemon/gdm-simple-slave.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/gdm-simple-slave.c')
-rw-r--r--daemon/gdm-simple-slave.c867
1 files changed, 58 insertions, 809 deletions
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 02f4dc92..04212d2c 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -57,9 +57,6 @@
#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"
-#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display"
-
#define MAX_CONNECT_ATTEMPTS 10
#define DEFAULT_PING_INTERVAL 15
@@ -69,10 +66,8 @@
struct GdmSimpleSlavePrivate
{
GPid pid;
+ char *username;
gint greeter_reset_id;
- guint start_session_id;
-
- char *start_session_service_name;
int ping_interval;
@@ -81,22 +76,14 @@ struct GdmSimpleSlavePrivate
GdmServer *server;
- /* we control the user session */
- GdmSession *session;
-
/* this spawns and controls the greeter session */
GdmLaunchEnvironment *greeter_environment;
- GHashTable *open_reauthentication_requests;
-
GDBusProxy *accountsservice_proxy;
guint have_existing_user_accounts : 1;
guint accountsservice_ready : 1;
guint waiting_to_connect_to_display : 1;
- guint start_session_when_ready : 1;
- guint waiting_to_start_session : 1;
- guint session_is_running : 1;
#ifdef HAVE_LOGINDEVPERM
gboolean use_logindevperm;
#endif
@@ -113,22 +100,10 @@ enum {
static void gdm_simple_slave_class_init (GdmSimpleSlaveClass *klass);
static void gdm_simple_slave_init (GdmSimpleSlave *simple_slave);
static void gdm_simple_slave_finalize (GObject *object);
-static void gdm_simple_slave_open_reauthentication_channel (GdmSlave *slave,
- const char *username,
- GPid pid_of_caller,
- uid_t uid_of_caller,
- GAsyncReadyCallback callback,
- gpointer user_data,
- GCancellable *cancellable);
static gboolean wants_initial_setup (GdmSimpleSlave *slave);
G_DEFINE_TYPE (GdmSimpleSlave, gdm_simple_slave, GDM_TYPE_SLAVE)
-static void create_new_session (GdmSimpleSlave *slave);
-static void start_session (GdmSimpleSlave *slave);
-static void queue_start_session (GdmSimpleSlave *slave,
- const char *service_name);
-
static gboolean
chown_file (GFile *file,
uid_t uid,
@@ -246,22 +221,6 @@ out:
g_free (gis_dir_path);
}
-static void
-on_session_started (GdmSession *session,
- const char *service_name,
- int pid,
- GdmSimpleSlave *slave)
-{
- const char *session_id;
-
- g_debug ("GdmSimpleSlave: session started %d", pid);
-
- slave->priv->session_is_running = TRUE;
-
- session_id = gdm_session_get_session_id (session);
- g_object_set (GDM_SLAVE (slave), "session-id", session_id, NULL);
-}
-
#ifdef HAVE_LOGINDEVPERM
static void
gdm_simple_slave_grant_console_permissions (GdmSimpleSlave *slave)
@@ -330,599 +289,6 @@ gdm_simple_slave_revoke_console_permissions (GdmSimpleSlave *slave)
#endif /* HAVE_LOGINDEVPERM */
static void
-on_session_exited (GdmSession *session,
- int exit_code,
- GdmSimpleSlave *slave)
-{
- g_object_set (GDM_SLAVE (slave), "session-id", NULL, NULL);
-
- g_debug ("GdmSimpleSlave: session exited with code %d\n", exit_code);
- gdm_slave_stop (GDM_SLAVE (slave));
-}
-
-static void
-on_session_died (GdmSession *session,
- int signal_number,
- GdmSimpleSlave *slave)
-{
- g_object_set (GDM_SLAVE (slave), "session-id", NULL, NULL);
-
- g_debug ("GdmSimpleSlave: session died with signal %d, (%s)",
- signal_number,
- g_strsignal (signal_number));
- gdm_slave_stop (GDM_SLAVE (slave));
-}
-
-static gboolean
-add_user_authorization (GdmSimpleSlave *slave,
- char **filename)
-{
- const char *username;
- gboolean ret;
-
- username = gdm_session_get_username (slave->priv->session);
- ret = gdm_slave_add_user_authorization (GDM_SLAVE (slave),
- username,
- filename);
-
- return ret;
-}
-
-static void
-reset_session (GdmSimpleSlave *slave)
-{
- if (slave->priv->session == NULL) {
- return;
- }
-
- gdm_session_reset (slave->priv->session);
-}
-
-static gboolean
-greeter_reset_timeout (GdmSimpleSlave *slave)
-{
- g_debug ("GdmSimpleSlave: resetting greeter");
-
- reset_session (slave);
-
- slave->priv->greeter_reset_id = 0;
- return FALSE;
-}
-
-static void
-queue_greeter_reset (GdmSimpleSlave *slave)
-{
- if (slave->priv->greeter_reset_id > 0) {
- return;
- }
-
- slave->priv->greeter_reset_id = g_idle_add ((GSourceFunc)greeter_reset_timeout, slave);
-}
-
-static void
-gdm_simple_slave_start_session_when_ready (GdmSimpleSlave *slave,
- const char *service_name)
-{
- if (slave->priv->start_session_when_ready) {
- slave->priv->waiting_to_start_session = FALSE;
- queue_start_session (slave, service_name);
- } else {
- slave->priv->waiting_to_start_session = TRUE;
- }
-}
-
-static gboolean
-switch_to_and_unlock_session (GdmSimpleSlave *slave,
- gboolean fail_if_already_switched)
-{
- const char *username;
- const char *session_id;
- gboolean res;
-
- username = gdm_session_get_username (slave->priv->session);
- session_id = gdm_session_get_session_id (slave->priv->session);
-
- g_debug ("GdmSimpleSlave: trying to switch to session for user %s", username);
-
- /* try to switch to an existing session */
- res = gdm_slave_switch_to_user_session (GDM_SLAVE (slave), username, session_id, fail_if_already_switched);
-
- return res;
-}
-
-static void
-stop_greeter (GdmSimpleSlave *slave)
-{
- gdm_launch_environment_stop (GDM_LAUNCH_ENVIRONMENT (slave->priv->greeter_environment));
-}
-
-static void
-start_session (GdmSimpleSlave *slave)
-{
- char *auth_file;
-
- auth_file = NULL;
- add_user_authorization (slave, &auth_file);
-
- g_assert (auth_file != NULL);
-
- g_object_set (slave->priv->session,
- "user-x11-authority-file", auth_file,
- NULL);
-
- g_free (auth_file);
-
- if (slave->priv->doing_initial_setup) {
- chown_initial_setup_home_dir ();
- }
-
- gdm_session_start_session (slave->priv->session,
- slave->priv->start_session_service_name);
-
- slave->priv->start_session_id = 0;
- g_free (slave->priv->start_session_service_name);
- slave->priv->start_session_service_name = NULL;
-}
-
-static gboolean
-start_session_timeout (GdmSimpleSlave *slave)
-{
- gboolean migrated;
- gboolean fail_if_already_switched = TRUE;
-
- g_debug ("GdmSimpleSlave: accredited");
-
- /* If there's already a session running, jump to it.
- * If the only session running is the one we just opened,
- * start a session on it.
- *
- * We assume we're in the former case if we need to switch
- * VTs, and we assume we're in the latter case if we don't.
- */
- migrated = switch_to_and_unlock_session (slave, fail_if_already_switched);
- g_debug ("GdmSimpleSlave: migrated: %d", migrated);
- if (migrated) {
- /* We don't stop the slave here because
- when Xorg exits it switches to the VT it was
- started from. That interferes with fast
- user switching. */
- gdm_session_reset (slave->priv->session);
-
- slave->priv->start_session_id = 0;
- g_free (slave->priv->start_session_service_name);
- slave->priv->start_session_service_name = NULL;
- } else {
- if (slave->priv->greeter_environment == NULL) {
- /* auto login */
- start_session (slave);
- } else {
- /* Session actually gets started from on_greeter_environment_session_stop */
- stop_greeter (slave);
- }
- }
-
- return FALSE;
-}
-
-static void
-queue_start_session (GdmSimpleSlave *slave,
- const char *service_name)
-{
- if (slave->priv->start_session_id > 0) {
- return;
- }
-
- slave->priv->start_session_id = g_idle_add ((GSourceFunc)start_session_timeout, slave);
- slave->priv->start_session_service_name = g_strdup (service_name);
-}
-
-static void
-on_session_reauthenticated (GdmSession *session,
- const char *service_name,
- GdmSimpleSlave *slave)
-{
- gboolean fail_if_already_switched = FALSE;
-
- /* There should already be a session running, so jump to it's
- * VT. In the event we're already on the right VT, (i.e. user
- * used an unlock screen instead of a user switched login screen),
- * then silently succeed and unlock the session.
- */
- switch_to_and_unlock_session (slave, fail_if_already_switched);
-}
-
-static void
-on_session_opened (GdmSession *session,
- const char *service_name,
- const char *session_id,
- GdmSimpleSlave *slave)
-{
-
-#ifdef HAVE_LOGINDEVPERM
- gdm_simple_slave_grant_console_permissions (slave);
-#endif /* HAVE_LOGINDEVPERM */
-
- if (g_strcmp0 (service_name, "gdm-autologin") == 0 &&
- !gdm_session_client_is_connected (slave->priv->session)) {
- /* If we're auto logging in then don't wait for the go-ahead from a greeter,
- * (since there is no greeter) */
- slave->priv->start_session_when_ready = TRUE;
- }
-
- gdm_simple_slave_start_session_when_ready (slave, service_name);
-}
-
-static void
-on_session_conversation_started (GdmSession *session,
- const char *service_name,
- GdmSimpleSlave *slave)
-{
- gboolean enabled;
- char *username;
- int delay;
-
- g_debug ("GdmSimpleSlave: session conversation started for service %s", service_name);
-
- if (g_strcmp0 (service_name, "gdm-autologin") != 0) {
- return;
- }
-
- enabled = FALSE;
- gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, &username, &delay);
- if (! enabled) {
- return;
- }
-
- if (delay == 0) {
- g_debug ("GdmSimpleSlave: begin auto login for user '%s'", username);
- /* service_name will be "gdm-autologin"
- */
- gdm_session_setup_for_user (slave->priv->session, service_name, username);
- }
-
- g_free (username);
-}
-
-static void
-on_session_conversation_stopped (GdmSession *session,
- const char *service_name,
- GdmSimpleSlave *slave)
-{
- g_debug ("GdmSimpleSlave: conversation stopped");
-
-}
-
-static void
-start_autologin_conversation_if_necessary (GdmSimpleSlave *slave)
-{
- gboolean enabled;
-
- if (g_file_test (GDM_RAN_ONCE_MARKER_FILE, G_FILE_TEST_EXISTS)) {
- return;
- }
-
- gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, NULL);
-
- if (!enabled) {
- return;
- }
-
- g_debug ("GdmSimpleSlave: Starting automatic login conversation");
- gdm_session_start_conversation (slave->priv->session, "gdm-autologin");
-}
-
-static void
-on_session_reauthentication_started (GdmSession *session,
- int pid_of_caller,
- const char *address,
- GdmSimpleSlave *slave)
-{
- GSimpleAsyncResult *result;
- gpointer source_tag;
-
- g_debug ("GdmSimpleSlave: reauthentication started");
-
- source_tag = GINT_TO_POINTER (pid_of_caller);
-
- result = g_hash_table_lookup (slave->priv->open_reauthentication_requests,
- source_tag);
-
- if (result != NULL) {
- g_simple_async_result_set_op_res_gpointer (result,
- g_strdup (address),
- (GDestroyNotify)
- g_free);
- g_simple_async_result_complete_in_idle (result);
- }
-
- g_hash_table_remove (slave->priv->open_reauthentication_requests,
- source_tag);
-}
-
-static void
-on_session_client_ready_for_session_to_start (GdmSession *session,
- const char *service_name,
- gboolean client_is_ready,
- GdmSimpleSlave *slave)
-{
- if (client_is_ready) {
- g_debug ("GdmSimpleSlave: Will start session when ready");
- } else {
- g_debug ("GdmSimpleSlave: Will start session when ready and told");
- }
-
- if (slave->priv->greeter_reset_id > 0) {
- return;
- }
-
- slave->priv->start_session_when_ready = client_is_ready;
-
- if (client_is_ready && slave->priv->waiting_to_start_session) {
- gdm_simple_slave_start_session_when_ready (slave, service_name);
- }
-}
-
-static void
-on_ready_to_request_timed_login (GdmSession *session,
- GSimpleAsyncResult *result,
- gpointer *user_data)
-{
- int delay = GPOINTER_TO_INT (user_data);
- GCancellable *cancellable;
- char *username;
-
- cancellable = g_object_get_data (G_OBJECT (result),
- "cancellable");
- if (g_cancellable_is_cancelled (cancellable)) {
- return;
- }
-
- username = g_simple_async_result_get_source_tag (result);
-
- gdm_session_request_timed_login (session, username, delay);
-
- g_object_weak_unref (G_OBJECT (session),
- (GWeakNotify)
- g_cancellable_cancel,
- cancellable);
- g_object_weak_unref (G_OBJECT (session),
- (GWeakNotify)
- g_object_unref,
- cancellable);
- g_object_weak_unref (G_OBJECT (session),
- (GWeakNotify)
- g_free,
- username);
-
- g_free (username);
-}
-
-static gboolean
-on_wait_for_greeter_timeout (GSimpleAsyncResult *result)
-{
- g_simple_async_result_complete (result);
-
- return FALSE;
-}
-
-static void
-on_session_client_connected (GdmSession *session,
- GCredentials *credentials,
- GPid pid_of_client,
- GdmSimpleSlave *slave)
-{
- gboolean timed_login_enabled;
- char *username;
- int delay;
- gboolean display_is_local;
-
- g_debug ("GdmSimpleSlave: client connected");
-
- g_object_get (slave,
- "display-is-local", &display_is_local,
- NULL);
-
- /* If XDMCP stop pinging */
- if ( ! display_is_local) {
- alarm (0);
- }
-
- timed_login_enabled = FALSE;
- gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &timed_login_enabled, &username, &delay);
-
- if (! timed_login_enabled) {
- return;
- }
-
- /* temporary hack to fix timed login
- * http://bugzilla.gnome.org/680348
- */
- if (delay > 0) {
- GSimpleAsyncResult *result;
- GCancellable *cancellable;
- guint timeout_id;
- gpointer source_tag;
-
- delay = MAX (delay, 4);
-
- cancellable = g_cancellable_new ();
- source_tag = g_strdup (username);
- result = g_simple_async_result_new (G_OBJECT (session),
- (GAsyncReadyCallback)
- on_ready_to_request_timed_login,
- GINT_TO_POINTER (delay),
- source_tag);
- g_simple_async_result_set_check_cancellable (result, cancellable);
- g_object_set_data (G_OBJECT (result),
- "cancellable",
- cancellable);
-
- timeout_id = g_timeout_add_seconds_full (delay - 2,
- G_PRIORITY_DEFAULT,
- (GSourceFunc)
- on_wait_for_greeter_timeout,
- g_object_ref (result),
- (GDestroyNotify)
- g_object_unref);
- g_cancellable_connect (cancellable,
- G_CALLBACK (g_source_remove),
- GINT_TO_POINTER (timeout_id),
- NULL);
-
- g_object_weak_ref (G_OBJECT (session),
- (GWeakNotify)
- g_cancellable_cancel,
- cancellable);
- g_object_weak_ref (G_OBJECT (session),
- (GWeakNotify)
- g_object_unref,
- cancellable);
- g_object_weak_ref (G_OBJECT (session),
- (GWeakNotify)
- g_free,
- source_tag);
- }
-
- g_free (username);
-}
-
-static void
-on_session_client_disconnected (GdmSession *session,
- GCredentials *credentials,
- GPid pid_of_client,
- GdmSimpleSlave *slave)
-{
- g_debug ("GdmSimpleSlave: client disconnected");
-}
-
-static void
-on_session_cancelled (GdmSession *session,
- GdmSimpleSlave *slave)
-{
- g_debug ("GdmSimpleSlave: Session was cancelled");
- queue_greeter_reset (slave);
-}
-
-static void
-touch_marker_file (GdmSimpleSlave *slave)
-{
- int fd;
-
- fd = g_creat (GDM_RAN_ONCE_MARKER_FILE, 0644);
-
- if (fd < 0 && errno != EEXIST) {
- g_warning ("could not create %s to mark run, this may cause auto login "
- "to repeat: %m", GDM_RAN_ONCE_MARKER_FILE);
- return;
- }
-
- fsync (fd);
- close (fd);
-}
-
-static void
-create_new_session (GdmSimpleSlave *slave)
-{
- gboolean display_is_local;
- char *display_name;
- char *display_hostname;
- char *display_device;
- char *display_seat_id;
- char *display_x11_authority_file;
- GdmSession *greeter_session;
- uid_t greeter_uid;
-
- g_debug ("GdmSimpleSlave: Creating new session");
-
- if (slave->priv->greeter_environment != NULL) {
- greeter_session = gdm_launch_environment_get_session (GDM_LAUNCH_ENVIRONMENT (slave->priv->greeter_environment));
- greeter_uid = gdm_session_get_allowed_user (greeter_session);
- } else {
- greeter_uid = 0;
- }
-
- g_object_get (slave,
- "display-name", &display_name,
- "display-hostname", &display_hostname,
- "display-is-local", &display_is_local,
- "display-x11-authority-file", &display_x11_authority_file,
- "display-seat-id", &display_seat_id,
- NULL);
-
- display_device = NULL;
- if (slave->priv->server != NULL) {
- display_device = gdm_server_get_display_device (slave->priv->server);
- }
-
- slave->priv->session = gdm_session_new (GDM_SESSION_VERIFICATION_MODE_LOGIN,
- greeter_uid,
- display_name,
- display_hostname,
- display_device,
- display_seat_id,
- display_x11_authority_file,
- display_is_local,
- NULL);
-
- g_free (display_name);
- g_free (display_device);
- g_free (display_hostname);
-
- g_signal_connect (slave->priv->session,
- "reauthentication-started",
- G_CALLBACK (on_session_reauthentication_started),
- slave);
- g_signal_connect (slave->priv->session,
- "reauthenticated",
- G_CALLBACK (on_session_reauthenticated),
- slave);
- g_signal_connect (slave->priv->session,
- "client-ready-for-session-to-start",
- G_CALLBACK (on_session_client_ready_for_session_to_start),
- slave);
- g_signal_connect (slave->priv->session,
- "client-connected",
- G_CALLBACK (on_session_client_connected),
- slave);
- g_signal_connect (slave->priv->session,
- "client-disconnected",
- G_CALLBACK (on_session_client_disconnected),
- slave);
- g_signal_connect (slave->priv->session,
- "cancelled",
- G_CALLBACK (on_session_cancelled),
- slave);
- g_signal_connect (slave->priv->session,
- "conversation-started",
- G_CALLBACK (on_session_conversation_started),
- slave);
- g_signal_connect (slave->priv->session,
- "conversation-stopped",
- G_CALLBACK (on_session_conversation_stopped),
- slave);
- g_signal_connect (slave->priv->session,
- "session-opened",
- G_CALLBACK (on_session_opened),
- slave);
- g_signal_connect (slave->priv->session,
- "session-started",
- G_CALLBACK (on_session_started),
- slave);
- g_signal_connect (slave->priv->session,
- "session-exited",
- G_CALLBACK (on_session_exited),
- slave);
- g_signal_connect (slave->priv->session,
- "session-died",
- G_CALLBACK (on_session_died),
- slave);
-
- start_autologin_conversation_if_necessary (slave);
-
- touch_marker_file (slave);
-}
-
-static void
on_greeter_environment_session_opened (GdmLaunchEnvironment *greeter_environment,
GdmSimpleSlave *slave)
{
@@ -947,11 +313,7 @@ on_greeter_environment_session_stopped (GdmLaunchEnvironment *greeter_environmen
GdmSimpleSlave *slave)
{
g_debug ("GdmSimpleSlave: Greeter stopped");
- if (slave->priv->start_session_service_name == NULL) {
- gdm_slave_stop (GDM_SLAVE (slave));
- } else {
- start_session (slave);
- }
+ gdm_slave_stop (GDM_SLAVE (slave));
g_object_unref (slave->priv->greeter_environment);
slave->priv->greeter_environment = NULL;
@@ -963,9 +325,7 @@ on_greeter_environment_session_exited (GdmLaunchEnvironment *greeter_environm
GdmSimpleSlave *slave)
{
g_debug ("GdmSimpleSlave: Greeter exited: %d", code);
- if (slave->priv->start_session_service_name == NULL) {
- gdm_slave_stop (GDM_SLAVE (slave));
- }
+ gdm_slave_stop (GDM_SLAVE (slave));
}
static void
@@ -974,9 +334,7 @@ on_greeter_environment_session_died (GdmLaunchEnvironment *greeter_environmen
GdmSimpleSlave *slave)
{
g_debug ("GdmSimpleSlave: Greeter died: %d", signal);
- if (slave->priv->start_session_service_name == NULL) {
- gdm_slave_stop (GDM_SLAVE (slave));
- }
+ gdm_slave_stop (GDM_SLAVE (slave));
}
#ifdef WITH_PLYMOUTH
@@ -1278,14 +636,58 @@ wants_initial_setup (GdmSimpleSlave *slave)
}
static void
-setup_session (GdmSimpleSlave *slave)
+gdm_simple_slave_set_up_greeter_session (GdmSlave *slave,
+ char **username)
+{
+ GdmSimpleSlave *self = GDM_SIMPLE_SLAVE (slave);
+
+ if (wants_initial_setup (self)) {
+ *username = g_strdup (INITIAL_SETUP_USERNAME);
+ } else if (wants_autologin (self)) {
+ *username = g_strdup ("root");
+ } else {
+ *username = g_strdup (GDM_USERNAME);
+ }
+}
+
+static void
+gdm_simple_slave_stop_greeter_session (GdmSlave *slave)
+{
+ GdmSimpleSlave *self = GDM_SIMPLE_SLAVE (slave);
+
+ if (self->priv->greeter_environment != NULL) {
+ g_signal_handlers_disconnect_by_func (self->priv->greeter_environment,
+ G_CALLBACK (on_greeter_environment_session_opened),
+ self);
+ g_signal_handlers_disconnect_by_func (self->priv->greeter_environment,
+ G_CALLBACK (on_greeter_environment_session_started),
+ self);
+ g_signal_handlers_disconnect_by_func (self->priv->greeter_environment,
+ G_CALLBACK (on_greeter_environment_session_stopped),
+ self);
+ g_signal_handlers_disconnect_by_func (self->priv->greeter_environment,
+ G_CALLBACK (on_greeter_environment_session_exited),
+ self);
+ g_signal_handlers_disconnect_by_func (self->priv->greeter_environment,
+ G_CALLBACK (on_greeter_environment_session_died),
+ self);
+ gdm_launch_environment_stop (GDM_LAUNCH_ENVIRONMENT (self->priv->greeter_environment));
+ g_clear_object (&self->priv->greeter_environment);
+ }
+
+ if (GDM_SIMPLE_SLAVE (slave)->priv->doing_initial_setup) {
+ chown_initial_setup_home_dir ();
+ }
+}
+
+static void
+gdm_simple_slave_start_greeter_session (GdmSlave *slave)
{
- if (wants_initial_setup (slave)) {
- start_initial_setup (slave);
- } else if (!wants_autologin (slave)) {
- start_greeter (slave);
+ if (wants_initial_setup (GDM_SIMPLE_SLAVE (slave))) {
+ start_initial_setup (GDM_SIMPLE_SLAVE (slave));
+ } else if (!wants_autologin (GDM_SIMPLE_SLAVE (slave))) {
+ start_greeter (GDM_SIMPLE_SLAVE (slave));
}
- create_new_session (slave);
}
static gboolean
@@ -1298,7 +700,6 @@ idle_connect_to_display (GdmSimpleSlave *slave)
res = gdm_slave_connect_to_x11_display (GDM_SLAVE (slave));
if (res) {
setup_server (slave);
- setup_session (slave);
} else {
if (slave->priv->connection_attempts >= MAX_CONNECT_ATTEMPTS) {
g_warning ("Unable to connect to display after %d tries - bailing out", slave->priv->connection_attempts);
@@ -1495,98 +896,6 @@ gdm_simple_slave_run (GdmSimpleSlave *slave)
}
static gboolean
-gdm_simple_slave_open_session (GdmSlave *slave,
- GPid pid_of_caller,
- uid_t uid_of_caller,
- const char **address,
- GError **error)
-{
- GdmSimpleSlave *self = GDM_SIMPLE_SLAVE (slave);
- uid_t allowed_user;
-
- if (self->priv->session_is_running) {
- g_set_error (error,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- _("Can only be called before user is logged in"));
- return FALSE;
- }
-
- allowed_user = gdm_session_get_allowed_user (self->priv->session);
-
- if (uid_of_caller != allowed_user) {
- g_set_error (error,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- _("Caller not GDM"));
- return FALSE;
- }
-
- *address = gdm_session_get_server_address (self->priv->session);
- return TRUE;
-}
-
-static char *
-gdm_simple_slave_open_reauthentication_channel_finish (GdmSlave *slave,
- GAsyncResult *result,
- GError **error)
-{
- GdmSimpleSlave *self = GDM_SIMPLE_SLAVE (slave);
- const char *address;
-
- g_return_val_if_fail (g_simple_async_result_is_valid (result,
- G_OBJECT (self),
- gdm_simple_slave_open_reauthentication_channel), NULL);
-
- address = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
-
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) {
- return NULL;
- }
-
- return g_strdup (address);
-}
-
-static void
-gdm_simple_slave_open_reauthentication_channel (GdmSlave *slave,
- const char *username,
- GPid pid_of_caller,
- uid_t uid_of_caller,
- GAsyncReadyCallback callback,
- gpointer user_data,
- GCancellable *cancellable)
-{
- GdmSimpleSlave *self = GDM_SIMPLE_SLAVE (slave);
- GSimpleAsyncResult *result;
-
- result = g_simple_async_result_new (G_OBJECT (slave),
- callback,
- user_data,
- gdm_simple_slave_open_reauthentication_channel);
-
- g_simple_async_result_set_check_cancellable (result, cancellable);
-
- if (!self->priv->session_is_running) {
- g_simple_async_result_set_error (result,
- G_DBUS_ERROR,
- G_DBUS_ERROR_ACCESS_DENIED,
- _("User not logged in"));
- g_simple_async_result_complete_in_idle (result);
-
- } else {
- g_hash_table_insert (self->priv->open_reauthentication_requests,
- GINT_TO_POINTER (pid_of_caller),
- g_object_ref (result));
-
- gdm_session_start_reauthentication (self->priv->session,
- pid_of_caller,
- uid_of_caller);
- }
-
- g_object_unref (result);
-}
-
-static gboolean
gdm_simple_slave_start (GdmSlave *slave)
{
GDM_SLAVE_CLASS (gdm_simple_slave_parent_class)->start (slave);
@@ -1605,46 +914,7 @@ gdm_simple_slave_stop (GdmSlave *slave)
GDM_SLAVE_CLASS (gdm_simple_slave_parent_class)->stop (slave);
- if (self->priv->greeter_environment != NULL) {
- g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
- G_CALLBACK (on_greeter_environment_session_opened),
- self);
- g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
- G_CALLBACK (on_greeter_environment_session_started),
- self);
- g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
- G_CALLBACK (on_greeter_environment_session_stopped),
- self);
- g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
- G_CALLBACK (on_greeter_environment_session_exited),
- self);
- g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->greeter_environment),
- G_CALLBACK (on_greeter_environment_session_died),
- self);
- gdm_launch_environment_stop (GDM_LAUNCH_ENVIRONMENT (self->priv->greeter_environment));
- g_clear_object (&self->priv->greeter_environment);
- }
-
- if (self->priv->start_session_id > 0) {
- g_source_remove (self->priv->start_session_id);
- self->priv->start_session_id = 0;
- }
-
- g_clear_pointer (&self->priv->start_session_service_name,
- (GDestroyNotify) g_free);
-
- if (self->priv->session_is_running) {
-#ifdef HAVE_LOGINDEVPERM
- gdm_simple_slave_revoke_console_permissions (self);
-#endif
-
- self->priv->session_is_running = FALSE;
- }
-
- if (self->priv->session != NULL) {
- gdm_session_close (self->priv->session);
- g_clear_object (&self->priv->session);
- }
+ gdm_simple_slave_stop_greeter_session (slave);
if (self->priv->server != NULL) {
gdm_server_stop (self->priv->server);
@@ -1666,9 +936,9 @@ gdm_simple_slave_class_init (GdmSimpleSlaveClass *klass)
slave_class->start = gdm_simple_slave_start;
slave_class->stop = gdm_simple_slave_stop;
- slave_class->open_session = gdm_simple_slave_open_session;
- slave_class->open_reauthentication_channel = gdm_simple_slave_open_reauthentication_channel;
- slave_class->open_reauthentication_channel_finish = gdm_simple_slave_open_reauthentication_channel_finish;
+ slave_class->set_up_greeter_session = gdm_simple_slave_set_up_greeter_session;
+ slave_class->start_greeter_session = gdm_simple_slave_start_greeter_session;
+ slave_class->stop_greeter_session = gdm_simple_slave_stop_greeter_session;
g_type_class_add_private (klass, sizeof (GdmSimpleSlavePrivate));
}
@@ -1680,13 +950,6 @@ gdm_simple_slave_init (GdmSimpleSlave *slave)
#ifdef HAVE_LOGINDEVPERM
slave->priv->use_logindevperm = FALSE;
#endif
-
- slave->priv->open_reauthentication_requests = g_hash_table_new_full (NULL,
- NULL,
- (GDestroyNotify)
- NULL,
- (GDestroyNotify)
- g_object_unref);
}
static void
@@ -1701,8 +964,6 @@ gdm_simple_slave_finalize (GObject *object)
g_return_if_fail (slave->priv != NULL);
- g_hash_table_unref (slave->priv->open_reauthentication_requests);
-
if (slave->priv->greeter_reset_id > 0) {
g_source_remove (slave->priv->greeter_reset_id);
slave->priv->greeter_reset_id = 0;
@@ -1710,15 +971,3 @@ gdm_simple_slave_finalize (GObject *object)
G_OBJECT_CLASS (gdm_simple_slave_parent_class)->finalize (object);
}
-
-GdmSlave *
-gdm_simple_slave_new (const char *id)
-{
- GObject *object;
-
- object = g_object_new (GDM_TYPE_SIMPLE_SLAVE,
- "display-id", id,
- NULL);
-
- return GDM_SLAVE (object);
-}