_request = $request; } // // Implement template methods from AuthorizationPolicy // /** * @see AuthorizationPolicy::effect() */ public function effect() { $request = $this->_request; $user = $request->getUser(); if (!$user instanceof \PKP\user\User) { return AuthorizationPolicy::AUTHORIZATION_DENY; } // Get all user roles. $roleDao = DAORegistry::getDAO('RoleDAO'); /** @var RoleDAO $roleDao */ $userRoles = $roleDao->getByUserIdGroupedByContext($user->getId()); $context = $request->getRouter()->getContext($request); $roleContext = $context?->getId() ?? Application::CONTEXT_ID_NONE; $contextRoles = $this->_getContextRoles($roleContext, $userRoles); $this->addAuthorizedContextObject(Application::ASSOC_TYPE_USER_ROLES, $contextRoles); return AuthorizationPolicy::AUTHORIZATION_PERMIT; } /** * Get the current context roles from all user roles. * @param array $userRoles List of roles grouped by contextId */ protected function _getContextRoles(int $contextId, array $userRoles): array { // Adapt the role context based on the passed role id. $contextRoles = []; // Check if user has site level or manager roles. if (array_key_exists(Application::CONTEXT_ID_NONE, $userRoles) && array_key_exists(Role::ROLE_ID_SITE_ADMIN, $userRoles[Application::CONTEXT_ID_NONE])) { // site level role $contextRoles[] = Role::ROLE_ID_SITE_ADMIN; } // Get the user roles related to the passed context. if ($contextId != Application::CONTEXT_ID_NONE && isset($userRoles[$contextId])) { // Filter the user roles to the found context id. return array_merge( $contextRoles, array_map(fn ($role) => $role->getRoleId(), $userRoles[$contextId]) ); } else { // Context id not present in user roles array. return $contextRoles; } } } if (!PKP_STRICT_MODE) { class_alias('\PKP\security\authorization\UserRolesRequiredPolicy', '\UserRolesRequiredPolicy'); }