751739
From 14bb1237f71e38749558c74963032a0387eecec0 Mon Sep 17 00:00:00 2001
751739
From: Ray Strode <rstrode@redhat.com>
751739
Date: Wed, 15 Aug 2018 16:04:42 -0400
751739
Subject: [PATCH 2/2] user: export new Saved property
751739
751739
accountsservice maintains a state file for some users, if those users
751739
have selected a specific session or language.
751739
751739
There's no good way, at the moment, for an application to check if a
751739
specific user has saved state.
751739
751739
This commit exports the Saved property on the User object.
751739
---
751739
 data/org.freedesktop.Accounts.User.xml | 10 ++++++++++
751739
 src/daemon.c                           |  3 +++
751739
 src/libaccountsservice/act-user.c      | 19 +++++++++++++++++++
751739
 src/libaccountsservice/act-user.h      |  1 +
751739
 src/user.c                             | 10 ++++++++++
751739
 src/user.h                             |  2 ++
751739
 6 files changed, 45 insertions(+)
751739
751739
diff --git a/data/org.freedesktop.Accounts.User.xml b/data/org.freedesktop.Accounts.User.xml
751739
index 7fc3c61..8d3fe1c 100644
751739
--- a/data/org.freedesktop.Accounts.User.xml
751739
+++ b/data/org.freedesktop.Accounts.User.xml
751739
@@ -811,60 +811,70 @@
751739
     </doc:doc>
751739
   </property>
751739
 
751739
   <property name="LoginHistory" type="a(xxa{sv})" access="read">
751739
     <doc:doc>
751739
       <doc:description>
751739
         <doc:para>
751739
           The login history for this user.
751739
           Each entry in the array represents a login session. The first two
751739
           members are the login time and logout time, as timestamps (seconds since the epoch). If the session is still running, the logout time
751739
           is 0.
751739
         </doc:para>
751739
         <doc:para>
751739
           The a{sv} member is a dictionary containing additional information
751739
           about the session. Possible members include 'type' (with values like ':0', 'tty0', 'pts/0' etc).
751739
         </doc:para>
751739
       </doc:description>
751739
     </doc:doc>
751739
   </property>
751739
 
751739
   <property name="IconFile" type="s" access="read">
751739
     <doc:doc>
751739
       <doc:description>
751739
         <doc:para>
751739
            The filename of a png file containing the users icon.
751739
         </doc:para>
751739
       </doc:description>
751739
     </doc:doc>
751739
   </property>
751739
 
751739
+  <property name="Saved" type="b" access="read">
751739
+    <doc:doc>
751739
+      <doc:description>
751739
+        <doc:para>
751739
+           Whether the users account has retained state
751739
+        </doc:para>
751739
+      </doc:description>
751739
+    </doc:doc>
751739
+  </property>
751739
+
751739
   <property name="Locked" type="b" access="read">
751739
     <doc:doc>
751739
       <doc:description>
751739
         <doc:para>
751739
            Whether the users account is locked.
751739
         </doc:para>
751739
       </doc:description>
751739
     </doc:doc>
751739
   </property>
751739
 
751739
   <property name="PasswordMode" type="i" access="read">
751739
     <doc:doc>
751739
       <doc:description>
751739
         <doc:para>
751739
           The password mode for the user account, encoded as an integer:
751739
           <doc:list>
751739
             <doc:item>
751739
               <doc:term>0</doc:term>
751739
               <doc:definition>Regular password</doc:definition>
751739
             </doc:item>
751739
             <doc:item>
751739
               <doc:term>1</doc:term>
751739
               <doc:definition>Password must be set at next login</doc:definition>
751739
             </doc:item>
751739
             <doc:item>
751739
               <doc:term>2</doc:term>
751739
               <doc:definition>No password</doc:definition>
751739
             </doc:item>
751739
           </doc:list>
751739
         </doc:para>
751739
diff --git a/src/daemon.c b/src/daemon.c
751739
index 2851ed6..2587b8a 100644
751739
--- a/src/daemon.c
751739
+++ b/src/daemon.c
751739
@@ -1187,60 +1187,61 @@ daemon_cache_user (AccountsAccounts      *accounts,
751739
                                  context,
751739
                                  g_strdup (user_name),
751739
                                  g_free);
751739
 
751739
         return TRUE;
751739
 }
751739
 
751739
 static void
