summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2016-07-29 15:49:19 +1200
committerRobert Ancell <robert.ancell@canonical.com>2016-07-29 15:49:19 +1200
commit018691887d2d00925f2e17be7e9e24c08818084e (patch)
tree432bfa1ee941c63d66a656db3325ab54b427025a
parentc57924403c46117fd112c8c88d3d30cc771aef04 (diff)
downloadlightdm-git-018691887d2d00925f2e17be7e9e24c08818084e.tar.gz
Fix finalizing common account users
-rw-r--r--common/user-list.c89
1 files changed, 56 insertions, 33 deletions
diff --git a/common/user-list.c b/common/user-list.c
index 1b198d1a..3169853e 100644
--- a/common/user-list.c
+++ b/common/user-list.c
@@ -61,6 +61,7 @@ static guint list_signals[LAST_LIST_SIGNAL] = { 0 };
enum
{
CHANGED,
+ GET_LOGGED_IN,
LAST_USER_SIGNAL
};
static guint user_signals[LAST_USER_SIGNAL] = { 0 };
@@ -93,12 +94,12 @@ typedef struct
typedef struct
{
- /* User list this user is part of */
- CommonUserList *user_list;
-
/* TRUE if have loaded the DMRC file */
gboolean loaded_dmrc;
+ /* Bus we are listening for accounts service on */
+ GDBusConnection *bus;
+
/* Accounts service path */
gchar *path;
@@ -252,10 +253,34 @@ update_passwd_user (CommonUser *user, const gchar *real_name, const gchar *home_
return TRUE;
}
+static void load_sessions (CommonUserList *user_list);
+
+static gboolean
+get_logged_in_cb (CommonUser *user, CommonUserList *user_list)
+{
+ CommonUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
+ const gchar *username;
+ GList *link;
+
+ // Lazily decide to load/listen to sessions
+ if (priv->session_added_signal == 0)
+ load_sessions (user_list);
+
+ username = GET_USER_PRIVATE (user)->name;
+ for (link = priv->sessions; link; link = link->next)
+ {
+ CommonSession *session = link->data;
+ if (strcmp (session->username, username) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void
-user_changed_cb (CommonUser *user)
+user_changed_cb (CommonUser *user, CommonUserList *user_list)
{
- g_signal_emit (GET_USER_PRIVATE (user)->user_list, list_signals[USER_CHANGED], 0, user);
+ g_signal_emit (user_list, list_signals[USER_CHANGED], 0, user);
}
static CommonUser *
@@ -266,6 +291,8 @@ make_passwd_user (CommonUserList *user_list, struct passwd *entry)
char **tokens;
gchar *real_name, *image;
+ g_signal_connect (user, "get-logged-in", G_CALLBACK (get_logged_in_cb), user_list);
+
tokens = g_strsplit (entry->pw_gecos, ",", -1);
if (tokens[0] != NULL && tokens[0][0] != '\0')
real_name = g_strdup (tokens[0]);
@@ -285,7 +312,6 @@ make_passwd_user (CommonUserList *user_list, struct passwd *entry)
}
}
- priv->user_list = user_list;
priv->name = g_strdup (entry->pw_name);
priv->real_name = real_name;
priv->home_directory = g_strdup (entry->pw_dir);
@@ -405,7 +431,7 @@ load_passwd_file (CommonUserList *user_list, gboolean emit_add_signal)
{
CommonUser *info = link->data;
g_debug ("User %s added", common_user_get_name (info));
- g_signal_connect (info, USER_SIGNAL_CHANGED, G_CALLBACK (user_changed_cb), NULL);
+ g_signal_connect (info, USER_SIGNAL_CHANGED, G_CALLBACK (user_changed_cb), user_list);
if (emit_add_signal)
g_signal_emit (user_list, list_signals[USER_ADDED], 0, info);
}
@@ -483,7 +509,7 @@ load_accounts_user (CommonUser *user)
/* Get the properties for this user */
if (!priv->changed_signal)
- priv->changed_signal = g_dbus_connection_signal_subscribe (GET_LIST_PRIVATE (priv->user_list)->bus,
+ priv->changed_signal = g_dbus_connection_signal_subscribe (priv->bus,
"org.freedesktop.Accounts",
"org.freedesktop.Accounts.User",
"Changed",
@@ -493,7 +519,7 @@ load_accounts_user (CommonUser *user)
accounts_user_changed_cb,
user,
NULL);
- result = g_dbus_connection_call_sync (GET_LIST_PRIVATE (priv->user_list)->bus,
+ result = g_dbus_connection_call_sync (priv->bus,
"org.freedesktop.Accounts",
priv->path,
"org.freedesktop.DBus.Properties",
@@ -600,9 +626,10 @@ add_accounts_user (CommonUserList *user_list, const gchar *path, gboolean emit_s
priv = GET_USER_PRIVATE (user);
g_debug ("User %s added", path);
- priv->user_list = user_list;
+ priv->bus = g_object_ref (list_priv->bus);
priv->path = g_strdup (path);
- g_signal_connect (user, USER_SIGNAL_CHANGED, G_CALLBACK (user_changed_cb), NULL);
+ g_signal_connect (user, USER_SIGNAL_CHANGED, G_CALLBACK (user_changed_cb), user_list);
+ g_signal_connect (user, "get-logged-in", G_CALLBACK (get_logged_in_cb), user_list);
if (load_accounts_user (user))
{
list_priv->users = g_list_insert_sorted (list_priv->users, user, compare_user);
@@ -1135,12 +1162,11 @@ call_method (CommonUser *user, const gchar *method, GVariant *args,
{
GVariant *answer;
GError *error = NULL;
- CommonUserPrivate *user_priv = GET_USER_PRIVATE (user);
- CommonUserListPrivate *list_priv = GET_LIST_PRIVATE (user_priv->user_list);
+ CommonUserPrivate *priv = GET_USER_PRIVATE (user);
- answer = g_dbus_connection_call_sync (list_priv->bus,
+ answer = g_dbus_connection_call_sync (priv->bus,
"org.freedesktop.Accounts",
- user_priv->path,
+ priv->path,
"org.freedesktop.Accounts.User",
method,
args,
@@ -1438,27 +1464,13 @@ common_user_set_session (CommonUser *user, const gchar *session)
gboolean
common_user_get_logged_in (CommonUser *user)
{
- CommonUserPrivate *priv;
- CommonUserListPrivate *list_priv;
- GList *link;
+ gboolean result;
g_return_val_if_fail (COMMON_IS_USER (user), FALSE);
- priv = GET_USER_PRIVATE (user);
- list_priv = GET_LIST_PRIVATE (priv->user_list);
-
- // Lazily decide to load/listen to sessions
- if (list_priv->session_added_signal == 0)
- load_sessions (priv->user_list);
-
- for (link = list_priv->sessions; link; link = link->next)
- {
- CommonSession *session = link->data;
- if (strcmp (session->username, priv->name) == 0)
- return TRUE;
- }
+ g_signal_emit (user, user_signals[GET_LOGGED_IN], 0, &result);
- return FALSE;
+ return result;
}
/**
@@ -1604,7 +1616,8 @@ common_user_finalize (GObject *object)
g_free (priv->path);
if (priv->changed_signal)
- g_dbus_connection_signal_unsubscribe (GET_LIST_PRIVATE (priv->user_list)->bus, priv->changed_signal);
+ g_dbus_connection_signal_unsubscribe (priv->bus, priv->changed_signal);
+ g_clear_object (&priv->bus);
g_free (priv->name);
g_free (priv->real_name);
g_free (priv->home_directory);
@@ -1751,6 +1764,16 @@ common_user_class_init (CommonUserClass *klass)
NULL, NULL,
NULL,
G_TYPE_NONE, 0);
+
+ user_signals[GET_LOGGED_IN] =
+ g_signal_new ("get-logged-in",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ g_signal_accumulator_first_wins,
+ NULL,
+ NULL,
+ G_TYPE_BOOLEAN, 0);
}
static void