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

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