[gdm] session: move wtmp/btmp logging to GdmManager



commit e137e14b11d801a3c5a25c3a49f3c4c7fc1c1df3
Author: Ray Strode <rstrode redhat com>
Date:   Mon Feb 16 17:35:19 2015 -0500

    session: move wtmp/btmp logging to GdmManager
    
    These record needs to know the display name,
    and that isn't always available to GdmSession,
    so this commit moves recording to GdmManager.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=744764

 daemon/gdm-manager.c |  101 ++++++++++++++++++++++++++++++++++++++++++++++++++
 daemon/gdm-session.c |   74 ------------------------------------
 2 files changed, 101 insertions(+), 74 deletions(-)
---
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index c5cd627..8ec6416 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -47,6 +47,7 @@
 #include "gdm-display-factory.h"
 #include "gdm-local-display-factory.h"
 #include "gdm-session.h"
+#include "gdm-session-record.h"
 #include "gdm-xdmcp-display-factory.h"
 
 #define GDM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_MANAGER, GdmManagerPrivate))
@@ -101,6 +102,12 @@ enum {
         LAST_SIGNAL
 };
 
+typedef enum {
+        SESSION_RECORD_LOGIN,
+        SESSION_RECORD_LOGOUT,
+        SESSION_RECORD_FAILED,
+} SessionRecord;
+
 static guint signals [LAST_SIGNAL] = { 0, };
 
 static void     gdm_manager_class_init  (GdmManagerClass *klass);
@@ -985,6 +992,65 @@ get_seed_session_for_display (GdmDisplay *display)
 }
 
 static gboolean
+add_session_record (GdmManager    *manager,
+                    GdmSession    *session,
+                    GPid           pid,
+                    SessionRecord  record)
+{
+        const char *username;
+        char *display_name, *hostname, *display_device;
+        gboolean recorded = FALSE;
+
+        display_name = NULL;
+        username = NULL;
+        hostname = NULL;
+        display_device = NULL;
+
+        username = gdm_session_get_username (session);
+        g_object_get (G_OBJECT (session),
+                      "display-name", &display_name,
+                      "display-hostname", &hostname,
+                      "display-device", &display_device,
+                      NULL);
+
+        if (display_name == NULL) {
+                goto out;
+        }
+
+        switch (record) {
+            case SESSION_RECORD_LOGIN:
+                gdm_session_record_login (pid,
+                                          username,
+                                          hostname,
+                                          display_name,
+                                          display_device);
+                break;
+            case SESSION_RECORD_LOGOUT:
+                gdm_session_record_logout (pid,
+                                           username,
+                                           hostname,
+                                           display_name,
+                                           display_device);
+                break;
+            case SESSION_RECORD_FAILED:
+                gdm_session_record_failed (pid,
+                                           username,
+                                           hostname,
+                                           display_name,
+                                           display_device);
+                break;
+        }
+
+        recorded = TRUE;
+out:
+        g_free (display_name);
+        g_free (hostname);
+        g_free (display_device);
+
+        return recorded;
+}
+
+static gboolean
 gdm_manager_handle_register_display (GdmDBusManager        *manager,
                                      GDBusMethodInvocation *invocation,
                                      GVariant              *details)
