Blame SOURCES/0002-manager-Fix-btmp-record-accounting.patch

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