46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/* -*- Mode: C; indent-tabs-mode:nil; tab-width:4 -*-
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Copyright (C) 2010 Robert Ancell.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Author: Robert Ancell <robert.ancell@canonical.com>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * This library is free software; you can redistribute it and/or modify it under
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * the terms of the GNU Lesser General Public License as published by the Free
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Software Foundation; either version 2 or version 3 of the License.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * See http://www.gnu.org/copyleft/lgpl.html the full text of the license.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic guint list_signals[LAST_LIST_SIGNAL] = { 0 };
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic guint user_signals[LAST_USER_SIGNAL] = { 0 };
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Connection to AccountsService */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Connection to DisplayManager */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* File monitor for password file */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* TRUE if have scanned users */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* List of users */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* List of sessions */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncG_DEFINE_TYPE (LightDMUserList, lightdm_user_list, G_TYPE_OBJECT);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncG_DEFINE_TYPE (LightDMUser, lightdm_user, G_TYPE_OBJECT);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#define SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), session_get_type (), Session))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#define GET_LIST_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserListPrivate)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#define GET_USER_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_USER, LightDMUserPrivate)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_list_get_instance:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the user list.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (transfer none): the #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync singleton = g_object_new (LIGHTDM_TYPE_USER_LIST, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_user_by_name (LightDMUserList *user_list, const gchar *username)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (lightdm_user_get_name (user), username) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *user_a = (LightDMUser *) a, *user_b = (LightDMUser *) b;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return strcmp (lightdm_user_get_display_name (user_a), lightdm_user_get_display_name (user_b));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncupdate_passwd_user (LightDMUser *user, const gchar *real_name, const gchar *home_directory, const gchar *image)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_strcmp0 (lightdm_user_get_real_name (user), real_name) == 0 &&
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strcmp0 (lightdm_user_get_home_directory (user), home_directory) == 0 &&
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strcmp0 (lightdm_user_get_image (user), image) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_changed_cb (LightDMUser *user, LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user_list, list_signals[USER_CHANGED], 0, user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncload_passwd_file (LightDMUserList *user_list, gboolean emit_add_signal)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *users = NULL, *old_users, *new_users = NULL, *changed_users = NULL, *link;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Loading user config from %s", USER_CONFIG_FILE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_key_file_load_from_file (config, USER_CONFIG_FILE, G_KEY_FILE_NONE, &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error && !g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Failed to load configuration from %s: %s", USER_CONFIG_FILE, error->message); // FIXME: Don't make warning on no file, just info
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_key_file_has_key (config, "UserList", "minimum-uid", NULL))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync minimum_uid = g_key_file_get_integer (config, "UserList", "minimum-uid", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync value = g_key_file_get_string (config, "UserList", "hidden-users", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync value = g_key_file_get_string (config, "UserList", "hidden-shells", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ignore system users */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ignore users disabled by shell */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (i = 0; hidden_shells[i] && strcmp (entry->pw_shell, hidden_shells[i]) != 0; i++);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ignore certain users */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (i = 0; hidden_users[i] && strcmp (entry->pw_name, hidden_users[i]) != 0; i++);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync image = g_build_filename (entry->pw_dir, ".face", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync image = g_build_filename (entry->pw_dir, ".face.icon", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_priv->home_directory = g_strdup (entry->pw_dir);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Update existing users if have them */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (lightdm_user_get_name (info), lightdm_user_get_name (user)) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (update_passwd_user (info, lightdm_user_get_real_name (user), lightdm_user_get_home_directory (user), lightdm_user_get_image (user)))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync changed_users = g_list_insert_sorted (changed_users, info, compare_user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Only notify once we have loaded the user list */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync new_users = g_list_insert_sorted (new_users, user, compare_user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync users = g_list_insert_sorted (users, user, compare_user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Failed to read password database: %s", strerror (errno));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Use new user list */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Notify of changes */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("User %s added", lightdm_user_get_name (info));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (info, "changed", G_CALLBACK (user_changed_cb), user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user_list, list_signals[USER_ADDED], 0, info);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = changed_users; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("User %s changed", lightdm_user_get_name (info));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* See if this user is in the current list */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (new_link = priv->users; new_link; new_link = new_link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("User %s removed", lightdm_user_get_name (info));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user_list, list_signals[USER_REMOVED], 0, info);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncpasswd_changed_cb (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("%s changed, reloading user list", g_file_get_path (file));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (object->user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (object->proxy),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DBus.Properties",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_new ("(s)", "org.freedesktop.Accounts.User"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error updating user %s: %s", g_dbus_proxy_get_object_path (object->proxy), error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync while (g_variant_iter_loop (iter, "{&sv}", &name, &value))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (name, "UserName") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (name, "RealName") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (name, "HomeDirectory") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (name, "IconFile") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (name, "BackgroundFile") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, UserAccountObject *object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("()")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("User %s changed", g_dbus_proxy_get_object_path (object->proxy));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (object->user, user_signals[CHANGED], 0);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Got org.freedesktop.Accounts.User signal Changed with unknown parameters %s", g_variant_get_type_string (parameters));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_account_object_new (LightDMUserList *user_list, const gchar *path)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts.User",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error getting user %s: %s", path, error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object->user = g_object_new (LIGHTDM_TYPE_USER, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GET_USER_PRIVATE (object->user)->user_list = user_list;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (proxy, "g-signal", G_CALLBACK (user_signal_cb), object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_account_object_free (UserAccountObject *object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncfind_user_account_object (LightDMUserList *user_list, const gchar *path)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = priv->user_account_objects; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (g_dbus_proxy_get_object_path (object->proxy), path) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_accounts_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ignore duplicate requests */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object = find_user_account_object (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object = user_account_object_new (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->user_account_objects = g_list_append (priv->user_account_objects, object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->users = g_list_insert_sorted (priv->users, g_object_ref (object->user), compare_user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (object->user, "changed", G_CALLBACK (user_changed_cb), user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user_list, list_signals[USER_ADDED], 0, object->user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Got UserAccounts signal UserAdded with unknown parameters %s", g_variant_get_type_string (parameters));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object = find_user_account_object (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->users = g_list_remove (priv->users, object->user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user_list, list_signals[USER_REMOVED], 0, object->user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->user_account_objects = g_list_remove (priv->user_account_objects, object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Got UserAccounts signal UserDeleted with unknown parameters %s", g_variant_get_type_string (parameters));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncload_session (LightDMUserList *user_list, const gchar *path)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (priv->display_manager_proxy),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DBus.Properties",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_new ("(ss)", "org.freedesktop.DisplayManager.Session", "UserName"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error getting UserName from org.freedesktop.DisplayManager.Session: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (username, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync session = g_object_new (session_get_type (), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->sessions = g_list_append (priv->sessions, session);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncdisplay_manager_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user = get_user_by_name (user_list, session->username);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (signal_name, "SessionRemoved") == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = priv->sessions; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->sessions = g_list_remove_link (priv->sessions, link);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user = get_user_by_name (user_list, session->username);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->accounts_service_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error contacting org.freedesktop.Accounts: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Check if the service exists */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync name = g_dbus_proxy_get_name_owner (priv->accounts_service_proxy);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("org.freedesktop.Accounts does not exist, falling back to passwd file");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (priv->accounts_service_proxy, "g-signal", G_CALLBACK (user_accounts_signal_cb), user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_proxy_call_sync (priv->accounts_service_proxy,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "ListCachedUsers",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error getting user list from org.freedesktop.Accounts: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(ao)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Loading users from org.freedesktop.Accounts");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object = user_account_object_new (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->user_account_objects = g_list_append (priv->user_account_objects, object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->users = g_list_insert_sorted (priv->users, g_object_ref (object->user), compare_user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (object->user, "changed", G_CALLBACK (user_changed_cb), user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected type from ListCachedUsers: %s", g_variant_get_type_string (result));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Watch for changes to user list */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->passwd_monitor = g_file_monitor (passwd_file, G_FILE_MONITOR_NONE, NULL, &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error monitoring %s: %s", PASSWD_FILE, error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (priv->passwd_monitor, "changed", G_CALLBACK (passwd_changed_cb), user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->display_manager_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error contacting org.freedesktop.DisplayManager: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (priv->display_manager_proxy, "g-signal", G_CALLBACK (display_manager_signal_cb), user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (priv->display_manager_proxy),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DBus.Properties",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_new ("(ss)", "org.freedesktop.DisplayManager", "Sessions"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error getting session list from org.freedesktop.DisplayManager: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(v)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Loading sessions from org.freedesktop.DisplayManager");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected type from org.freedesktop.DisplayManager.Sessions: %s", g_variant_get_type_string (result));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_list_get_length:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: a #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The number of users able to log in
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_get_length (LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), 0);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return g_list_length (GET_LIST_PRIVATE (user_list)->users);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_list_get_users:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get a list of users to present to the user. This list may be a subset of the
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * available users and may be empty depending on the server configuration.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (element-type LightDMUser) (transfer none): A list of #LightDMUser that should be presented to the user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_get_users (LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_list_get_user_by_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @username: Name of user to get.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get infomation about a given user or #NULL if this user doesn't exist.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (transfer none): A #LightDMUser entry for the given user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_get_user_by_name (LightDMUserList *user_list, const gchar *username)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_int (value, lightdm_user_list_get_length (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserList *self = LIGHTDM_USER_LIST (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (self);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_list_free_full (priv->user_account_objects, (GDestroyNotify) user_account_object_free);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_CLASS (lightdm_user_list_parent_class)->finalize (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_class_init (LightDMUserListClass *klass)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GObjectClass *object_class = G_OBJECT_CLASS (klass);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_type_class_add_private (klass, sizeof (LightDMUserListPrivate));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->set_property = lightdm_user_list_set_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->get_property = lightdm_user_list_get_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->finalize = lightdm_user_list_finalize;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "num-users",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Number of login users",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * LightDMUserList::user-added:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: The #LightDM user that has been added.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * The ::user-added signal gets emitted when a user account is created.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_STRUCT_OFFSET (LightDMUserListClass, user_added),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * LightDMUserList::user-changed:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: The #LightDM user that has been changed.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * The ::user-changed signal gets emitted when a user account is modified.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_STRUCT_OFFSET (LightDMUserListClass, user_changed),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * LightDMUserList::user-removed:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: The #LightDM user that has been removed.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * The ::user-removed signal gets emitted when a user account is removed.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_STRUCT_OFFSET (LightDMUserListClass, user_removed),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the name of a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The name of the given user
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_real_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the real name of a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The real name of the given user
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_display_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the display name of a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The display name of the given user
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_home_directory:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the home directory for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The users home directory
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_image:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the image URI for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The image URI for the given user or #NULL if no URI
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_background:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the background file path for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The background file path for the given user or #NULL if no path
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync //gboolean have_dmrc;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Load from the user directory */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync path = g_build_filename (priv->home_directory, ".dmrc", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /*have_dmrc = */g_key_file_load_from_file (priv->dmrc_file, path, G_KEY_FILE_KEEP_COMMENTS, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* If no ~/.dmrc, then load from the cache */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync // FIXME: Watch for changes
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* The Language field is actually a locale, strip the codeset off it to get the language */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->language = g_key_file_get_string (priv->dmrc_file, "Desktop", "Language", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_key_file_has_key (priv->dmrc_file, "Desktop", "Layout", NULL))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->layouts[0] = g_key_file_get_string (priv->dmrc_file, "Desktop", "Layout", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->session = g_key_file_get_string (priv->dmrc_file, "Desktop", "Session", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_property (GDBusProxy *proxy, const gchar *property)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync answer = g_dbus_proxy_get_cached_property (proxy, property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Could not get accounts property %s", property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_boolean_property (GDBusProxy *proxy, const gchar *property)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!g_variant_is_of_type (answer, G_VARIANT_TYPE_BOOLEAN))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected accounts property type for %s: %s",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_string_property (GDBusProxy *proxy, const gchar *property)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!g_variant_is_of_type (answer, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected accounts property type for %s: %s",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync rv = g_strdup (g_variant_get_string (answer, NULL));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_string_array_property (GDBusProxy *proxy, const gchar *property)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync answer = g_dbus_proxy_get_cached_property (proxy, property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Could not get accounts property %s", property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!g_variant_is_of_type (answer, G_VARIANT_TYPE ("as")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected accounts property type for %s: %s",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *list_priv = GET_LIST_PRIVATE (priv->user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* First, find AccountObject proxy */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (iter = list_priv->user_account_objects; iter; iter = iter->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* We have proxy, let's grab some properties */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->language = get_string_property (account->proxy, "Language");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->session = get_string_property (account->proxy, "XSession");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync value = get_string_array_property (account->proxy, "XKeyboardLayouts");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->has_messages = get_boolean_property (account->proxy, "XHasMessages");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/* Loads language/layout/session info for user */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_accounts_service (user); // overrides dmrc values
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ensure a few guarantees */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_language:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the language for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The language for the given user or #NULL if using system defaults.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_layout:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the keyboard layout for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The keyboard layout for the given user or #NULL if using system defaults. Copy the value if you want to use it long term.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_layouts:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the configured keyboard layouts for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (transfer none): A NULL-terminated array of keyboard layouts for the given user. Copy the values if you want to use them long term.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar * const *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return (const gchar * const *) GET_USER_PRIVATE (user)->layouts;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_session:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the session for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The session for the given user or #NULL if using system defaults.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_logged_in:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Check if a user is logged in.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if the user is currently logged in.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *list_priv = GET_LIST_PRIVATE (priv->user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), FALSE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = list_priv->sessions; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_has_messages:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Check if a user has waiting messages.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if the user has waiting messages.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), FALSE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_name (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_real_name (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_display_name (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_home_directory (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_image (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_background (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_language (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_layout (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_boxed (value, g_strdupv ((gchar **) lightdm_user_get_layouts (self)));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_session (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_boolean (value, lightdm_user_get_logged_in (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_boolean (value, lightdm_user_get_has_messages (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (self);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GObjectClass *object_class = G_OBJECT_CLASS (klass);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_type_class_add_private (klass, sizeof (LightDMUserPrivate));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->set_property = lightdm_user_set_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->get_property = lightdm_user_get_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Username",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "real-name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Users real name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "display-name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Users display name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "home-directory",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Home directory",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Avatar image",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "background",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "User background",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "language",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Language used by this user",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Keyboard layout used by this user",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Keyboard layouts used by this user",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Session used by this user",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "logged-in",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "TRUE if the user is currently in a session",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "has-messages",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "TRUE if the user is has waiting messages",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * LightDMUser::changed:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * The ::changed signal gets emitted this user account is modified.