From a55f7889272e65bc599d40e0b27273171f4e2da5 Mon Sep 17 00:00:00 2001 From: Gunnar Wrobel Date: Wed, 1 Apr 2009 07:21:44 +0000 Subject: [PATCH] Reorganized the object classes. Each object class can now provide searches specific to this class. Structural changes: Classes directly representing an LDAP object class should be located within the Object/ directory. Any logical Object types should be placed in separate hierarchies (Object/Kolab so far). --- .../Kolab_Server/lib/Horde/Kolab/Server/Object.php | 150 +++++++- .../Server/Object/{base.php => Inetorgperson.php} | 31 +- .../Object/{address.php => Kolab/Address.php} | 2 +- .../{administrator.php => Kolab/Administrator.php} | 2 +- .../Object/{adminrole.php => Kolab/Adminrole.php} | 25 +- .../Object/{distlist.php => Kolab/Distlist.php} | 2 +- .../Domainmaintainer.php} | 12 +- .../{maintainer.php => Kolab/Maintainer.php} | 2 +- .../Server/Object/{server.php => Kolab/Server.php} | 4 +- .../Server/Object/{user.php => Kolab/User.php} | 16 +- .../Object/{group.php => Kolabgroupofnames.php} | 124 ++++++- .../Kolab/Server/Object/Kolabinetorgperson.php | 413 +++++++++++++++++++++ .../{sharedfolder.php => Kolabsharedfolder.php} | 4 +- .../Kolab/Server/Object/Organizationalperson.php | 93 +++++ .../lib/Horde/Kolab/Server/Object/Person.php | 115 ++++++ framework/Kolab_Server/package.xml | 54 +-- 16 files changed, 949 insertions(+), 100 deletions(-) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{base.php => Inetorgperson.php} (67%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{address.php => Kolab/Address.php} (95%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{administrator.php => Kolab/Administrator.php} (94%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{adminrole.php => Kolab/Adminrole.php} (81%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{distlist.php => Kolab/Distlist.php} (92%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{domainmaintainer.php => Kolab/Domainmaintainer.php} (83%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{maintainer.php => Kolab/Maintainer.php} (91%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{server.php => Kolab/Server.php} (90%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{user.php => Kolab/User.php} (95%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{group.php => Kolabgroupofnames.php} (57%) create mode 100644 framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabinetorgperson.php rename framework/Kolab_Server/lib/Horde/Kolab/Server/Object/{sharedfolder.php => Kolabsharedfolder.php} (93%) create mode 100644 framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Organizationalperson.php create mode 100644 framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php index 9f531caa5..614a30ada 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php @@ -29,6 +29,10 @@ */ class Horde_Kolab_Server_Object { + /** Define types of return values for searches. */ + const RESULT_SINGLE = 1; + const RESULT_STRICT = 2; + const RESULT_MANY = 3; /** Define attributes specific to this object type */ @@ -49,7 +53,7 @@ class Horde_Kolab_Server_Object * * @var Kolab_Server */ - protected $db; + protected $server; /** * UID of this object on the Kolab server. @@ -112,13 +116,13 @@ class Horde_Kolab_Server_Object * Initialize the Kolab Object. Provide either the UID or a * LDAP search result. * - * @param Horde_Kolab_Server &$db The link into the Kolab db. - * @param string $uid UID of the object. - * @param array $data A possible array of data for the object + * @param Horde_Kolab_Server &$server The link into the Kolab server. + * @param string $uid UID of the object. + * @param array $data A possible array of data for the object */ - public function __construct(&$db, $uid = null, $data = null) + public function __construct(&$server, $uid = null, $data = null) { - $this->db = &$db; + $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!')); @@ -212,8 +216,8 @@ class Horde_Kolab_Server_Object */ protected function read() { - $this->_cache = $this->db->read($this->uid, - $this->supported_attributes); + $this->_cache = $this->server->read($this->uid, + $this->supported_attributes); } /** @@ -286,7 +290,7 @@ class Horde_Kolab_Server_Object switch ($attr) { case self::ATTRIBUTE_ID: return substr($this->uid, 0, - strlen($this->uid) - strlen($this->db->getBaseUid()) - 1); + strlen($this->uid) - strlen($this->server->getBaseUid()) - 1); } } @@ -355,7 +359,7 @@ class Horde_Kolab_Server_Object $info[self::ATTRIBUTE_OC] = $this->object_classes; - $result = $this->db->save($this->uid, $info); + $result = $this->server->save($this->uid, $info); if ($result === false || $result instanceOf PEAR_Error) { return $result; } @@ -364,4 +368,130 @@ class Horde_Kolab_Server_Object return $result; } + + /** + * Identify the UID(s) of the result entry(s). + * + * @param array $result The LDAP search result. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return boolean|string|array The UID(s) or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception If the number of results did not + * meet the expectations. + */ + static protected function uidFromResult($result, + $restrict = Horde_Kolab_Server::RESULT_SINGLE) + { + if (empty($result)) { + return false; + } + $uids = array_keys($result); + + switch ($restrict) { + case self::RESULT_STRICT: + if (count($uids) > 1) { + throw new Horde_Kolab_Server_Exception(sprintf(_("Found %s results when expecting only one!"), + $count)); + } + case self::RESULT_SINGLE: + return array_pop($uids); + case self::RESULT_MANY: + return $uids; + } + } + + /** + * Get the attributes of the result entry(s). + * + * @param array $result The LDAP search result. + * @param array $attrs The attributes to retrieve. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return array The attributes of the entry(s) found. + * + * @throws Horde_Kolab_Server_Exception If the number of results did not + * meet the expectations. + */ + static protected function attrsFromResult($result, $attrs, + $restrict = Horde_Kolab_Server::RESULT_SINGLE) + { + switch ($restrict) { + case self::RESULT_STRICT: + if (count($result) > 1) { + throw new Horde_Kolab_Server_Exception(sprintf(_("Found %s results when expecting only one!"), + $count)); + } + case self::RESULT_SINGLE: + if (count($result) > 0) { + return array_pop($result); + } + return array(); + case self::RESULT_MANY: + return $result; + } + return array(); + } + + /** + * Returns the set of search operations supported by this object type. + * + * @return array An array of supported search operations. + */ + static public function getSearchOperations() + { + $searches = array( + 'basicUidForSearch', + 'attrsForSearch', + ); + return $searches; + } + + /** + * Identify the UID for the first object found using the specified + * search criteria. + * + * @param array $criteria The search parameters as array. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return boolean|string|array The UID(s) or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function basicUidForSearch($server, $criteria, + $restrict = Horde_Kolab_Server::RESULT_SINGLE) + { + $params = array('attributes' => self::ATTRIBUTE_UID); + $filter = $server->searchQuery($criteria); + $result = $server->search($filter, $params, $server->getBaseUid()); + $data = $result->as_struct(); + if (is_a($data, 'PEAR_Error')) { + throw new Horde_Kolab_Server_Exception($data->getMessage()); + } + return self::uidFromResult($data, $restrict); + } + + /** + * Identify attributes for the objects found using a filter. + * + * @param array $criteria The search parameters as array. + * @param array $attrs The attributes to retrieve. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return array The results. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function attrsForSearch($server, $criteria, $attrs, + $restrict = Horde_Kolab_Server::RESULT_SINGLE) + { + $params = array('attributes' => $attrs); + $filter = $server->searchQuery($criteria); + $result = $server->search($filter, $params, $server->getBaseUid()); + $data = $result->as_struct(); + if (is_a($data, 'PEAR_Error')) { + throw new Horde_Kolab_Server_Exception($data->getMessage()); + } + return self::attrsFromResult($data, $attrs, $restrict); + } }; diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/base.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Inetorgperson.php similarity index 67% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/base.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Inetorgperson.php index 9b59e5982..b33b65bd0 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/base.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Inetorgperson.php @@ -25,43 +25,27 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_base extends Horde_Kolab_Server_Object +class Horde_Kolab_Server_Object_Inetorgperson extends Horde_Kolab_Server_Object_Organizationalperson { const ATTRIBUTE_SID = 'uid'; - const ATTRIBUTE_CN = 'cn'; - const ATTRIBUTE_SN = 'sn'; const ATTRIBUTE_GIVENNAME = 'givenName'; const ATTRIBUTE_FN = 'fn'; const ATTRIBUTE_MAIL = 'mail'; - const ATTRIBUTE_DELEGATE = 'kolabDelegate'; - const ATTRIBUTE_MEMBER = 'member'; - const ATTRIBUTE_VISIBILITY = 'visible'; const ATTRIBUTE_LNFN = 'lnfn'; const ATTRIBUTE_FNLN = 'fnln'; - const ATTRIBUTE_DOMAIN = 'domain'; - const ATTRIBUTE_DELETED = 'kolabDeleteFlag'; - const ATTRIBUTE_FBPAST = 'kolabFreeBusyPast'; - const ATTRIBUTE_FBFUTURE = 'kolabFreeBusyFuture'; - const ATTRIBUTE_FOLDERTYPE = 'kolabFolderType'; - const ATTRIBUTE_HOMESERVER = 'kolabHomeServer'; - const ATTRIBUTE_FREEBUSYHOST = 'kolabFreeBusyServer'; - const ATTRIBUTE_IMAPHOST = 'kolabImapServer'; - const ATTRIBUTE_IPOLICY = 'kolabInvitationPolicy'; const OBJECTCLASS_INETORGPERSON = 'inetOrgPerson'; - const OBJECTCLASS_KOLABINETORGPERSON = 'kolabInetOrgPerson'; - const OBJECTCLASS_HORDEPERSON = 'hordePerson'; - const OBJECTCLASS_KOLABGROUPOFNAMES = 'kolabGroupOfNames'; - const OBJECTCLASS_KOLABSHAREDFOLDER = 'kolabSharedFolder'; /** - * The group the UID must be member of so that this object really - * matches this class type. This may not include the root UID. + * The ldap classes for this type of object. * - * @var string + * @var array */ - protected $required_group; + protected $object_classes = array( + self::OBJECTCLASS_TOP, + self::OBJECTCLASS_INETORGPERSON + ); /** * The attributes supported by this class @@ -120,5 +104,4 @@ class Horde_Kolab_Server_Object_base 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/address.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Address.php similarity index 95% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/address.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Address.php index 99fb8519b..1a20272cf 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/address.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Address.php @@ -26,7 +26,7 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_address extends Horde_Kolab_Server_Object_base +class Horde_Kolab_Server_Object_Kolab_Address extends Horde_Kolab_Server_Object_Kolabinetorgperson { /** diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/administrator.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Administrator.php similarity index 94% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/administrator.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Administrator.php index ab7c20a8b..ad20091d9 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/administrator.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Administrator.php @@ -26,7 +26,7 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_administrator extends Horde_Kolab_Server_Object_adminrole +class Horde_Kolab_Server_Object_Kolab_Administrator extends Horde_Kolab_Server_Object_Kolab_Adminrole { /** diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/adminrole.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Adminrole.php similarity index 81% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/adminrole.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Adminrole.php index 56147f79d..986d24805 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/adminrole.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Adminrole.php @@ -25,7 +25,7 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_adminrole extends Horde_Kolab_Server_Object_base +class Horde_Kolab_Server_Object_Kolab_Adminrole extends Horde_Kolab_Server_Object_Kolabinetorgperson { /** @@ -39,17 +39,6 @@ class Horde_Kolab_Server_Object_adminrole extends Horde_Kolab_Server_Object_base ); /** - * The ldap classes for this type of object. - * - * @var array - */ - protected $object_classes = array( - self::OBJECTCLASS_TOP, - self::OBJECTCLASS_INETORGPERSON, - self::OBJECTCLASS_KOLABINETORGPERSON, - ); - - /** * The group the UID must be member of so that this object really * matches this class type. This may not include the root UID. * @@ -106,9 +95,9 @@ class Horde_Kolab_Server_Object_adminrole extends Horde_Kolab_Server_Object_base } $admins_uid = sprintf('%s,%s', $this->required_group, - $this->db->getBaseUid()); + $this->server->getBaseUid()); - $admin_group = $this->db->fetch($admins_uid, 'Horde_Kolab_Server_Object_group'); + $admin_group = $this->server->fetch($admins_uid, 'Horde_Kolab_Server_Object_Kolabgroupofnames'); if ($admin_group instanceOf PEAR_Error || !$admin_group->exists()) { $members = array($this->uid); @@ -117,10 +106,10 @@ class Horde_Kolab_Server_Object_adminrole extends Horde_Kolab_Server_Object_base $parts = split(',', $this->required_group); list($groupname) = sscanf($parts[0], 'cn=%s'); - $result = $this->db->add(array(self::ATTRIBUTE_CN => $groupname, - 'type' => 'Horde_Kolab_Server_Object_group', - self::ATTRIBUTE_MEMBER => $members, - self::ATTRIBUTE_VISIBILITY => false)); + $result = $this->server->add(array(self::ATTRIBUTE_CN => $groupname, + 'type' => 'Horde_Kolab_Server_Object_Kolabgroupofnames', + Horde_Kolab_Server_Object_Kolabgroupofnames::ATTRIBUTE_MEMBER => $members, + Horde_Kolab_Server_Object_Kolabgroupofnames::ATTRIBUTE_VISIBILITY => false)); if ($result instanceOf PEAR_Error) { return $result; } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/distlist.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Distlist.php similarity index 92% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/distlist.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Distlist.php index a03d43d56..baa788292 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/distlist.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Distlist.php @@ -25,7 +25,7 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_distlist extends Horde_Kolab_Server_Object_group +class Horde_Kolab_Server_Object_Kolab_Distlist extends Horde_Kolab_Server_Object_Kolabgroupofnames { /** * Return the filter string to retrieve this object type. diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/domainmaintainer.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Domainmaintainer.php similarity index 83% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/domainmaintainer.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Domainmaintainer.php index 37eda13b6..c0bef8479 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/domainmaintainer.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Domainmaintainer.php @@ -25,9 +25,11 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_domainmaintainer extends Horde_Kolab_Server_Object_adminrole +class Horde_Kolab_Server_Object_Kolab_Domainmaintainer extends Horde_Kolab_Server_Object_Kolab_Adminrole { + const ATTRIBUTE_DOMAIN = 'domain'; + /** * Attributes derived from the LDAP values. * @@ -77,18 +79,18 @@ class Horde_Kolab_Server_Object_domainmaintainer extends Horde_Kolab_Server_Obje { foreach ($info[self::ATTRIBUTE_DOMAIN] as $domain) { $domain_uid = sprintf('cn=%s,cn=domain,cn=internal,%s', - $domain, $this->db->getBaseUid()); + $domain, $this->server->getBaseUid()); //FIXME: This should be made easier by the group object - $domain_group = $this->db->fetch($domain_uid, 'Horde_Kolab_Server_Object_group'); + $domain_group = $this->server->fetch($domain_uid, 'Horde_Kolab_Server_Object_Kolabgroupofnames'); if ($domain_group instanceOf PEAR_Error) { return $domain_group; } if (!$domain_group->exists()) { $members = array($this->uid); $domain_group->save(array(self::ATTRIBUTE_CN => $domain, - self::ATTRIBUTE_MEMBER => $members)); + Horde_Kolab_Server_Object_Kolabgroupofnames::ATTRIBUTE_MEMBER => $members)); } else { $result = $domain_group->isMember($this->uid); if ($result instanceOf PEAR_Error) { @@ -97,7 +99,7 @@ class Horde_Kolab_Server_Object_domainmaintainer extends Horde_Kolab_Server_Obje if ($result === false) { $members = $domain_group->getMembers(); $members[] = $this->uid; - $domain_group->save(array(self::ATTRIBUTE_MEMBER => $members)); + $domain_group->save(array(Horde_Kolab_Server_Object_Kolabgroupofnames::ATTRIBUTE_MEMBER => $members)); } } } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/maintainer.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Maintainer.php similarity index 91% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/maintainer.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Maintainer.php index d1dcb0758..3bb1c250f 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/maintainer.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Maintainer.php @@ -26,7 +26,7 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_maintainer extends Horde_Kolab_Server_Object_adminrole +class Horde_Kolab_Server_Object_Kolab_Maintainer extends Horde_Kolab_Server_Object_Kolab_Adminrole { /** diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/server.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Server.php similarity index 90% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/server.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Server.php index 8c8702c13..cfe86da65 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/server.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Server.php @@ -25,9 +25,11 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_server extends Horde_Kolab_Server_Object_base +class Horde_Kolab_Server_Object_Kolab_Server extends Horde_Kolab_Server_Object { + const ATTRIBUTE_FBPAST = 'kolabFreeBusyPast'; + /** * The attributes supported by this class * diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/user.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php similarity index 95% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/user.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php index cefbf7333..52db00a71 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/user.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php @@ -26,7 +26,7 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_user extends Horde_Kolab_Server_Object_base +class Horde_Kolab_Server_Object_Kolab_User extends Horde_Kolab_Server_Object_Kolabinetorgperson { /** Define attributes specific to this object type */ @@ -67,18 +67,6 @@ class Horde_Kolab_Server_Object_user extends Horde_Kolab_Server_Object_base public $required_attributes = false; /** - * The ldap classes for this type of object. - * - * @var array - */ - protected $object_classes = array( - self::OBJECTCLASS_TOP, - self::OBJECTCLASS_INETORGPERSON, - self::OBJECTCLASS_KOLABINETORGPERSON, - self::OBJECTCLASS_HORDEPERSON, - ); - - /** * Initialize the Kolab Object. Provide either the UID or a * LDAP search result. * @@ -198,7 +186,7 @@ class Horde_Kolab_Server_Object_user extends Horde_Kolab_Server_Object_base */ public function getGroups() { - return $this->db->getGroups($this->uid); + return $this->server->getGroups($this->uid); } /** diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/group.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php similarity index 57% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/group.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php index 17d35a6b9..5d0e73f8b 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/group.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php @@ -25,9 +25,14 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_group extends Horde_Kolab_Server_Object_base +class Horde_Kolab_Server_Object_Kolabgroupofnames extends Horde_Kolab_Server_Object_Inetorgperson { + const ATTRIBUTE_VISIBILITY = 'visible'; + const ATTRIBUTE_MEMBER = 'member'; + + const OBJECTCLASS_KOLABGROUPOFNAMES = 'kolabGroupOfNames'; + /** * Attributes derived from the LDAP values. * @@ -220,4 +225,121 @@ class Horde_Kolab_Server_Object_group extends Horde_Kolab_Server_Object_base } } + /** + * Returns the set of search operations supported by this object type. + * + * @return array An array of supported search operations. + */ + static public function getSearchOperations() + { + $searches = array( + 'gidForSearch', + 'gidForMail', + 'memberOfGroupAddress', + 'getGroups', + ); + return $searches; + } + + /** + * FIXME: This method belongs somewhere where we are aware of groups + * Identify the GID for the first group found using the specified + * search criteria + * + * @param array $criteria The search parameters as array. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return boolean|string|array The GID(s) or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function gidForSearch($server, $criteria, + $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + { + $groups = array('field' => self::ATTRIBUTE_OC, + 'op' => '=', + 'test' => self::OBJECTCLASS_KOLABGROUPOFNAMES); + if (!empty($criteria)) { + $criteria = array('AND' => array($groups, $criteria)); + } else { + $criteria = array('AND' => array($groups)); + } + return self::basicUidForSearch($server, $criteria, $restrict); + } + + /** + * Identify the GID for the first group found with the given mail. + * + * @param string $mail Search for groups with this mail address. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return mixed The GID or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function gidForMail($server, $mail, + $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + { + $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_MEMBER, + 'op' => '=', + 'test' => $mail), + ), + ); + return self::gidForSearch($server, $criteria, $restrict); + } + + /** + * Is the given UID member of the group with the given mail address? + * + * @param string $uid UID of the user. + * @param string $mail Search the group with this mail address. + * + * @return boolean True in case the user is in the group, false otherwise. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function memberOfGroupAddress($server, $uid, $mail) + { + $criteria = array('AND' => + array( + array('field' => self::ATTRIBUTE_MAIL, + 'op' => '=', + 'test' => $mail), + array('field' => self::ATTRIBUTE_MEMBER, + 'op' => '=', + 'test' => $uid), + ), + ); + + $result = self::gidForSearch($server, $criteria, + self::RESULT_SINGLE); + return !empty($result); + } + + /** + * Get the groups for this object. + * + * @param string $uid The UID of the object to fetch. + * + * @return array An array of group ids. + * + * @throws Horde_Kolab_Server_Exception + */ + public function getGroups($server, $uid) + { + $criteria = array('AND' => + array( + array('field' => self::ATTRIBUTE_MEMBER, + 'op' => '=', + 'test' => $uid), + ), + ); + + $result = self::gidForSearch($server, $criteria, self::RESULT_MANY); + if (empty($result)) { + return array(); + } + return $result; + } + } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabinetorgperson.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabinetorgperson.php new file mode 100644 index 000000000..7c8fcff88 --- /dev/null +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabinetorgperson.php @@ -0,0 +1,413 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ + +/** + * This class provides basic methods common to all Kolab server objects. + * + * Copyright 2008-2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Server + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ +class Horde_Kolab_Server_Object_Kolabinetorgperson extends Horde_Kolab_Server_Object_Inetorgperson +{ + + const ATTRIBUTE_ALIAS = 'alias'; + const ATTRIBUTE_DELEGATE = 'kolabDelegate'; + const ATTRIBUTE_DELETED = 'kolabDeleteFlag'; + const ATTRIBUTE_FBFUTURE = 'kolabFreeBusyFuture'; + const ATTRIBUTE_FOLDERTYPE = 'kolabFolderType'; + const ATTRIBUTE_HOMESERVER = 'kolabHomeServer'; + const ATTRIBUTE_FREEBUSYHOST = 'kolabFreeBusyServer'; + const ATTRIBUTE_IMAPHOST = 'kolabImapServer'; + const ATTRIBUTE_IPOLICY = 'kolabInvitationPolicy'; + + const OBJECTCLASS_KOLABINETORGPERSON = 'kolabInetOrgPerson'; + + /** + * The ldap classes for this type of object. + * + * @var array + */ + protected $object_classes = array( + self::OBJECTCLASS_TOP, + self::OBJECTCLASS_INETORGPERSON, + self::OBJECTCLASS_KOLABINETORGPERSON, + ); + + /** + * The attributes supported by this class + * + * @var array + */ +/* public $supported_attributes = array( */ +/* self::ATTRIBUTE_FBPAST, */ +/* ); */ + + + /** + * Derive an attribute value. + * + * @param string $attr The attribute to derive. + * + * @return mixed The value of the attribute. + */ + protected function derive($attr) + { + switch ($attr) { + case self::ATTRIBUTE_ID: + $result = split(',', $this->uid); + if (substr($result[0], 0, 3) == self::ATTRIBUTE_CN . '=') { + return substr($result[0], 3); + } else { + return $result[0]; + } + default: + return parent::derive($attr); + } + } + + /** + * Generates an ID for the given information. + * + * @param array $info The data of the object. + * + * @static + * + * @return string|PEAR_Error The ID. + */ + public static function generateId($info) + { + $id_mapfields = array(self::ATTRIBUTE_GIVENNAME, + self::ATTRIBUTE_SN); + $id_format = '%s %s'; + + $fieldarray = array(); + foreach ($id_mapfields as $mapfield) { + if (isset($info[$mapfield])) { + $fieldarray[] = $info[$mapfield]; + } else { + $fieldarray[] = ''; + } + } + + return trim(vsprintf($id_format, $fieldarray), " \t\n\r\0\x0B,"); + } + + /** + * Returns the set of search operations supported by this object type. + * + * @return array An array of supported search operations. + */ + static public function getSearchOperations() + { + $searches = array( + 'uidForSearch', + 'uidForId', + 'uidForMail', + 'uidForIdOrMail', + 'uidForAlias', + 'uidForMailOrAlias', + 'uidForIdOrMailOrAlias', + 'mailForIdOrMail', + 'addrsForIdOrMail', + ); + return $searches; + } + + /** + * Identify the kolab UID for the first object found using the specified + * search criteria. + * + * @param array $criteria The search parameters as array. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return boolean|string|array The UID(s) or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function uidForSearch($server, $criteria, + $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + { + $users = array('field' => self::ATTRIBUTE_OC, + 'op' => '=', + 'test' => self::OBJECTCLASS_KOLABINETORGPERSON); + if (!empty($criteria)) { + $criteria = array('AND' => array($users, $criteria)); + } else { + $criteria = array('AND' => array($users)); + } + return self::basicUidForSearch($server, $criteria, $restrict); + } + + /** + * Identify the UID for the first object found with the given ID. + * + * @param string $id Search for objects with this ID. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return mixed The UID or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function uidForId($server, $id, + $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + { + $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_SID, + 'op' => '=', + 'test' => $id), + ), + ); + return self::uidForSearch($server, $criteria, $restrict); + } + + /** + * Identify the UID for the first user found with the given mail. + * + * @param string $mail Search for users with this mail address. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return mixed The UID or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function uidForMail($server, $mail, + $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + { + $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_MAIL, + 'op' => '=', + 'test' => $mail), + ), + ); + return self::uidForSearch($server, $criteria, $restrict); + } + + /** + * Identify the UID for the first object found with the given ID or mail. + * + * @param string $id Search for objects with this uid/mail. + * + * @return string|boolean The UID or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function uidForIdOrMail($server, $id) + { + $criteria = array('OR' => + array( + array('field' => self::ATTRIBUTE_SID, + 'op' => '=', + 'test' => $id), + array('field' => self::ATTRIBUTE_MAIL, + 'op' => '=', + 'test' => $id), + ), + ); + return self::uidForSearch($server, $criteria); + } + + /** + * Identify the UID for the first object found with the given alias. + * + * @param string $mail Search for objects with this mail alias. + * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * + * @return mixed The UID or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function uidForAlias($server, $mail, + $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + { + $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_ALIAS, + 'op' => '=', + 'test' => $mail), + ), + ); + return self::uidForSearch($server, $criteria, $restrict); + } + + /** + * Identify the UID for the first object found with the given mail + * address or alias. + * + * @param string $mail Search for objects with this mail address + * or alias. + * + * @return string|boolean The UID or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function uidForMailOrAlias($server, $mail) + { + $criteria = array('OR' => + array( + array('field' => self::ATTRIBUTE_ALIAS, + 'op' => '=', + 'test' => $mail), + array('field' => self::ATTRIBUTE_MAIL, + 'op' => '=', + 'test' => $mail), + ) + ); + return self::uidForSearch($server, $criteria); + } + + /** + * Identify the UID for the first object found with the given ID, + * mail or alias. + * + * @param string $id Search for objects with this ID/mail/alias. + * + * @return string|boolean The UID or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function uidForIdOrMailOrAlias($server, $id) + { + $criteria = array('OR' => + array( + array('field' => self::ATTRIBUTE_ALIAS, + 'op' => '=', + 'test' => $id), + array('field' => self::ATTRIBUTE_MAIL, + 'op' => '=', + 'test' => $id), + array('field' => self::ATTRIBUTE_SID, + 'op' => '=', + 'test' => $id), + ), + ); + return self::uidForSearch($server, $criteria); + } + + /** + * Identify the primary mail attribute for the first object found + * with the given ID or mail. + * + * @param string $id Search for objects with this ID/mail. + * + * @return mixed The mail address or false if there was no result. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function mailForIdOrMail($server, $id) + { + $criteria = array('AND' => + array( + array('field' => self::ATTRIBUTE_OC, + 'op' => '=', + 'test' => self::OBJECTCLASS_KOLABINETORGPERSON), + array('OR' => + array( + array('field' => self::ATTRIBUTE_SID, + 'op' => '=', + 'test' => $id), + array('field' => self::ATTRIBUTE_MAIL, + 'op' => '=', + 'test' => $id), + ), + ), + ), + ); + + $data = self::attrsForSearch($server, $criteria, array(self::ATTRIBUTE_MAIL), + self::RESULT_STRICT); + if (!empty($data)) { + return $data[self::ATTRIBUTE_MAIL][0]; + } else { + return false; + } + } + + /** + * Returns a list of allowed email addresses for the given user. + * + * @param string $id Search for objects with this ID/mail. + * + * @return array An array of allowed mail addresses. + * + * @throws Horde_Kolab_Server_Exception + */ + static public function addrsForIdOrMail($server, $id) + { + $criteria = array('AND' => + array( + array('field' => self::ATTRIBUTE_OC, + 'op' => '=', + 'test' => self::OBJECTCLASS_KOLABINETORGPERSON), + array('OR' => + array( + array('field' => self::ATTRIBUTE_SID, + 'op' => '=', + 'test' => $id), + array('field' => self::ATTRIBUTE_MAIL, + 'op' => '=', + 'test' => $id), + ), + ), + ), + ); + + $result = self::attrsForSearch($server, $criteria, + array(self::ATTRIBUTE_MAIL, + self::ATTRIBUTE_ALIAS), + self::RESULT_STRICT); + if (isset($result[self::ATTRIBUTE_ALIAS])) { + $addrs = array_merge((array) $result[self::ATTRIBUTE_MAIL], + (array) $result[self::ATTRIBUTE_ALIAS]); + } else { + $addrs = $result[self::ATTRIBUTE_MAIL]; + } + + if (empty($result)) { + return array(); + } + $criteria = array('AND' => + array( + array('field' => self::ATTRIBUTE_OC, + 'op' => '=', + 'test' => self::OBJECTCLASS_KOLABINETORGPERSON), + array('field' => self::ATTRIBUTE_DELEGATE, + 'op' => '=', + 'test' => $result[self::ATTRIBUTE_MAIL][0]), + ), + ); + + $result = self::attrsForSearch($server, $criteria, + array(self::ATTRIBUTE_MAIL, + self::ATTRIBUTE_ALIAS), + self::RESULT_MANY); + if (!empty($result)) { + foreach ($result as $adr) { + if (isset($adr[self::ATTRIBUTE_MAIL])) { + $addrs = array_merge((array) $addrs, (array) $adr[self::ATTRIBUTE_MAIL]); + } + if (isset($adr[self::ATTRIBUTE_ALIAS])) { + $addrs = array_merge((array) $addrs, (array) $adr[self::ATTRIBUTE_ALIAS]); + } + } + } + + $addrs = array_map('strtolower', $addrs); + + return $addrs; + } + +} \ No newline at end of file diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/sharedfolder.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabsharedfolder.php similarity index 93% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Object/sharedfolder.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabsharedfolder.php index 74195b53a..1974fdc7d 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/sharedfolder.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabsharedfolder.php @@ -26,9 +26,11 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_sharedfolder extends Horde_Kolab_Server_Object_base +class Horde_Kolab_Server_Object_Kolabsharedfolder extends Horde_Kolab_Server_Object { + const OBJECTCLASS_KOLABSHAREDFOLDER = 'kolabSharedFolder'; + /** * The ldap classes for this type of object. * diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Organizationalperson.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Organizationalperson.php new file mode 100644 index 000000000..53be772da --- /dev/null +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Organizationalperson.php @@ -0,0 +1,93 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ + +/** + * This class provides methods for the organizationalPerson objectclass. + * + * Copyright 2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Server + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ +class Horde_Kolab_Server_Object_Organizationalperson extends Horde_Kolab_Server_Object_Person +{ + + const ATTRIBUTE_POSTALADDRESS = 'postalAddress'; + + const OBJECTCLASS_ORGANIZATIONALPERSON = 'organizationalPerson'; + + /** + * The ldap classes for this type of object. + * + * @var array + */ + protected $object_classes = array( + self::OBJECTCLASS_TOP, + self::OBJECTCLASS_ORGANIZATIONALPERSON + ); + + /** + * Derive an attribute value. + * + * @param string $attr The attribute to derive. + * + * @return mixed The value of the attribute. + */ + protected function derive($attr) + { + switch ($attr) { + case self::ATTRIBUTE_ID: + $result = split(',', $this->uid); + if (substr($result[0], 0, 3) == 'cn=') { + return substr($result[0], 3); + } else { + return $result[0]; + } + default: + return parent::derive($attr); + } + } + + /** + * Generates an ID for the given information. + * + * @param array $info The data of the object. + * + * @static + * + * @return string|PEAR_Error The ID. + */ + public static function generateId($info) + { + $id_mapfields = array('givenName', 'sn'); + $id_format = '%s %s'; + + $fieldarray = array(); + foreach ($id_mapfields as $mapfield) { + if (isset($info[$mapfield])) { + $fieldarray[] = $info[$mapfield]; + } else { + $fieldarray[] = ''; + } + } + + 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/Person.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php new file mode 100644 index 000000000..5ecfbb5e8 --- /dev/null +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php @@ -0,0 +1,115 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ + +/** + * This class provides methods for the person objectclass. + * + * Copyright 2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Server + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ +class Horde_Kolab_Server_Object_Person extends Horde_Kolab_Server_Object +{ + + const ATTRIBUTE_CN = 'cn'; + const ATTRIBUTE_SN = 'sn'; + const ATTRIBUTE_USERPASSWORD = 'userPassword'; + + const OBJECTCLASS_PERSON = 'person'; + + /** + * The ldap classes for this type of object. + * + * @var array + */ + protected $object_classes = array( + self::OBJECTCLASS_TOP, + self::OBJECTCLASS_PERSON + ); + + /** + * Alias names for attributes. + * + * @var array + */ + protected $attribute_aliases = array( + self::ATTRIBUTE_CN => 'commonName', + self::ATTRIBUTE_SN => 'surname', + ); + + /** + * The attributes supported by this class + * + * @var array + */ +/* public $supported_attributes = array( */ +/* self::ATTRIBUTE_FBPAST, */ +/* ); */ + + + /** + * Derive an attribute value. + * + * @param string $attr The attribute to derive. + * + * @return mixed The value of the attribute. + */ + protected function derive($attr) + { + switch ($attr) { + case self::ATTRIBUTE_ID: + $result = split(',', $this->uid); + if (substr($result[0], 0, 3) == 'cn=') { + return substr($result[0], 3); + } else { + return $result[0]; + } + default: + return parent::derive($attr); + } + } + + /** + * Generates an ID for the given information. + * + * @param array $info The data of the object. + * + * @static + * + * @return string|PEAR_Error The ID. + */ + public static function generateId($info) + { + $id_mapfields = array('givenName', 'sn'); + $id_format = '%s %s'; + + $fieldarray = array(); + foreach ($id_mapfields as $mapfield) { + if (isset($info[$mapfield])) { + $fieldarray[] = $info[$mapfield]; + } else { + $fieldarray[] = ''; + } + } + + return trim(vsprintf($id_format, $fieldarray), " \t\n\r\0\x0B,"); + } + +} \ No newline at end of file diff --git a/framework/Kolab_Server/package.xml b/framework/Kolab_Server/package.xml index 1cff6b7aa..7a23dcf48 100644 --- a/framework/Kolab_Server/package.xml +++ b/framework/Kolab_Server/package.xml @@ -50,21 +50,27 @@ http://pear.php.net/dtd/package-2.0.xsd"> + - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -136,20 +142,24 @@ http://pear.php.net/dtd/package-2.0.xsd"> + - - - - - - - - - - - + + + + + + + + + + + + + + -- 2.11.0