[liboobs] Update to new groups protocol



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]