From 69dee76e64f75c4f20ed30c4ea2a8a6901a1666b Mon Sep 17 00:00:00 2001 From: Gunnar Wrobel Date: Thu, 8 Apr 2010 19:45:54 +0200 Subject: [PATCH] Refactor the permission handling in Kolab_Storage. --- .../Core/lib/Horde/Core/Factory/KolabStorage.php | 7 +- .../lib/Horde/Kolab/Storage/Driver.php | 54 +++ .../lib/Horde/Kolab/Storage/Driver/Imap.php | 137 +++++-- .../lib/Horde/Kolab/Storage/Folder.php | 38 +- .../lib/Horde/Kolab/Storage/Folder/Base.php | 237 ++++++------ .../Horde/Kolab/Storage/Folder/Decorator/Base.php | 36 ++ .../lib/Horde/Kolab/Storage/Folder/Permission.php | 125 +++++++ .../Horde/Kolab/Storage/Folder/Permission/Acl.php | 79 ++++ .../Storage/Folder/Permission/Acl/Anonymous.php | 43 +++ .../Kolab/Storage/Folder/Permission/Acl/Anyone.php | 43 +++ .../Storage/Folder/Permission/Acl/Creator.php | 43 +++ .../Kolab/Storage/Folder/Permission/Acl/Group.php | 71 ++++ .../Kolab/Storage/Folder/Permission/Acl/User.php | 62 ++++ .../Storage/Folder/Permission/AclIterator.php | 93 +++++ .../Kolab/Storage/Folder/Permission/Element.php | 99 +++++ .../Storage/Folder/Permission/Element/Creator.php | 69 ++++ .../Storage/Folder/Permission/Element/Default.php | 40 ++ .../Storage/Folder/Permission/Element/Group.php | 80 ++++ .../Storage/Folder/Permission/Element/Guest.php | 40 ++ .../Storage/Folder/Permission/Element/User.php | 72 ++++ .../Storage/Folder/Permission/ElementIterator.php | 100 +++++ .../lib/Horde/Kolab/Storage/Namespace/Imap.php | 2 +- .../lib/Horde/Kolab/Storage/Permission.php | 402 --------------------- framework/Kolab_Storage/package.xml | 83 +++-- .../test/Horde/Kolab/Storage/AclTest.php | 213 +++++++++++ .../test/Horde/Kolab/Storage/Autoload.php | 4 +- .../test/Horde/Kolab/Storage/NamespaceTest.php | 20 +- .../test/Horde/Kolab/Storage/PermissionTest.php | 361 ++++++++++++++++++ .../test/Horde/Kolab/Storage/PermsTest.php | 176 --------- 29 files changed, 2057 insertions(+), 772 deletions(-) create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Anonymous.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Anyone.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Creator.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Group.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/User.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/AclIterator.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Creator.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Default.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Group.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Guest.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/User.php create mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/ElementIterator.php delete mode 100644 framework/Kolab_Storage/lib/Horde/Kolab/Storage/Permission.php create mode 100644 framework/Kolab_Storage/test/Horde/Kolab/Storage/AclTest.php create mode 100644 framework/Kolab_Storage/test/Horde/Kolab/Storage/PermissionTest.php delete mode 100644 framework/Kolab_Storage/test/Horde/Kolab/Storage/PermsTest.php diff --git a/framework/Core/lib/Horde/Core/Factory/KolabStorage.php b/framework/Core/lib/Horde/Core/Factory/KolabStorage.php index cdacf29b7..e7bb3bc84 100644 --- a/framework/Core/lib/Horde/Core/Factory/KolabStorage.php +++ b/framework/Core/lib/Horde/Core/Factory/KolabStorage.php @@ -93,6 +93,7 @@ class Horde_Core_Factory_KolabStorage if (empty($mail)) { return false; } + $params = array( 'hostspec' => $session->getImapServer(), 'username' => Horde_Auth::getAuth(), @@ -102,8 +103,12 @@ class Horde_Core_Factory_KolabStorage $imap = Horde_Imap_Client::factory('socket', $params); + //@todo: The Group package needs to be converted to H4 + require_once 'Horde/Group.php'; + $master = new Horde_Kolab_Storage_Driver_Imap( - $imap + $imap, + Group::singleton() ); return new Horde_Kolab_Storage( diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver.php index 6d48802c0..75d8cf6fb 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver.php @@ -28,9 +28,63 @@ abstract class Horde_Kolab_Storage_Driver { /** + * Return the id of the user currently authenticated. + * + * @return string The id of the user that opened the connection. + */ + abstract public function getAuth(); + + /** + * Does the given folder exist? + * + * @param string $folder The folder to check. + * + * @return boolean True in case the folder exists, false otherwise. + */ + abstract public function exists($folder); + + /** + * Retrieve the access rights for a folder. + * + * @param Horde_Kolab_Storage_Folder $folder The folder to retrieve the ACL for. + * + * @return An array of rights. + */ + abstract public function getAcl(Horde_Kolab_Storage_Folder $folder); + + /** + * Set the access rights for a folder. + * + * @param string $folder The folder to act upon. + * @param string $user The user to set the ACL for. + * @param string $acl The ACL. + * + * @return NULL + */ + abstract public function setAcl($folder, $user, $acl); + + /** + * Delete the access rights for user on a folder. + * + * @param string $folder The folder to act upon. + * @param string $user The user to delete the ACL for + * + * @return NULL + */ + abstract public function deleteAcl($folder, $user); + + /** * Retrieve the namespace information for this connection. * * @return Horde_Kolab_Storage_Namespace The initialized namespace handler. */ abstract public function getNamespace(); + + /** + * Get the group handler for this connection. + * + * @return Horde_Group The group handler. + */ + abstract public function getGroupHandler(); + } \ No newline at end of file diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Imap.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Imap.php index e774b4af7..2edaf30e0 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Imap.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Driver/Imap.php @@ -35,14 +35,33 @@ class Horde_Kolab_Storage_Driver_Imap extends Horde_Kolab_Storage_Driver private $_imap; /** + * The group handler for this connection. + * + * @var Horde_Group + */ + private $_groups; + + /** * Constructor. * * @param array $params Connection parameters. */ public function __construct( - Horde_Imap_Client_Base $imap + Horde_Imap_Client_Base $imap, + Group $groups ) { - $this->_imap = $imap; + $this->_imap = $imap; + $this->_groups = $groups; + } + + /** + * Return the id of the user currently authenticated. + * + * @return string The id of the user that opened the IMAP connection. + */ + public function getAuth() + { + return $this->_imap->getParam('username'); } /** @@ -257,44 +276,97 @@ class Horde_Kolab_Storage_Driver_Imap extends Horde_Kolab_Storage_Driver } /** - * Retrieve the access rights from a folder + * Retrieve the access rights for a folder. * - * @param string $folder The folder to retrieve the ACLs from. + * @param Horde_Kolab_Storage_Folder $folder The folder to retrieve the ACL for. * - * @return mixed An array of rights if successfull, a PEAR error - * otherwise. + * @return An array of rights. */ - function getACL($folder) + public function getAcl(Horde_Kolab_Storage_Folder $folder) { - if (!$this->_imap->queryCapability('ACL')) { - $acl = array(); - $acl[Horde_Auth::getAuth()] = 'lrid'; - return $acl; + //@todo: Separate driver class + if ($this->_imap->queryCapability('ACL') === true) { + if ($folder->getOwner() == $this->getAuth()) { + try { + return $this->_getAcl($folder->getName()); + } catch (Exception $e) { + return array($this->getAuth() => $this->_getMyAcl($folder->getName())); + } + } else { + $acl = $this->_getMyAcl($folder->getName()); + if (strpos($acl, 'a')) { + try { + return $this->_getAcl($folder->getName()); + } catch (Exception $e) { + } + } + return array($this->getAuth() => $acl); + } + } else { + return array($this->getAuth() => 'lrid'); } + } - try { - return $this->_imap->getACL($folder); - } catch (Exception $e) { - try { - return array(Horde_Auth::getAuth() => str_split($this->_imap->getMyACLRights($folder))); - } catch (Exception $e) { - return array(Horde_Auth::getAuth() => str_split('lrid')); - } - } + /** + * Retrieve the access rights for a folder. + * + * @param string $folder The folder to retrieve the ACL for. + * + * @return An array of rights. + */ + private function _getAcl($folder) + { + $acl = $this->_imap->getACL($folder); + $result = array(); + foreach ($acl as $user => $rights) { + $result[$user] = join('', $rights); + } + return $result; + } + + /** + * Retrieve the access rights on a folder for the current user. + * + * @param string $folder The folder to retrieve the ACL for. + * + * @return An array of rights. + */ + private function _getMyAcl($folder) + { + return $this->_imap->getMyACLRights($folder); } /** - * Set the access rights for a folder + * Set the access rights for a folder. * - * @param string $folder The folder to retrieve the ACLs from. - * @param string $user The user to set the ACLs for - * @param string $acl The ACLs + * @param string $folder The folder to act upon. + * @param string $user The user to set the ACL for. + * @param string $acl The ACL. * - * @return mixed True if successfull, a PEAR error otherwise. + * @return NULL */ - function setACL($folder, $user, $acl) + public function setAcl($folder, $user, $acl) { - return $this->_imap->setACL($folder, $user, array('rights' => $acl)); + //@todo: Separate driver class + if ($this->_imap->queryCapability('ACL') === true) { + $this->_imap->setACL($folder, $user, array('rights' => $acl)); + } + } + + /** + * Delete the access rights for user on a folder. + * + * @param string $folder The folder to act upon. + * @param string $user The user to delete the ACL for + * + * @return NULL + */ + public function deleteAcl($folder, $user) + { + //@todo: Separate driver class + if ($this->_imap->queryCapability('ACL') === true) { + $this->_imap->setACL($folder, $user, array('remove' => true)); + } } /** @@ -350,4 +422,15 @@ class Horde_Kolab_Storage_Driver_Imap extends Horde_Kolab_Storage_Driver } return new Horde_Kolab_Storage_Namespace_Fixed(); } + + /** + * Get the group handler for this connection. + * + * @return Horde_Group The group handler. + */ + public function getGroupHandler() + { + return $this->_groups; + } + } \ No newline at end of file diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder.php index 7b7ecf352..b8a0361ab 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder.php @@ -32,6 +32,34 @@ interface Horde_Kolab_Storage_Folder { /** + * Retrieve the driver for this folder. + * + * @return Horde_Kolab_Storage_Driver The folder driver. + */ + public function getDriver(); + + /** + * Get the permissions for this folder. + * + * @return Horde_Kolab_Storage_Folder_Permission The permission handler. + */ + public function getPermission(); + + /** + * Sets the permissions on this folder. + * + * @param Horde_Kolab_Storage_Folder_Permission $perms Permission object. + * @param boolean $update Save the updated + * information? + * + * @return NULL + */ + public function setPermission( + Horde_Kolab_Storage_Folder_Permission $perms, + $update = true + ); + + /** * Saves the folder. * * @param array $attributes An array of folder attributes. You can @@ -90,11 +118,11 @@ interface Horde_Kolab_Storage_Folder &$old_object = null); /** - * Return the IMAP ACL of this folder. + * Return the ACL of this folder. * - * @return array An array with IMAP ACL. + * @return array An array with ACL. */ - public function getACL(); + public function getAcl(); /** * Set the ACL of this folder. @@ -104,7 +132,7 @@ interface Horde_Kolab_Storage_Folder * * @return NULL */ - public function setACL($user, $acl); + public function setAcl($user, $acl); /** * Delete the ACL for a user on this folder. @@ -113,6 +141,6 @@ interface Horde_Kolab_Storage_Folder * * @return NULL */ - public function deleteACL($user); + public function deleteAcl($user); } diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Base.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Base.php index 4bab4ac78..0fdae63cf 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Base.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Base.php @@ -61,11 +61,11 @@ implements Horde_Kolab_Storage_Folder var $new_name; /** - * The connection specific for this folder. + * The driver for this folder. * * @var Horde_Kolab_Storage_Driver */ - private $_connection; + private $_driver; /** * The handler for the list of Kolab folders. @@ -197,7 +197,7 @@ implements Horde_Kolab_Storage_Folder { $properties = get_object_vars($this); unset($properties['_storage']); - unset($properties['_connection']); + unset($properties['_driver']); $properties = array_keys($properties); return $properties; } @@ -207,17 +207,64 @@ implements Horde_Kolab_Storage_Folder * * @param Horde_Kolab_Storage $storage The handler for the list of * folders. - * @param Horde_Kolab_Storage_Driver $connection The storage connection. + * @param Horde_Kolab_Storage_Driver $driver The storage driver. */ function restore( Horde_Kolab_Storage &$storage, - Horde_Kolab_Storage_Driver &$connection + Horde_Kolab_Storage_Driver &$driver ) { - $this->_storage = $storage; - $this->_connection = $connection; + $this->_storage = $storage; + $this->_driver = $driver; } /** + * Retrieve the driver for this folder. + * + * @return Horde_Kolab_Storage_Driver The folder driver. + */ + public function getDriver() + { + return $this->_driver; + } + + /** + * Get the permissions for this folder. + * + * @return Horde_Kolab_Storage_Folder_Permission The permission handler. + */ + public function getPermission() + { + if ($this->_perms === null) { + $this->_perms = new Horde_Kolab_Storage_Folder_Permission( + $this->getName(), + $this, + $this->_driver->getGroupHandler() + ); + } + return $this->_perms; + } + + /** + * Sets the permissions on this folder. + * + * @param Horde_Kolab_Storage_Folder_Permission $perms Permission object. + * @param boolean $update Save the updated + * information? + * + * @return NULL + */ + public function setPermission( + Horde_Kolab_Storage_Folder_Permission $perms, + $update = true + ) { + $this->_perms = $perms; + if ($update) { + $this->save(); + } + } + + + /** * Return the name of the folder. * * @return string The name of the folder. @@ -227,7 +274,7 @@ implements Horde_Kolab_Storage_Folder if (isset($this->name)) { return $this->name; } - if (!isset($this->name) && isset($this->new_name)) { + if (isset($this->new_name)) { return $this->new_name; } } @@ -240,7 +287,7 @@ implements Horde_Kolab_Storage_Folder */ function setName($name) { - $this->new_name = $this->_connection->getNamespace()->setName($name); + $this->new_name = $this->_driver->getNamespace()->setName($name); } /** @@ -301,14 +348,14 @@ implements Horde_Kolab_Storage_Folder $this->_default = false; } - $result = $this->_connection->exists($this->new_name); + $result = $this->_driver->exists($this->new_name); if ($result) { throw new Horde_Kolab_Storage_Exception(sprintf("Unable to add %s: destination folder already exists", $this->new_name), Horde_Kolab_Storage_Exception::FOLDER_EXISTS); } - $this->_connection->create($this->new_name); + $this->_driver->create($this->new_name); $this->name = $this->new_name; $this->new_name = null; @@ -339,13 +386,13 @@ implements Horde_Kolab_Storage_Folder if (isset($this->new_name) && $this->new_name != $this->name) { /** The folder needs to be renamed */ - $result = $this->_connection->exists($this->new_name); + $result = $this->_driver->exists($this->new_name); if ($result) { throw new Horde_Kolab_Storage_Exception(sprintf(_("Unable to rename %s to %s: destination folder already exists"), $name, $new_name)); } - $result = $this->_connection->rename($this->name, $this->new_name); + $result = $this->_driver->rename($this->name, $this->new_name); $this->_storage->removeFromCache($this); $this->name = $this->new_name; @@ -415,6 +462,7 @@ implements Horde_Kolab_Storage_Folder /** Now save the folder permissions */ if (isset($this->_perms)) { $this->_perms->save(); + $this->_perms = null; } $this->_storage->addToCache($this); @@ -429,7 +477,7 @@ implements Horde_Kolab_Storage_Folder */ function delete() { - $this->_connection->delete($this->name); + $this->_driver->delete($this->name); $this->_storage->removeFromCache($this); return true; } @@ -442,14 +490,14 @@ implements Horde_Kolab_Storage_Folder public function getOwner() { if (!isset($this->_owner)) { - $owner = $this->_connection->getNamespace()->getOwner($this->getName()); + $owner = $this->_driver->getNamespace()->getOwner($this->getName()); /** * @todo: Reconsider if this handling should really be done here * rather than in a module nearer to the applications. */ switch ($owner) { case Horde_Kolab_Storage_Namespace::PERSONAL: - $this->_owner = Horde_Auth::getAuth(); + $this->_owner = $this->_driver->getAuth(); break; case Horde_Kolab_Storage_Namespace::SHARED: $this->_owner = 'anonymous'; @@ -457,7 +505,7 @@ implements Horde_Kolab_Storage_Folder default: list($prefix, $user) = explode(':', $owner, 2); if (strpos($user, '@') === false) { - $domain = strstr(Horde_Auth::getAuth(), '@'); + $domain = strstr($this->_driver->getAuth(), '@'); if (!empty($domain)) { $user .= $domain; } @@ -481,10 +529,10 @@ implements Horde_Kolab_Storage_Folder public function getSubpath($name = null) { if (!empty($name)) { - return $this->_connection->getNamespace()->getSubpath($name); + return $this->_driver->getNamespace()->getSubpath($name); } if (!isset($this->_subpath)) { - $this->_subpath = $this->_connection->getNamespace()->getSubpath($this->getName()); + $this->_subpath = $this->_driver->getNamespace()->getSubpath($this->getName()); } return $this->_subpath; } @@ -497,7 +545,7 @@ implements Horde_Kolab_Storage_Folder public function getTitle() { if (!isset($this->_title)) { - $this->_title = $this->_connection->getNamespace()->getTitle($this->getName()); + $this->_title = $this->_driver->getNamespace()->getTitle($this->getName()); } return $this->_title; } @@ -608,8 +656,11 @@ implements Horde_Kolab_Storage_Folder */ function exists() { + if ($this->name === null) { + return false; + } try { - return $this->_connection->exists($this->name); + return $this->_driver->exists($this->name); } catch (Horde_Imap_Client_Exception $e) { return false; } @@ -623,7 +674,7 @@ implements Horde_Kolab_Storage_Folder function accessible() { try { - return $this->_connection->select($this->name); + return $this->_driver->select($this->name); } catch (Horde_Imap_Client_Exception $e) { return false; } @@ -678,8 +729,8 @@ implements Horde_Kolab_Storage_Folder public function deleteMessage($id, $trigger = true) { // Select folder - $this->_connection->deleteMessages($this->name, $id); - $this->_connection->expunge($this->name); + $this->_driver->deleteMessages($this->name, $id); + $this->_driver->expunge($this->name); } /** @@ -692,9 +743,9 @@ implements Horde_Kolab_Storage_Folder */ public function moveMessage($id, $folder) { - $this->_connection->select($this->name); - $this->_connection->moveMessage($this->name, $id, $folder); - $this->_connection->expunge($this->name); + $this->_driver->select($this->name); + $this->_driver->moveMessage($this->name, $id, $folder); + $this->_driver->expunge($this->name); } /** @@ -753,7 +804,7 @@ implements Horde_Kolab_Storage_Folder &$old_object = null) { // Select folder - $this->_connection->select($this->name); + $this->_driver->select($this->name); $new_headers = new Horde_Mime_Headers(); $new_headers->setEOL("\r\n"); @@ -776,7 +827,7 @@ implements Horde_Kolab_Storage_Folder if ($id != null) { /** Update an existing kolab object */ - if (!in_array($id, $this->_connection->getUids($this->name))) { + if (!in_array($id, $this->_driver->getUids($this->name))) { return PEAR::raiseError(sprintf(_("The message with ID %s does not exist. This probably means that the Kolab object has been modified by somebody else while you were editing it. Your edits have been lost."), $id)); } @@ -903,21 +954,21 @@ implements Horde_Kolab_Storage_Folder // delete old email? if ($id != null) { - $this->_connection->deleteMessages($this->name, $id); + $this->_driver->deleteMessages($this->name, $id); } // store new email try { - $result = $this->_connection->appendMessage($this->name, $msg); + $result = $this->_driver->appendMessage($this->name, $msg); } catch (Horde_Kolab_Storage_Exception $e) { if ($id != null) { - $this->_connection->undeleteMessages($id); + $this->_driver->undeleteMessages($id); } } // remove deleted object if ($id != null) { - $this->_connection->expunge($this->name); + $this->_driver->expunge($this->name); } } @@ -938,13 +989,13 @@ implements Horde_Kolab_Storage_Folder function parseMessage($id, $mime_type, $parse_headers = true, $formats = array('XML')) { - $raw_headers = $this->_connection->getMessageHeader($this->name, $id); + $raw_headers = $this->_driver->getMessageHeader($this->name, $id); if (is_a($raw_headers, 'PEAR_Error')) { return PEAR::raiseError(sprintf(_("Failed retrieving the message with ID %s. Original error: %s."), $id, $raw_headers->getMessage())); } - $body = $this->_connection->getMessageBody($this->name, $id); + $body = $this->_driver->getMessageBody($this->name, $id); if (is_a($body, 'PEAR_Error')) { return PEAR::raiseError(sprintf(_("Failed retrieving the message with ID %s. Original error: %s."), $id, $body->getMessage())); @@ -1023,96 +1074,24 @@ implements Horde_Kolab_Storage_Folder function getStatus() { // Select the folder to update uidnext - $this->_connection->select($this->name); + $this->_driver->select($this->name); - $status = $this->_connection->status($this->name); - $uids = $this->_connection->getUids($this->name); + $status = $this->_driver->status($this->name); + $uids = $this->_driver->getUids($this->name); return array($status['uidvalidity'], $status['uidnext'], $uids); } /** - * Checks to see if a user has a given permission. - * - * @param string $userid The userid of the user. - * @param integer $permission A Horde_Perms::* constant to test for. - * @param string $creator The creator of the shared object. - * - * @return boolean|PEAR_Error Whether or not $userid has $permission. - */ - function hasPermission($userid, $permission, $creator = null) - { - if ($userid == $this->getOwner()) { - return true; - } - - $perm = &$this->getPermission(); - if (is_a($perm, 'PEAR_Error')) { - return $perm; - } - return $perm->hasPermission($userid, $permission, $creator); - } - - /** - * Returns the permissions from this storage object. - * - * @return Horde_Permission_Kolab The permissions on the share. - */ - function &getPermission() - { - if (!isset($this->_perms)) { - if ($this->exists()) { - // The permissions are unknown but the folder exists - // -> discover permissions - $perms = null; - } else { - $perms = array( - 'users' => array( - Horde_Auth::getAuth() => Horde_Perms::ALL - ) - ); - } - $this->_perms = new Horde_Kolab_Storage_Permission($this, $perms); - } - return $this->_perms; - } - - /** - * Sets the permissions on the share. - * - * @param Horde_Permission_Kolab $perms Permission object to store on the - * object. - * @param boolean $update Save the updated information? - * - * @return boolean|PEAR_Error True on success. - */ - function setPermission(&$perms, $update = true) - { - if (!is_a($perms, 'Horde_Perms_Permission')) { - return PEAR::raiseError('The permissions for this share must be specified as an instance of the Horde_Perms_Permission class!'); - } - - if (!is_a($perms, 'Horde_Kolab_Storage_Permission')) { - $this->_perms = new Horde_Kolab_Storage_Permission($this, $perms->data); - } else { - $this->_perms = $perms; - $this->_perms->setFolder($this); - } - - if ($update) { - return $this->save(); - } - - return true; - } - - /** * Return the ACL of this folder. * * @return array An array with ACL. */ - public function getACL() + public function getAcl() { - return $this->_connection->getACL($this->name); + if (!$this->exists()) { + array($this->getDriver()->getAuth() => 'lrid'); + } + return $this->getDriver()->getAcl($this); } /** @@ -1123,14 +1102,11 @@ implements Horde_Kolab_Storage_Folder * * @return NULL */ - public function setACL($user, $acl) + public function setAcl($user, $acl) { - $this->_connection->setACL($this->name, $user, $acl); - - if (!empty($this->_perms)) { - /** Refresh the cache after changing the permissions */ - $this->_perms->getPerm(); - } + $this->getDriver()->setAcl( + $this->getName(), $user, $acl + ); } /** @@ -1140,18 +1116,13 @@ implements Horde_Kolab_Storage_Folder * * @return NULL */ - public function deleteACL($user) + public function deleteAcl($user) { - global $conf; - - if (!empty($conf['kolab']['imap']['no_acl'])) { - return true; - } - - $this->_connection->deleteACL($this->name, $user); + $this->getDriver()->deleteAcl( + $this->getName(), $user + ); } - /** * Get annotation values on IMAP server that do not support * METADATA. @@ -1176,7 +1147,7 @@ implements Horde_Kolab_Storage_Folder global $conf; if (empty($conf['kolab']['imap']['no_annotations'])) { - return $this->_connection->getAnnotation($key, $this->name); + return $this->_driver->getAnnotation($key, $this->name); } if (!isset($this->_annotation_data)) { @@ -1206,7 +1177,7 @@ implements Horde_Kolab_Storage_Folder function _setAnnotation($key, $value) { if (empty($conf['kolab']['imap']['no_annotations'])) { - return $this->_connection->setAnnotation($key, $value, $this->name); + return $this->_driver->setAnnotation($key, $value, $this->name); } if (!isset($this->_annotation_data)) { diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Base.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Base.php index 11640f408..eb35e3938 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Base.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Decorator/Base.php @@ -44,6 +44,42 @@ implements Horde_Kolab_Storage_Folder } /** + * Retrieve the driver for this folder. + * + * @return Horde_Kolab_Storage_Driver The folder driver. + */ + public function getDriver() + { + return $this->_folder->getDriver(); + } + + /** + * Get the permissions for this folder. + * + * @return Horde_Kolab_Storage_Folder_Permission The permission handler. + */ + public function getPermission() + { + return $this->_folder->getPermission(); + } + + /** + * Sets the permissions on this folder. + * + * @param Horde_Kolab_Storage_Folder_Permission $perms Permission object. + * @param boolean $update Save the updated + * information? + * + * @return NULL + */ + public function setPermission( + Horde_Kolab_Storage_Folder_Permission $perms, + $update = true + ) { + $this->_folder->setPermission($perms, $update); + } + + /** * Saves the folder. * * @param array $attributes An array of folder attributes. You can diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission.php new file mode 100644 index 000000000..c0d76b164 --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission.php @@ -0,0 +1,125 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps folder permissions into the Horde_Permission system. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission +extends Horde_Perms_Permission +{ + /** + * The Kolab Folder these permissions belong to. + * + * @var Horde_Kolab_Storage_Folder + */ + private $_folder; + + /** + * The Horde_Group:: handler. + * + * @var Horde_Group + */ + private $_groups; + + /** + * A cache for the folder acl settings. The cache holds the permissions + * in horde compatible format, not in the IMAP permission format. + * + * @var string + */ + public $data; + + /** + * Constructor. + * + * @param string $name The name of the folder. + * @param Horde_Kolab_Storage_Folder $acl The folder these permissions + * belong to. + * @param Horde_Group $groups The group handler. + */ + public function __construct( + $name, + Horde_Kolab_Storage_Folder $folder, + Group $groups + ) { + parent::__construct(__CLASS__ . '::' . $name); + $this->_folder = $folder; + $this->_groups = $groups; + $this->data = $this->getCurrentPermissions(); + } + + /** + * Gets the current permission of the folder and stores the values in the + * cache. + * + * @return NULL + */ + public function getCurrentPermissions() + { + $data = array(); + $acl = new Horde_Kolab_Storage_Folder_Permission_AclIterator( + $this->_folder->getAcl(), + $this->_groups, + $this->_folder->getOwner() + ); + foreach ($acl as $element) { + $element->toHorde($data); + } + return $data; + } + + /** + * Saves the current permission values from the cache to the IMAP folder. + * + * @return NULL + */ + public function save() + { + /** + * @todo: If somebody else accessed the folder before us, we will + * overwrite the change here. + */ + $current = $this->getCurrentPermissions(); + + $elements = new Horde_Kolab_Storage_Folder_Permission_ElementIterator( + $this->data, $this->_groups, $this->_folder->getOwner() + ); + foreach ($elements as $element) { + $this->_folder->setAcl($element->getId(), $element->fromHorde()); + $element->unsetInCurrent($current); + } + + // Delete ACLs that have been removed + $elements = new Horde_Kolab_Storage_Folder_Permission_ElementIterator( + $current, $this->_groups, $this->_folder->getOwner() + ); + foreach ($elements as $element) { + $this->_folder->deleteAcl($element->getId()); + } + + // Load the permission from the folder again + $this->data = $this->getCurrentPermissions(); + } + +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl.php new file mode 100644 index 000000000..2146d9d9c --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl.php @@ -0,0 +1,79 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Kolab_Storage ACL element to the Horde permission system. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +abstract class Horde_Kolab_Storage_Folder_Permission_Acl +{ + /** + * The ACL. + * + * @var string + */ + private $_acl; + + /** + * Constructor. + * + * @param string $acl The folder ACL element as provided by the driver. + */ + public function __construct($acl) + { + $this->_acl = $acl; + } + + /** + * Convert the Acl string to a Horde_Perms:: mask and store it in the + * provided data array. + * + * @param array &$data The horde permission data. + * + * @return NULL + */ + abstract public function toHorde(array &$data); + + /** + * Convert the Acl string to a Horde_Perms:: mask. + * + * @return int The permission mask + */ + protected function convertAclToMask() + { + $result = 0; + if (strpos($this->_acl, 'l') !== false) { + $result |= Horde_Perms::SHOW; + } + if (strpos($this->_acl, 'r') !== false) { + $result |= Horde_Perms::READ; + } + if (strpos($this->_acl, 'i') !== false) { + $result |= Horde_Perms::EDIT; + } + if (strpos($this->_acl, 'd') !== false) { + $result |= Horde_Perms::DELETE; + } + return $result; + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Anonymous.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Anonymous.php new file mode 100644 index 000000000..ca503d70b --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Anonymous.php @@ -0,0 +1,43 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Kolab_Storage anonymous ACL element to the Horde permission system. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Acl_Anonymous +extends Horde_Kolab_Storage_Folder_Permission_Acl +{ + /** + * Convert the Acl string to a Horde_Perms:: mask and store it in the + * provided data array. + * + * @param array &$data The horde permission data. + * + * @return NULL + */ + public function toHorde(array &$data) + { + $data['guest'] = $this->convertAclToMask(); + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Anyone.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Anyone.php new file mode 100644 index 000000000..9ea1e490a --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Anyone.php @@ -0,0 +1,43 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Kolab_Storage known user ACL element to the Horde permission system. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Acl_Anyone +extends Horde_Kolab_Storage_Folder_Permission_Acl +{ + /** + * Convert the Acl string to a Horde_Perms:: mask and store it in the + * provided data array. + * + * @param array &$data The horde permission data. + * + * @return NULL + */ + public function toHorde(array &$data) + { + $data['default'] = $this->convertAclToMask(); + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Creator.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Creator.php new file mode 100644 index 000000000..6ff6c1dc6 --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Creator.php @@ -0,0 +1,43 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Kolab_Storage creator ACL element to the Horde permission system. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Acl_Creator +extends Horde_Kolab_Storage_Folder_Permission_Acl +{ + /** + * Convert the Acl string to a Horde_Perms:: mask and store it in the + * provided data array. + * + * @param array &$data The horde permission data. + * + * @return NULL + */ + public function toHorde(array &$data) + { + $data['creator'] = $this->convertAclToMask(); + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Group.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Group.php new file mode 100644 index 000000000..e13c90feb --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/Group.php @@ -0,0 +1,71 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Kolab_Storage group ACL element to the Horde permission system. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Acl_Group +extends Horde_Kolab_Storage_Folder_Permission_Acl +{ + /** + * The group id. + * + * @var string + */ + private $_id; + + /** + * The group handler. + * + * @var Group + */ + private $_groups; + + /** + * Constructor. + * + * @param string $acl The folder ACL element as provided by the driver. + * @param string $id The group id. + * @param Group $groups The horde group handler. + */ + public function __construct($acl, $id, Group $groups) + { + $this->_id = $id; + $this->_groups = $groups; + parent::__construct($acl); + } + + /** + * Convert the Acl string to a Horde_Perms:: mask and store it in the + * provided data array. + * + * @param array &$data The horde permission data. + * + * @return NULL + */ + public function toHorde(array &$data) + { + $data['groups'][$this->_groups->getGroupId($this->_id)] = $this->convertAclToMask(); + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/User.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/User.php new file mode 100644 index 000000000..d436b3eec --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Acl/User.php @@ -0,0 +1,62 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Kolab_Storage user ACL element to the Horde permission system. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Acl_User +extends Horde_Kolab_Storage_Folder_Permission_Acl +{ + /** + * The group id. + * + * @var string + */ + private $_id; + + /** + * Constructor. + * + * @param string $acl The folder ACL element as provided by the driver. + * @param string $id The group id. + */ + public function __construct($acl, $id) + { + $this->_id = $id; + parent::__construct($acl); + } + + /** + * Convert the Acl string to a Horde_Perms:: mask and store it in the + * provided data array. + * + * @param array &$data The horde permission data. + * + * @return NULL + */ + public function toHorde(array &$data) + { + $data['users'][$this->_id] = $this->convertAclToMask(); + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/AclIterator.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/AclIterator.php new file mode 100644 index 000000000..8f1c778ab --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/AclIterator.php @@ -0,0 +1,93 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps Kolab_Storage ACL to the Horde permission system. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_AclIterator +implements Iterator +{ + /** + * The ACL elements. + * + * @var array + */ + private $_acl = array(); + + /** + * Constructor. + * + * @param array $acl The folder ACL as provided by the driver. + * @param Horde_Group $groups The group handler. + * @param string $creator The ID of the folder creator. + */ + public function __construct(array $acl, Group $groups, $creator) + { + foreach ($acl as $user => $rights) { + if ($user == $creator) { + $this->_acl[] = new Horde_Kolab_Storage_Folder_Permission_Acl_Creator( + $rights + ); + } else if (substr($user, 0, 6) == 'group:') { + $this->_acl[] = new Horde_Kolab_Storage_Folder_Permission_Acl_Group( + $rights, substr($user, 6), $groups + ); + } else if ($user == 'anyone' || $user == 'anonymous'){ + $class = 'Horde_Kolab_Storage_Folder_Permission_Acl_' . ucfirst($user); + $this->_acl[] = new $class( + $rights + ); + } else { + $this->_acl[] = new Horde_Kolab_Storage_Folder_Permission_Acl_User( + $rights, $user + ); + } + } + } + + public function rewind() + { + return reset($this->_acl); + } + + public function current() + { + return current($this->_acl); + } + + public function key() + { + return key($this->_acl); + } + + public function next() + { + return next($this->_acl); + } + + public function valid() + { + return key($this->_acl) !== null; + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element.php new file mode 100644 index 000000000..d3ad63759 --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element.php @@ -0,0 +1,99 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Horde permission element to a Kolab_Storage ACL. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +abstract class Horde_Kolab_Storage_Folder_Permission_Element +{ + /** + * The permission. + * + * @var int + */ + private $_permission; + + /** + * Constructor. + * + * @param int $permission The folder permission as provided by Horde. + */ + public function __construct($permission) + { + $this->_permission = $permission; + } + + /** + * Convert the Horde_Perms:: mask to a Acl string. + * + * @return string The ACL string. + */ + public function fromHorde() + { + return $this->convertMaskToAcl(); + } + + /** + * Get the Kolab_Storage ACL id for this permission. + * + * @return string The ACL string. + */ + abstract public function getId(); + + /** + * Unset the element in the provided permission array. + * + * @param array &$current The current permission array. + * + * @return NULL + */ + public function unsetInCurrent(&$current) + { + unset($current[$this->getId()]); + } + + /** + * Convert the a Horde_Perms:: mask to a Acl string. + * + * @return string The ACL + */ + protected function convertMaskToAcl() + { + $result = ''; + if ($this->_permission & Horde_Perms::SHOW) { + $result .= 'l'; + } + if ($this->_permission & Horde_Perms::READ) { + $result .= 'r'; + } + if ($this->_permission & Horde_Perms::EDIT) { + $result .= 'iswc'; + } + if ($this->_permission & Horde_Perms::DELETE) { + $result .= 'd'; + } + + return $result; + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Creator.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Creator.php new file mode 100644 index 000000000..00f042175 --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Creator.php @@ -0,0 +1,69 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Horde creator permission element to a Kolab_Storage ACL. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Element_Creator +extends Horde_Kolab_Storage_Folder_Permission_Element +{ + /** + * The creator id. + * + * @var string + */ + private $_creator; + + /** + * Constructor. + * + * @param int $permission The folder permission as provided by Horde. + * @param string $creator The folder owner. + */ + public function __construct($permission, $creator) + { + $this->_creator = $creator; + parent::__construct($permission); + } + + /** + * Convert the Horde_Perms:: mask to a Acl string. + * + * @return string The ACL string. + */ + public function fromHorde() + { + return 'a' . $this->convertMaskToAcl(); + } + + /** + * Get the Kolab_Storage ACL id for this permission. + * + * @return string The ACL string. + */ + public function getId() + { + return $this->_creator; + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Default.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Default.php new file mode 100644 index 000000000..e51f5ccc7 --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Default.php @@ -0,0 +1,40 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Horde default permission element to a Kolab_Storage ACL. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Element_Default +extends Horde_Kolab_Storage_Folder_Permission_Element +{ + /** + * Get the Kolab_Storage ACL id for this permission. + * + * @return string The ACL string. + */ + public function getId() + { + return 'anyone'; + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Group.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Group.php new file mode 100644 index 000000000..2bd503093 --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Group.php @@ -0,0 +1,80 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Horde group permission element to a Kolab_Storage ACL. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Element_Group +extends Horde_Kolab_Storage_Folder_Permission_Element +{ + /** + * The Horde group id. + * + * @var string + */ + private $_horde_id; + + /** + * The Kolab group id. + * + * @var string + */ + private $_kolab_id; + + /** + * Constructor. + * + * @param int $permission The folder permission as provided by Horde. + * @param string $id The group id. + * @param Group $groups The horde group handler. + */ + public function __construct($permission, $id, Group $groups) + { + $this->_horde_id = $id; + $this->_kolab_id = 'group:' . $groups->getGroupName($id); + parent::__construct($permission); + } + + /** + * Get the Kolab_Storage ACL id for this permission. + * + * @return string The ACL string. + */ + public function getId() + { + return $this->_kolab_id; + } + + /** + * Unset the element in the provided permission array. + * + * @param array &$current The current permission array. + * + * @return NULL + */ + public function unsetInCurrent(&$current) + { + unset($current['groups'][$this->_horde_id]); + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Guest.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Guest.php new file mode 100644 index 000000000..8fb8fe355 --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/Guest.php @@ -0,0 +1,40 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Horde guest permission element to a Kolab_Storage ACL. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Element_Guest +extends Horde_Kolab_Storage_Folder_Permission_Element +{ + /** + * Get the Kolab_Storage ACL id for this permission. + * + * @return string The ACL string. + */ + public function getId() + { + return 'anonymous'; + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/User.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/User.php new file mode 100644 index 000000000..3dbca78d9 --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/Element/User.php @@ -0,0 +1,72 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps a single Horde user permission element to a Kolab_Storage ACL. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_Element_User +extends Horde_Kolab_Storage_Folder_Permission_Element +{ + /** + * The group id. + * + * @var string + */ + private $_id; + + /** + * Constructor. + * + * @param int $permission The folder permission as provided by Horde. + * @param string $id The user id. + */ + public function __construct($permission, $id) + { + $this->_id = $id; + parent::__construct($permission); + } + + /** + * Get the Kolab_Storage ACL id for this permission. + * + * @return string The ACL string. + */ + public function getId() + { + return $this->_id; + } + + /** + * Unset the element in the provided permission array. + * + * @param array &$current The current permission array. + * + * @return NULL + */ + public function unsetInCurrent(&$current) + { + unset($current['users'][$this->getId()]); + } + +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/ElementIterator.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/ElementIterator.php new file mode 100644 index 000000000..807cdff32 --- /dev/null +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder/Permission/ElementIterator.php @@ -0,0 +1,100 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Maps Horde permission elements into Kolab_Storage ACL. + * + * Copyright 2006-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_Folder_Permission_ElementIterator +implements Iterator +{ + /** + * The Horde permission elements. + * + * @var array + */ + private $_elements = array(); + + /** + * Constructor. + * + * @param array $permissions The folder permissions as provided by Horde. + * @param Horde_Group $groups The group handler. + * @param string $creator The ID of the folder creator. + */ + public function __construct(array $permissions, Group $groups, $creator) + { + foreach ($permissions as $user => $user_perms) { + if ($user == 'default') { + $this->_elements[] = new Horde_Kolab_Storage_Folder_Permission_Element_Default( + $user_perms + ); + } else if ($user == 'guest') { + $this->_elements[] = new Horde_Kolab_Storage_Folder_Permission_Element_Guest( + $user_perms + ); + } else if ($user == 'creator') { + $this->_elements[] = new Horde_Kolab_Storage_Folder_Permission_Element_Creator( + $user_perms, $creator + ); + } else if ($user == 'groups') { + foreach ($user_perms as $user_entry => $perms) { + $this->_elements[] = new Horde_Kolab_Storage_Folder_Permission_Element_Group( + $perms, $user_entry, $groups + ); + } + } else if ($user == 'users') { + foreach ($user_perms as $user_entry => $perms) { + $this->_elements[] = new Horde_Kolab_Storage_Folder_Permission_Element_User( + $perms, $user_entry + ); + } + } + } + } + + public function rewind() + { + return reset($this->_elements); + } + + public function current() + { + return current($this->_elements); + } + + public function key() + { + return key($this->_elements); + } + + public function next() + { + return next($this->_elements); + } + + public function valid() + { + return key($this->_elements) !== null; + } +} diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace/Imap.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace/Imap.php index 1748227bb..b9f41aef0 100644 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace/Imap.php +++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Namespace/Imap.php @@ -35,7 +35,7 @@ extends Horde_Kolab_Storage_Namespace_Config /** * Constructor. */ - public function __construct(array $namespaces, array $configuration) + public function __construct(array $namespaces, array $configuration = array()) { $c = array(); foreach ($namespaces as $namespace) { diff --git a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Permission.php b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Permission.php deleted file mode 100644 index 2fc3b7588..000000000 --- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Permission.php +++ /dev/null @@ -1,402 +0,0 @@ - - * @license http://www.fsf.org/copyleft/lgpl.html LGPL - * @link http://pear.horde.org/index.php?package=Kolab_Storage - */ - -/** - * The Autoloader allows us to omit "require/include" statements. - */ -require_once 'Horde/Autoloader.php'; - -/** - * Packages that aren't autoloadable yet - */ -require_once 'Horde/Group.php'; - -/** - * The Horde_Kolab_Storage_Permission provides a bridge between Horde Permission - * handling and the IMAP permission system used on the Kolab server. - * - * Copyright 2006-2010 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_Storage - * @author Gunnar Wrobel - * @license http://www.fsf.org/copyleft/lgpl.html LGPL - * @link http://pear.horde.org/index.php?package=Kolab_Storage - */ -class Horde_Kolab_Storage_Permission extends Horde_Perms_Permission -{ - /** - * The folder name. - * - * @var string - */ - protected $_folder; - - /** - * A cache for the folder acl settings. The cache holds the permissions - * in horde compatible format, not in the IMAP permission format. - * - * @var string - */ - public $data; - - /** - * A cache for the raw IMAP folder acl settings. - * - * @var string - */ - protected $acl; - - /** - * Constructor. - * - * @param Horde_Kolab_Storage_Folder $folder The Kolab Folder these - * permissions belong to. - * @param array $perms A set of initial - * permissions. - */ - public function __construct($folder, $perms = null) - { - $this->setFolder($folder); - if (!isset($perms)) { - $result = $this->getPerm(); - if ($result instanceOf PEAR_Error) { - Horde::logMessage(sprintf("Failed parsing permission information. Error was: %s", $result->getMessage()), 'INFO'); - } else { - $perms = $result; - } - } - $this->data = $perms; - - } - - /** - * Returns the properties that need to be serialized. - * - * @return array List of serializable properties. - */ - public function __sleep() - { - $properties = get_object_vars($this); - unset($properties['_folder']); - $properties = array_keys($properties); - return $properties; - } - - /** - * Sets the folder object for this permission object. - * - * @param Horde_Kolab_Storage_Folder $folder Kolab Folder object. - */ - public function setFolder(Horde_Kolab_Storage_Folder $folder) - { - $this->_folder = $folder; - } - - /** - * Gets one of the attributes of the object, or null if it isn't defined. - * - * @param string $attribute The attribute to get. - * - * @return mixed The value of the attribute, or null. - */ - public function get($attribute) - { - // This object only handles permissions. So only return these - switch ($attribute) { - case 'perm': - return $this->data; - case 'type': - return 'matrix'; - default: - // User requested something other than permissions: return null - return null; - } - } - - /** - * Gets the current permission of the folder and stores the values in the - * cache. - * - * @return array|PEAR_Error The data array representing the permissions. - */ - public function getPerm() - { - try { - $acl = $this->_folder->getACL(); - } catch (Horde_Kolab_Storage_Exception $e) { - Horde::logMessage($acl, 'INFO'); - return array(); - } - if (empty($acl)) { - return array(); - } - $this->acl = &$acl; - - // Loop through the returned users - $data = array(); - foreach ($acl as $user => $r) { - // Convert the user rights to horde format - $result = 0; - $rights = join('', $r); - for ($i = 0, $j = strlen($rights); $i < $j; $i++) { - switch ($rights[$i]) { - case 'l': - $result |= Horde_Perms::SHOW; - break; - case 'r': - $result |= Horde_Perms::READ; - break; - case 'i': - $result |= Horde_Perms::EDIT; - break; - case 'd': - $result |= Horde_Perms::DELETE; - break; - } - } - - // Check for special users - $name = ''; - switch ($user) { - case 'anyone': - $name = 'default'; - break; - case 'anonymous': - $name = 'guest'; - break; - } - - // Did we have a special user? - if ($name) { - // Store the converted acl in the cache - $data[$name] = $result; - continue; - } - - // Is it a group? - if (substr($user, 0, 6) == 'group:') { - if (!isset($groups)) { - $groups = Group::singleton(); - } - $group_id = $groups->getGroupId(substr($user, 6)); - if ($group_id instanceOf PEAR_Error) { - // Store the converted acl in the cache - $data['groups'][$group_id] = $result; - } - - continue; - } - - // Standard user - // Store the converted acl in the cache - $data['users'][$user] = $result; - } - - return $data; - } - - /** - * Saves the current permission values from the cache to the IMAP folder. - * - * @return boolean|PEAR_Error True on success, false if there is - * nothing to save. - */ - public function save() - { - if (!isset($this->data)) { - return false; - } - - // FIXME: If somebody else accessed the folder before us, we will overwrite - // the change here. - $current = $this->getPerm(); - - foreach ($this->data as $user => $user_perms) { - if (is_array($user_perms)) { - foreach ($user_perms as $userentry => $perms) { - if ($user == 'groups') { - if (!isset($groups)) { - $groups = Group::singleton(); - } - // Convert group id back to name - $group_name = $groups->getGroupName($userentry); - $name = 'group:' . $group_name; - } else if ($user == 'users') { - $name = $userentry; - } else { - continue; - } - $this->savePermission($name, $perms); - unset($current[$user][$userentry]); - } - } else { - if ($user == 'default') { - $name = 'anyone'; - } else if ($user == 'guest') { - $name = 'anonymous'; - } else { - continue; - } - $this->savePermission($name, $user_perms); - unset($current[$user]); - } - } - - // Delete ACLs that have been removed - foreach ($current as $user => $user_perms) { - if (is_array($user_perms)) { - foreach ($user_perms as $userentry => $perms) { - if ($user == 'groups') { - if (!isset($groups)) { - $groups = Group::singleton(); - } - // Convert group id back to name - $group_name = $groups->getGroupName($userentry); - $name = 'group:' . $group_name; - } else { - $name = $userentry; - } - - $this->_folder->deleteACL($name); - } - } else { - if ($user == 'default') { - $name = 'anyone'; - } else if ($user == 'guest') { - $name = 'anonymous'; - } else { - continue; - } - $this->_folder->deleteACL($name); - } - } - - // Load the permission from the folder again - $this->data = $this->getPerm(); - - return true; - } - - /** - * Saves the specified permission values for the given user on the - * IMAP folder. - * - * @return boolean|PEAR_Error True on success. - */ - public function savePermission($user, $perms) - { - // Convert the horde permission style to IMAP permissions - $result = $user == $this->_folder->getOwner() ? 'a' : ''; - if ($perms & Horde_Perms::SHOW) { - $result .= 'l'; - } - if ($perms & Horde_Perms::READ) { - $result .= 'r'; - } - if ($perms & Horde_Perms::EDIT) { - $result .= 'iswc'; - } - if ($perms & Horde_Perms::DELETE) { - $result .= 'd'; - } - - return $this->_folder->setACL($user, $result); - } - - /** - * Finds out what rights the given user has to this object. - * - * @param string $user The user to check for. Defaults to the current - * user. - * @param string $creator The user who created the object. - * - * @return mixed A bitmask of permissions, a permission value, or - * an array of permission values the user has, - * depending on the permission type and whether the - * permission value is ambiguous. False if there is - * no such permsission. - */ - public function getPermissions($user = null, $creator = null) - { - if ($user === null) { - $user = Auth::getAuth(); - } - // If $creator was specified, check creator permissions. - if ($creator !== null) { - // If the user is the creator see if there are creator - // permissions. - if (strlen($user) && $user === $creator && - ($perms = $this->getCreatorPermissions()) !== null) { - return $perms; - } - } - - // Check user-level permissions. - $userperms = $this->getUserPermissions(); - if (isset($userperms[$user])) { - return $userperms[$user]; - } - - // If no user permissions are found, try group permissions. - $groupperms = $this->getGroupPermissions(); - if (!empty($groupperms)) { - $groups = Group::singleton(); - - $composite_perm = null; - foreach ($this->data['groups'] as $group => $perm) { - $result = $groups->userIsInGroup($user, $group); - if (is_a($result, 'PEAR_Error')) { - return $result; - } - - if ($result) { - if ($composite_perm === null) { - $composite_perm = 0; - } - $composite_perm |= $perm; - } - } - - if ($composite_perm !== null) { - return $composite_perm; - } - } - - // If there are default permissions, return them. - if (($perms = $this->getDefaultPermissions()) !== null) { - return $perms; - } - - // Otherwise, deny all permissions to the object. - return false; - } - - /** - * Finds out if the user has the specified rights to the given object. - * - * @param string $user The user to check for. - * @param integer $perm The permission level that needs to be checked - * for. - * @param string $creator The creator of the shared object. - * - * @return boolean True if the user has the specified permissions. - */ - public function hasPermission($user, $perm, $creator = null) - { - return ($this->getPermissions($user, $creator) & $perm); - } -} diff --git a/framework/Kolab_Storage/package.xml b/framework/Kolab_Storage/package.xml index 86297d753..e154aaa1b 100644 --- a/framework/Kolab_Storage/package.xml +++ b/framework/Kolab_Storage/package.xml @@ -31,8 +31,8 @@ jan@horde.org yes - 2010-03-11 - + 2010-04-07 + 0.4.0 0.1.0 @@ -76,32 +76,52 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - + + + + + + @@ -111,13 +131,15 @@ + - + + @@ -125,6 +147,7 @@ + @@ -209,27 +232,43 @@ + + + - + + + + + + + + + + + + + + + + - - - - + - + + @@ -303,9 +342,11 @@ alpha alpha - 2010-03-11 + 2010-04-07 LGPL +* Added namespace support (Bug #6691). +* Converted the package to Horde 4 / PHP 5. * Fixed list driver to prevent overwriting folder data when authenticating twice (relevant for testing). * Allow to supress triggering (relevant for testing). diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/AclTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/AclTest.php new file mode 100644 index 000000000..109d8b28e --- /dev/null +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/AclTest.php @@ -0,0 +1,213 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Prepare the test setup. + */ +require_once 'Autoload.php'; + +/** + * Test the handling of ACL. + * + * Copyright 2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_AclTest extends PHPUnit_Framework_TestCase +{ + public function setUp() + { + $this->_storage = $this->getMock('Horde_Kolab_Storage', array(), array(), '', false, false); + $this->_imap = $this->getMock('Horde_Imap_Client_Socket', array(), array(), '', false, false); + $this->groups = $this->getMock('Group', array(), array(), '', false, false); + $this->_connection = new Horde_Kolab_Storage_Driver_Imap($this->_imap, $this->groups); + $this->_imap->expects($this->any()) + ->method('getNamespaces') + ->will( + $this->returnValue( + array( + array( + 'name' => 'INBOX/', + 'type' => Horde_Kolab_Storage_Namespace::PERSONAL, + 'delimiter' => '/', + ), + array( + 'name' => 'user/', + 'type' => Horde_Kolab_Storage_Namespace::OTHER, + 'delimiter' => '/', + ), + array( + 'name' => '', + 'type' => Horde_Kolab_Storage_Namespace::SHARED, + 'delimiter' => '/', + ) + ) + ) + ); + } + + public function testGetaclRetrievesFolderAcl() + { + $this->_supportAcl(); + $this->_imap->expects($this->once()) + ->method('listMailboxes') + ->will($this->returnValue(array('INBOX'))); + $this->_imap->expects($this->once()) + ->method('getAcl') + ->with('INBOX') + ->will($this->returnValue(array('user' => array('l', 'r', 'a')))); + $folder = $this->_getFolder('INBOX'); + $this->assertEquals(array('user' => 'lra'), $folder->getAcl()); + } + + public function testGetaclRetrievesMyFolderAclOnFolderWithNoAdminRights() + { + $this->_supportAcl(); + $this->_imap->expects($this->once()) + ->method('listMailboxes') + ->will($this->returnValue(array('INBOX'))); + $this->_imap->expects($this->once()) + ->method('getAcl') + ->with('INBOX') + ->will($this->throwException(new Horde_Imap_Client_Exception())); + $this->_imap->expects($this->once()) + ->method('getMyACLRights') + ->with('INBOX') + ->will($this->returnValue('lr')); + $this->_imap->expects($this->any()) + ->method('getParam') + ->with('username') + ->will($this->returnValue('user')); + $folder = $this->_getFolder('INBOX'); + $this->assertEquals(array('user' => 'lr'), $folder->getAcl()); + } + + public function testGetaclRetrievesMyFolderAclOnForeignFolderWithNoAdminRights() + { + $this->_supportAcl(); + $this->_imap->expects($this->once()) + ->method('listMailboxes') + ->will($this->returnValue(array('INBOX'))); + $this->_imap->expects($this->once()) + ->method('getMyACLRights') + ->with('user/test') + ->will($this->returnValue('lr')); + $this->_imap->expects($this->any()) + ->method('getParam') + ->with('username') + ->will($this->returnValue('test')); + $folder = $this->_getFolder('user/test'); + $this->assertEquals(array('test' => 'lr'), $folder->getAcl()); + } + + public function testGetaclRetrievesAllFolderAclOnForeignFolderWithAdminRights() + { + $this->_supportAcl(); + $this->_imap->expects($this->once()) + ->method('listMailboxes') + ->will($this->returnValue(array('INBOX'))); + $this->_imap->expects($this->once()) + ->method('getMyACLRights') + ->with('user/test') + ->will($this->returnValue('lra')); + $this->_imap->expects($this->once()) + ->method('getAcl') + ->with('user/test') + ->will($this->returnValue(array('test' => 'lra'))); + $this->_imap->expects($this->any()) + ->method('getParam') + ->with('username') + ->will($this->returnValue('test')); + $folder = $this->_getFolder('user/test'); + $this->assertEquals(array('test' => 'lra'), $folder->getAcl()); + } + + public function testSetacletsFolderAcl() + { + $this->_supportAcl(); + $this->_imap->expects($this->once()) + ->method('setAcl') + ->with('INBOX', 'user', array('rights' => 'lra')); + $folder = $this->_getFolder('INBOX'); + $folder->setAcl('user', 'lra'); + } + + public function testDeleteaclDeletesFolderAcl() + { + $this->_supportAcl(); + $this->_imap->expects($this->once()) + ->method('setAcl') + ->with('INBOX', 'user', array('remove' => true)); + $folder = $this->_getFolder('INBOX'); + $folder->deleteAcl('user'); + } + + public function testGetaclRetrievesDefaultAclIfAclAreNotSupported() + { + $this->_imap->expects($this->once()) + ->method('queryCapability') + ->with('ACL') + ->will($this->returnValue(false)); + $this->_imap->expects($this->once()) + ->method('listMailboxes') + ->will($this->returnValue(array('INBOX'))); + $this->_imap->expects($this->any()) + ->method('getParam') + ->with('username') + ->will($this->returnValue('user')); + $folder = $this->_getFolder('INBOX'); + $this->assertEquals(array('user' => 'lrid'), $folder->getAcl()); + } + + public function testSetaclDoesNothingIfAclAreNotSupported() + { + $this->_imap->expects($this->once()) + ->method('queryCapability') + ->with('ACL') + ->will($this->returnValue(false)); + $folder = $this->_getFolder('INBOX'); + $folder->setAcl('user', 'lr'); + } + + public function testDeleteaclDoesNothingIfAclAreNotSupported() + { + $this->_imap->expects($this->once()) + ->method('queryCapability') + ->with('ACL') + ->will($this->returnValue(false)); + $folder = $this->_getFolder('INBOX'); + $folder->deleteAcl('user', 'lr'); + } + + private function _getFolder($name) + { + $folder = new Horde_Kolab_Storage_Folder_Base($name); + $folder->restore($this->_storage, $this->_connection); + return $folder; + } + + private function _supportAcl() + { + $this->_imap->expects($this->any()) + ->method('queryCapability') + ->with($this->logicalOr('ACL', 'NAMESPACE')) + ->will($this->returnValue(true)); + } +} \ No newline at end of file diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Autoload.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Autoload.php index 0b602f4f5..a3652c4c2 100644 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/Autoload.php +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/Autoload.php @@ -46,4 +46,6 @@ if (!defined('HORE_KOLAB_STORAGE_TESTS')) { } Horde_Autoloader::addClassPath(HORE_KOLAB_STORAGE_TESTS); -} \ No newline at end of file +} + +require_once 'Horde/Group.php'; diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/NamespaceTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/NamespaceTest.php index f408733b8..9af29823a 100644 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/NamespaceTest.php +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/NamespaceTest.php @@ -83,7 +83,9 @@ class Horde_Kolab_Storage_NamespaceTest extends PHPUnit_Framework_TestCase public function testFolderTitleIsAccessibleForNewFolders() { foreach ($this->_getNamespaces() as $namespace) { - $_SESSION['horde_auth']['userId'] = 'test'; + $this->_connection->expects($this->any()) + ->method('getAuth') + ->will($this->returnValue('test')); $folder = $this->_getFolder(null, $namespace); $folder->setName('test'); $this->assertEquals('test', $folder->getTitle()); @@ -93,7 +95,9 @@ class Horde_Kolab_Storage_NamespaceTest extends PHPUnit_Framework_TestCase public function testFolderOwnerIsCurrentUserIfPrefixMatchesPersonalNamespace() { foreach ($this->_getNamespaces() as $namespace) { - $_SESSION['horde_auth']['userId'] = 'test'; + $this->_connection->expects($this->any()) + ->method('getAuth') + ->will($this->returnValue('test')); $folder = $this->_getFolder('INBOX', $namespace); $this->assertEquals('test', $folder->getOwner()); } @@ -102,7 +106,9 @@ class Horde_Kolab_Storage_NamespaceTest extends PHPUnit_Framework_TestCase public function testFolderOwnerIsCurrentUserIfPrefixContainsPersonalNamespace() { foreach ($this->_getNamespaces() as $namespace) { - $_SESSION['horde_auth']['userId'] = 'test'; + $this->_connection->expects($this->any()) + ->method('getAuth') + ->will($this->returnValue('test')); $folder = $this->_getFolder('INBOX/mine', $namespace); $this->assertEquals('test', $folder->getOwner()); } @@ -135,7 +141,9 @@ class Horde_Kolab_Storage_NamespaceTest extends PHPUnit_Framework_TestCase public function testFolderOwnerIsAccessibleForNewFolders() { foreach ($this->_getNamespaces() as $namespace) { - $_SESSION['horde_auth']['userId'] = 'test'; + $this->_connection->expects($this->any()) + ->method('getAuth') + ->will($this->returnValue('test')); $folder = $this->_getFolder(null, $namespace); $folder->setName('test'); $this->assertEquals('test', $folder->getOwner()); @@ -145,7 +153,9 @@ class Horde_Kolab_Storage_NamespaceTest extends PHPUnit_Framework_TestCase public function testFolderOwnerHasDomainFromFolderDomain() { foreach ($this->_getNamespaces() as $namespace) { - $_SESSION['horde_auth']['userId'] = 'test@example.com'; + $this->_connection->expects($this->any()) + ->method('getAuth') + ->will($this->returnValue('test@example.com')); $folder = $this->_getFolder('user/test/mine', $namespace); $this->assertEquals('test@example.com', $folder->getOwner()); } diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/PermissionTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/PermissionTest.php new file mode 100644 index 000000000..47aec9e9d --- /dev/null +++ b/framework/Kolab_Storage/test/Horde/Kolab/Storage/PermissionTest.php @@ -0,0 +1,361 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ + +/** + * Prepare the test setup. + */ +require_once 'Autoload.php'; + +/** + * Test the Kolab permission handler. + * + * Copyright 2008-2010 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_Storage + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Storage + */ +class Horde_Kolab_Storage_PermissionTest extends PHPUnit_Framework_TestCase +{ + public function setUp() + { + $this->folder = $this->getMock('Horde_Kolab_Storage_Folder_Base', array(), array(), '', false, false); + $this->groups = $this->getMock('Group', array(), array(), '', false, false); + $this->perms = new Horde_Perms(); + } + + public function testConstruct() + { + $this->folder->expects($this->once()) + ->method('getAcl') + ->will($this->returnValue(array('test' => 'l'))); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $this->assertEquals('matrix', $permission->get('type')); + } + + public function testImapListAclResultsInShowPermission() + { + $this->folder->expects($this->once()) + ->method('getAcl') + ->will($this->returnValue(array('test' => 'l'))); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $this->assertTrue((bool) $this->perms->hasPermission($permission, 'test', Horde_Perms::SHOW)); + } + + public function testImapReadAclResultsInReadPermission() + { + $this->folder->expects($this->once()) + ->method('getAcl') + ->will($this->returnValue(array('test' => 'r'))); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $this->assertTrue((bool) $this->perms->hasPermission($permission, 'test', Horde_Perms::READ)); + } + + public function testImapEditAclResultsInEditPermission() + { + $this->folder->expects($this->once()) + ->method('getAcl') + ->will($this->returnValue(array('test' => 'i'))); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $this->assertTrue((bool) $this->perms->hasPermission($permission, 'test', Horde_Perms::EDIT)); + } + + public function testImapDeleteAclResultsInDeletePermission() + { + $this->folder->expects($this->once()) + ->method('getAcl') + ->will($this->returnValue(array('test' => 'd'))); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $this->assertTrue((bool) $this->perms->hasPermission($permission, 'test', Horde_Perms::DELETE)); + } + + public function testImapAnonymousUserMapsToGuestUsers() + { + $this->folder->expects($this->once()) + ->method('getAcl') + ->will($this->returnValue(array('anonymous' => 'lrid'))); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $this->assertEquals(Horde_Perms::ALL, $permission->getGuestPermissions()); + } + + public function testImapAnyoneUserMapsToDefaultUsers() + { + $this->folder->expects($this->once()) + ->method('getAcl') + ->will($this->returnValue(array('anyone' => 'lrid'))); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $this->assertEquals(Horde_Perms::ALL, $permission->getDefaultPermissions()); + } + + public function testImapOwnerUserMapsToCreator() + { + $storage = $this->getMock('Horde_Kolab_Storage', array(), array(), '', false, false); + $connection = $this->getMock('Horde_Kolab_Storage_Driver'); + $connection->expects($this->any()) + ->method('getNamespace') + ->will( + $this->returnValue( + new Horde_Kolab_Storage_Namespace_Imap( + array( + array( + 'type' => Horde_Kolab_Storage_Namespace::PERSONAL, + 'name' => 'INBOX/', + 'delimiter' => '/', + 'add' => true, + ) + ) + ) + ) + ); + $connection->expects($this->any()) + ->method('getAuth') + ->will($this->returnValue('test')); + $connection->expects($this->once()) + ->method('getAcl') + ->will($this->returnValue(array('test' => 'lrid'))); + $folder = new Horde_Kolab_Storage_Folder_Base('INBOX/test'); + $folder->restore($storage, $connection); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $folder, $this->groups + ); + $this->assertEquals(Horde_Perms::ALL, $permission->getCreatorPermissions()); + } + + public function testImapGroupMapsToHordeGroup() + { + $this->groups->expects($this->once()) + ->method('getGroupId') + ->with('test') + ->will($this->returnValue('horde_test')); + $this->folder->expects($this->once()) + ->method('getAcl') + ->will($this->returnValue(array('group:test' => 'lrid'))); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $this->assertEquals(array('horde_test' => Horde_Perms::ALL), $permission->getGroupPermissions()); + } + + public function testShowPermissionResultsInImapListAcl() + { + $this->folder->expects($this->exactly(3)) + ->method('getAcl') + ->will($this->returnValue(array())); + $this->folder->expects($this->once()) + ->method('setAcl') + ->with('test', 'l'); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $permission->addUserPermission('test', Horde_Perms::SHOW, true); + } + + public function testReadPermissionResultsInImapReadAcl() + { + $this->folder->expects($this->exactly(3)) + ->method('getAcl') + ->will($this->returnValue(array())); + $this->folder->expects($this->once()) + ->method('setAcl') + ->with('test', 'r'); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $permission->addUserPermission('test', Horde_Perms::READ, true); + } + + public function testEditPermissionResultsInImapEditAcl() + { + $this->folder->expects($this->exactly(3)) + ->method('getAcl') + ->will($this->returnValue(array())); + $this->folder->expects($this->once()) + ->method('setAcl') + ->with('test', 'iswc'); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $permission->addUserPermission('test', Horde_Perms::EDIT, true); + } + + public function testDeletePermissionResultsInImapDeleteAcl() + { + $this->folder->expects($this->exactly(3)) + ->method('getAcl') + ->will($this->returnValue(array())); + $this->folder->expects($this->once()) + ->method('setAcl') + ->with('test', 'd'); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $permission->addUserPermission('test', Horde_Perms::DELETE, true); + } + + public function testGuestUsersMapsToImapAnonymousUser() + { + $this->folder->expects($this->exactly(3)) + ->method('getAcl') + ->will($this->returnValue(array())); + $this->folder->expects($this->once()) + ->method('setAcl') + ->with('anonymous', 'lriswcd'); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $permission->addGuestPermission(Horde_Perms::ALL, true); + } + + public function testDefaultUsersMapsToImapAnyoneUser() + { + $this->folder->expects($this->exactly(3)) + ->method('getAcl') + ->will($this->returnValue(array())); + $this->folder->expects($this->once()) + ->method('setAcl') + ->with('anyone', 'lriswcd'); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $permission->addDefaultPermission(Horde_Perms::ALL, true); + } + + public function testCreatorMapsToImapOwnerUser() + { + $storage = $this->getMock('Horde_Kolab_Storage', array(), array(), '', false, false); + $connection = $this->getMock('Horde_Kolab_Storage_Driver'); + $connection->expects($this->any()) + ->method('getNamespace') + ->will( + $this->returnValue( + new Horde_Kolab_Storage_Namespace_Imap( + array( + array( + 'type' => Horde_Kolab_Storage_Namespace::PERSONAL, + 'name' => 'INBOX/', + 'delimiter' => '/', + 'add' => true, + ) + ) + ) + ) + ); + $connection->expects($this->any()) + ->method('getAuth') + ->will($this->returnValue('test')); + $connection->expects($this->exactly(3)) + ->method('getAcl') + ->will($this->returnValue(array())); + $connection->expects($this->once()) + ->method('setAcl') + ->with('INBOX/test', 'test', 'alriswcd'); + $folder = new Horde_Kolab_Storage_Folder_Base('INBOX/test'); + $folder->restore($storage, $connection); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $folder, $this->groups + ); + $permission->addCreatorPermission(Horde_Perms::ALL, true); + } + + public function testHordeGroupMapsToImapGroup() + { + $this->groups->expects($this->once()) + ->method('getGroupName') + ->with('horde_test') + ->will($this->returnValue('test')); + $this->folder->expects($this->exactly(3)) + ->method('getAcl') + ->will($this->returnValue(array())); + $this->folder->expects($this->once()) + ->method('setAcl') + ->with('group:test', 'lriswcd'); + $permission = new Horde_Kolab_Storage_Folder_Permission( + 'test', $this->folder, $this->groups + ); + $permission->addGroupPermission('horde_test', Horde_Perms::ALL, true); + } + + /** + * Test saving permissions + */ + public function testSave() + { + $this->markTestIncomplete('Currently broken'); + $GLOBALS['conf']['auth']['driver'] = 'auto'; + $GLOBALS['conf']['group']['driver'] = 'mock'; + + $folder = new DummyFolder( + array( + 'wrobel' => array('l', 'r', 'i', 'd'), + 'reader' => array('l', 'r'), + 'viewer' => array('l'), + 'editor' => array('l', 'r', 'e'), + 'anyone' => array('l'), + 'anonymous' => array(''), + 'group:editors' => array('l', 'r', 'e') + ), + 'wrobel' + ); + $perms = new Horde_Kolab_Storage_Folder_Permissions_Default($folder); + $data = $perms->getData(); + unset($data['guest']); + unset($data['default']); + unset($data['users']['viewer']); + $data['users']['editor'] = Horde_Perms::ALL; + $data['users']['test'] = Horde_Perms::SHOW | Horde_Perms::READ; + $data['groups']['group'] = Horde_Perms::SHOW | Horde_Perms::READ; + $perms->setData($data); + $perms->save(); + $this->assertNotContains('anyone', array_keys($folder->acl)); + $this->assertNotContains('anonymous', array_keys($folder->acl)); + $this->assertEquals('lr', join('', $folder->acl['test'])); + $this->assertEquals('lriswcd', join('', $folder->acl['editor'])); + $this->assertEquals('alriswcd', join('', $folder->acl['wrobel'])); + } + + /** + * Test using Horde permissions. + */ + public function testHordePermissions() + { + $this->markTestIncomplete('Currently broken'); + $GLOBALS['conf']['auth']['driver'] = 'auto'; + $GLOBALS['conf']['group']['driver'] = 'mock'; + + $folder = new DummyFolder(array(), 'wrobel'); + $hperms = new Horde_Perms_Permission('test'); + $hperms->addUserPermission('wrobel', Horde_Perms::SHOW, false); + $perms = new Horde_Kolab_Storage_Folder_Permissions_Default($folder, $hperms->data); + $perms->save(); + $this->assertEquals('al', join('', $folder->acl['wrobel'])); + } +} diff --git a/framework/Kolab_Storage/test/Horde/Kolab/Storage/PermsTest.php b/framework/Kolab_Storage/test/Horde/Kolab/Storage/PermsTest.php deleted file mode 100644 index f5154aca5..000000000 --- a/framework/Kolab_Storage/test/Horde/Kolab/Storage/PermsTest.php +++ /dev/null @@ -1,176 +0,0 @@ - - * @license http://www.fsf.org/copyleft/lgpl.html LGPL - * @link http://pear.horde.org/index.php?package=Kolab_Storage - */ - -/** - * Prepare the test setup. - */ -require_once 'Autoload.php'; - -/** - * Test the Kolab permission handler. - * - * Copyright 2008-2010 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_Storage - * @author Gunnar Wrobel - * @license http://www.fsf.org/copyleft/lgpl.html LGPL - * @link http://pear.horde.org/index.php?package=Kolab_Storage - */ -class Horde_Kolab_Storage_PermsTest extends PHPUnit_Framework_TestCase -{ - - /** - * Test class construction. - */ - public function testConstruct() - { - $folder = new DummyFolder(null); - $perms = new Horde_Kolab_Storage_Permission($folder); - $this->assertEquals(array(), $perms->get('perm')); - $permissions = array('users' => - array( - 'wrobel' => Horde_Perms::ALL - )); - $perms = new Horde_Kolab_Storage_Permission($folder, $permissions); - $this->assertTrue(is_array($perms->get('perm'))); - } - - /** - * Test retrieving permissions. - */ - public function testGetPerm() - { - $this->markTestIncomplete('Currently broken'); - $GLOBALS['conf']['auth']['driver'] = 'auto'; - $GLOBALS['conf']['group']['driver'] = 'mock'; - - $folder = new DummyFolder( - array( - 'wrobel' => array('l', 'r', 'i', 'd'), - 'reader' => array('l', 'r'), - 'viewer' => array('l'), - 'editor' => array('l', 'r', 'e'), - 'anyone' => array('l'), - 'anonymous' => array(''), - 'group:editors' => array('l', 'r', 'e') - ) - ); - $perms = new Horde_Kolab_Storage_Permission($folder); - $data = $perms->getData(); - $this->assertContains('users', array_keys($data)); - $this->assertContains('wrobel', array_keys($data['users'])); - $this->assertContains('reader', array_keys($data['users'])); - $this->assertContains('groups', array_keys($data)); - $this->assertContains('default', array_keys($data)); - $this->assertContains('guest', array_keys($data)); - } - - /** - * Test saving permissions - */ - public function testSave() - { - $GLOBALS['conf']['auth']['driver'] = 'auto'; - $GLOBALS['conf']['group']['driver'] = 'mock'; - - $folder = new DummyFolder( - array( - 'wrobel' => array('l', 'r', 'i', 'd'), - 'reader' => array('l', 'r'), - 'viewer' => array('l'), - 'editor' => array('l', 'r', 'e'), - 'anyone' => array('l'), - 'anonymous' => array(''), - 'group:editors' => array('l', 'r', 'e') - ), - 'wrobel' - ); - $perms = new Horde_Kolab_Storage_Permission($folder); - $data = $perms->getData(); - unset($data['guest']); - unset($data['default']); - unset($data['users']['viewer']); - $data['users']['editor'] = Horde_Perms::ALL; - $data['users']['test'] = Horde_Perms::SHOW | Horde_Perms::READ; - $data['groups']['group'] = Horde_Perms::SHOW | Horde_Perms::READ; - $perms->setData($data); - $perms->save(); - $this->assertNotContains('anyone', array_keys($folder->acl)); - $this->assertNotContains('anonymous', array_keys($folder->acl)); - $this->assertEquals('lr', join('', $folder->acl['test'])); - $this->assertEquals('lriswcd', join('', $folder->acl['editor'])); - $this->assertEquals('alriswcd', join('', $folder->acl['wrobel'])); - } - - /** - * Test using Horde permissions. - */ - public function testHordePermissions() - { - $GLOBALS['conf']['auth']['driver'] = 'auto'; - $GLOBALS['conf']['group']['driver'] = 'mock'; - - $folder = new DummyFolder(array(), 'wrobel'); - $hperms = new Horde_Perms_Permission('test'); - $hperms->addUserPermission('wrobel', Horde_Perms::SHOW, false); - $perms = new Horde_Kolab_Storage_Permission($folder, $hperms->data); - $perms->save(); - $this->assertEquals('al', join('', $folder->acl['wrobel'])); - } -} - -/** - * A dummy folder representation to test the Kolab permission handler. - * - * Copyright 2008-2010 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_Storage - * @author Gunnar Wrobel - * @license http://www.fsf.org/copyleft/lgpl.html LGPL - * @link http://pear.horde.org/index.php?package=Kolab_Storage - */ -class DummyFolder extends Horde_Kolab_Storage_Folder_Base -{ - var $acl; - var $_owner; - function DummyFolder($acl, $owner = null) - { - $this->acl = $acl; - $this->_owner = $owner; - } - function getACL() - { - return $this->acl; - } - function setACL($user, $acl) - { - return $this->acl[$user] = str_split($acl); - } - function deleteACL($user) - { - unset($this->acl[$user]); - } - function getOwner() - { - return $this->_owner; - } -} - -- 2.11.0