751739
 daemon_uncache_user_authorized_cb (Daemon                *daemon,
751739
                                    User                  *dummy,
751739
                                    GDBusMethodInvocation *context,
751739
                                    gpointer               data)
751739
 {
751739
         const gchar *user_name = data;
751739
         User        *user;
751739
 
751739
         sys_log (context, "uncache user '%s'", user_name);
751739
 
751739
         user = daemon_local_find_user_by_name (daemon, user_name);
751739
         if (user == NULL) {
751739
                 throw_error (context, ERROR_USER_DOES_NOT_EXIST,
751739
                              "No user with the name %s found", user_name);
751739
                 return;
751739
         }
751739
 
751739
         /* Always use the canonical user name looked up */
751739
         user_name = user_get_user_name (user);
751739
 
751739
         remove_cache_files (user_name);
751739
 
751739
+        user_set_saved (user, FALSE);
751739
         user_set_cached (user, FALSE);
751739
 
751739
         accounts_accounts_complete_uncache_user (NULL, context);
751739
 
751739
         queue_reload_users (daemon);
751739
 }
751739
 
751739
 static gboolean
751739
 daemon_uncache_user (AccountsAccounts      *accounts,
751739
                      GDBusMethodInvocation *context,
751739
                      const gchar           *user_name)
751739
 {
751739
         Daemon *daemon = (Daemon*)accounts;
751739
 
751739
         daemon_local_check_auth (daemon,
751739
                                  NULL,
751739
                                  "org.freedesktop.accounts.user-administration",
751739
                                  TRUE,
751739
                                  daemon_uncache_user_authorized_cb,
751739
                                  context,
751739
                                  g_strdup (user_name),
751739
                                  g_free);
751739
 
751739
         return TRUE;
751739
 }
751739
 
751739
 typedef struct {
751739
         uid_t uid;
751739
         gboolean remove_files;
751739
 } DeleteUserData;
751739
@@ -1252,60 +1253,62 @@ daemon_delete_user_authorized_cb (Daemon                *daemon,
751739
                                   gpointer               data)
751739
 
751739
 {
751739
         DeleteUserData *ud = data;
751739
         g_autoptr(GError) error = NULL;
751739
         struct passwd *pwent;
751739
         const gchar *argv[6];
751739
         User *user;
751739
 
751739
         pwent = getpwuid (ud->uid);
751739
 
751739
         if (pwent == NULL) {
751739
                 throw_error (context, ERROR_USER_DOES_NOT_EXIST, "No user with uid %d found", ud->uid);
751739
                 return;
751739
         }
751739
 
751739
         sys_log (context, "delete user '%s' (%d)", pwent->pw_name, ud->uid);
751739
 
751739
         user = daemon_local_find_user_by_id (daemon, ud->uid);
751739
 
751739
         if (user != NULL) {
751739
                 user_set_cached (user, FALSE);
751739
 
751739
                 if (daemon->priv->autologin == user) {
751739
                         daemon_local_set_automatic_login (daemon, user, FALSE, NULL);
751739
                 }
751739
         }
751739
 
751739
         remove_cache_files (pwent->pw_name);
751739
 
751739
+        user_set_saved (user, FALSE);
751739
+
751739
         argv[0] = "/usr/sbin/userdel";
751739
         if (ud->remove_files) {
751739
                 argv[1] = "-f";
751739
                 argv[2] = "-r";
751739
                 argv[3] = "--";
751739
                 argv[4] = pwent->pw_name;
751739
                 argv[5] = NULL;
751739
         }
751739
         else {
751739
                 argv[1] = "-f";
751739
                 argv[2] = "--";
751739
                 argv[3] = pwent->pw_name;
751739
                 argv[4] = NULL;
751739
         }
751739
 
751739
         if (!spawn_with_login_uid (context, argv, &error)) {
751739
                 throw_error (context, ERROR_FAILED, "running '%s' failed: %s", argv[0], error->message);
751739
                 return;
751739
         }
751739
 
751739
         accounts_accounts_complete_delete_user (NULL, context);
751739
 }
751739
 
751739
 
751739
 static gboolean
751739
 daemon_delete_user (AccountsAccounts      *accounts,
751739
                     GDBusMethodInvocation *context,
751739
                     gint64                 uid,
751739
                     gboolean               remove_files)
