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

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