1 /* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*-
2  *
3  * Copyright (C) 2010-2011 Robert Ancell.
4  * Author: Robert Ancell <robert.ancell@canonical.com>
5  *
6  * This program is free software: you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License as published by the Free Software
8  * Foundation, either version 3 of the License, or (at your option) any later
9  * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
10  * license.
11  */
12 
13 #include <pwd.h>
14 #include <stdlib.h>
15 
16 #include "accounts.h"
17 #include "user-list.h"
18 
19 typedef struct
20 {
21     /* Internal user object */
22     CommonUser *common_user;
23 } UserPrivate;
24 
G_DEFINE_TYPE_WITH_PRIVATE(User,user,G_TYPE_OBJECT)25 G_DEFINE_TYPE_WITH_PRIVATE (User, user, G_TYPE_OBJECT)
26 
27 User *
28 accounts_get_user_by_name (const gchar *username)
29 {
30     g_return_val_if_fail (username != NULL, NULL);
31 
32     CommonUser *common_user = common_user_list_get_user_by_name (common_user_list_get_instance (), username);
33     if (common_user == NULL)
34         return NULL;
35 
36     User *user = g_object_new (USER_TYPE, NULL);
37     UserPrivate *priv = user_get_instance_private (user);
38     priv->common_user = common_user;
39     return user;
40 }
41 
42 User *
accounts_get_current_user()43 accounts_get_current_user ()
44 {
45     struct passwd *entry = getpwuid (getuid ());
46     if (entry != NULL)
47         return accounts_get_user_by_name (entry->pw_name);
48     else
49         return NULL;
50 }
51 
52 const gchar *
user_get_name(User * user)53 user_get_name (User *user)
54 {
55     UserPrivate *priv = user_get_instance_private (user);
56     g_return_val_if_fail (user != NULL, NULL);
57     return common_user_get_name (priv->common_user);
58 }
59 
60 uid_t
user_get_uid(User * user)61 user_get_uid (User *user)
62 {
63     UserPrivate *priv = user_get_instance_private (user);
64     g_return_val_if_fail (user != NULL, 0);
65     return common_user_get_uid (priv->common_user);
66 }
67 
68 gid_t
user_get_gid(User * user)69 user_get_gid (User *user)
70 {
71     UserPrivate *priv = user_get_instance_private (user);
72     g_return_val_if_fail (user != NULL, 0);
73     return common_user_get_gid (priv->common_user);
74 }
75 
76 const gchar *
user_get_home_directory(User * user)77 user_get_home_directory (User *user)
78 {
79     UserPrivate *priv = user_get_instance_private (user);
80     g_return_val_if_fail (user != NULL, NULL);
81     return common_user_get_home_directory (priv->common_user);
82 }
83 
84 const gchar *
user_get_shell(User * user)85 user_get_shell (User *user)
86 {
87     UserPrivate *priv = user_get_instance_private (user);
88     g_return_val_if_fail (user != NULL, NULL);
89     return common_user_get_shell (priv->common_user);
90 }
91 
92 void
user_set_language(User * user,const gchar * language)93 user_set_language (User *user, const gchar *language)
94 {
95     UserPrivate *priv = user_get_instance_private (user);
96     g_return_if_fail (user != NULL);
97     common_user_set_language (priv->common_user, language);
98 }
99 
100 const gchar *
user_get_language(User * user)101 user_get_language (User *user)
102 {
103     UserPrivate *priv = user_get_instance_private (user);
104     g_return_val_if_fail (user != NULL, NULL);
105     return common_user_get_language (priv->common_user);
106 }
107 
108 void
user_set_xsession(User * user,const gchar * xsession)109 user_set_xsession (User *user, const gchar *xsession)
110 {
111     UserPrivate *priv = user_get_instance_private (user);
112     g_return_if_fail (user != NULL);
113     common_user_set_session (priv->common_user, xsession);
114 }
115 
116 const gchar *
user_get_xsession(User * user)117 user_get_xsession (User *user)
118 {
119     UserPrivate *priv = user_get_instance_private (user);
120     g_return_val_if_fail (user != NULL, NULL);
121     return common_user_get_session (priv->common_user);
122 }
123 
124 static void
user_init(User * user)125 user_init (User *user)
126 {
127 }
128 
129 static void
user_finalize(GObject * object)130 user_finalize (GObject *object)
131 {
132     User *self = USER (object);
133     UserPrivate *priv = user_get_instance_private (self);
134 
135     g_clear_object (&priv->common_user);
136 
137     G_OBJECT_CLASS (user_parent_class)->finalize (object);
138 }
139 
140 static void
user_class_init(UserClass * klass)141 user_class_init (UserClass *klass)
142 {
143     GObjectClass *object_class = G_OBJECT_CLASS (klass);
144 
145     object_class->finalize = user_finalize;
146 }
147