751739
 {
751739
diff --git a/src/libaccountsservice/act-user.c b/src/libaccountsservice/act-user.c
751739
index dd8f81b..540ffe7 100644
751739
--- a/src/libaccountsservice/act-user.c
751739
+++ b/src/libaccountsservice/act-user.c
751739
@@ -849,60 +849,79 @@ act_user_collate (ActUser *user1,
751739
  *
751739
  * Returns whether or not #ActUser is currently graphically logged in
751739
  * on the same seat as the seat of the session of the calling process.
751739
  *
751739
  * Returns: %TRUE or %FALSE
751739
  */
751739
 gboolean
751739
 act_user_is_logged_in (ActUser *user)
751739
 {
751739
         return user->our_sessions != NULL;
751739
 }
751739
 
751739
 /**
751739
  * act_user_is_logged_in_anywhere:
751739
  * @user: a #ActUser
751739
  *
751739
  * Returns whether or not #ActUser is currently logged in in any way
751739
  * whatsoever.  See also act_user_is_logged_in().
751739
  *
751739
  * (Currently, this function is only implemented for systemd-logind.
751739
  * For ConsoleKit, it is equivalent to act_user_is_logged_in.)
751739
  *
751739
  * Returns: %TRUE or %FALSE
751739
  */
751739
 gboolean
751739
 act_user_is_logged_in_anywhere (ActUser *user)
751739
 {
751739
         return user->our_sessions != NULL || user->other_sessions != NULL;
751739
 }
751739
 
751739
+/**
751739
+ * act_user_get_saved:
751739
+ * @user: a #ActUser
751739
+ *
751739
+ * Returns whether or not the #ActUser account has retained state in accountsservice.
751739
+ *
751739
+ * Returns: %TRUE or %FALSE
751739
+ */
751739
+gboolean
751739
+act_user_get_saved (ActUser *user)
751739
+{
751739
+        g_return_val_if_fail (ACT_IS_USER (user), TRUE);
751739
+
751739
+        if (user->accounts_proxy == NULL)
751739
+                return FALSE;
751739
+
751739
+        return accounts_user_get_saved (user->accounts_proxy);
751739
+}
751739
+
751739
 /**
751739
  * act_user_get_locked:
751739
  * @user: a #ActUser
751739
  *
751739
  * Returns whether or not the #ActUser account is locked.
751739
  *
751739
  * Returns: %TRUE or %FALSE
751739
  */
751739
 gboolean
751739
 act_user_get_locked (ActUser *user)
751739
 {
751739
         g_return_val_if_fail (ACT_IS_USER (user), TRUE);
751739
 
751739
         if (user->accounts_proxy == NULL)
751739
                 return TRUE;
751739
 
751739
         return accounts_user_get_locked (user->accounts_proxy);
751739
 }
751739
 
751739
 /**
751739
  * act_user_get_automatic_login:
751739
  * @user: a #ActUser
751739
  *
751739
  * Returns whether or not #ActUser is automatically logged in at boot time.
751739
  *
751739
  * Returns: %TRUE or %FALSE
751739
  */
751739
 gboolean
751739
 act_user_get_automatic_login (ActUser *user)
751739
 {
751739
diff --git a/src/libaccountsservice/act-user.h b/src/libaccountsservice/act-user.h
751739
index 2ef13b1..34d7fe3 100644
751739
--- a/src/libaccountsservice/act-user.h
751739
+++ b/src/libaccountsservice/act-user.h
751739
@@ -43,60 +43,61 @@ typedef enum {
751739
 typedef enum {
751739
         ACT_USER_PASSWORD_MODE_REGULAR,
751739
         ACT_USER_PASSWORD_MODE_SET_AT_LOGIN,
751739
         ACT_USER_PASSWORD_MODE_NONE,
751739
 } ActUserPasswordMode;
751739
 
751739
 typedef struct _ActUser ActUser;
751739
 typedef struct _ActUserClass ActUserClass;
751739
 
751739
 GType          act_user_get_type                  (void) G_GNUC_CONST;
751739
 
751739
 const char    *act_user_get_object_path           (ActUser *user);
751739
 
751739
 uid_t          act_user_get_uid                   (ActUser   *user);
751739
 const char    *act_user_get_user_name             (ActUser   *user);
751739
 const char    *act_user_get_real_name             (ActUser   *user);
751739
 ActUserAccountType act_user_get_account_type      (ActUser   *user);
751739
 ActUserPasswordMode act_user_get_password_mode    (ActUser   *user);
751739
 const char    *act_user_get_password_hint         (ActUser   *user);
751739
 const char    *act_user_get_home_dir              (ActUser   *user);
751739
 const char    *act_user_get_shell                 (ActUser   *user);
751739
 const char    *act_user_get_email                 (ActUser   *user);
751739
 const char    *act_user_get_location              (ActUser   *user);
751739
 guint          act_user_get_num_sessions          (ActUser   *user);
751739
 guint          act_user_get_num_sessions_anywhere (ActUser   *user);
751739
 gboolean       act_user_is_logged_in              (ActUser   *user);
751739
 gboolean       act_user_is_logged_in_anywhere     (ActUser   *user);
751739
 int            act_user_get_login_frequency       (ActUser   *user);
751739
 gint64         act_user_get_login_time            (ActUser   *user);
751739
 const GVariant*act_user_get_login_history         (ActUser   *user);
751739
+gboolean       act_user_get_saved                 (ActUser   *user);
751739
 gboolean       act_user_get_locked                (ActUser   *user);
751739
 gboolean       act_user_get_automatic_login       (ActUser   *user);
751739
 gboolean       act_user_is_system_account         (ActUser   *user);
751739
 gboolean       act_user_is_local_account          (ActUser   *user);
751739
 gboolean       act_user_is_nonexistent            (ActUser   *user);
751739
 const char    *act_user_get_icon_file             (ActUser   *user);
751739
 const char    *act_user_get_language              (ActUser   *user);
751739
 const char    *act_user_get_x_session             (ActUser   *user);
751739
 const char    *act_user_get_session               (ActUser   *user);
751739
 const char    *act_user_get_session_type          (ActUser   *user);
751739
 const char    *act_user_get_primary_session_id    (ActUser   *user);
751739
 
751739
 gint           act_user_collate                   (ActUser   *user1,
751739
                                                    ActUser   *user2);
751739
 gboolean       act_user_is_loaded                 (ActUser   *user);
751739
 
751739
 void           act_user_get_password_expiration_policy (ActUser   *user,
751739
                                                         gint64    *expiration_time,
751739
                                                         gint64    *last_change_time,
751739
                                                         gint64    *min_days_between_changes,
751739
                                                         gint64    *max_days_between_changes,
751739
                                                         gint64    *days_to_warn,
751739
                                                         gint64    *days_after_expiration_until_lock);
751739
 
751739
 void           act_user_set_email                 (ActUser    *user,
751739
                                                    const char *email);
751739
 void           act_user_set_language              (ActUser    *user,
751739
                                                    const char *language);
751739
 void           act_user_set_x_session             (ActUser    *user,
751739
                                                    const char *x_session);
751739
diff --git a/src/user.c b/src/user.c
751739
index 94c0244..93afadc 100644
751739
--- a/src/user.c
751739
+++ b/src/user.c
751739
@@ -284,60 +284,61 @@ user_update_from_keyfile (User     *user,
751739
         }
751739
 
751739
         s = g_key_file_get_string (keyfile, "User", "Location", NULL);
751739
         if (s != NULL) {
751739
                 accounts_user_set_location (ACCOUNTS_USER (user), s);
751739
                 g_clear_pointer (&s, g_free);
751739
         }
751739
 
751739
         s = g_key_file_get_string (keyfile, "User", "PasswordHint", NULL);
751739
         if (s != NULL) {
751739
                 accounts_user_set_password_hint (ACCOUNTS_USER (user), s);
751739
                 g_clear_pointer (&s, g_free);
751739
         }
751739
 
751739
         s = g_key_file_get_string (keyfile, "User", "Icon", NULL);
751739
         if (s != NULL) {
751739
                 accounts_user_set_icon_file (ACCOUNTS_USER (user), s);
751739
                 g_clear_pointer (&s, g_free);
751739
         }
751739
 
751739
         if (g_key_file_has_key (keyfile, "User", "SystemAccount", NULL)) {
751739
             gboolean system_account;
751739
 
751739
             system_account = g_key_file_get_boolean (keyfile, "User", "SystemAccount", NULL);
751739
             accounts_user_set_system_account (ACCOUNTS_USER (user), system_account);
751739
         }
751739
 
751739
         g_clear_pointer (&user->keyfile, g_key_file_unref);
751739
         user->keyfile = g_key_file_ref (keyfile);
751739
         user_set_cached (user, TRUE);
751739
+        user_set_saved (user, TRUE);
751739
 
751739
         g_object_thaw_notify (G_OBJECT (user));
751739
 }
751739
 
751739
 void
751739
 user_update_local_account_property (User          *user,
751739
                                     gboolean       local)
751739
 {
751739
         accounts_user_set_local_account (ACCOUNTS_USER (user), local);
751739
 }
751739
 
751739
 void
751739
 user_update_system_account_property (User          *user,
751739
                                      gboolean       system)
751739
 {
751739
         accounts_user_set_system_account (ACCOUNTS_USER (user), system);
751739
 }
751739
 
751739
 static void
751739
 user_save_to_keyfile (User     *user,
751739
                       GKeyFile *keyfile)
751739
 {
751739
         g_key_file_remove_group (keyfile, "User", NULL);
751739
 
751739
         if (accounts_user_get_email (ACCOUNTS_USER (user)))
751739
                 g_key_file_set_string (keyfile, "User", "Email", accounts_user_get_email (ACCOUNTS_USER (user)));
751739
 
751739
         if (accounts_user_get_language (ACCOUNTS_USER (user)))
751739
                 g_key_file_set_string (keyfile, "User", "Language", accounts_user_get_language (ACCOUNTS_USER (user)));
751739
 
751739
@@ -357,60 +358,62 @@ user_save_to_keyfile (User     *user,
751739
                 g_key_file_set_string (keyfile, "User", "PasswordHint", accounts_user_get_password_hint (ACCOUNTS_USER (user)));
751739
 
751739
         if (accounts_user_get_icon_file (ACCOUNTS_USER (user)))
751739
                 g_key_file_set_string (keyfile, "User", "Icon", accounts_user_get_icon_file (ACCOUNTS_USER (user)));
751739
 
751739
         g_key_file_set_boolean (keyfile, "User", "SystemAccount", accounts_user_get_system_account (ACCOUNTS_USER (user)));
751739
 
751739
         user_set_cached (user, TRUE);
751739
 }
751739
 
751739
 static void
751739
 save_extra_data (User *user)
751739
 {
751739
         g_autofree gchar *data = NULL;
751739
         g_autofree gchar *filename = NULL;
751739
         g_autoptr(GError) error = NULL;
751739
 
751739
         user_save_to_keyfile (user, user->keyfile);
751739
 
751739
         data = g_key_file_to_data (user->keyfile, NULL, &error);
751739
         if (data == NULL) {
751739
                 g_warning ("Saving data for user %s failed: %s",
751739
                            accounts_user_get_user_name (ACCOUNTS_USER (user)), error->message);
751739
                 return;
751739
         }
751739
 
751739
         filename = g_build_filename (USERDIR,
751739
                                      accounts_user_get_user_name (ACCOUNTS_USER (user)),
751739
                                      NULL);
751739
         g_file_set_contents (filename, data, -1, &error);
751739
+
751739
+        user_set_saved (user, TRUE);
751739
 }
751739
 
751739
 static void
751739
 move_extra_data (const gchar *old_name,
751739
                  const gchar *new_name)
751739
 {
751739
         g_autofree gchar *old_filename = NULL;
751739
         g_autofree gchar *new_filename = NULL;
751739
 
751739
         old_filename = g_build_filename (USERDIR,
751739
                                          old_name, NULL);
751739
         new_filename = g_build_filename (USERDIR,
751739
                                          new_name, NULL);
751739
 
751739
         g_rename (old_filename, new_filename);
751739
 }
751739
 
751739
 static GVariant *
751739
 user_extension_get_value (User                    *user,
751739
                           GDBusInterfaceInfo      *interface,
751739
                           const GDBusPropertyInfo *property)
751739
 {
751739
         const GVariantType *type = G_VARIANT_TYPE (property->signature);
751739
         GVariant *value;
751739
         g_autofree gchar *printed = NULL;
751739
         gint i;
751739
 
751739
         /* First, try to get the value from the keyfile */
751739
         printed = g_key_file_get_value (user->keyfile, interface->name, property->name, NULL);
751739
         if (printed) {
751739
@@ -773,60 +776,67 @@ const gchar *
751739
 user_get_object_path (User *user)
751739
 {
751739
         return g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (user));
751739
 }
751739
 
751739
 uid_t
751739
 user_get_uid (User *user)
751739
 {
751739
         return accounts_user_get_uid (ACCOUNTS_USER (user));
751739
 }
751739
 
751739
 const gchar *
751739
 user_get_shell(User *user)
751739
 {
751739
 	return accounts_user_get_shell (ACCOUNTS_USER (user));
751739
 }
751739
 
751739
 gboolean
751739
 user_get_cached (User *user)
751739
 {
751739
         return user->cached;
751739
 }
751739
 
751739
 void
751739
 user_set_cached (User     *user,
751739
                  gboolean  cached)
751739
 {
751739
         user->cached = cached;
751739
 }
751739
 
751739
+void
751739
+user_set_saved (User     *user,
751739
+                gboolean  saved)
751739
+{
751739
+        accounts_user_set_saved (ACCOUNTS_USER (user), saved);
751739
+}
751739
+
751739
 static void
751739
 throw_error (GDBusMethodInvocation *context,
751739
              gint                   error_code,
751739
              const gchar           *format,
751739
              ...)
751739
 {
751739
         va_list args;
751739
         g_autofree gchar *message = NULL;
751739
 
751739
         va_start (args, format);
751739
         message = g_strdup_vprintf (format, args);
751739
         va_end (args);
751739
 
751739
         g_dbus_method_invocation_return_error (context, ERROR, error_code, "%s", message);
751739
 }
751739
 
751739
 static void
751739
 user_change_real_name_authorized_cb (Daemon                *daemon,
751739
                                      User                  *user,
751739
                                      GDBusMethodInvocation *context,
751739
                                      gpointer               data)
751739
 
751739
 {
751739
         gchar *name = data;
751739
         g_autoptr(GError) error = NULL;
751739
         const gchar *argv[6];
751739
 
751739
         if (g_strcmp0 (accounts_user_get_real_name (ACCOUNTS_USER (user)), name) != 0) {
751739
                 sys_log (context,
751739
                          "change real name of user '%s' (%d) to '%s'",
751739
diff --git a/src/user.h b/src/user.h
751739
index 39c6f13..b3b3380 100644
751739
--- a/src/user.h
751739
+++ b/src/user.h
751739
@@ -39,47 +39,49 @@ typedef enum {
751739
         ACCOUNT_TYPE_STANDARD,
751739
         ACCOUNT_TYPE_ADMINISTRATOR,
751739
 #define ACCOUNT_TYPE_LAST ACCOUNT_TYPE_ADMINISTRATOR
751739
 } AccountType;
751739
 
751739
 typedef enum {
751739
         PASSWORD_MODE_REGULAR,
751739
         PASSWORD_MODE_SET_AT_LOGIN,
751739
         PASSWORD_MODE_NONE,
751739
 #define PASSWORD_MODE_LAST PASSWORD_MODE_NONE
751739
 } PasswordMode;
751739
 
751739
 /* local methods */
751739
 
751739
 GType          user_get_type                (void) G_GNUC_CONST;
751739
 User *         user_new                     (Daemon        *daemon,
751739
                                              uid_t          uid);
751739
 
751739
 void           user_update_from_pwent       (User          *user,
751739
                                              struct passwd *pwent,
751739
                                              struct spwd   *spent);
751739
 void           user_update_from_keyfile     (User          *user,
751739
                                              GKeyFile      *keyfile);
751739
 void           user_update_local_account_property (User          *user,
751739
                                                    gboolean       local);
751739
 void           user_update_system_account_property (User          *user,
751739
                                                     gboolean       system);
751739
 gboolean       user_get_cached              (User          *user);
751739
 void           user_set_cached              (User          *user,
751739
                                              gboolean       cached);
751739
+void           user_set_saved               (User          *user,
751739
+                                             gboolean       saved);
751739
 
751739
 void           user_register                (User          *user);
751739
 void           user_unregister              (User          *user);
751739
 void           user_changed                 (User          *user);
751739
 
751739
 void           user_save                    (User          *user);
751739
 
751739
 const gchar *  user_get_user_name           (User          *user);
751739
 gboolean       user_get_system_account      (User          *user);
751739
 gboolean       user_get_local_account       (User          *user);
751739
 const gchar *  user_get_object_path         (User          *user);
751739
 uid_t          user_get_uid                 (User          *user);
751739
 const gchar *  user_get_shell               (User          *user);
751739
 
751739
 G_END_DECLS
751739
 
751739
 #endif
751739
-- 
751739
2.17.1
751739