Fixed the generation of server ids to use quoting.
authorGunnar Wrobel <p@rdus.de>
Thu, 9 Apr 2009 19:19:38 +0000 (21:19 +0200)
committerGunnar Wrobel <p@rdus.de>
Thu, 9 Apr 2009 19:19:38 +0000 (21:19 +0200)
framework/Kolab_Server/lib/Horde/Kolab/Server.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Groupofnames.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Inetorgperson.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabsharedfolder.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Structure.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Kolab.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php

index c1ed676..313d8c5 100644 (file)
@@ -250,27 +250,6 @@ abstract class Horde_Kolab_Server
     }
 
     /**
-     * Generates a unique ID for the given information.
-     *
-     * @param string $type The type of the object to create.
-     * @param array  $info Any additional information about the object to create.
-     *
-     * @return string The UID.
-     *
-     * @throws Horde_Kolab_Server_Exception
-     */
-    public function generateUid($type, $info)
-    {
-        if (!class_exists($type)) {
-            $result = Horde_Kolab_Server_Object::loadClass($type);
-        }
-
-        $id = call_user_func(array($type, 'generateId'), $info);
-
-        return $this->generateServerUid($type, $id, $info);
-    }
-
-    /**
      * Add a Kolab object.
      *
      * @param array $info The object to store.
@@ -288,13 +267,11 @@ abstract class Horde_Kolab_Server
                 'The type of a new object must be specified!');
         }
 
-        $uid = $this->generateUid($info['type'], $info);
-
-        $object = &Horde_Kolab_Server_Object::factory($info['type'], $uid, $this);
+        $object = &Horde_Kolab_Server_Object::factory($info['type'], null, $this, $info);
         if ($object->exists()) {
             throw new Horde_Kolab_Server_Exception(
                 sprintf(_("The object with the uid \"%s\" does already exist!"),
-                        $uid));
+                        $object->get(Horde_Kolab_Server_Object::ATTRIBUTE_UID)));
         }
         unset($info['type']);
         $object->save($info);
@@ -380,7 +357,7 @@ abstract class Horde_Kolab_Server
      *
      * @throws Horde_Kolab_Server_Exception
      */
-    protected function generateServerUid($type, $id, $info)
+    public function generateServerUid($type, $id, $info)
     {
         return $this->structure->generateServerUid($type, $id, $info);
     }
index 338384c..9e7e95e 100644 (file)
@@ -166,22 +166,25 @@ class Horde_Kolab_Server_Object
      * @param string             $uid     UID of the object.
      * @param array              $data    A possible array of data for the object
      */
