_request = $request; } // // Implement template methods from AuthorizationPolicy // /** * @see AuthorizationPolicy::effect() */ public function effect() { // A query should already be in the context. $query = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_QUERY); if (!$query instanceof \PKP\query\Query) { return AuthorizationPolicy::AUTHORIZATION_DENY; } // Check that there is a currently logged in user. $user = $this->_request->getUser(); if (!$user instanceof \PKP\user\User) { return AuthorizationPolicy::AUTHORIZATION_DENY; } // Determine if the query is assigned to the user. $queryDao = DAORegistry::getDAO('QueryDAO'); /** @var QueryDAO $queryDao */ if ($queryDao->getParticipantIds($query->getId(), $user->getId())) { return AuthorizationPolicy::AUTHORIZATION_PERMIT; } // Managers are allowed to access discussions they are not participants in // as long as they have Manager-level access to the workflow stage $accessibleWorkflowStages = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_ACCESSIBLE_WORKFLOW_STAGES); $managerAssignments = array_intersect([Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN], $accessibleWorkflowStages[$query->getStageId()] ?? []); if (!empty($managerAssignments)) { return AuthorizationPolicy::AUTHORIZATION_PERMIT; } // Otherwise, deny. return AuthorizationPolicy::AUTHORIZATION_DENY; } } if (!PKP_STRICT_MODE) { class_alias('\PKP\security\authorization\internal\QueryAssignedToUserAccessPolicy', '\QueryAssignedToUserAccessPolicy'); }