46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/* -*- Mode: C; indent-tabs-mode:nil; tab-width:4 -*-
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Copyright (C) 2010 Robert Ancell.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Author: Robert Ancell <robert.ancell@canonical.com>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
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.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include "config.h"
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <errno.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <string.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <sys/utsname.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <pwd.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <gio/gio.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include "lightdm/user.h"
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncenum
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LIST_PROP_0,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LIST_PROP_NUM_USERS,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LIST_PROP_USERS,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync};
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncenum
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_0,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_REAL_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_DISPLAY_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_HOME_DIRECTORY,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_IMAGE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_BACKGROUND,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_LANGUAGE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_LAYOUT,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_LAYOUTS,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_SESSION,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_LOGGED_IN,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_HAS_MESSAGES
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync};
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncenum
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_ADDED,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_CHANGED,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_REMOVED,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LAST_LIST_SIGNAL
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync};
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic guint list_signals[LAST_LIST_SIGNAL] = { 0 };
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncenum
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync CHANGED,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LAST_USER_SIGNAL
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync};
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic guint user_signals[LAST_USER_SIGNAL] = { 0 };
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Connection to AccountsService */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GDBusProxy *accounts_service_proxy;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *user_account_objects;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Connection to DisplayManager */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GDBusProxy *display_manager_proxy;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* File monitor for password file */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GFileMonitor *passwd_monitor;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* TRUE if have scanned users */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gboolean have_users;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* List of users */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *users;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* List of sessions */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *sessions;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync} LightDMUserListPrivate;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GDBusProxy *proxy;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *user;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync} UserAccountObject;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserList *user_list;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *real_name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *home_directory;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *image;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *background;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gboolean has_messages;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GKeyFile *dmrc_file;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *language;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar **layouts;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *session;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync} LightDMUserPrivate;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GObject parent_instance;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *path;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *username;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync} Session;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynctypedef struct
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GObjectClass parent_class;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync} SessionClass;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
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))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncGType session_get_type (void);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncG_DEFINE_TYPE (Session, session, G_TYPE_OBJECT);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
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
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#define PASSWD_FILE "/etc/passwd"
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#define USER_CONFIG_FILE "/etc/lightdm/users.conf"
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic LightDMUserList *singleton = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_list_get_instance:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the user list.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (transfer none): the #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncLightDMUserList *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_get_instance (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!singleton)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync singleton = g_object_new (LIGHTDM_TYPE_USER_LIST, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return singleton;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic LightDMUser *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_user_by_name (LightDMUserList *user_list, const gchar *username)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *link;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = priv->users; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *user = link->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (lightdm_user_get_name (user), username) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return user;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gint
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynccompare_user (gconstpointer a, gconstpointer b)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
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));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncupdate_passwd_user (LightDMUser *user, const gchar *real_name, const gchar *home_directory, const gchar *image)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
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)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->real_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->real_name = g_strdup (real_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->home_directory);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->home_directory = g_strdup (home_directory);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->image);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->image = g_strdup (image);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return TRUE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_changed_cb (LightDMUser *user, LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user_list, list_signals[USER_CHANGED], 0, user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncload_passwd_file (LightDMUserList *user_list, gboolean emit_add_signal)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GKeyFile *config;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *value;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gint minimum_uid;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar **hidden_users, **hidden_shells;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *users = NULL, *old_users, *new_users = NULL, *changed_users = NULL, *link;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GError *error = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Loading user config from %s", USER_CONFIG_FILE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync config = g_key_file_new ();
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 g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
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 else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync minimum_uid = 500;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync value = g_key_file_get_string (config, "UserList", "hidden-users", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!value)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync value = g_strdup ("nobody nobody4 noaccess");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync hidden_users = g_strsplit (value, " ", -1);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (value);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync value = g_key_file_get_string (config, "UserList", "hidden-shells", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!value)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync value = g_strdup ("/bin/false /usr/sbin/nologin");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync hidden_shells = g_strsplit (value, " ", -1);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (value);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_key_file_free (config);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync setpwent ();
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync while (TRUE)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync struct passwd *entry;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *user;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *user_priv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync char **tokens;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *real_name, *image;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync int i;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync errno = 0;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync entry = getpwent ();
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!entry)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ignore system users */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (entry->pw_uid < minimum_uid)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync continue;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ignore users disabled by shell */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (entry->pw_shell)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (i = 0; hidden_shells[i] && strcmp (entry->pw_shell, hidden_shells[i]) != 0; i++);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (hidden_shells[i])
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync continue;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ignore certain users */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (i = 0; hidden_users[i] && strcmp (entry->pw_name, hidden_users[i]) != 0; i++);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (hidden_users[i])
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync continue;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync tokens = g_strsplit (entry->pw_gecos, ",", -1);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (tokens[0] != NULL && tokens[0][0] != '\0')
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync real_name = g_strdup (tokens[0]);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync real_name = g_strdup ("");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (tokens);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync image = g_build_filename (entry->pw_dir, ".face", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!g_file_test (image, G_FILE_TEST_EXISTS))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (image);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync image = g_build_filename (entry->pw_dir, ".face.icon", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!g_file_test (image, G_FILE_TEST_EXISTS))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (image);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync image = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user = g_object_new (LIGHTDM_TYPE_USER, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_priv->user_list = user_list;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (user_priv->name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_priv->name = g_strdup (entry->pw_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (user_priv->real_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_priv->real_name = real_name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (user_priv->home_directory);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_priv->home_directory = g_strdup (entry->pw_dir);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (user_priv->image);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_priv->image = image;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Update existing users if have them */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = priv->users; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *info = link->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (lightdm_user_get_name (info), lightdm_user_get_name (user)) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
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 g_object_unref (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user = info;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!link)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Only notify once we have loaded the user list */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->have_users)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync new_users = g_list_insert_sorted (new_users, user, compare_user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync users = g_list_insert_sorted (users, user, compare_user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (hidden_users);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (hidden_shells);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (errno != 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Failed to read password database: %s", strerror (errno));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync endpwent ();
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Use new user list */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync old_users = priv->users;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->users = users;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Notify of changes */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = new_users; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *info = link->data;
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 if (emit_add_signal)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user_list, list_signals[USER_ADDED], 0, info);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_list_free (new_users);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = changed_users; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *info = link->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("User %s changed", lightdm_user_get_name (info));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (info, user_signals[CHANGED], 0);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_list_free (changed_users);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = old_users; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *new_link;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* See if this user is in the current list */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (new_link = priv->users; new_link; new_link = new_link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (new_link->data == link->data)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!new_link)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *info = link->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("User %s removed", lightdm_user_get_name (info));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user_list, list_signals[USER_REMOVED], 0, info);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (info);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_list_free (old_users);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncpasswd_changed_cb (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("%s changed, reloading user list", g_file_get_path (file));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_passwd_file (user_list, TRUE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncupdate_user (UserAccountObject *object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (object->user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *result, *value;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariantIter *iter;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GError *error = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (object->proxy),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_dbus_proxy_get_object_path (object->proxy),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DBus.Properties",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "GetAll",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_new ("(s)", "org.freedesktop.Accounts.User"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_VARIANT_TYPE ("(a{sv})"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_CALL_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync -1,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error updating user %s: %s", g_dbus_proxy_get_object_path (object->proxy), error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!result)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (result, "(a{sv})", &iter);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync while (g_variant_iter_loop (iter, "{&sv}", &name, &value))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (name, "UserName") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *user_name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (value, "&s", &user_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->name = g_strdup (user_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (name, "RealName") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *real_name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (value, "&s", &real_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->real_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->real_name = g_strdup (real_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (name, "HomeDirectory") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *home_directory;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (value, "&s", &home_directory);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->home_directory);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->home_directory = g_strdup (home_directory);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (name, "IconFile") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *icon_file;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (value, "&s", &icon_file);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->image);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (icon_file, "") == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->image = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->image = g_strdup (icon_file);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (name, "BackgroundFile") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *background_file;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (value, "&s", &background_file);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->background);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (background_file, "") == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->background = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->background = g_strdup (background_file);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_iter_free (iter);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (result);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return TRUE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, UserAccountObject *object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (signal_name, "Changed") == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("()")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("User %s changed", g_dbus_proxy_get_object_path (object->proxy));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync update_user (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (object->user, user_signals[CHANGED], 0);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Got org.freedesktop.Accounts.User signal Changed with unknown parameters %s", g_variant_get_type_string (parameters));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic UserAccountObject *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_account_object_new (LightDMUserList *user_list, const gchar *path)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GDBusProxy *proxy;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync UserAccountObject *object;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GError *error = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_PROXY_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync path,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts.User",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error getting user %s: %s", path, error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object = g_malloc0 (sizeof (UserAccountObject));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object->user = g_object_new (LIGHTDM_TYPE_USER, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GET_USER_PRIVATE (object->user)->user_list = user_list;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object->proxy = proxy;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (proxy, "g-signal", G_CALLBACK (user_signal_cb), object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return object;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_account_object_free (UserAccountObject *object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (object->user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (object->proxy);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic UserAccountObject *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncfind_user_account_object (LightDMUserList *user_list, const gchar *path)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *link;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = priv->user_account_objects; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync UserAccountObject *object = link->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (g_dbus_proxy_get_object_path (object->proxy), path) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return object;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncuser_accounts_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (signal_name, "UserAdded") == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *path;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync UserAccountObject *object;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (parameters, "(&o)", &path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ignore duplicate requests */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object = find_user_account_object (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object = user_account_object_new (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (object && update_user (object))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("User %s added", 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 }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_account_object_free (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Got UserAccounts signal UserAdded with unknown parameters %s", g_variant_get_type_string (parameters));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (signal_name, "UserDeleted") == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *path;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync UserAccountObject *object;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (parameters, "(&o)", &path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object = find_user_account_object (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("User %s deleted", path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->users = g_list_remove (priv->users, object->user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (object->user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user_list, list_signals[USER_REMOVED], 0, object->user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->user_account_objects = g_list_remove (priv->user_account_objects, object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_account_object_free (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Got UserAccounts signal UserDeleted with unknown parameters %s", g_variant_get_type_string (parameters));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic Session *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncload_session (LightDMUserList *user_list, const gchar *path)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync Session *session = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *result, *username;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GError *error = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (priv->display_manager_proxy),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync path,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DBus.Properties",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Get",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_new ("(ss)", "org.freedesktop.DisplayManager.Session", "UserName"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_VARIANT_TYPE ("(v)"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_CALL_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync -1,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error getting UserName from org.freedesktop.DisplayManager.Session: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!result)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (result, "(v)", &username);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (username, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (username, "&s", &name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Loaded session %s (%s)", path, name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync session = g_object_new (session_get_type (), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync session->username = g_strdup (name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync session->path = g_strdup (path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->sessions = g_list_append (priv->sessions, session);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (username);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (result);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return session;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncdisplay_manager_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (signal_name, "SessionAdded") == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *path;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync Session *session;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *user = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (parameters, "(&o)", &path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync session = load_session (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (session)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user = get_user_by_name (user_list, session->username);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user, user_signals[CHANGED], 0);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else if (strcmp (signal_name, "SessionRemoved") == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *path;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *link;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (parameters, "(&o)", &path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = priv->sessions; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync Session *session = link->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (session->path, path) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *user;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Session %s removed", path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->sessions = g_list_remove_link (priv->sessions, link);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user = get_user_by_name (user_list, session->username);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_emit (user, user_signals[CHANGED], 0);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (session);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncupdate_users (LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GError *error = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->have_users)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->have_users = TRUE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->accounts_service_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_PROXY_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "/org/freedesktop/Accounts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.Accounts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error contacting org.freedesktop.Accounts: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Check if the service exists */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->accounts_service_proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync name = g_dbus_proxy_get_name_owner (priv->accounts_service_proxy);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!name)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("org.freedesktop.Accounts does not exist, falling back to passwd file");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (priv->accounts_service_proxy);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->accounts_service_proxy = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->accounts_service_proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *result;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (priv->accounts_service_proxy, "g-signal", G_CALLBACK (user_accounts_signal_cb), user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_proxy_call_sync (priv->accounts_service_proxy,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "ListCachedUsers",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_new ("()"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_CALL_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync -1,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error getting user list from org.freedesktop.Accounts: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!result)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(ao)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariantIter *iter;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync const gchar *path;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Loading users from org.freedesktop.Accounts");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (result, "(ao)", &iter);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync while (g_variant_iter_loop (iter, "&o", &path))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync UserAccountObject *object;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Loading user %s", path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object = user_account_object_new (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (object && update_user (object))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
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 }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_account_object_free (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_iter_free (iter);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected type from ListCachedUsers: %s", g_variant_get_type_string (result));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (result);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GFile *passwd_file;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_passwd_file (user_list, FALSE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Watch for changes to user list */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync passwd_file = g_file_new_for_path (PASSWD_FILE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->passwd_monitor = g_file_monitor (passwd_file, G_FILE_MONITOR_NONE, NULL, &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (passwd_file);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error monitoring %s: %s", PASSWD_FILE, error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (priv->passwd_monitor, "changed", G_CALLBACK (passwd_changed_cb), user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->display_manager_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_PROXY_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "/org/freedesktop/DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error contacting org.freedesktop.DisplayManager: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->display_manager_proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *result;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_connect (priv->display_manager_proxy, "g-signal", G_CALLBACK (display_manager_signal_cb), user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (priv->display_manager_proxy),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "/org/freedesktop/DisplayManager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.DBus.Properties",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Get",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_new ("(ss)", "org.freedesktop.DisplayManager", "Sessions"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_VARIANT_TYPE ("(v)"),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_CALL_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync -1,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync &error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Error getting session list from org.freedesktop.DisplayManager: %s", error->message);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_clear_error (&error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!result)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(v)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *value;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariantIter *iter;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync const gchar *path;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (result, "(v)", &value);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_debug ("Loading sessions from org.freedesktop.DisplayManager");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (value, "ao", &iter);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync while (g_variant_iter_loop (iter, "&o", &path))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_session (user_list, path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_iter_free (iter);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (value);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected type from org.freedesktop.DisplayManager.Sessions: %s", g_variant_get_type_string (result));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (result);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_list_get_length:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: a #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The number of users able to log in
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgint
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_get_length (LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), 0);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync update_users (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return g_list_length (GET_LIST_PRIVATE (user_list)->users);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_list_get_users:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
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 *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (element-type LightDMUser) (transfer none): A list of #LightDMUser that should be presented to the user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncGList *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_get_users (LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync update_users (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_LIST_PRIVATE (user_list)->users;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_list_get_user_by_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @username: Name of user to get.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get infomation about a given user or #NULL if this user doesn't exist.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: (transfer none): A #LightDMUser entry for the given user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncLightDMUser *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_get_user_by_name (LightDMUserList *user_list, const gchar *username)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (username != NULL, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync update_users (user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return get_user_by_name (user_list, username);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_init (LightDMUserList *user_list)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_set_property (GObject *object,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync guint prop_id,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync const GValue *value,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GParamSpec *pspec)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_get_property (GObject *object,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync guint prop_id,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GValue *value,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GParamSpec *pspec)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserList *self;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync self = LIGHTDM_USER_LIST (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync switch (prop_id)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case LIST_PROP_NUM_USERS:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_int (value, lightdm_user_list_get_length (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync default:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_finalize (GObject *object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserList *self = LIGHTDM_USER_LIST (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *priv = GET_LIST_PRIVATE (self);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->accounts_service_proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (priv->accounts_service_proxy);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_list_free_full (priv->user_account_objects, (GDestroyNotify) user_account_object_free);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->passwd_monitor)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_unref (priv->passwd_monitor);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_list_free_full (priv->users, g_object_unref);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_list_free_full (priv->sessions, g_object_unref);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_CLASS (lightdm_user_list_parent_class)->finalize (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_list_class_init (LightDMUserListClass *klass)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GObjectClass *object_class = G_OBJECT_CLASS (klass);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_type_class_add_private (klass, sizeof (LightDMUserListPrivate));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
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
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LIST_PROP_NUM_USERS,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_int ("num-users",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "num-users",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Number of login users",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync 0, G_MAXINT, 0,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READABLE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * LightDMUserList::user-added:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: The #LightDM user that has been added.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * The ::user-added signal gets emitted when a user account is created.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync list_signals[USER_ADDED] =
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_new ("user-added",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_TYPE_FROM_CLASS (klass),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_SIGNAL_RUN_LAST,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_STRUCT_OFFSET (LightDMUserListClass, user_added),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL, NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_cclosure_marshal_VOID__OBJECT,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_TYPE_NONE, 1, LIGHTDM_TYPE_USER);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * LightDMUserList::user-changed:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: The #LightDM user that has been changed.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * The ::user-changed signal gets emitted when a user account is modified.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync list_signals[USER_CHANGED] =
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_new ("user-changed",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_TYPE_FROM_CLASS (klass),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_SIGNAL_RUN_LAST,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_STRUCT_OFFSET (LightDMUserListClass, user_changed),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL, NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_cclosure_marshal_VOID__OBJECT,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_TYPE_NONE, 1, LIGHTDM_TYPE_USER);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * LightDMUserList::user-removed:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user_list: A #LightDMUserList
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: The #LightDM user that has been removed.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * The ::user-removed signal gets emitted when a user account is removed.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync list_signals[USER_REMOVED] =
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_new ("user-removed",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_TYPE_FROM_CLASS (klass),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_SIGNAL_RUN_LAST,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_STRUCT_OFFSET (LightDMUserListClass, user_removed),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL, NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_cclosure_marshal_VOID__OBJECT,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_TYPE_NONE, 1, LIGHTDM_TYPE_USER);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the name of a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The name of the given user
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_name (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_USER_PRIVATE (user)->name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_real_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the real name of a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The real name of the given user
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_real_name (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_USER_PRIVATE (user)->real_name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_display_name:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the display name of a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The display name of the given user
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_display_name (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (priv->real_name, ""))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return priv->real_name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return priv->name;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_home_directory:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the home directory for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The users home directory
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_home_directory (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_USER_PRIVATE (user)->home_directory;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_image:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the image URI for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The image URI for the given user or #NULL if no URI
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_image (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_USER_PRIVATE (user)->image;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_background:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the background file path for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The background file path for the given user or #NULL if no path
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_background (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_USER_PRIVATE (user)->background;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncload_dmrc (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *path;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync //gboolean have_dmrc;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!priv->dmrc_file)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->dmrc_file = g_key_file_new ();
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
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 g_free (path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* If no ~/.dmrc, then load from the cache */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync // FIXME
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync // FIXME: Watch for changes
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* The Language field is actually a locale, strip the codeset off it to get the language */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->language)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->language);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->language = g_key_file_get_string (priv->dmrc_file, "Desktop", "Language", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->language)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *codeset = strchr (priv->language, '.');
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (codeset)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *codeset = '\0';
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->layouts)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (priv->layouts);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->layouts = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_key_file_has_key (priv->dmrc_file, "Desktop", "Layout", NULL))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->layouts = g_malloc (sizeof (gchar *) * 2);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->layouts[0] = g_key_file_get_string (priv->dmrc_file, "Desktop", "Layout", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->layouts[1] = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->session)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->session);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->session = g_key_file_get_string (priv->dmrc_file, "Desktop", "Session", NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic GVariant *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_property (GDBusProxy *proxy, const gchar *property)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *answer;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync answer = g_dbus_proxy_get_cached_property (proxy, property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!answer)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Could not get accounts property %s", property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return answer;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_boolean_property (GDBusProxy *proxy, const gchar *property)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *answer;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gboolean rv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync answer = get_property (proxy, property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!g_variant_is_of_type (answer, G_VARIANT_TYPE_BOOLEAN))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected accounts property type for %s: %s",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync property, g_variant_get_type_string (answer));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (answer);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync rv = g_variant_get_boolean (answer);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (answer);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return rv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_string_property (GDBusProxy *proxy, const gchar *property)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *answer;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar *rv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync answer = get_property (proxy, property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!g_variant_is_of_type (answer, G_VARIANT_TYPE_STRING))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected accounts property type for %s: %s",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync property, g_variant_get_type_string (answer));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (answer);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync rv = g_strdup (g_variant_get_string (answer, NULL));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (rv, "") == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (rv);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync rv = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (answer);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return rv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gchar **
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncget_string_array_property (GDBusProxy *proxy, const gchar *property)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *answer;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar **rv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync answer = g_dbus_proxy_get_cached_property (proxy, property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!answer)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Could not get accounts property %s", property);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!g_variant_is_of_type (answer, G_VARIANT_TYPE ("as")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_warning ("Unexpected accounts property type for %s: %s",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync property, g_variant_get_type_string (answer));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (answer);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync rv = g_variant_dup_strv (answer, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (answer);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return rv;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncload_accounts_service (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *list_priv = GET_LIST_PRIVATE (priv->user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync UserAccountObject *account = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *iter;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gchar **value;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* First, find AccountObject proxy */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (iter = list_priv->user_account_objects; iter; iter = iter->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync UserAccountObject *a = iter->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (a->user == user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync account = a;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!account)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* We have proxy, let's grab some properties */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->language)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->language);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->language = get_string_property (account->proxy, "Language");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->session)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->session);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->session = get_string_property (account->proxy, "XSession");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync value = get_string_array_property (account->proxy, "XKeyboardLayouts");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (value)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (value[0])
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (priv->layouts);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->layouts = value;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync else
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (value);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->has_messages = get_boolean_property (account->proxy, "XHasMessages");
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return TRUE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/* Loads language/layout/session info for user */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncload_user_values (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_dmrc (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_accounts_service (user); // overrides dmrc values
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /* Ensure a few guarantees */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->layouts == NULL)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->layouts = g_malloc (sizeof (gchar *) * 1);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync priv->layouts[0] = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_language:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the language for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The language for the given user or #NULL if using system defaults.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_language (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_user_values (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_USER_PRIVATE (user)->language;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_layout:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the keyboard layout for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
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 **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_layout (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_user_values (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_USER_PRIVATE (user)->layouts[0];
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_layouts:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the configured keyboard layouts for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
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.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar * const *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_layouts (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_user_values (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return (const gchar * const *) GET_USER_PRIVATE (user)->layouts;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_session:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Get the session for a user.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: The session for the given user or #NULL if using system defaults.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncconst gchar *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_session (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_user_values (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_USER_PRIVATE (user)->session;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_logged_in:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Check if a user is logged in.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if the user is currently logged in.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_logged_in (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserListPrivate *list_priv = GET_LIST_PRIVATE (priv->user_list);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GList *link;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), FALSE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync for (link = list_priv->sessions; link; link = link->next)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync Session *session = link->data;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (strcmp (session->username, priv->name) == 0)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return TRUE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_user_get_has_messages:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Check if a user has waiting messages.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if the user has waiting messages.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_has_messages (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_return_val_if_fail (LIGHTDM_IS_USER (user), FALSE);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync load_user_values (user);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return GET_USER_PRIVATE (user)->has_messages;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_init (LightDMUser *user)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_set_property (GObject *object,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync guint prop_id,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync const GValue *value,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GParamSpec *pspec)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_get_property (GObject *object,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync guint prop_id,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GValue *value,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GParamSpec *pspec)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *self;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync self = LIGHTDM_USER (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync switch (prop_id)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_NAME:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_name (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_REAL_NAME:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_real_name (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_DISPLAY_NAME:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_display_name (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_HOME_DIRECTORY:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_home_directory (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_IMAGE:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_image (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_BACKGROUND:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_background (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_LANGUAGE:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_language (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_LAYOUT:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_layout (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_LAYOUTS:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_boxed (value, g_strdupv ((gchar **) lightdm_user_get_layouts (self)));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_SESSION:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_string (value, lightdm_user_get_session (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_LOGGED_IN:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_boolean (value, lightdm_user_get_logged_in (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync case USER_PROP_HAS_MESSAGES:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_value_set_boolean (value, lightdm_user_get_has_messages (self));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync default:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync break;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_finalize (GObject *object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUser *self = LIGHTDM_USER (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync LightDMUserPrivate *priv = GET_USER_PRIVATE (self);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->real_name);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->home_directory);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->image);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (priv->background);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_strfreev (priv->layouts);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (priv->dmrc_file)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_key_file_free (priv->dmrc_file);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_user_class_init (LightDMUserClass *klass)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GObjectClass *object_class = G_OBJECT_CLASS (klass);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_type_class_add_private (klass, sizeof (LightDMUserPrivate));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->set_property = lightdm_user_set_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->get_property = lightdm_user_get_property;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->finalize = lightdm_user_finalize;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Username",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_REAL_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("real-name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "real-name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Users real name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_DISPLAY_NAME,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("display-name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "display-name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Users display name",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READABLE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_HOME_DIRECTORY,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("home-directory",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "home-directory",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Home directory",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_IMAGE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("image",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "image",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Avatar image",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_BACKGROUND,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("background",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "background",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "User background",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_LANGUAGE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("language",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "language",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Language used by this user",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READABLE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_LAYOUT,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("layout",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "layout",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Keyboard layout used by this user",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READABLE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_LAYOUTS,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_boxed ("layouts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "layouts",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Keyboard layouts used by this user",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_TYPE_STRV,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READABLE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_SESSION,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_string ("session",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "session",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "Session used by this user",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READABLE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_LOGGED_IN,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_boolean ("logged-in",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "logged-in",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "TRUE if the user is currently in a session",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync FALSE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_object_class_install_property (object_class,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync USER_PROP_LOGGED_IN,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_param_spec_boolean ("has-messages",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "has-messages",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "TRUE if the user is has waiting messages",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync FALSE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_PARAM_READWRITE));
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync /**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * LightDMUser::changed:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @user: A #LightDMUser
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * The ::changed signal gets emitted this user account is modified.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync user_signals[CHANGED] =
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_signal_new ("changed",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_TYPE_FROM_CLASS (klass),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_SIGNAL_RUN_LAST,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_STRUCT_OFFSET (LightDMUserClass, changed),
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL, NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_cclosure_marshal_VOID__VOID,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_TYPE_NONE, 0);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncsession_init (Session *session)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncsession_finalize (GObject *object)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync Session *self = SESSION (object);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (self->path);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_free (self->username);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic void
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncsession_class_init (SessionClass *klass)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GObjectClass *object_class = G_OBJECT_CLASS (klass);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync object_class->finalize = session_finalize;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}