@@ -993,6 +1059,7 @@ gdm_manager_handle_register_display (GdmDBusManager        *manager,
         const char      *sender;
         GDBusConnection *connection;
         GdmDisplay      *display = NULL;
+        GdmSession      *session;
 
         g_debug ("GdmManager: trying to register new display");
 
@@ -1009,6 +1076,18 @@ gdm_manager_handle_register_display (GdmDBusManager        *manager,
                 return TRUE;
         }
 
+        session = get_seed_session_for_display (display);
+
+        if (session != NULL) {
+                GPid pid;
+
+                pid = gdm_session_get_pid (session);
+
+                if (pid > 0) {
+                        add_session_record (self, session, pid, SESSION_RECORD_LOGIN);
+                }
+        }
+
         g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL);
 
         gdm_dbus_manager_complete_register_display (GDM_DBUS_MANAGER (manager),
@@ -1593,6 +1672,15 @@ start_user_session_if_ready (GdmManager *manager,
 }
 
 static void
+on_session_authentication_failed (GdmSession *session,
+                                  const char *service_name,
+                                  GPid        conversation_pid,
+                                  GdmManager *manager)
+{
+        add_session_record (manager, session, conversation_pid, SESSION_RECORD_FAILED);
+}
+
+static void
 on_user_session_opened (GdmSession       *session,
                         const char       *service_name,
                         const char       *session_id,
@@ -1617,6 +1705,7 @@ on_user_session_started (GdmSession      *session,
                          GdmManager      *manager)
 {
         g_debug ("GdmManager: session started %d", pid);
+        add_session_record (manager, session, pid, SESSION_RECORD_LOGIN);
 }
 
 static void
@@ -1647,7 +1736,15 @@ on_user_session_exited (GdmSession *session,
                         int         code,
                         GdmManager *manager)
 {
+        GPid pid;
+
         g_debug ("GdmManager: session exited with status %d", code);
+        pid = gdm_session_get_pid (session);
+
+        if (pid > 0) {
+                add_session_record (manager, session, pid, SESSION_RECORD_LOGOUT);
+        }
+
         remove_user_session (manager, session);
 }
 
@@ -2061,6 +2158,10 @@ create_seed_session_for_display (GdmManager *manager,
                           G_CALLBACK (on_session_conversation_stopped),
                           manager);
         g_signal_connect (session,
+                          "authentication-failed",
+                          G_CALLBACK (on_session_authentication_failed),
+                          manager);
+        g_signal_connect (session,
                           "session-opened",
                           G_CALLBACK (on_user_session_opened),
                           manager);
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 6f4ae3e..747e156 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -49,7 +49,6 @@
 
 #include "gdm-session.h"
 #include "gdm-session-enum-types.h"
-#include "gdm-session-record.h"
 #include "gdm-session-worker-common.h"
 #include "gdm-session-worker-job.h"
 #include "gdm-session-worker-glue.h"
@@ -190,51 +189,6 @@ find_conversation_by_name (GdmSession *self,
 }
 
 static void
-on_session_started (GdmSession *self,
-                    const char *service_name)
-{
-        GdmSessionConversation *conversation;
-
-        conversation = find_conversation_by_name (self, service_name);
-        if (conversation != NULL) {
-                gdm_session_record_login (conversation->worker_pid,
-                                          self->priv->selected_user,
-                                          self->priv->display_hostname,
-                                          self->priv->display_name,
-                                          self->priv->display_device);
-        }
-}
-
-static void
-on_session_start_failed (GdmSession *self,
-                         const char *service_name,
-                         const char *message)
-{
-        GdmSessionConversation *conversation;
-
-        conversation = find_conversation_by_name (self, service_name);
-        if (conversation != NULL) {
-                gdm_session_record_login (conversation->worker_pid,
-                                          self->priv->selected_user,
-                                          self->priv->display_hostname,
-                                          self->priv->display_name,
-                                          self->priv->display_device);
-        }
-}
-
-static void
-on_session_exited (GdmSession *self,
-                   int        exit_code)
-{
-
-        gdm_session_record_logout (self->priv->session_pid,
-                                   self->priv->selected_user,
-                                   self->priv->display_hostname,
-                                   self->priv->display_name,
-                                   self->priv->display_device);
-}
-
-static void
 report_and_stop_conversation (GdmSession *self,
                               const char *service_name,
                               GError     *error)
@@ -289,13 +243,6 @@ on_authenticate_cb (GdmDBusWorker *proxy,
                                0,
                                service_name,
                                conversation->worker_pid);
-
-                gdm_session_record_failed (conversation->worker_pid,
-                                           self->priv->selected_user,
-                                           self->priv->display_hostname,
-                                           self->priv->display_name,
-                                           self->priv->display_device);
-
                 report_and_stop_conversation (self, service_name, error);
         }
 }
@@ -1720,19 +1667,6 @@ gdm_session_init (GdmSession *self)
                                                   GDM_TYPE_SESSION,
                                                   GdmSessionPrivate);
 
-        g_signal_connect (self,
-                          "session-started",
-                          G_CALLBACK (on_session_started),
-                          NULL);
-        g_signal_connect (self,
-                          "session-start-failed",
-                          G_CALLBACK (on_session_start_failed),
-                          NULL);
-        g_signal_connect (self,
-                          "session-exited",
-                          G_CALLBACK (on_session_exited),
-                          NULL);
-
         self->priv->conversations = g_hash_table_new_full (g_str_hash,
                                                            g_str_equal,
                                                            (GDestroyNotify) g_free,
@@ -2659,14 +2593,6 @@ stop_all_conversations (GdmSession *self)
 static void
 do_reset (GdmSession *self)
 {
-        if (self->priv->session_conversation != NULL) {
-                gdm_session_record_logout (self->priv->session_pid,
-                                           self->priv->selected_user,
-                                           self->priv->display_hostname,
-                                           self->priv->display_name,
-                                           self->priv->display_device);
-        }
-
         stop_all_conversations (self);
 
         g_list_free_full (self->priv->pending_worker_connections, g_object_unref);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]