-    public function __construct(&$server, $uid = null, $data = null)
+    public function __construct(&$server, $uid = null, $data = false)
     {
         $this->server = &$server;
         if (empty($uid)) {
-            if (empty($data) || !isset($data[self::ATTRIBUTE_UID])) {
-                throw new Horde_Kolab_Server_Exception(_('Specify either the UID or a search result!'));
-            }
-            if (is_array($data[self::ATTRIBUTE_UID])) {
-                $this->uid = $data[self::ATTRIBUTE_UID][0];
+            if (isset($data[self::ATTRIBUTE_UID])) {
+                if (is_array($data[self::ATTRIBUTE_UID])) {
+                    $this->uid = $data[self::ATTRIBUTE_UID][0];
+                } else {
+                    $this->uid = $data[self::ATTRIBUTE_UID];
+                }
             } else {
-                $this->uid = $data[self::ATTRIBUTE_UID];
+                $this->uid = $this->server->generateServerUid(get_class($this),
+                                                              $this->generateId($data),
+                                                              $data);
             }
-            $this->_cache = $data;
         } else {
             $this->uid = $uid;
         }
+        $this->_cache = $data;
 
         list($this->attributes, $this->attribute_map) = $server->getAttributes(get_class($this));
     }
@@ -503,12 +506,12 @@ class Horde_Kolab_Server_Object
      *
      * @return string The ID.
      */
-    public static function generateId($info)
+    public function generateId($info)
     {
         if (!empty($info[self::ATTRIBUTE_ID])) {
-            return $info[self::ATTRIBUTE_ID];
+            return $this->server->structure->quoteForUid($info[self::ATTRIBUTE_ID]);
         }
-        return hash('sha256', uniqid(mt_rand(), true));
+        return $this->server->structure->quoteForUid(hash('sha256', uniqid(mt_rand(), true)));
     }
 
     /**
index bd39b39..f8d0751 100644 (file)
@@ -79,7 +79,7 @@ class Horde_Kolab_Server_Object_Groupofnames extends Horde_Kolab_Server_Object
      *
      * @return string|PEAR_Error The ID.
      */
-    public static function generateId($info)
+    public function generateId($info)
     {
         return trim(self::ATTRIBUTE_CN . '=' . $info[self::ATTRIBUTE_CN], " \t\n\r\0\x0B,");
     }
index 23afe23..384a870 100644 (file)
@@ -150,7 +150,7 @@ class Horde_Kolab_Server_Object_Inetorgperson extends Horde_Kolab_Server_Object_
      *
      * @return string|PEAR_Error The ID.
      */
-    public static function generateId($info)
+    public function generateId($info)
     {
         $id_mapfields = array(self::ATTRIBUTE_GIVENNAME,
                               self::ATTRIBUTE_SN);
@@ -159,7 +159,7 @@ class Horde_Kolab_Server_Object_Inetorgperson extends Horde_Kolab_Server_Object_
         $fieldarray = array();
         foreach ($id_mapfields as $mapfield) {
             if (isset($info[$mapfield])) {
-                $fieldarray[] = $info[$mapfield];
+                $fieldarray[] = $this->server->structure->quoteForUid($info[$mapfield]);
             } else {
                 $fieldarray[] = '';
             }
@@ -167,4 +167,5 @@ class Horde_Kolab_Server_Object_Inetorgperson extends Horde_Kolab_Server_Object_
 
         return trim(vsprintf($id_format, $fieldarray), " \t\n\r\0\x0B,");
     }
+
 }
\ No newline at end of file
index f46d0d1..710c3e6 100644 (file)
@@ -229,7 +229,7 @@ class Horde_Kolab_Server_Object_Kolab_User extends Horde_Kolab_Server_Object_Kol
      *
      * @return string|PEAR_Error The ID.
      */
-    public static function generateId($info)
+    public function generateId($info)
     {
         global $conf;
 
@@ -251,7 +251,7 @@ class Horde_Kolab_Server_Object_Kolab_User extends Horde_Kolab_Server_Object_Kol
         $fieldarray = array();
         foreach ($id_mapfields as $mapfield) {
             if (isset($info[$mapfield])) {
-                $fieldarray[] = $info[$mapfield];
+                $fieldarray[] = $this->server->structure->quoteForUid($info[$mapfield]);
             } else {
                 $fieldarray[] = '';
             }
index 8af7930..fa9d901 100644 (file)
@@ -100,12 +100,12 @@ class Horde_Kolab_Server_Object_Kolabgroupofnames extends Horde_Kolab_Server_Obj
      *
      * @return string|PEAR_Error The ID.
      */
-    public static function generateId($info)
+    public function generateId($info)
     {
         if (isset($info[self::ATTRIBUTE_MAIL])) {
-            return trim(self::ATTRIBUTE_CN . '=' . $info[self::ATTRIBUTE_MAIL], " \t\n\r\0\x0B,");
+            return self::ATTRIBUTE_CN . '=' . $this->server->structure->quoteForUid(trim($info[self::ATTRIBUTE_MAIL]), " \t\n\r\0\x0B,");
         } else {
-            return trim(self::ATTRIBUTE_CN . '=' . $info[self::ATTRIBUTE_CN], " \t\n\r\0\x0B,");
+            return self::ATTRIBUTE_CN . '=' . $this->server->structure->quoteForUid(trim($info[self::ATTRIBUTE_CN]), " \t\n\r\0\x0B,");
         }
     }
 
index 803054b..776688c 100644 (file)
@@ -79,9 +79,9 @@ class Horde_Kolab_Server_Object_Kolabsharedfolder extends Horde_Kolab_Server_Obj
      *
      * @return string|PEAR_Error The ID.
      */
-    public static function generateId($info)
+    public function generateId($info)
     {
-        return trim(self::ATTRIBUTE_CN . '=' . $info['cn'], " \t\n\r\0\x0B,");
+        return self::ATTRIBUTE_CN . '=' . $this->server->structure->quoteForUid(trim($info['cn'], " \t\n\r\0\x0B,"));
     }
 
     /**
index 9ef6b04..e36c571 100644 (file)
@@ -190,12 +190,12 @@ class Horde_Kolab_Server_Object_Person extends Horde_Kolab_Server_Object
      *
      * @return string The ID.
      */
-    public static function generateId($info)
+    public function generateId($info)
     {
         if (!empty($info[self::ATTRIBUTE_CN])) {
-            return self::ATTRIBUTE_CN . '=' . $info[self::ATTRIBUTE_CN];
+            return self::ATTRIBUTE_CN . '=' . $this->server->structure->quoteForUid($info[self::ATTRIBUTE_CN]);
         }
-        return self::ATTRIBUTE_CN . '=' . $info[self::ATTRIBUTE_SN];
+        return self::ATTRIBUTE_CN . '=' . $this->server->structure->quoteForUid($info[self::ATTRIBUTE_SN]);
     }
 
     /**
index 54b40ba..2756b4f 100644 (file)
@@ -116,4 +116,22 @@ abstract class Horde_Kolab_Server_Structure
      * @throws Horde_Kolab_Server_Exception If the given type is unknown.
      */
     abstract public function generateServerUid($type, $id, $info);
+
+    /**
+     * Quote an UID part.
+     *
+     * @param string $id   The UID part.
+     *
+     * @return string The quoted part.
+     */
+    abstract public function quoteForUid($id);
+
+    /**
+     * Quote an filter part.
+     *
+     * @param string $part   The filter part.
+     *
+     * @return string The quoted part.
+     */
+    abstract public function quoteForFilter($part);
 }
index f2d992a..4e364e3 100644 (file)
@@ -120,22 +120,32 @@ class Horde_Kolab_Server_Structure_Kolab extends Horde_Kolab_Server_Structure_Ld
             if (empty($info['user_type'])) {
                 return parent::generateServerUid($type, $id, $info);
             } else if ($info['user_type'] == Horde_Kolab_Server_Object_Kolab_User::USERTYPE_INTERNAL) {
-                return sprintf('%s,cn=internal,%s', $id, $this->server->getBaseUid());
+                return parent::generateServerUid($type,
+                                                 sprintf('%s,cn=internal', $id),
+                                                 $info);
             } else if ($info['user_type'] == Horde_Kolab_Server_Object_Kolab_User::USERTYPE_GROUP) {
-                return sprintf('%s,cn=groups,%s', $id, $this->server->getBaseUid());
+                return parent::generateServerUid($type,
+                                                 sprintf('%s,cn=groups', $id),
+                                                 $info);
             } else if ($info['user_type'] == Horde_Kolab_Server_Object_Kolab_User::USERTYPE_RESOURCE) {
-                return sprintf('%s,cn=resources,%s', $id, $this->server->getBaseUid());
+                return parent::generateServerUid($type,
+                                                 sprintf('%s,cn=resources', $id),
+                                                 $info);
             } else {
                 return parent::generateServerUid($type, $id, $info);
             }
         case 'Horde_Kolab_Server_Object_Kolab_Address':
-            return sprintf('%s,cn=external,%s', $id, $this->server->getBaseUid());
+            return parent::generateServerUid($type,
+                                             sprintf('%s,cn=external', $id),
+                                             $info);
         case 'Horde_Kolab_Server_Object_Kolabgroupofnames':
         case 'Horde_Kolab_Server_Object_Kolab_Distlist':
             if (!isset($info['visible']) || !empty($info['visible'])) {
                 return parent::generateServerUid($type, $id, $info);
             } else {
-                return sprintf('%s,cn=internal,%s', $id, $this->server->getBaseUid());
+                return parent::generateServerUid($type,
+                                                 sprintf('%s,cn=internal', $id),
+                                                 $info);
             }
         case 'Horde_Kolab_Server_Object_Kolabsharedfolder':
         case 'Horde_Kolab_Server_Object_Kolab_Administrator':
index ed06de1..287a7a3 100644 (file)
@@ -83,4 +83,34 @@ class Horde_Kolab_Server_Structure_Ldap extends Horde_Kolab_Server_Structure
     {
         return sprintf('%s,%s', $id, $this->server->getBaseUid());
     }
+
+    /**
+     * Quote an UID part.
+     *
+     * @param string $id   The UID part.
+     *
+     * @return string The UID part.
+     */
+    public function quoteForUid($id)
+    {
+        require_once 'Net/LDAP2/Util.php';
+
+        $id = Net_LDAP2_Util::escape_dn_value($id);
+        return $id[0];
+    }
+
+    /**
+     * Quote an filter part.
+     *
+     * @param string $part   The filter part.
+     *
+     * @return string The quoted part.
+     */
+    public function quoteForFilter($part)
+    {
+        require_once 'Net/LDAP2/Util.php';
+
+        $part = Net_LDAP2_Util::escape_filter_value($part);
+        return $part[0];
+    }
 }