gdm/SOURCES/0002-manager-session-Add-some-debugging-around-starting-r.patch

1016 lines
39 KiB
Diff
Raw Normal View History

2020-01-21 19:18:04 +00:00
From d3b60b5211d804e23c663d053c5b511dede22a28 Mon Sep 17 00:00:00 2001
From: Iain Lane <iainl@gnome.org>
Date: Thu, 31 Jan 2019 10:52:35 +0000
Subject: [PATCH 2/4] manager,session: Add some debugging around starting
reauthentication
There's a bug right now dealing with timed login and reauthentication,
but it's not clear what's going on by looking at the logs.
This commit sprinkles some more logging throughout the code, to make
the bug easier to track.
---
daemon/gdm-manager.c | 46 ++++++++++++++++++++++++++++++++++++++------
daemon/gdm-session.c | 25 ++++++++++++++++++++----
2 files changed, 61 insertions(+), 10 deletions(-)
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index b2d0578f5..0cc06a978 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -340,77 +340,94 @@ session_unlock (GdmManager *manager,
"org.freedesktop.login1.Manager",
"UnlockSession",
g_variant_new ("(s)", ssid),
NULL, /* expected reply */
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
if (reply == NULL) {
g_debug ("GdmManager: logind 'UnlockSession' %s raised:\n %s\n\n",
g_dbus_error_get_remote_error (error), error->message);
g_error_free (error);
return FALSE;
}
g_variant_unref (reply);
return TRUE;
}
static GdmSession *
find_session_for_user_on_seat (GdmManager *manager,
const char *username,
const char *seat_id,
GdmSession *dont_count_session)
{
GList *node;
for (node = manager->priv->user_sessions; node != NULL; node = node->next) {
GdmSession *candidate_session = node->data;
- const char *candidate_username, *candidate_seat_id;
+ const char *candidate_username, *candidate_seat_id, *candidate_session_id;
- if (candidate_session == dont_count_session)
+ candidate_session_id = gdm_session_get_session_id (candidate_session);
+
+ if (candidate_session == dont_count_session) {
+ g_debug ("GdmSession: Ignoring session %s as requested",
+ candidate_session_id);
continue;
+ }
- if (!gdm_session_is_running (candidate_session))
+ if (!gdm_session_is_running (candidate_session)) {
+ g_debug ("GdmSession: Ignoring session %s as it isn't running",
+ candidate_session_id);
continue;
+ }
candidate_username = gdm_session_get_username (candidate_session);
candidate_seat_id = gdm_session_get_display_seat_id (candidate_session);
+ g_debug ("GdmManager: Considering session %s on seat %s belonging to user %s",
+ candidate_session_id,
+ candidate_seat_id,
+ candidate_username);
+
if (g_strcmp0 (candidate_username, username) == 0 &&
g_strcmp0 (candidate_seat_id, seat_id) == 0) {
+ g_debug ("GdmManager: yes, found session %s", candidate_session_id);
return candidate_session;
}
+
+ g_debug ("GdmManager: no, will not use session %s", candidate_session_id);
}
+ g_debug ("GdmManager: no matching sessions found");
return NULL;
}
static gboolean
is_remote_session (GdmManager *self,
const char *session_id,
GError **error)
{
char *seat;
int ret;
gboolean is_remote;
/* FIXME: The next release of logind is going to have explicit api for
* checking remoteness.
*/
seat = NULL;
ret = sd_session_get_seat (session_id, &seat);
if (ret < 0 && ret != -ENOENT) {
g_debug ("GdmManager: Error while retrieving seat for session %s: %s",
session_id, strerror (-ret));
}
if (seat != NULL) {
is_remote = FALSE;
free (seat);
} else {
is_remote = TRUE;
}
@@ -840,62 +857,66 @@ gdm_manager_handle_open_session (GdmDBusManager *manager,
if (display == NULL) {
g_dbus_method_invocation_return_error_literal (invocation,
G_DBUS_ERROR,
G_DBUS_ERROR_ACCESS_DENIED,
_("No session available"));
return TRUE;
}
#ifdef HAVE_LIBXDMCP
if (GDM_IS_XDMCP_CHOOSER_DISPLAY (display)) {
GdmLaunchEnvironment *launch_environment;
g_object_get (display, "launch-environment", &launch_environment, NULL);
if (launch_environment != NULL) {
session = gdm_launch_environment_get_session (launch_environment);
}
if (session == NULL) {
g_dbus_method_invocation_return_error_literal (invocation,
G_DBUS_ERROR,
G_DBUS_ERROR_ACCESS_DENIED,
_("Chooser session unavailable"));
return TRUE;
}
}
#endif
if (session == NULL) {
session = get_user_session_for_display (display);
+ g_debug ("GdmSession: Considering session %s for username %s",
+ gdm_session_get_session_id (session),
+ gdm_session_get_username (session));
if (gdm_session_is_running (session)) {
+ g_debug ("GdmSession: the session is running, and therefore can't be used");
g_dbus_method_invocation_return_error_literal (invocation,
G_DBUS_ERROR,
G_DBUS_ERROR_ACCESS_DENIED,
_("Can only be called before user is logged in"));
return TRUE;
}
}
allowed_user = gdm_session_get_allowed_user (session);
if (uid != allowed_user) {
g_dbus_method_invocation_return_error_literal (invocation,
G_DBUS_ERROR,
G_DBUS_ERROR_ACCESS_DENIED,
_("Caller not GDM"));
return TRUE;
}
address = gdm_session_get_server_address (session);
if (address == NULL) {
g_dbus_method_invocation_return_error_literal (invocation,
G_DBUS_ERROR,
G_DBUS_ERROR_ACCESS_DENIED,
_("Unable to open private communication channel"));
return TRUE;
}
gdm_dbus_manager_complete_open_session (GDM_DBUS_MANAGER (manager),
invocation,
@@ -1017,60 +1038,64 @@ open_temporary_reauthentication_channel (GdmManager *self,
char *seat_id,
char *session_id,
GPid pid,
uid_t uid,
gboolean is_remote)
{
GdmSession *session;
char **environment;
const char *display, *auth_file;
const char *address;
/* Note we're just using a minimal environment here rather than the
* session's environment because the caller is unprivileged and the
* associated worker will be privileged */
environment = g_get_environ ();
display = "";
auth_file = "/dev/null";
session = gdm_session_new (GDM_SESSION_VERIFICATION_MODE_REAUTHENTICATE,
uid,
display,
NULL,
NULL,
seat_id,
auth_file,
is_remote == FALSE,
(const char * const *)
environment);
g_strfreev (environment);
+ g_debug ("GdmSession: Created session for temporary reauthentication channel for user %d (seat %s)",
+ (int) uid,
+ seat_id);
+
g_object_set_data_full (G_OBJECT (session),
"caller-session-id",
g_strdup (session_id),
(GDestroyNotify)
g_free);
g_object_set_data (G_OBJECT (session),
"caller-pid",
GUINT_TO_POINTER (pid));
g_hash_table_insert (self->priv->transient_sessions,
GINT_TO_POINTER (pid),
session);
g_signal_connect (session,
"client-connected",
G_CALLBACK (on_reauthentication_client_connected),
self);
g_signal_connect (session,
"client-disconnected",
G_CALLBACK (on_reauthentication_client_disconnected),
self);
g_signal_connect (session,
"client-rejected",
G_CALLBACK (on_reauthentication_client_rejected),
self);
g_signal_connect (session,
"cancelled",
G_CALLBACK (on_reauthentication_cancelled),
self);
g_signal_connect (session,
"conversation-started",
@@ -1096,65 +1121,67 @@ gdm_manager_handle_open_reauthentication_channel (GdmDBusManager *manager
const char *username)
{
GdmManager *self = GDM_MANAGER (manager);
const char *sender;
GdmDisplay *display = NULL;
GdmSession *session;
GDBusConnection *connection;
char *seat_id = NULL;
char *session_id = NULL;
GPid pid = 0;
uid_t uid = (uid_t) -1;
gboolean is_login_screen = FALSE;
gboolean is_remote = FALSE;
g_debug ("GdmManager: trying to open reauthentication channel for user %s", username);
sender = g_dbus_method_invocation_get_sender (invocation);
connection = g_dbus_method_invocation_get_connection (invocation);
get_display_and_details_for_bus_sender (self, connection, sender, &display, &seat_id, &session_id, NULL, &pid, &uid, &is_login_screen, &is_remote);
if (session_id == NULL || pid == 0 || uid == (uid_t) -1) {
g_dbus_method_invocation_return_error_literal (invocation,
G_DBUS_ERROR,
G_DBUS_ERROR_ACCESS_DENIED,
_("No session available"));
return TRUE;
}
if (is_login_screen) {
+ g_debug ("GdmManager: looking for login screen session for user %s on seat %s", username, seat_id);
session = find_session_for_user_on_seat (self,
username,
seat_id,
NULL);
} else {
+ g_debug ("GdmManager: looking for user session on display");
session = get_user_session_for_display (display);
}
if (session != NULL && gdm_session_is_running (session)) {
gdm_session_start_reauthentication (session, pid, uid);
g_hash_table_insert (self->priv->open_reauthentication_requests,
GINT_TO_POINTER (pid),
invocation);
} else if (is_login_screen) {
g_dbus_method_invocation_return_error_literal (invocation,
G_DBUS_ERROR,
G_DBUS_ERROR_ACCESS_DENIED,
"Login screen only allowed to open reauthentication channels for running sessions");
return TRUE;
} else {
char *address;
address = open_temporary_reauthentication_channel (self,
seat_id,
session_id,
pid,
uid,
is_remote);
gdm_dbus_manager_complete_open_reauthentication_channel (GDM_DBUS_MANAGER (manager),
invocation,
address);
g_free (address);
}
return TRUE;
}
@@ -2087,107 +2114,107 @@ on_session_client_ready_for_session_to_start (GdmSession *session,
if (client_is_ready) {
g_debug ("GdmManager: Will start session when ready");
} else {
g_debug ("GdmManager: Will start session when ready and told");
}
waiting_to_start_user_session = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (session),
"waiting-to-start"));
g_object_set_data (G_OBJECT (session),
"start-when-ready",
GINT_TO_POINTER (client_is_ready));
if (client_is_ready && waiting_to_start_user_session) {
start_user_session_if_ready (manager, session, service_name);
}
}
static void
on_session_client_connected (GdmSession *session,
GCredentials *credentials,
GPid pid_of_client,
GdmManager *manager)
{
GdmDisplay *display;
char *username;
int delay;
gboolean enabled;
gboolean allow_timed_login = FALSE;
- g_debug ("GdmManager: client connected");
+ g_debug ("GdmManager: client with pid %d connected", (int) pid_of_client);
display = get_display_for_user_session (session);
if (display == NULL) {
return;
}
if (!display_is_on_seat0 (display)) {
return;
}
#ifdef WITH_PLYMOUTH
if (manager->priv->plymouth_is_running) {
plymouth_quit_with_transition ();
manager->priv->plymouth_is_running = FALSE;
}
#endif
g_object_get (G_OBJECT (display), "allow-timed-login", &allow_timed_login, NULL);
if (!allow_timed_login) {
return;
}
enabled = get_timed_login_details (manager, &username, &delay);
if (! enabled) {
return;
}
gdm_session_set_timed_login_details (session, username, delay);
g_debug ("GdmManager: Starting automatic login conversation (for timed login)");
gdm_session_start_conversation (session, "gdm-autologin");
g_free (username);
}
static void
on_session_client_disconnected (GdmSession *session,
GCredentials *credentials,
GPid pid_of_client,
GdmManager *manager)
{
- g_debug ("GdmManager: client disconnected");
+ g_debug ("GdmManager: client with pid %d disconnected", (int) pid_of_client);
}
typedef struct
{
GdmManager *manager;
GdmSession *session;
guint idle_id;
} ResetSessionOperation;
static void
destroy_reset_session_operation (ResetSessionOperation *operation)
{
g_object_set_data (G_OBJECT (operation->session),
"reset-session-operation",
NULL);
g_object_unref (operation->session);
g_slice_free (ResetSessionOperation, operation);
}
static gboolean
on_reset_session (ResetSessionOperation *operation)
{
gdm_session_reset (operation->session);
destroy_reset_session_operation (operation);
return G_SOURCE_REMOVE;
}
static void
@@ -2200,63 +2227,64 @@ queue_session_reset (GdmManager *manager,
if (operation != NULL) {
return;
}
operation = g_slice_new0 (ResetSessionOperation);
operation->manager = manager;
operation->session = g_object_ref (session);
operation->idle_id = g_idle_add ((GSourceFunc) on_reset_session, operation);
g_object_set_data (G_OBJECT (session), "reset-session-operation", operation);
}
static void
on_session_cancelled (GdmSession *session,
GdmManager *manager)
{
g_debug ("GdmManager: Session was cancelled");
queue_session_reset (manager, session);
}
static void
on_session_conversation_started (GdmSession *session,
const char *service_name,
GdmManager *manager)
{
GdmDisplay *display;
gboolean enabled;
char *username;
- g_debug ("GdmManager: session conversation started for service %s", service_name);
+ g_debug ("GdmManager: session conversation started for service %s on session", service_name);
if (g_strcmp0 (service_name, "gdm-autologin") != 0) {
+ g_debug ("GdmManager: ignoring session conversation since its not automatic login conversation");
return;
}
display = get_display_for_user_session (session);
if (display == NULL) {
g_debug ("GdmManager: conversation has no associated display");
return;
}
if (!display_is_on_seat0 (display)) {
return;
}
enabled = get_automatic_login_details (manager, &username);
if (! enabled) {
return;
}
g_debug ("GdmManager: begin auto login for user '%s'", username);
/* service_name will be "gdm-autologin"
*/
gdm_session_setup_for_user (session, service_name, username);
g_free (username);
}
static void
@@ -2312,60 +2340,66 @@ create_user_session_for_display (GdmManager *manager,
char *display_auth_file = NULL;
char *display_seat_id = NULL;
char *display_id = NULL;
#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
char *display_session_type = NULL;
gboolean greeter_is_wayland;
#endif
g_object_get (G_OBJECT (display),
"id", &display_id,
"x11-display-name", &display_name,
"is-local", &display_is_local,
"remote-hostname", &remote_hostname,
"x11-authority-file", &display_auth_file,
"seat-id", &display_seat_id,
#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
"session-type", &display_session_type,
#endif
NULL);
display_device = get_display_device (manager, display);
session = gdm_session_new (GDM_SESSION_VERIFICATION_MODE_LOGIN,
allowed_user,
display_name,
remote_hostname,
display_device,
display_seat_id,
display_auth_file,
display_is_local,
NULL);
+
+ g_debug ("GdmSession: Created user session for user %d on display %s (seat %s)",
+ (int) allowed_user,
+ display_id,
+ display_seat_id);
+
g_free (display_name);
g_free (remote_hostname);
g_free (display_auth_file);
g_free (display_seat_id);
g_signal_connect (session,
"reauthentication-started",
G_CALLBACK (on_session_reauthentication_started),
manager);
g_signal_connect (session,
"reauthenticated",
G_CALLBACK (on_session_reauthenticated),
manager);
g_signal_connect (session,
"client-ready-for-session-to-start",
G_CALLBACK (on_session_client_ready_for_session_to_start),
manager);
g_signal_connect (session,
"client-connected",
G_CALLBACK (on_session_client_connected),
manager);
g_signal_connect (session,
"client-disconnected",
G_CALLBACK (on_session_client_disconnected),
manager);
g_signal_connect (session,
"cancelled",
G_CALLBACK (on_session_cancelled),
manager);
g_signal_connect (session,
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 0f821e390..f23a83c5e 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -624,61 +624,64 @@ get_fallback_session_name (GdmSession *self)
static const char *
get_default_session_name (GdmSession *self)
{
if (self->priv->saved_session != NULL) {
return self->priv->saved_session;
}
return get_fallback_session_name (self);
}
static void
gdm_session_defaults_changed (GdmSession *self)
{
update_session_type (self);
if (self->priv->greeter_interface != NULL) {
gdm_dbus_greeter_emit_default_language_name_changed (self->priv->greeter_interface,
get_default_language_name (self));
gdm_dbus_greeter_emit_default_session_name_changed (self->priv->greeter_interface,
get_default_session_name (self));
}
}
void
gdm_session_select_user (GdmSession *self,
const char *text)
{
- g_debug ("GdmSession: Setting user: '%s'", text);
+ g_debug ("GdmSession: selecting user '%s' for session '%s' (%p)",
+ text,
+ gdm_session_get_session_id (self),
+ self);
g_free (self->priv->selected_user);
self->priv->selected_user = g_strdup (text);
g_free (self->priv->saved_session);
self->priv->saved_session = NULL;
g_free (self->priv->saved_session_type);
self->priv->saved_session_type = NULL;
g_free (self->priv->saved_language);
self->priv->saved_language = NULL;
}
static void
cancel_pending_query (GdmSessionConversation *conversation)
{
if (conversation->pending_invocation == NULL) {
return;
}
g_debug ("GdmSession: Cancelling pending query");
g_dbus_method_invocation_return_dbus_error (conversation->pending_invocation,
GDM_SESSION_DBUS_ERROR_CANCEL,
"Operation cancelled");
conversation->pending_invocation = NULL;
}
static void
@@ -1416,117 +1419,121 @@ gdm_session_handle_client_cancel (GdmDBusUserVerifier *user_verifier_interfac
gdm_dbus_user_verifier_complete_cancel (user_verifier_interface,
invocation);
gdm_session_cancel (self);
return TRUE;
}
static gboolean
gdm_session_handle_client_select_session (GdmDBusGreeter *greeter_interface,
GDBusMethodInvocation *invocation,
const char *session,
GdmSession *self)
{
if (self->priv->greeter_interface != NULL) {
gdm_dbus_greeter_complete_select_session (greeter_interface,
invocation);
}
gdm_session_select_session (self, session);
return TRUE;
}
static gboolean
gdm_session_handle_client_select_user (GdmDBusGreeter *greeter_interface,
GDBusMethodInvocation *invocation,
const char *username,
GdmSession *self)
{
if (self->priv->greeter_interface != NULL) {
gdm_dbus_greeter_complete_select_user (greeter_interface,
invocation);
}
+ g_debug ("GdmSession: client selected user '%s' on session (%p)", username, self);
gdm_session_select_user (self, username);
return TRUE;
}
static gboolean
gdm_session_handle_client_start_session_when_ready (GdmDBusGreeter *greeter_interface,
GDBusMethodInvocation *invocation,
const char *service_name,
gboolean client_is_ready,
GdmSession *self)
{
if (self->priv->greeter_interface != NULL) {
gdm_dbus_greeter_complete_start_session_when_ready (greeter_interface,
invocation);
}
g_signal_emit (G_OBJECT (self),
signals [CLIENT_READY_FOR_SESSION_TO_START],
0,
service_name,
client_is_ready);
return TRUE;
}
static gboolean
gdm_session_handle_get_timed_login_details (GdmDBusGreeter *greeter_interface,
GDBusMethodInvocation *invocation,
GdmSession *self)
{
if (self->priv->greeter_interface != NULL) {
gdm_dbus_greeter_complete_get_timed_login_details (greeter_interface,
invocation,
self->priv->timed_login_username != NULL,
self->priv->timed_login_username != NULL? self->priv->timed_login_username : "",
self->priv->timed_login_delay);
if (self->priv->timed_login_username != NULL) {
gdm_dbus_greeter_emit_timed_login_requested (self->priv->greeter_interface,
self->priv->timed_login_username,
self->priv->timed_login_delay);
}
}
return TRUE;
}
static gboolean
gdm_session_handle_client_begin_auto_login (GdmDBusGreeter *greeter_interface,
GDBusMethodInvocation *invocation,
const char *username,
GdmSession *self)
{
if (self->priv->greeter_interface != NULL) {
gdm_dbus_greeter_complete_begin_auto_login (greeter_interface,
invocation);
}
- g_debug ("GdmSession: begin auto login for user '%s'", username);
+ g_debug ("GdmSession: client requesting automatic login for user '%s' on session '%s' (%p)",
+ username,
+ gdm_session_get_session_id (self),
+ self);
gdm_session_setup_for_user (self, "gdm-autologin", username);
return TRUE;
}
static void
export_user_verifier_interface (GdmSession *self,
GDBusConnection *connection)
{
GdmDBusUserVerifier *user_verifier_interface;
user_verifier_interface = GDM_DBUS_USER_VERIFIER (gdm_dbus_user_verifier_skeleton_new ());
g_object_set_data (G_OBJECT (connection), "gdm-session", self);
g_signal_connect (user_verifier_interface,
"handle-enable-extensions",
G_CALLBACK (gdm_session_handle_client_enable_extensions),
connection);
g_signal_connect (user_verifier_interface,
"handle-begin-verification",
G_CALLBACK (gdm_session_handle_client_begin_verification),
self);
g_signal_connect (user_verifier_interface,
"handle-begin-verification-for-user",
G_CALLBACK (gdm_session_handle_client_begin_verification_for_user),
self);
g_signal_connect (user_verifier_interface,
"handle-answer-query",
G_CALLBACK (gdm_session_handle_client_answer_query),
@@ -1775,61 +1782,63 @@ allow_user_function (GDBusAuthObserver *observer,
{
uid_t client_uid;
GPid pid_of_client;
client_uid = g_credentials_get_unix_user (credentials, NULL);
if (client_uid == self->priv->allowed_user) {
return TRUE;
}
g_debug ("GdmSession: User not allowed");
pid_of_client = g_credentials_get_unix_pid (credentials, NULL);
g_signal_emit (G_OBJECT (self),
signals [CLIENT_REJECTED],
0,
credentials,
(guint)
pid_of_client);
return FALSE;
}
static void
setup_outside_server (GdmSession *self)
{
GDBusAuthObserver *observer;
GDBusServer *server;
GError *error = NULL;
- g_debug ("GdmSession: Creating D-Bus server for greeters and such");
+ g_debug ("GdmSession: Creating D-Bus server for greeters and such for session %s (%p)",
+ gdm_session_get_session_id (self),
+ self);
observer = g_dbus_auth_observer_new ();
g_signal_connect_object (observer,
"authorize-authenticated-peer",
G_CALLBACK (allow_user_function),
self,
0);
server = gdm_dbus_setup_private_server (observer, &error);
g_object_unref (observer);
if (server == NULL) {
g_warning ("Cannot create greeter D-Bus server for the session: %s",
error->message);
return;
}
g_signal_connect_object (server,
"new-connection",
G_CALLBACK (handle_connection_from_outside),
self,
0);
self->priv->outside_server = server;
g_dbus_server_start (server);
g_debug ("GdmSession: D-Bus server for greeters listening on %s",
g_dbus_server_get_client_address (self->priv->outside_server));
}
@@ -2160,61 +2169,61 @@ stop_conversation_now (GdmSessionConversation *conversation)
void
gdm_session_set_ignore_wayland (GdmSession *self,
gboolean ignore_wayland)
{
self->priv->ignore_wayland = ignore_wayland;
}
#endif
gboolean
gdm_session_start_conversation (GdmSession *self,
const char *service_name)
{
GdmSessionConversation *conversation;
g_return_val_if_fail (GDM_IS_SESSION (self), FALSE);
conversation = g_hash_table_lookup (self->priv->conversations,
service_name);
if (conversation != NULL) {
if (!conversation->is_stopping) {
g_warning ("GdmSession: conversation %s started more than once", service_name);
return FALSE;
}
g_debug ("GdmSession: stopping old conversation %s", service_name);
gdm_session_worker_job_stop_now (conversation->job);
g_object_unref (conversation->job);
conversation->job = NULL;
}
- g_debug ("GdmSession: starting conversation %s", service_name);
+ g_debug ("GdmSession: starting conversation %s for session (%p)", service_name, self);
conversation = start_conversation (self, service_name);
g_hash_table_insert (self->priv->conversations,
g_strdup (service_name), conversation);
return TRUE;
}
void
gdm_session_stop_conversation (GdmSession *self,
const char *service_name)
{
GdmSessionConversation *conversation;
g_return_if_fail (GDM_IS_SESSION (self));
g_debug ("GdmSession: stopping conversation %s", service_name);
conversation = find_conversation_by_name (self, service_name);
if (conversation != NULL) {
stop_conversation (conversation);
}
}
static void
on_initialization_complete_cb (GdmDBusWorker *proxy,
GAsyncResult *res,
gpointer user_data)
{
@@ -2319,60 +2328,64 @@ initialize (GdmSession *self,
}
g_free (extensions);
}
void
gdm_session_setup (GdmSession *self,
const char *service_name)
{
g_return_if_fail (GDM_IS_SESSION (self));
update_session_type (self);
initialize (self, service_name, NULL, NULL);
gdm_session_defaults_changed (self);
}
void
gdm_session_setup_for_user (GdmSession *self,
const char *service_name,
const char *username)
{
g_return_if_fail (GDM_IS_SESSION (self));
g_return_if_fail (username != NULL);
update_session_type (self);
+ g_debug ("GdmSession: Set up service %s for username %s on session (%p)",
+ service_name,
+ username,
+ self);
gdm_session_select_user (self, username);
self->priv->is_program_session = FALSE;
initialize (self, service_name, self->priv->selected_user, NULL);
gdm_session_defaults_changed (self);
}
void
gdm_session_setup_for_program (GdmSession *self,
const char *service_name,
const char *username,
const char *log_file)
{
g_return_if_fail (GDM_IS_SESSION (self));
self->priv->is_program_session = TRUE;
initialize (self, service_name, username, log_file);
}
void
gdm_session_authenticate (GdmSession *self,
const char *service_name)
{
GdmSessionConversation *conversation;
g_return_if_fail (GDM_IS_SESSION (self));
conversation = find_conversation_by_name (self, service_name);
if (conversation != NULL) {
@@ -2968,60 +2981,64 @@ gdm_session_set_timed_login_details (GdmSession *self,
gboolean
gdm_session_is_running (GdmSession *self)
{
return self->priv->session_pid > 0;
}
gboolean
gdm_session_client_is_connected (GdmSession *self)
{
g_return_val_if_fail (GDM_IS_SESSION (self), FALSE);
return self->priv->outside_connections != NULL;
}
uid_t
gdm_session_get_allowed_user (GdmSession *self)
{
return self->priv->allowed_user;
}
void
gdm_session_start_reauthentication (GdmSession *session,
GPid pid_of_caller,
uid_t uid_of_caller)
{
GdmSessionConversation *conversation = session->priv->session_conversation;
g_return_if_fail (conversation != NULL);
+ g_debug ("GdmSession: starting reauthentication for session %s for client with pid %d",
+ conversation->session_id,
+ (int) uid_of_caller);
+
conversation->reauth_pid_of_caller = pid_of_caller;
gdm_dbus_worker_call_start_reauthentication (conversation->worker_proxy,
(int) pid_of_caller,
(int) uid_of_caller,
conversation->worker_cancellable,
(GAsyncReadyCallback) on_reauthentication_started_cb,
conversation);
}
const char *
gdm_session_get_server_address (GdmSession *self)
{
g_return_val_if_fail (GDM_IS_SESSION (self), NULL);
return g_dbus_server_get_client_address (self->priv->outside_server);
}
const char *
gdm_session_get_username (GdmSession *self)
{
g_return_val_if_fail (GDM_IS_SESSION (self), NULL);
return self->priv->selected_user;
}
const char *
gdm_session_get_display_device (GdmSession *self)
{
g_return_val_if_fail (GDM_IS_SESSION (self), NULL);
--
2.21.0