summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2015-02-16 17:35:19 -0500
committerRay Strode <rstrode@redhat.com>2015-02-16 23:36:04 -0500
commit023cdae8f3b01292e036bf7fdbebf806d2d9304d (patch)
treefadeb721fee4b801806eef06c6b8cde0aeab981c
parent33ed5b71344f059e9709033b57b16160c87e0403 (diff)
downloadgdm-023cdae8f3b01292e036bf7fdbebf806d2d9304d.tar.gz
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.
-rw-r--r--daemon/gdm-manager.c101
-rw-r--r--daemon/gdm-session.c74
2 files changed, 101 insertions, 74 deletions
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index 5cb85b67..1d5f576b 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_x11_display (GdmDBusManager *manager,
GDBusMethodInvocation *invocation,
const char *display_name)
@@ -993,6 +1059,7 @@ gdm_manager_handle_register_x11_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_x11_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_x11_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 3eb98fc1..c16d84b7 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);