Файл: base-sys/base/bol/authorization_service.php
Строк: 956
<?php
class BOL_AuthorizationService
{
const ADMIN_GROUP_NAME = 'admin';
const ON_BEFORE_ROLE_DELETE = 'base.on_before_role_delete';
const ON_AFTER_ROLE_DELETE = 'base.on_after_role_delete';
const STATUS_AVAILABLE = 'available';
const STATUS_PROMOTED = 'promoted';
const STATUS_DISABLED = 'disabled';
/**
* @var BOL_AuthorizationRoleDao
*/
private $roleDao;
/**
* @var BOL_AuthorizationUserRoleDao
*/
private $userRoleDao;
/**
* @var BOL_AuthorizationActionDao
*/
private $actionDao;
/**
* @var BOL_AuthorizationGroupDao
*/
private $groupDao;
/**
* @var BOL_AuthorizationPermissionDao
*/
private $permissionDao;
/**
* @var BOL_AuthorizationModeratorDao
*/
private $moderatorDao;
/**
* @var BOL_AuthorizationModeratorPermissionDao
*/
private $moderatorPermissionDao;
/**
* Singleton instance.
*
* @var BOL_AuthorizationService
*/
private static $classInstance;
/**
* Returns an instance of class (singleton pattern implementation).
*
* @return BOL_AuthorizationService
*/
public static function getInstance()
{
if ( self::$classInstance === null )
{
self::$classInstance = new self();
}
return self::$classInstance;
}
private $groupCache = array();
private $moderatorCache = array();
private $moderatorPermissionCache = array();
private $actionCache = array();
private $permissionCache = array();
private $guestRoleId;
private $userRolesCache;
private $superModeratorUserId;
private $groupDaoCache;
private $actionDaoCache;
private $roleDaoCache;
private function __construct()
{
$this->roleDao = BOL_AuthorizationRoleDao::getInstance();
$this->userRoleDao = BOL_AuthorizationUserRoleDao::getInstance();
$this->actionDao = BOL_AuthorizationActionDao::getInstance();
$this->groupDao = BOL_AuthorizationGroupDao::getInstance();
$this->permissionDao = BOL_AuthorizationPermissionDao::getInstance();
$this->moderatorDao = BOL_AuthorizationModeratorDao::getInstance();
$this->moderatorPermissionDao = BOL_AuthorizationModeratorPermissionDao::getInstance();
$this->groupDaoCache = $this->groupDao->findAll();
foreach ( $this->groupDaoCache as $group )
{
/* @var $group BOL_AuthorizationGroup */
$this->groupCache[$group->name] = $group->id;
}
$moderatorDaoCache = $this->moderatorDao->findAll();
$this->superModeratorUserId = 0;
foreach ( $moderatorDaoCache as $moderator )
{
/* @var $moderator BOL_AuthorizationModerator */
$this->moderatorCache[$moderator->userId] = $moderator->id;
if ( $this->superModeratorUserId === 0
|| (int) $this->moderatorCache[$moderator->userId] < (int) $this->moderatorCache[$this->superModeratorUserId] )
{
$this->superModeratorUserId = (int) $moderator->userId;
}
}
$moderatorPermissionDaoCache = $this->moderatorPermissionDao->findAll();
foreach ( $moderatorPermissionDaoCache as $perm )
{
/* @var $perm BOL_AuthorizationModeratorPermission */
$this->moderatorPermissionCache[$perm->moderatorId][$perm->groupId] = $perm->id;
}
$this->actionDaoCache = $this->actionDao->findAll();
foreach ( $this->actionDaoCache as $action )
{
/* @var $action BOL_AuthorizationAction */
$this->actionCache[$action->name][$action->groupId] = $action->id;
}
$this->userRolesCache = array();
if ( PEEP::getUser()->isAuthenticated() )
{
$this->userRolesCache[PEEP::getUser()->getId()] = $this->userRoleDao->getRoleIdList(PEEP::getUser()->getId());
}
$permissionDaoCache = $this->permissionDao->findAll();
foreach ( $permissionDaoCache as $permission )
{
/* @var $permission BOL_AuthorizationPermission */
$this->permissionCache[$permission->actionId][$permission->roleId] = $permission->id;
}
$this->roleDaoCache = $this->roleDao->findAll();
$this->guestRoleId = $this->getGuestRoleId();
}
/* ----------------------------------------- */
public function getGuestRoleId()
{
/* @var $roleItem BOL_AuthorizationRole */
foreach ( $this->roleDaoCache as $roleItem )
{
if ( $roleItem->getName() == BOL_AuthorizationRoleDao::GUEST )
{
return $roleItem->getId();
}
}
return null;
}
public function findNonGuestRoleList()
{
$result = array();
/* @var $roleItem BOL_AuthorizationRole */
foreach ( $this->roleDaoCache as $roleItem )
{
if ( $roleItem->getName() != BOL_AuthorizationRoleDao::GUEST )
{
$result[] = $roleItem;
}
}
return $result;
}
/* ---------------------------------------- */
/**
*
* @param $groupName
* @param $actionName
* @param bool $readFromLocalCache
* @return BOL_AuthorizationAction
*/
public function findAction( $groupName, $actionName, $readFromLocalCache = false )
{
$groupDto = null;
if ( $readFromLocalCache )
{
/* @var $groupItem BOL_AuthorizationGroup */
foreach ( $this->groupDaoCache as $groupItem )
{
if ( $groupItem->getName() == $groupName )
{
$groupDto = $groupItem;
break;
}
}
}
else
{
$groupDto = $this->groupDao->findByName($groupName);
}
if ( $groupDto === null )
{
return null;
}
if ( $readFromLocalCache )
{
/* @var $actionItem BOL_AuthorizationAction */
foreach ( $this->actionDaoCache as $actionItem )
{
if ( $actionItem->getGroupId() == $groupDto->getId() && $actionItem->getName() == $actionName )
{
return $actionItem;
}
}
}
else
{
return $this->actionDao->findAction($actionName, $groupDto->getId());
}
return null;
}
/**
* @param string
* @return BOL_AuthorizationGroup $groupName
*/
public function findGroupByName( $groupName )
{
if ( !$groupName )
{
return null;
}
return $this->groupDao->findByName($groupName);
}
public function getGroupList( $excludeNonModerated = false )
{
$groups = $this->groupDao->findAll();
foreach ( $groups as $key => $value )
{
/* @var $value BOL_AuthorizationGroup */
if ( $excludeNonModerated && !$value->isModerated() )
{
unset($groups[$key]);
}
}
return $groups;
}
public function getModeratorList()
{
return $this->moderatorDao->findAll();
}
public function getRoleList()
{
return $this->roleDao->findAll();
}
public function getActionList()
{
return $this->actionDao->findAll();
}
public function getPermissionList()
{
return $this->permissionDao->findAll();
}
public function getModeratorPermissionList()
{
return $this->moderatorPermissionDao->findAll();
}
public function getModeratorIdByUserId( $userId )
{
$userId = (int) $userId;
if ( $userId > 0 )
{
return $this->moderatorDao->getIdByUserId($userId);
}
return null;
}
/**
* @param $groupName
* @param null $actionName
* @param array $extra
*
* @return boolean
*/
public function isActionAuthorized( $groupName, $actionName = null, $extra = null )
{
if ( $extra !== null && !is_array($extra) )
{
trigger_error("`ownerId` parameter has been deprecated, pass `extra` parameter insteadn"
. PEEP_ErrorManager::getInstance()->debugBacktrace(), E_USER_WARNING);
}
if ( !empty($extra['userId']) )
{
$userId = (int) $extra['userId'];
}
else
{
$userId = PEEP::getUser()->isAuthenticated() ? PEEP::getUser()->getId() : 0;
}
$isAuthorized = $this->isActionAuthorizedForUser($userId, $groupName, $actionName);
if ( $isAuthorized )
{
return true;
}
if ( !$userId && !$this->isActionAuthorizedForGuest($groupName, $actionName) )
{
return false;
}
// layer check
$eventParams = array(
'userId' => $userId,
'groupName' => $groupName,
'actionName' => $actionName,
'extra' => $extra
);
try
{
$event = new BASE_CLASS_EventCollector('authorization.layer_check', $eventParams);
PEEP::getEventManager()->trigger($event);
$data = $event->getData();
}
catch ( Exception $ex )
{
PEEP::getLogger()->addEntry($ex->getMessage() . "n" . print_r($ex->getTrace(), true) );
}
if ( !empty($data) )
{
usort($data, array($this, 'sortLayersByPriorityAsc'));
foreach ( $data as $layer )
{
if ( $layer['permission'] === true )
{
return true;
}
}
}
return $isAuthorized;
}
/**
* @param $groupName
* @param null $actionName
* @param array $extra
*
* @return boolean
*/
public function isActionAuthorizedBy( $groupName, $actionName = null, array $extra = null )
{
if ( !empty($extra['userId']) )
{
$userId = (int) $extra['userId'];
}
else
{
$userId = PEEP::getUser()->isAuthenticated() ? PEEP::getUser()->getId() : 0;
}
$isAuthorized = array(
'status' => $this->isActionAuthorizedForUser($userId, $groupName, $actionName),
'authorizedBy' => 'base'
);
if ( $isAuthorized['status'] )
{
return $isAuthorized;
}
try
{
// layer check
$eventParams = array(
'userId' => $userId,
'groupName' => $groupName,
'actionName' => $actionName,
'extra' => $extra
);
$event = new BASE_CLASS_EventCollector('authorization.layer_check', $eventParams);
PEEP::getEventManager()->trigger($event);
$data = $event->getData();
}
catch ( Exception $ex )
{
PEEP::getLogger()->addEntry($ex->getMessage() . "n" . print_r($ex->getTrace(), true) );
}
if ( !empty($data) )
{
usort($data, array($this, 'sortLayersByPriorityAsc'));
foreach ( $data as $layer )
{
if ( $layer['permission'] === true )
{
return array('status' => true, 'authorizedBy' => $layer['pluginKey']);
}
}
}
return $isAuthorized;
}
private function sortLayersByPriorityAsc( $el1, $el2 )
{
if ( $el1['priority'] === $el2['priority'] )
{
return 0;
}
return $el1['priority'] > $el2['priority'] ? 1 : -1;
}
/**
* @param $groupName
* @param null $actionName
* @param array $extra
* @return string
*/
public function getActionStatus( $groupName, $actionName = null, array $extra = null )
{
if ( !empty($extra['userId']) )
{
$userId = (int) $extra['userId'];
}
else
{
$userId = PEEP::getUser()->isAuthenticated() ? PEEP::getUser()->getId() : 0;
}
$isAuthorized = $this->isActionAuthorizedBy($groupName, $actionName, $extra);
if ( $isAuthorized['status'] )
{
return array('status' => self::STATUS_AVAILABLE, 'msg' => null, 'authorizedBy' => $isAuthorized['authorizedBy']);
}
$lang = PEEP::getLanguage();
$error = array(
'status' => self::STATUS_DISABLED,
'msg' => $lang->text('base', 'authorization_failed_feedback')
);
if ( !$userId && !$this->isActionAuthorizedForGuest($groupName, $actionName) )
{
return $error;
}
try
{
// layer check
$eventParams = array(
'userId' => $userId,
'groupName' => $groupName,
'actionName' => $actionName,
'extra' => $extra
);
$event = new BASE_CLASS_EventCollector('authorization.layer_check_collect_error', $eventParams);
PEEP::getEventManager()->trigger($event);
$data = $event->getData();
}
catch ( Exception $ex )
{
PEEP::getLogger()->addEntry($ex->getMessage() . "n" . print_r($ex->getTrace(), true) );
}
if ( empty($data) )
{
return $error;
}
usort($data, array($this, 'sortLayersByPriorityAsc'));
$links = array();
foreach ( $data as $option )
{
if ( !empty($option['label']) )
{
if ( PEEP::getApplication()->isMobile() )
{
$option['url'] = null;
}
$label = mb_strtolower($option['label']);
$links[] = !empty($option['url']) ? '<a href="'.$option['url'].'">'.$label.'</a>' : $label;
}
}
if ( count($links) )
{
$actionLabel = $this->getActionLabel($groupName, $actionName);
$error = array(
'status' => self::STATUS_PROMOTED,
'msg' => $lang->text(
'base',
'authorization_action_promotion',
array('alternatives' => implode(' '.$lang->text('base', 'or').' ', $links), 'action' => mb_strtolower($actionLabel))
)
);
}
return $error;
}
public function trackAction( $groupName, $actionName = null, array $extra = null )
{
return $this->trackActionForUser( 0, $groupName, $actionName, $extra );
}
public function trackActionForUser( $userId, $groupName, $actionName = null, array $extra = null )
{
$userId = !empty($userId) ? $userId : (PEEP::getUser()->isAuthenticated() ? PEEP::getUser()->getId() : 0);
$isAuthorized = $this->isActionAuthorizedBy($groupName, $actionName, $extra);
$defaults = array('status' => false, 'msg' => null, 'trackedBy' => null);
if ( $isAuthorized['status'] && $isAuthorized['authorizedBy'] == 'base' )
{
return $defaults;
}
// layer check
$eventParams = array(
'userId' => $userId,
'groupName' => $groupName,
'actionName' => $actionName,
'extra' => $extra
);
$event = new BASE_CLASS_EventCollector('authorization.layer_check_track_action', $eventParams);
PEEP::getEventManager()->trigger($event);
$data = $event->getData();
if ( !$data )
{
return $defaults;
}
usort($data, array($this, 'sortLayersByPriorityAsc'));
foreach ( $data as $layer )
{
if ( !empty($layer['msg']) )
{
return array('status' => true, 'msg' => $layer['msg'], 'trackedBy' => $layer['pluginKey']);
}
}
return $defaults;
}
public function isActionAuthorizedForUser( $userId, $groupName, $actionName = null )
{
$userId = (int) $userId;
if ( isset($this->groupCache[$groupName]) )
{
$groupId = $this->groupCache[$groupName];
}
else
{
return false;
}
// contains user's role ids
$roles = array();
if ( $userId > 0 || PEEP::getUser()->isAuthenticated() )
{
$userId = ( $userId > 0 ) ? $userId : PEEP::getUser()->getId();
if ( $actionName === null )
{
if ( isset($this->moderatorCache[$userId]) )
{
$moderatorId = $this->moderatorCache[$userId];
// $adminGroupId = $this->groupCache[self::ADMIN_GROUP_NAME];
return isset($this->moderatorPermissionCache[$moderatorId][$groupId])
// || isset($this->moderatorPermissionCache[$moderatorId][$adminGroupId])
|| $this->isSuperModerator($userId);
}
else
{
return false;
}
}
if ( !array_key_exists($userId, $this->userRolesCache) )
{
$this->userRolesCache[$userId] = $this->userRoleDao->getRoleIdList($userId);
}
$roles = $this->userRolesCache[$userId];
}
else
{
$roles[] = $this->guestRoleId;
}
if ( isset($this->actionCache[$actionName][$groupId]) )
{
$actionId = $this->actionCache[$actionName][$groupId];
}
else
{
return false;
}
$permissionId = null;
foreach ( $roles as $role )
{
if ( isset($this->permissionCache[$actionId][$role]) )
{
$permissionId = $this->permissionCache[$actionId][$role];
break;
}
}
return ( $permissionId !== null /* && (int)$permissionId > 0 */ );
}
public function isActionAuthorizedForGuest( $groupName, $actionName = null )
{
if ( isset($this->groupCache[$groupName]) )
{
$groupId = $this->groupCache[$groupName];
}
else
{
return false;
}
// contains user's role ids
$roles = array( $this->guestRoleId );
if ( isset($this->actionCache[$actionName][$groupId]) )
{
$actionId = $this->actionCache[$actionName][$groupId];
}
else
{
return false;
}
$permissionId = null;
foreach ( $roles as $role )
{
if ( isset($this->permissionCache[$actionId][$role]) )
{
$permissionId = $this->permissionCache[$actionId][$role];
break;
}
}
return ( $permissionId !== null /* && (int)$permissionId > 0 */ );
}
public function countUserByRoleId( $id )
{
return $this->userRoleDao->countByRoleId($id);
}
public function isModerator( $userId = null )//TODO rewrite this method
{
if ( $userId == null && ( $userId = PEEP::getUser()->getId() ) === null )
{
return false;
}
return (bool) $this->getModeratorIdByUserId($userId);
}
public function findUserRoleList( $userId )
{
return $this->roleDao->findUserRoleList($userId);
}
public function findGroupIdByName( $name )
{
$id = $this->groupDao->getIdByName($name);
return ( $id === null ) ? 0 : (int) $id;
}
public function findActionListByGroupId( $groupId )
{
if ( $groupId === null || $groupId < 1 )
{
return array();
}
return $this->actionDao->findActionListByGroupId($groupId);
}
/**
* @param int $id
* @throws InvalidArgumentException
* @return BOL_AuthorizationRole
*/
public function getRoleById( $id )
{
$id = (int) $id;
if ( $id < 1 )
{
throw new InvalidArgumentException('invalid role id');
}
return $this->roleDao->findById($id);
}
public function saveModeratorPermissionList( array $perms, $userId )
{
$moderatorId = $this->getModeratorIdByUserId($userId);
if ( $moderatorId === null )
{
return;
}
$isSuperAdmin = $this->isSuperModerator($userId);
$superModeratorId = (int) $this->getModeratorIdByUserId($this->getSuperModeratorUserId());
$adminGroupId = $this->getAdminGroupId();
// delete old
$oldPerms = $this->getModeratorPermissionList();
foreach ( $oldPerms as $perm )
{
/* @var $perm BOL_AuthorizationModeratorPermission */
if ( (int) $perm->getGroupId() === $adminGroupId && !$isSuperAdmin )
{
continue;
}
if ( (int) $perm->getModeratorId() === $superModeratorId )
{
continue;
}
$match = false;
foreach ( $perms as $value )
{
/* @var $value BOL_AuthorizationModeratorPermission */
if ( (int) $value->groupId === (int) $perm->groupId && (int) $value->moderatorId === (int) $perm->moderatorId )
{
$match = true;
break;
}
}
if ( !$match )
{
$this->moderatorPermissionDao->delete($perm);
}
}
// add new
foreach ( $perms as $perm )
{
/* @var $perm BOL_AuthorizationModeratorPermission */
if ( (int) $perm->getGroupId() === $adminGroupId && !$isSuperAdmin )
{
continue;
}
if ( (int) $perm->getModeratorId() === $superModeratorId )
{
continue;
}
$oldPermId = $this->moderatorPermissionDao->getId($perm->getModeratorId(), $perm->getGroupId());
if ( $oldPermId !== null )
{
$perm->setId($oldPermId);
}
$this->moderatorPermissionDao->save($perm);
}
}
public function addModerator( $userId )
{
$userId = (int) $userId;
if ( $this->moderatorDao->getIdByUserId($userId) !== null )
{
return false;
}
$moder = new BOL_AuthorizationModerator();
$moder->userId = $userId;
$this->moderatorDao->save($moder);
$this->giveAllPermissions($moder->getId());
return true;
}
public function giveAllPermissions( $moderatorId )
{
$this->moderatorPermissionDao->deleteByModeratorId($moderatorId);
$groups = $this->getGroupList(true);
$adminGroupId = $this->getAdminGroupId();
foreach ( $groups as $group )
{
/** @var $group BOL_AuthorizationGroup */
if ( (int) $group->getId() === (int) $adminGroupId )
{
continue;
}
$permisson = new BOL_AuthorizationModeratorPermission();
$permisson->setGroupId($group->getId())->setModeratorId($moderatorId);
$this->saveModeratorPermission($permisson);
}
}
public function addAdministrator( $userId )
{
$this->addModerator($userId);
$moderatorId = $this->moderatorDao->getIdByUserId($userId);
$groupId = $this->getAdminGroupId();
$permisson = new BOL_AuthorizationModeratorPermission();
$permisson->setGroupId($groupId)
->setModeratorId($moderatorId);
$this->saveModeratorPermission($permisson);
}
public function deleteModerator( $moderatorId )
{
$moderatorId = (int) $moderatorId;
$adminGroupId = $this->getAdminGroupId();
if ( $this->moderatorPermissionDao->getId($moderatorId, $adminGroupId) !== null )
{
return false;
}
$removed = ( $this->moderatorDao->deleteById($moderatorId) > 0 ); // ? true : false;
if ( $removed )
{
$this->moderatorPermissionDao->deleteByModeratorId($moderatorId);
}
return $removed;
}
public function findAdminIdList()
{
$adminGroupId = $this->getAdminGroupId();
$moderPerms = $this->moderatorPermissionDao->findListByGroupId($adminGroupId);
$adminIds = array();
foreach ( $moderPerms as $perm )
{
/* @var $perm BOL_AuthorizationModeratorPermission */
$adminIds[] = $perm->moderatorId;
}
return $adminIds;
}
public function getDefaultRole()
{
return $this->roleDao->findDefault();
}
public function getRoleListOfUsers( array $userIds, $displayLabel = true )
{
$userIds = array_unique($userIds);
$roles = $this->userRoleDao->getRoleListOfUsers($userIds, $displayLabel);
$keyRoles = array();
foreach ( $roles as $key => &$role )
{
$keyRoles[$role['userId']] = &$role;
$role['label'] = $this->getRoleLabel($role['name']);
}
return $keyRoles;
}
public function getRoleLabel( $roleName )
{
return PEEP::getLanguage()->text('base', "authorization_role_{$roleName}");
}
public function getActionLabel( $groupName, $actionName )
{
// collecting labels
$event = new BASE_CLASS_EventCollector('admin.add_auth_labels');
PEEP::getEventManager()->trigger($event);
$data = $event->getData();
$dataLabels = empty($data) ? array() : call_user_func_array('array_merge', $data);
return !empty($dataLabels[$groupName]['actions'][$actionName]) ? $dataLabels[$groupName]['actions'][$actionName] : null;
}
public function isSuperModerator( $userId )
{
return (int) $userId === (int) $this->superModeratorUserId;
}
public function getSuperModeratorUserId()
{
return $this->superModeratorUserId;
}
public function getAdminGroupId()
{
return (int) $this->findGroupIdByName(self::ADMIN_GROUP_NAME);
}
public function savePermissionList( array $perms )//TODO check action available for guest
{
$this->permissionDao->deleteAll();
foreach ( $perms as $perm )
{
$this->permissionDao->save($perm);
}
}
public function saveUserRole( $userId, $roleId )
{
$this->deleteUserRole($userId, $roleId);
$userRole = new BOL_AuthorizationUserRole();
$userRole->userId = (int) $userId;
$userRole->roleId = (int) $roleId;
$this->userRoleDao->deleteUserRole($userRole->userId, $userRole->roleId);
$this->userRoleDao->save($userRole);
}
public function assignDefaultRoleToUser( $userId )
{
$role = $this->getDefaultRole();
$this->saveUserRole((int) $userId, $role->id);
}
public function reorderRoles( $list )
{
$idList = array_keys($list);
$roles = $this->roleDao->findByIdList($idList);
foreach ( $roles as $role )
{
/* @var $role BOL_AuthorizationRole */
$this->roleDao->save($role->setSortOrder($list[$role->getId()]));
}
}
public function deleteRoleById( $id )
{
/** @var BOL_AuthorizationRole $role */
$role = $this->roleDao->findById($id);
$eventBefore = new PEEP_Event(self::ON_BEFORE_ROLE_DELETE, array('roleId' => $role->getId()));
PEEP::getEventManager()->trigger($eventBefore);
$languageService = BOL_LanguageService::getInstance();
$key = $languageService->findKey('base', "authorization_role_{$role->getName()}");
if ( !empty($key) )
{
$languageService->deleteKey($key->getId());
}
$this->userRoleDao->onDeleteRole($role->getId(), $this->getDefaultRole()->getId());
$this->roleDao->deleteById($role->getId());
//TODO delete from Permission
$eventAfter = new PEEP_Event(self::ON_AFTER_ROLE_DELETE, array('roleId' => $role->getId()));
PEEP::getEventManager()->trigger($eventAfter);
}
public function addRole( $label )
{
$languageService = BOL_LanguageService::getInstance();
$i = 0;
$name = $languageService->generateCustomKey($label);
$unique = "authorization_role_{$name}";
while ( !$languageService->isKeyUnique('base', $unique) )
{
$i++;
$unique = "authorization_role_{$name}" . $i;
}
if ( $i > 0 )
{
$name .= $i;
}
$key = $unique;
$role = new BOL_AuthorizationRole();
$role->setName($name);
$role->setSortOrder($this->roleDao->findMaxOrder() + 1);
$this->roleDao->save($role);
$languageService->addValue($languageService->getCurrent()->getId(), 'base', $key, $label, true);
}
public function saveRole( BOL_AuthorizationRole $role )
{
$this->roleDao->save($role);
}
public function saveModeratorPermission( $dto )
{
$this->moderatorPermissionDao->save($dto);
}
public function deleteUserRolesByUserId( $userId )
{
$userId = (int) $userId;
if ( $userId > 0 )
{
$this->userRoleDao->deleteByUserId($userId);
}
}
public function deleteUserRole( $userId, $roleId )
{
$userId = (int) $userId;
$roleId = (int) $roleId;
if ( $userId > 0 && $roleId > 0 )
{
$this->userRoleDao->deleteUserRole($userId, $roleId);
}
}
public function grantActionListToRole( BOL_AuthorizationRole $role, array $actions )
{
if ( $role === null || empty($actions) )
{
return;
}
/* @var $action BOL_AuthorizationAction */
foreach ( $actions as $action )
{
if ( !$action->isAvailableForGuest() && ( (int) $role->id === (int) $this->guestRoleId ) )
{
continue;
}
$perm = $this->permissionDao->findByRoleIdAndActionId($role->id, $action->id);
if ( $perm === null )
{
$perm = new BOL_AuthorizationPermission();
$perm->actionId = $action->id;
$perm->roleId = $role->id;
$this->permissionDao->save($perm);
}
}
}
/**
*
* @param BOL_AuthorizationGroup $group
* @param array $labels ex.: array('en' => 'Colour', 'en-US' => 'Color')
* @throws InvalidArgumentException
*/
public function addGroup( BOL_AuthorizationGroup $group, array $labels )
{
if ( $group === null )
{
throw new InvalidArgumentException('$group cannot be null');
}
$this->groupDao->save($group);
foreach ( $labels as $tag => $label )
{
$lang = BOL_LanguageService::getInstance()->findByTag($tag);
if ( $lang !== null )
{
BOL_LanguageService::getInstance()
->addValue($lang->id, 'base', 'authorization_group_' . mb_strtolower($group->name), $label);
}
}
if ( $group->isModerated() )
{
$adminIds = $this->findAdminIdList();
if ( count($adminIds) > 0 )
{
foreach ( $adminIds as $adminId )
{
$perm = new BOL_AuthorizationModeratorPermission();
$perm->groupId = $group->id;
$perm->moderatorId = $adminId;
$this->moderatorPermissionDao->save($perm);
}
}
}
}
public function deleteGroup( $groupName )
{
$group = $this->groupDao->findByName($groupName);
if ( $group !== null )
{
if ( $group->isModerated() )
{
$this->moderatorPermissionDao->deleteByGroupId($group->id);
}
$actions = $this->actionDao->findActionListByGroupId($group->id);
if ( !empty($actions) )
{
foreach ( $actions as $action )
{
$this->deleteAction($action->id);
}
}
$this->groupDao->deleteById($group->id);
}
}
/**
*
* @param BOL_AuthorizationAction $action
* @param array $labels ex.: array('en' => 'Colour', 'en-US' => 'Color')
* @throws InvalidArgumentException
*/
public function addAction( BOL_AuthorizationAction $action, array $labels )
{
if ( $action === null )
{
throw new InvalidArgumentException('action cannot be null');
}
$this->actionDao->save($action);
/** @var BOL_AuthorizationGroup $group */
$group = $this->groupDao->findById($action->groupId);
foreach ( $labels as $tag => $label )
{
$lang = BOL_LanguageService::getInstance()->findByTag($tag);
if ( $lang !== null )
{
$key = 'authorization_action_' . mb_strtolower($group->name) . '_' . mb_strtolower($action->name);
try
{
BOL_LanguageService::getInstance()->addValue($lang->id, 'base', $key, $label);
}
catch ( Exception $e )
{
}
}
}
$roles = $this->getRoleList();
foreach ( $roles as $role )
{
$this->grantActionListToRole($role, array($action));
}
}
public function deleteAction( $actionId )
{
$actionId = (int) $actionId;
if ( $actionId > 0 )
{
$this->permissionDao->deleteByActionId($actionId);
$this->actionDao->deleteById($actionId);
}
}
public function saveGroup( BOL_AuthorizationGroup $group )
{
$this->groupDao->save($group);
}
public function saveAction( BOL_AuthorizationAction $action )
{
$this->actionDao->save($action);
}
public function deleteGroupByName( $groupName )
{
$group = $this->groupDao->findByName($groupName);
if ( $group !== null )
{
if ( $group->isModerated() )
{
$this->moderatorPermissionDao->deleteByGroupId($group->id);
}
$actions = $this->actionDao->findActionListByGroupId($group->id);
if ( !empty($actions) )
{
foreach ( $actions as $action )
{
$this->deleteActionById($action->id);
}
}
$this->groupDao->deleteById($group->id);
}
}
public function deleteActionById( $actionId )
{
$actionId = (int) $actionId;
if ( $actionId > 0 )
{
$this->permissionDao->deleteByActionId($actionId);
$this->actionDao->deleteById($actionId);
}
}
}