|
|
7d155d |
From 20725e4c65555178ed64a3cb77ee979ec98998f8 Mon Sep 17 00:00:00 2001
|
|
|
7d155d |
From: Ray Strode <rstrode@redhat.com>
|
|
|
7d155d |
Date: Wed, 19 Oct 2022 14:50:33 -0400
|
|
|
7d155d |
Subject: [PATCH 2/2] manager: Fix btmp record accounting
|
|
|
7d155d |
|
|
|
7d155d |
Before a user logs in they don't have a display.
|
|
|
7d155d |
|
|
|
7d155d |
btmp records currently need a display though, and they
|
|
|
7d155d |
get written when the user can't log in.
|
|
|
7d155d |
|
|
|
7d155d |
Furthermore, the display from X11 point of view is
|
|
|
7d155d |
somewhat archaic. We use wayland by default now.
|
|
|
7d155d |
|
|
|
7d155d |
In lieu of a display, this commit gives the btmp record
|
|
|
7d155d |
the seat id instead.
|
|
|
7d155d |
---
|
|
|
7d155d |
daemon/gdm-manager.c | 11 +++++++++--
|
|
|
7d155d |
daemon/gdm-session-record.c | 8 ++++++--
|
|
|
7d155d |
2 files changed, 15 insertions(+), 4 deletions(-)
|
|
|
7d155d |
|
|
|
7d155d |
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
|
|
|
7d155d |
index 4b62b8b1..c70248f3 100644
|
|
|
7d155d |
--- a/daemon/gdm-manager.c
|
|
|
7d155d |
+++ b/daemon/gdm-manager.c
|
|
|
7d155d |
@@ -641,113 +641,120 @@ switch_to_compatible_user_session (GdmManager *manager,
|
|
|
7d155d |
|
|
|
7d155d |
ret = TRUE;
|
|
|
7d155d |
|
|
|
7d155d |
out:
|
|
|
7d155d |
return ret;
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
static GdmDisplay *
|
|
|
7d155d |
get_display_for_user_session (GdmSession *session)
|
|
|
7d155d |
{
|
|
|
7d155d |
return g_object_get_data (G_OBJECT (session), "gdm-display");
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
static GdmSession *
|
|
|
7d155d |
get_user_session_for_display (GdmDisplay *display)
|
|
|
7d155d |
{
|
|
|
7d155d |
if (display == NULL) {
|
|
|
7d155d |
return NULL;
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
return g_object_get_data (G_OBJECT (display), "gdm-user-session");
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
static gboolean
|
|
|
7d155d |
add_session_record (GdmManager *manager,
|
|
|
7d155d |
GdmSession *session,
|
|
|
7d155d |
GPid pid,
|
|
|
7d155d |
SessionRecord record)
|
|
|
7d155d |
{
|
|
|
7d155d |
const char *username;
|
|
|
7d155d |
- char *display_name, *hostname, *display_device;
|
|
|
7d155d |
+ char *display_name, *hostname, *display_device, *display_seat_id;
|
|
|
7d155d |
gboolean recorded = FALSE;
|
|
|
7d155d |
|
|
|
7d155d |
display_name = NULL;
|
|
|
7d155d |
username = NULL;
|
|
|
7d155d |
hostname = NULL;
|
|
|
7d155d |
display_device = NULL;
|
|
|
7d155d |
+ display_seat_id = NULL;
|
|
|
7d155d |
|
|
|
7d155d |
username = gdm_session_get_username (session);
|
|
|
7d155d |
|
|
|
7d155d |
if (username == NULL) {
|
|
|
7d155d |
goto out;
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
g_object_get (G_OBJECT (session),
|
|
|
7d155d |
"display-name", &display_name,
|
|
|
7d155d |
"display-hostname", &hostname,
|
|
|
7d155d |
"display-device", &display_device,
|
|
|
7d155d |
+ "display-seat-id", &display_seat_id,
|
|
|
7d155d |
NULL);
|
|
|
7d155d |
|
|
|
7d155d |
if (display_name == NULL && display_device == NULL) {
|
|
|
7d155d |
- goto out;
|
|
|
7d155d |
+ if (display_seat_id == NULL)
|
|
|
7d155d |
+ goto out;
|
|
|
7d155d |
+
|
|
|
7d155d |
+ display_name = g_strdup ("login screen");
|
|
|
7d155d |
+ display_device = g_strdup (display_seat_id);
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
switch (record) {
|
|
|
7d155d |
case SESSION_RECORD_LOGIN:
|
|
|
7d155d |
gdm_session_record_login (pid,
|
|
|
7d155d |
username,
|
|
|
7d155d |
hostname,
|
|
|
7d155d |
display_name,
|
|
|
7d155d |
display_device);
|
|
|
7d155d |
break;
|
|
|
7d155d |
case SESSION_RECORD_LOGOUT:
|
|
|
7d155d |
gdm_session_record_logout (pid,
|
|
|
7d155d |
username,
|
|
|
7d155d |
hostname,
|
|
|
7d155d |
display_name,
|
|
|
7d155d |
display_device);
|
|
|
7d155d |
break;
|
|
|
7d155d |
case SESSION_RECORD_FAILED:
|
|
|
7d155d |
gdm_session_record_failed (pid,
|
|
|
7d155d |
username,
|
|
|
7d155d |
hostname,
|
|
|
7d155d |
display_name,
|
|
|
7d155d |
display_device);
|
|
|
7d155d |
break;
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
recorded = TRUE;
|
|
|
7d155d |
out:
|
|
|
7d155d |
g_free (display_name);
|
|
|
7d155d |
g_free (hostname);
|
|
|
7d155d |
g_free (display_device);
|
|
|
7d155d |
+ g_free (display_seat_id);
|
|
|
7d155d |
|
|
|
7d155d |
return recorded;
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
static GdmSession *
|
|
|
7d155d |
find_user_session_for_display (GdmManager *self,
|
|
|
7d155d |
GdmDisplay *display)
|
|
|
7d155d |
{
|
|
|
7d155d |
|
|
|
7d155d |
GList *node = self->priv->user_sessions;
|
|
|
7d155d |
|
|
|
7d155d |
while (node != NULL) {
|
|
|
7d155d |
GdmSession *session = node->data;
|
|
|
7d155d |
GdmDisplay *candidate_display;
|
|
|
7d155d |
GList *next_node = node->next;
|
|
|
7d155d |
|
|
|
7d155d |
candidate_display = get_display_for_user_session (session);
|
|
|
7d155d |
|
|
|
7d155d |
if (candidate_display == display)
|
|
|
7d155d |
return session;
|
|
|
7d155d |
|
|
|
7d155d |
node = next_node;
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
return NULL;
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
static gboolean
|
|
|
7d155d |
gdm_manager_handle_register_display (GdmDBusManager *manager,
|
|
|
7d155d |
GDBusMethodInvocation *invocation,
|
|
|
7d155d |
diff --git a/daemon/gdm-session-record.c b/daemon/gdm-session-record.c
|
|
|
7d155d |
index 7719d0a8..310323b6 100644
|
|
|
7d155d |
--- a/daemon/gdm-session-record.c
|
|
|
7d155d |
+++ b/daemon/gdm-session-record.c
|
|
|
7d155d |
@@ -125,66 +125,70 @@ record_set_host (UTMP *u,
|
|
|
7d155d |
*/
|
|
|
7d155d |
if (host_name != NULL
|
|
|
7d155d |
&& x11_display_name != NULL
|
|
|
7d155d |
&& g_str_has_prefix (x11_display_name, ":")) {
|
|
|
7d155d |
hostname = g_strdup_printf ("%s%s", host_name, x11_display_name);
|
|
|
7d155d |
} else {
|
|
|
7d155d |
hostname = g_strdup (x11_display_name);
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
if (hostname != NULL) {
|
|
|
7d155d |
memccpy (u->ut_host, hostname, '\0', sizeof (u->ut_host));
|
|
|
7d155d |
g_debug ("using ut_host %.*s", (int) sizeof (u->ut_host), u->ut_host);
|
|
|
7d155d |
#ifdef HAVE_UT_UT_SYSLEN
|
|
|
7d155d |
u->ut_syslen = MIN (strlen (hostname), sizeof (u->ut_host));
|
|
|
7d155d |
#endif
|
|
|
7d155d |
g_free (hostname);
|
|
|
7d155d |
}
|
|
|
7d155d |
#endif
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
static void
|
|
|
7d155d |
record_set_line (UTMP *u,
|
|
|
7d155d |
const char *display_device,
|
|
|
7d155d |
const char *x11_display_name)
|
|
|
7d155d |
{
|
|
|
7d155d |
/*
|
|
|
7d155d |
* Set ut_line to the device name associated with this display
|
|
|
7d155d |
* but remove the "/dev/" prefix. If no device, then use the
|
|
|
7d155d |
* $DISPLAY value.
|
|
|
7d155d |
*/
|
|
|
7d155d |
- if (display_device != NULL
|
|
|
7d155d |
- && g_str_has_prefix (display_device, "/dev/")) {
|
|
|
7d155d |
+ if (display_device != NULL && g_str_has_prefix (display_device, "/dev/")) {
|
|
|
7d155d |
memccpy (u->ut_line,
|
|
|
7d155d |
display_device + strlen ("/dev/"),
|
|
|
7d155d |
'\0',
|
|
|
7d155d |
sizeof (u->ut_line));
|
|
|
7d155d |
+ } else if (display_device != NULL && g_str_has_prefix (display_device, "seat")) {
|
|
|
7d155d |
+ memccpy (u->ut_line,
|
|
|
7d155d |
+ display_device,
|
|
|
7d155d |
+ '\0',
|
|
|
7d155d |
+ sizeof (u->ut_line));
|
|
|
7d155d |
} else if (x11_display_name != NULL) {
|
|
|
7d155d |
memccpy (u->ut_line,
|
|
|
7d155d |
x11_display_name,
|
|
|
7d155d |
'\0',
|
|
|
7d155d |
sizeof (u->ut_line));
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
g_debug ("using ut_line %.*s", (int) sizeof (u->ut_line), u->ut_line);
|
|
|
7d155d |
}
|
|
|
7d155d |
|
|
|
7d155d |
void
|
|
|
7d155d |
gdm_session_record_login (GPid session_pid,
|
|
|
7d155d |
const char *user_name,
|
|
|
7d155d |
const char *host_name,
|
|
|
7d155d |
const char *x11_display_name,
|
|
|
7d155d |
const char *display_device)
|
|
|
7d155d |
{
|
|
|
7d155d |
UTMP session_record = { 0 };
|
|
|
7d155d |
|
|
|
7d155d |
if (x11_display_name == NULL)
|
|
|
7d155d |
x11_display_name = display_device;
|
|
|
7d155d |
|
|
|
7d155d |
record_set_username (&session_record, user_name);
|
|
|
7d155d |
|
|
|
7d155d |
g_debug ("Writing login record");
|
|
|
7d155d |
|
|
|
7d155d |
#if defined(HAVE_UT_UT_TYPE)
|
|
|
7d155d |
session_record.ut_type = USER_PROCESS;
|
|
|
7d155d |
g_debug ("using ut_type USER_PROCESS");
|
|
|
7d155d |
#endif
|
|
|
7d155d |
--
|
|
|
7d155d |
2.31.1
|
|
|
7d155d |
|