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