* @author Jan Schneider * @category Horde * @package Perms * @todo Remove $GLOBALS references here and in Sql backend for Horde 6. */ abstract class Horde_Perms_Base { /** * Cache object. * * @var Horde_Cache */ protected $_cache; /** * Logger. * * @var Horde_Log_Logger */ protected $_logger; /** * Constructor. * * @param array $params Configuration parameters: *
     * 'cache' - (Horde_Cache) The object to use to cache perms.
     * 'logger' - (Horde_Log_Logger) A logger object.
     * 
* * @throws Horde_Perms_Exception */ public function __construct($params = array()) { if (isset($params['cache'])) { $this->_cache = $params['cache']; } if (isset($params['logger'])) { $this->_logger = $params['logger']; } } /** * Returns the short name of an object, the last portion of the full name. * * @param string $name The name of the object. * * @return string The object's short name. */ public function getShortName($name) { /* If there are several components to the name, explode and * get the last one, otherwise just return the name. */ if (strpos($name, ':') !== false) { $tmp = explode(':', $name); return array_pop($tmp); } return $name; } /** * Returns a new permissions object. * * @param string $name The permission's name. * @param string $type The permission type. * @param array $params The permission parameters. * * @return Horde_Perms_Permission A new permissions object. * @throws Horde_Perms_Exception */ abstract public function newPermission($name, $type = 'matrix', $params = null); /** * Returns an object corresponding to the named permission, with the users * and other data retrieved appropriately. * * @param string $name The name of the permission to retrieve. * * @return Horde_Perms_Permission A permissions object. * @throws Horde_Perms_Exception */ abstract public function getPermission($name); /** * Returns an object corresponding to the given unique ID, with the users * and other data retrieved appropriately. * * @param integer $cid The unique ID of the permission to retrieve. * * @return Horde_Perms_Permission A permissions object. * @throws Horde_Perms_Exception */ abstract public function getPermissionById($cid); /** * Adds a permission to the permissions system. The permission must first * be created with newPermission(), and have any initial users added to * it, before this function is called. * * @param Horde_Perms_Permission $perm The permissions object. * * @throws Horde_Perms_Exception */ abstract public function addPermission(Horde_Perms_Permission $perm); /** * Removes a permission from the permissions system permanently. * * @param Horde_Perms_Permission $perm The permission to remove. * @param boolean $force Force to remove every child. * * @throws Horde_Perms_Exception */ abstract public function removePermission(Horde_Perms_Permission $perm, $force = false); /** * Finds out what rights the given user has to this object. * * @param mixed $permission The full permission name of the object to * check the permissions of, or the * Horde_Permissions object. * @param string $user The user to check for. * @param string $creator The user who created the event. * * @return mixed A bitmask of permissions the user has, false if there * are none. */ public function getPermissions($permission, $user, $creator = null) { if (is_string($permission)) { try { $permission = $this->getPermission($permission); } catch (Horde_Perms_Exception $e) { /* Ignore not exists errors. */ if ($this->_logger && ($e->getCode() != Horde_Perms_Exception::NOT_EXIST)) { $this->_logger->log($e, 'DEBUG'); } return false; } } // If this is a guest user, only check guest permissions. if (empty($user)) { return $permission->getGuestPermissions(); } // Combine all other applicable permissions. $type = $permission->get('type'); $composite_perm = ($type == 'matrix') ? 0 : array(); // If $creator was specified, check creator permissions. // If the user is the creator of the event see if there are creator // permissions. if (!is_null($creator) && strlen($user) && ($user === $creator) && (($perms = $permission->getCreatorPermissions()) !== null)) { if ($type == 'matrix') { $composite_perm |= $perms; } else { $composite_perm[] = $perms; } } // Check user-level permissions. $userperms = $permission->getUserPermissions(); if (isset($userperms[$user])) { if ($type == 'matrix') { $composite_perm |= $userperms[$user]; } else { $composite_perm[] = $userperms[$user]; } } // If no user permissions are found, try group permissions. if (isset($permission->data['groups']) && is_array($permission->data['groups']) && count($permission->data['groups'])) { $groups = $GLOBALS['injector'] ->getInstance('Horde_Group') ->listGroups($user); foreach ($permission->data['groups'] as $group => $perms) { if (isset($groups[$group])) { if ($type == 'matrix') { $composite_perm |= $perms; } else { $composite_perm[] = $perms; } } } } // If there are default permissions, return them. if (($perms = $permission->getDefaultPermissions()) !== null) { if ($type == 'matrix') { $composite_perm |= $perms; } else { $composite_perm[] = $perms; } } // Return composed permissions. if ($composite_perm) { return $composite_perm; } // Otherwise, deny all permissions to the object. return false; } /** * Returns the unique identifier of this permission. * * @param Horde_Perms_Permission $permission The permission object to get * the ID of. * * @return integer The unique id. * @throws Horde_Perms_Exception */ abstract public function getPermissionId($permission); /** * Finds out if the user has the specified rights to the given object. * * @param string $permission The permission to check. * @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 event * * @return boolean Whether the user has the specified permissions. */ public function hasPermission($permission, $user, $perm, $creator = null) { return (bool)($this->getPermissions($permission, $user, $creator) & $perm); } /** * Checks if a permission exists in the system. * * @param string $permission The permission to check. * * @return boolean True if the permission exists. */ abstract public function exists($permission); /** * Returns a list of parent permissions. * * @param string $child The name of the child to retrieve parents for. * * @return array A hash with all parents in a tree format. * @throws Horde_Perms_Exception */ abstract public function getParents($child); /** * Returns all permissions of the system in a tree format. * * @return array A hash with all permissions in a tree format. */ abstract public function getTree(); }