diff options
-rw-r--r-- | daemon/gdm-manager.c | 101 | ||||
-rw-r--r-- | 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 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); |