From: Gunnar Wrobel Date: Thu, 9 Apr 2009 19:19:38 +0000 (+0200) Subject: Fixed the generation of server ids to use quoting. X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=4d30b2c25d61c1f105832b84fa9e2d79f1324ba5;p=horde.git Fixed the generation of server ids to use quoting. --- diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server.php b/framework/Kolab_Server/lib/Horde/Kolab/Server.php index c1ed67672..313d8c547 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server.php @@ -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); } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php index 338384cba..9e7e95e3d 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php @@ -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))); } /** diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Groupofnames.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Groupofnames.php index bd39b3951..f8d07518d 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Groupofnames.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Groupofnames.php @@ -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,"); } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Inetorgperson.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Inetorgperson.php index 23afe239d..384a87081 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Inetorgperson.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Inetorgperson.php @@ -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 diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php index f46d0d115..710c3e6f9 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php @@ -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[] = ''; } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php index 8af79306e..fa9d901bf 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php @@ -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,"); } } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabsharedfolder.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabsharedfolder.php index 803054bed..776688c80 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabsharedfolder.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabsharedfolder.php @@ -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,")); } /** diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php index 9ef6b04cc..e36c571cf 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php @@ -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]); } /** diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure.php index 54b40bac0..2756b4f93 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure.php @@ -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); } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Kolab.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Kolab.php index f2d992a10..4e364e399 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Kolab.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Kolab.php @@ -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': diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php index ed06de1bf..287a7a383 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php @@ -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]; + } }