[liboobs] Update to new groups protocol
- From: Milan Bouchet-Valat <milanbv src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [liboobs] Update to new groups protocol
- Date: Mon, 11 Jan 2010 16:39:05 +0000 (UTC)
commit db45ae5f1bfde704de7a2eb033da0ae7179e374b
Author: Milan Bouchet-Valat <nalimilan club fr>
Date: Sun Dec 27 16:35:10 2009 +0100
Update to new groups protocol
New SystemToolsBackends protocol since the 2.9 series. Groups can now be added and deleted individually via methods oobs_groups_config_add/delete_group(). OobsGroup is now an OobsObject implementing commit(), only working on existing groups, and add()/delete(), which are called by previously cited GroupsConfig convenience methods. oobs_groups_config_commit() still commits all groups to the system, but only for existing ones. This prevents bugs from destroying the system.
New fields in the D-Bus protocol have their accessors and variables too.
oobs/oobs-group.c | 169 ++++++++++++++++++++++++++------------------
oobs/oobs-group.h | 5 +-
oobs/oobs-groupsconfig.c | 175 +++++++++++++++++++++++++++-------------------
oobs/oobs-groupsconfig.h | 5 ++
4 files changed, 209 insertions(+), 145 deletions(-)
---
diff --git a/oobs/oobs-group.c b/oobs/oobs-group.c
index ceef8ce..2a4d6c4 100644
--- a/oobs/oobs-group.c
+++ b/oobs/oobs-group.c
@@ -15,20 +15,24 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
- * Authors: Carlos Garnacho Parro <carlosg gnome org>
+ * Authors: Carlos Garnacho Parro <carlosg gnome org>,
+ * Milan Bouchet-Valat <nalimilan club fr>.
*/
+#include <string.h>
#include <glib-object.h>
+#include <dbus/dbus.h>
+
+#include "oobs-object-private.h"
#include "oobs-session.h"
#include "oobs-group.h"
+#include "oobs-group-private.h"
#include "oobs-user.h"
#include "oobs-session.h"
#include "oobs-groupsconfig.h"
#include "oobs-usersconfig.h"
#include "oobs-defines.h"
#include "utils.h"
-#include <crypt.h>
-#include <string.h>
/**
* SECTION:oobs-group
@@ -37,6 +41,7 @@
* @see_also: #OobsGroupsConfig
**/
+#define GROUP_REMOTE_OBJECT "GroupConfig2"
#define OOBS_GROUP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), OOBS_TYPE_GROUP, OobsGroupPrivate))
typedef struct _OobsGroupPrivate OobsGroupPrivate;
@@ -49,8 +54,6 @@ struct _OobsGroupPrivate {
gid_t gid;
GList *users;
-
- gboolean use_md5;
};
static void oobs_group_class_init (OobsGroupClass *class);
@@ -66,25 +69,34 @@ static void oobs_group_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
+static void oobs_group_commit (OobsObject *object);
+
+static GList* get_users_list (OobsGroup *group);
+
enum {
PROP_0,
PROP_GROUPNAME,
PROP_PASSWORD,
- PROP_CRYPTED_PASSWORD,
PROP_GID,
};
-G_DEFINE_TYPE (OobsGroup, oobs_group, G_TYPE_OBJECT);
+G_DEFINE_TYPE (OobsGroup, oobs_group, OOBS_TYPE_OBJECT);
static void
oobs_group_class_init (OobsGroupClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
+ OobsObjectClass *oobs_class = OOBS_OBJECT_CLASS (class);
object_class->set_property = oobs_group_set_property;
object_class->get_property = oobs_group_get_property;
object_class->finalize = oobs_group_finalize;
+ oobs_class->commit = oobs_group_commit;
+
+ /* override the singleton check */
+ oobs_class->singleton = FALSE;
+
g_object_class_install_property (object_class,
PROP_GROUPNAME,
g_param_spec_string ("name",
@@ -98,21 +110,14 @@ oobs_group_class_init (OobsGroupClass *class)
"Password",
"Password for the group",
NULL,
- G_PARAM_WRITABLE));
- g_object_class_install_property (object_class,
- PROP_CRYPTED_PASSWORD,
- g_param_spec_string ("crypted-password",
- "Crypted password",
- "Crypted password for the group",
- NULL,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_GID,
- g_param_spec_int ("gid",
- "GID",
- "Main group GID for the group",
- 0, OOBS_MAX_GID, OOBS_MAX_GID,
- G_PARAM_READWRITE));
+ g_param_spec_uint ("gid",
+ "GID",
+ "Main group GID for the group",
+ 0, OOBS_MAX_GID, OOBS_MAX_GID,
+ G_PARAM_READWRITE));
g_type_class_add_private (object_class,
sizeof (OobsGroupPrivate));
}
@@ -121,7 +126,6 @@ static void
oobs_group_init (OobsGroup *group)
{
OobsGroupPrivate *priv;
- OobsObject *users_config;
g_return_if_fail (OOBS_IS_GROUP (group));
@@ -131,8 +135,6 @@ oobs_group_init (OobsGroup *group)
priv->password = NULL;
priv->users = NULL;
- users_config = oobs_users_config_get ();
- g_object_get (users_config, "use-md5", &priv->use_md5, NULL);
group->_priv = priv;
}
@@ -144,7 +146,6 @@ oobs_group_set_property (GObject *object,
{
OobsGroup *group;
OobsGroupPrivate *priv;
- gchar *salt, *str;
g_return_if_fail (OOBS_IS_GROUP (object));
@@ -157,31 +158,13 @@ oobs_group_set_property (GObject *object,
g_free (priv->groupname);
priv->groupname = g_value_dup_string (value);
break;
- case PROP_PASSWORD:
- g_free (priv->password);
-
- if (priv->use_md5)
- {
- salt = utils_get_random_string (5);
- str = g_strdup_printf ("$1$%s", salt);
- priv->password = g_strdup (crypt (g_value_get_string (value), str));
-
- g_free (str);
- }
- else
- {
- salt = utils_get_random_string (2);
- priv->password = g_strdup (crypt (g_value_get_string (value), salt));
- }
-
- g_free (salt);
break;
- case PROP_CRYPTED_PASSWORD:
+ case PROP_PASSWORD:
g_free (priv->password);
priv->password = g_value_dup_string (value);
break;
case PROP_GID:
- priv->gid = g_value_get_int (value);
+ priv->gid = g_value_get_uint (value);
break;
}
}
@@ -205,11 +188,11 @@ oobs_group_get_property (GObject *object,
case PROP_GROUPNAME:
g_value_set_string (value, priv->groupname);
break;
- case PROP_CRYPTED_PASSWORD:
+ case PROP_PASSWORD:
g_value_set_string (value, priv->password);
break;
case PROP_GID:
- g_value_set_int (value, priv->gid);
+ g_value_set_uint (value, priv->gid);
break;
}
}
@@ -238,6 +221,70 @@ oobs_group_finalize (GObject *object)
(* G_OBJECT_CLASS (oobs_group_parent_class)->finalize) (object);
}
+static GList*
+get_users_list (OobsGroup *group)
+{
+ GList *users, *elem, *usernames = NULL;
+ OobsUser *user;
+
+ users = elem = oobs_group_get_users (group);
+
+ while (elem)
+ {
+ user = elem->data;
+ usernames = g_list_prepend (usernames, (gpointer) oobs_user_get_login_name (user));
+
+ elem = elem->next;
+ }
+
+ g_list_free (users);
+ return usernames;
+}
+
+void
+_oobs_create_dbus_struct_from_group (OobsGroup *group,
+ DBusMessage *message,
+ DBusMessageIter *array_iter)
+{
+ DBusMessageIter struct_iter;
+ guint32 gid;
+ gchar *groupname, *passwd;
+ GList *users;
+
+ g_object_get (group,
+ "name", &groupname,
+ "password", &passwd,
+ "gid", &gid,
+ NULL);
+
+ users = get_users_list (OOBS_GROUP (group));
+
+ dbus_message_iter_open_container (array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter);
+
+ utils_append_string (&struct_iter, groupname);
+ utils_append_string (&struct_iter, passwd);
+ utils_append_uint (&struct_iter, gid);
+
+ utils_create_dbus_array_from_string_list (users, message, &struct_iter);
+
+ dbus_message_iter_close_container (array_iter, &struct_iter);
+
+ g_list_free (users);
+ g_free (groupname);
+ g_free (passwd);
+}
+
+static void
+oobs_group_commit (OobsObject *object)
+{
+ DBusMessage *message;
+ DBusMessageIter iter;
+
+ message = _oobs_object_get_dbus_message (object);
+ dbus_message_iter_init_append (message, &iter);
+ _oobs_create_dbus_struct_from_group (OOBS_GROUP (object), message, &iter);
+}
+
/**
* oobs_group_new:
* @name: group name.
@@ -253,6 +300,7 @@ oobs_group_new (const gchar *name)
return g_object_new (OOBS_TYPE_GROUP,
"name", name,
+ "remote-object", GROUP_REMOTE_OBJECT,
NULL);
}
@@ -260,7 +308,7 @@ oobs_group_new (const gchar *name)
* oobs_group_get_name:
* @group: An #OobsGroup.
*
- * Returns the name of the group represented by #OobsGroup.
+ * Returns the name of the group represented by @group.
*
* Return Value: A pointer to the group name as a string.
* This string must not be freed, modified or stored.
@@ -279,38 +327,21 @@ oobs_group_get_name (OobsGroup *group)
}
/**
- * oobs_group_set_password:
+ * oobs_group_set__password:
* @group: An #OobsGroup.
- * @password: A new password for #group.
+ * @crypted_password: a new password for @group.
*
- * Sets the group password for the group defined
- * by #OobsGroup, overwriting the previous one.
- **/
-void
-oobs_group_set_password (OobsGroup *group, const gchar *password)
-{
- g_return_if_fail (group != NULL);
- g_return_if_fail (OOBS_IS_GROUP (group));
-
- g_object_set (G_OBJECT (group), "password", password, NULL);
-}
-
-/**
- * oobs_group_set_crypted_password:
- * @group: An #OobsGroup.
- * @crypted_password: a new crypted password for #group.
- *
- * Sets an already crypted password for the group
+ * Sets clear text password for the group
* defined by #OobsGroup, overwriting the previous one.
**/
void
-oobs_group_set_crypted_password (OobsGroup *group,
- const gchar *crypted_password)
+oobs_group_set_password (OobsGroup *group,
+ const gchar *password)
{
g_return_if_fail (group != NULL);
g_return_if_fail (OOBS_IS_GROUP (group));
- g_object_set (G_OBJECT (group), "crypted-password", crypted_password, NULL);
+ g_object_set (G_OBJECT (group), "password", password, NULL);
}
/**
diff --git a/oobs/oobs-group.h b/oobs/oobs-group.h
index 46a8d90..e41ca9f 100644
--- a/oobs/oobs-group.h
+++ b/oobs/oobs-group.h
@@ -38,14 +38,14 @@ typedef struct _OobsGroupClass OobsGroupClass;
#include "oobs-user.h"
struct _OobsGroup {
- GObject parent;
+ OobsObject parent;
/*<private>*/
gpointer _priv;
};
struct _OobsGroupClass {
- GObjectClass parent_class;
+ OobsObjectClass parent_class;
void (*_oobs_padding1) (void);
void (*_oobs_padding2) (void);
@@ -58,7 +58,6 @@ OobsGroup* oobs_group_new (const gchar *name);
G_CONST_RETURN gchar* oobs_group_get_name (OobsGroup *group);
void oobs_group_set_password (OobsGroup *group, const gchar *password);
-void oobs_group_set_crypted_password (OobsGroup *group, const gchar *crypted_password);
gid_t oobs_group_get_gid (OobsGroup *group);
void oobs_group_set_gid (OobsGroup *group, gid_t gid);
diff --git a/oobs/oobs-groupsconfig.c b/oobs/oobs-groupsconfig.c
index 032b36d..3fc61de 100644
--- a/oobs/oobs-groupsconfig.c
+++ b/oobs/oobs-groupsconfig.c
@@ -30,6 +30,7 @@
#include "oobs-groupsconfig.h"
#include "oobs-usersconfig.h"
#include "oobs-group.h"
+#include "oobs-group-private.h"
#include "oobs-defines.h"
#include "utils.h"
@@ -40,7 +41,7 @@
* @see_also: #OobsGroup
**/
-#define GROUPS_CONFIG_REMOTE_OBJECT "GroupsConfig"
+#define GROUPS_CONFIG_REMOTE_OBJECT "GroupsConfig2"
#define OOBS_GROUPS_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), OOBS_TYPE_GROUPS_CONFIG, OobsGroupsConfigPrivate))
typedef struct _OobsGroupsConfigPrivate OobsGroupsConfigPrivate;
@@ -221,7 +222,7 @@ create_group_from_dbus_reply (OobsObject *object,
{
OobsGroupsConfigPrivate *priv;
DBusMessageIter iter;
- int gid;
+ guint32 gid;
const gchar *groupname, *passwd;
GList *users;
OobsGroup *group;
@@ -231,15 +232,15 @@ create_group_from_dbus_reply (OobsObject *object,
groupname = utils_get_string (&iter);
passwd = utils_get_string (&iter);
- gid = utils_get_int (&iter);
+ gid = utils_get_uint (&iter);
users = utils_get_string_list_from_dbus_reply (reply, &iter);
- group = g_object_new (OOBS_TYPE_GROUP,
- "name", groupname,
- "crypted-password", passwd,
- "gid", gid,
- NULL);
+ group = oobs_group_new (groupname);
+ g_object_set (G_OBJECT (group),
+ "password", passwd,
+ "gid", gid,
+ NULL);
/* put the users list in the hashtable, will be used each time
* the users config has changed, in order to get references to
@@ -252,59 +253,6 @@ create_group_from_dbus_reply (OobsObject *object,
return OOBS_GROUP (group);
}
-static GList*
-get_users_list (OobsGroup *group)
-{
- GList *users, *elem, *usernames = NULL;
- OobsUser *user;
-
- users = elem = oobs_group_get_users (group);
-
- while (elem)
- {
- user = elem->data;
- usernames = g_list_prepend (usernames, (gpointer) oobs_user_get_login_name (user));
-
- elem = elem->next;
- }
-
- g_list_free (users);
- return usernames;
-}
-
-static void
-create_dbus_struct_from_group (GObject *group,
- DBusMessage *message,
- DBusMessageIter *array_iter)
-{
- DBusMessageIter struct_iter;
- int gid;
- gchar *groupname, *passwd;
- GList *users;
-
- g_object_get (group,
- "name", &groupname,
- "crypted-password", &passwd,
- "gid", &gid,
- NULL);
-
- users = get_users_list (OOBS_GROUP (group));
-
- dbus_message_iter_open_container (array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter);
-
- utils_append_string (&struct_iter, groupname);
- utils_append_string (&struct_iter, passwd);
- utils_append_int (&struct_iter, gid);
-
- utils_create_dbus_array_from_string_list (users, message, &struct_iter);
-
- dbus_message_iter_close_container (array_iter, &struct_iter);
-
- g_list_free (users);
- g_free (groupname);
- g_free (passwd);
-}
-
static void
query_users_foreach (OobsGroup *group,
GList *users,
@@ -372,8 +320,8 @@ oobs_groups_config_update (OobsObject *object)
dbus_message_iter_next (&iter);
- priv->minimum_gid = utils_get_int (&iter);
- priv->maximum_gid = utils_get_int (&iter);
+ priv->minimum_gid = utils_get_uint (&iter);
+ priv->maximum_gid = utils_get_uint (&iter);
users_config = oobs_users_config_get ();
@@ -400,22 +348,22 @@ oobs_groups_config_commit (OobsObject *object)
dbus_message_iter_init_append (message, &iter);
dbus_message_iter_open_container (&iter,
- DBUS_TYPE_ARRAY,
- DBUS_STRUCT_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_STRING_AS_STRING
- DBUS_TYPE_STRING_AS_STRING
- DBUS_TYPE_INT32_AS_STRING
- DBUS_TYPE_ARRAY_AS_STRING
- DBUS_TYPE_STRING_AS_STRING
- DBUS_STRUCT_END_CHAR_AS_STRING,
- &array_iter);
+ DBUS_TYPE_ARRAY,
+ DBUS_STRUCT_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_UINT32_AS_STRING
+ DBUS_TYPE_ARRAY_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_STRUCT_END_CHAR_AS_STRING,
+ &array_iter);
valid = oobs_list_get_iter_first (priv->groups_list, &list_iter);
while (valid)
{
group = oobs_list_get (priv->groups_list, &list_iter);
- create_dbus_struct_from_group (group, message, &array_iter);
+ _oobs_create_dbus_struct_from_group (OOBS_GROUP (group), message, &array_iter);
g_object_unref (group);
valid = oobs_list_iter_next (priv->groups_list, &list_iter);
@@ -461,6 +409,87 @@ oobs_groups_config_get_groups (OobsGroupsConfig *config)
return priv->groups_list;
}
+/**
+ * oobs_groups_config_add_group:
+ * @config: An #OobsGroupsConfig.
+ * @group: An #Oobsgroup.
+ *
+ * Add a group to the configuration, immediately committing changes to the system.
+ * On success, @group will be appended to the groups list.
+ *
+ * Return value: an #OobsResult enum with the error code.
+ **/
+OobsResult
+oobs_groups_config_add_group (OobsGroupsConfig *config, OobsGroup *group)
+{
+ OobsGroupsConfigPrivate *priv;
+ OobsListIter list_iter;
+ OobsResult result;
+
+ g_return_val_if_fail (config != NULL, OOBS_RESULT_MALFORMED_DATA);
+ g_return_val_if_fail (group != NULL, OOBS_RESULT_MALFORMED_DATA);
+ g_return_val_if_fail (OOBS_IS_GROUPS_CONFIG (config), OOBS_RESULT_MALFORMED_DATA);
+ g_return_val_if_fail (OOBS_IS_GROUP (group), OOBS_RESULT_MALFORMED_DATA);
+
+ result = oobs_object_add (OOBS_OBJECT (group));
+
+ if (result != OOBS_RESULT_OK)
+ return result;
+
+ priv = config->_priv;
+
+ oobs_list_append (priv->groups_list, &list_iter);
+ oobs_list_set (priv->groups_list, &list_iter, G_OBJECT (group));
+
+ return OOBS_RESULT_OK;
+}
+
+/**
+ * oobs_groups_config_delete_group:
+ * @config: An #OobsGroupsConfig.
+ * @group: An #OobsGroup.
+ *
+ * Delete an group from the configuration, immediately committing changes to the system.
+ * On success, @group will be removed from the groups list.
+ *
+ * Return value: an #OobsResult enum with the error code.
+ **/
+OobsResult
+oobs_groups_config_delete_group (OobsGroupsConfig *config, OobsGroup *group)
+{
+ OobsGroupsConfigPrivate *priv;
+ OobsGroup *list_group;
+ OobsListIter list_iter;
+ gboolean valid;
+ OobsResult result;
+
+ g_return_val_if_fail (config != NULL, OOBS_RESULT_MALFORMED_DATA);
+ g_return_val_if_fail (group != NULL, OOBS_RESULT_MALFORMED_DATA);
+ g_return_val_if_fail (OOBS_IS_GROUPS_CONFIG (config), OOBS_RESULT_MALFORMED_DATA);
+ g_return_val_if_fail (OOBS_IS_GROUP (group), OOBS_RESULT_MALFORMED_DATA);
+
+ result = oobs_object_delete (OOBS_OBJECT (group));
+
+ if (result != OOBS_RESULT_OK)
+ return result;
+
+ priv = config->_priv;
+
+ valid = oobs_list_get_iter_first (priv->groups_list, &list_iter);
+
+ while (valid) {
+ list_group = OOBS_GROUP (oobs_list_get (priv->groups_list, &list_iter));
+
+ if (list_group == group)
+ break;
+
+ valid = oobs_list_iter_next (priv->groups_list, &list_iter);
+ }
+
+ oobs_list_remove (priv->groups_list, &list_iter);
+
+ return OOBS_RESULT_OK;
+}
/**
* oobs_groups_config_get_from_name:
diff --git a/oobs/oobs-groupsconfig.h b/oobs/oobs-groupsconfig.h
index 163bbb2..7e951e1 100644
--- a/oobs/oobs-groupsconfig.h
+++ b/oobs/oobs-groupsconfig.h
@@ -61,6 +61,11 @@ GType oobs_groups_config_get_type (void);
OobsObject* oobs_groups_config_get (void);
OobsList* oobs_groups_config_get_groups (OobsGroupsConfig *config);
+OobsResult oobs_groups_config_add_group (OobsGroupsConfig *config,
+ OobsGroup *group);
+OobsResult oobs_groups_config_delete_group (OobsGroupsConfig *config,
+ OobsGroup *group);
+
OobsGroup* oobs_groups_config_get_from_name (OobsGroupsConfig *config,
const gchar *name);
OobsGroup* oobs_groups_config_get_from_gid (OobsGroupsConfig *config,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]