Files
OSJ/lib/pkp/classes/security/authorization/internal/SubmissionFileRequestedRevisionRequiredPolicy.php
CHIEFSOFT\ameye df3a033196 first commit
2024-06-08 17:09:23 -04:00

103 lines
4.0 KiB
PHP

<?php
/**
* @file classes/security/authorization/internal/SubmissionFileRequestedRevisionRequiredPolicy.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class SubmissionFileRequestedRevisionRequiredPolicy
*
* @ingroup security_authorization_internal
*
* @brief Base Submission file policy to ensure we have a viewable file that is part of
* a review round with the requested revision decision.
*
*/
namespace PKP\security\authorization\internal;
use APP\core\Application;
use APP\decision\Decision;
use APP\facades\Repo;
use PKP\db\DAORegistry;
use PKP\security\authorization\AuthorizationPolicy;
use PKP\submission\reviewRound\ReviewRound;
use PKP\submission\reviewRound\ReviewRoundDAO;
use PKP\submissionFile\SubmissionFile;
class SubmissionFileRequestedRevisionRequiredPolicy extends SubmissionFileBaseAccessPolicy
{
//
// Implement template methods from AuthorizationPolicy
// Note: This class is subclassed in each Application, so that Policies have the opportunity to add
// constraints to the effect() method. See e.g. SubmissionFileRequestedRevisionRequiredPolicy.php in OMP.
//
/**
* @see AuthorizationPolicy::effect()
*/
public function effect()
{
$request = $this->getRequest();
$reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /** @var ReviewRoundDAO $reviewRoundDao */
// Get the submission file.
$submissionFile = $this->getSubmissionFile($request);
if (!$submissionFile instanceof SubmissionFile) {
return AuthorizationPolicy::AUTHORIZATION_DENY;
}
// Make sure the file is part of a review round
// with a requested revision decision.
$reviewRound = $reviewRoundDao->getBySubmissionFileId($submissionFile->getId());
if (!$reviewRound instanceof ReviewRound) {
return AuthorizationPolicy::AUTHORIZATION_DENY;
}
$countRevisionDecisions = Repo::decision()->getCollector()
->filterBySubmissionIds([$submissionFile->getData('submissionId)')])
->filterByReviewRoundIds([$reviewRound->getId()])
->filterByDecisionTypes([Decision::PENDING_REVISIONS])
->getCount();
if (!$countRevisionDecisions) {
return AuthorizationPolicy::AUTHORIZATION_DENY;
}
// Make sure review round stage is the same of the current stage in request.
$stageId = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_WORKFLOW_STAGE);
if ($reviewRound->getStageId() != $stageId) {
return AuthorizationPolicy::AUTHORIZATION_DENY;
}
// Make sure the file stage is SubmissionFile::SUBMISSION_FILE_REVIEW_REVISION.
if ($submissionFile->getData('fileStage') != SubmissionFile::SUBMISSION_FILE_REVIEW_REVISION) {
return AuthorizationPolicy::AUTHORIZATION_DENY;
}
$reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /** @var ReviewRoundDAO $reviewRoundDao */
// Make sure that the last review round editor decision is request revisions.
$reviewRoundDecisions = Repo::decision()->getCollector()
->filterBySubmissionIds([$submissionFile->getData('submissionId')])
->filterByStageIds([$reviewRound->getStageId()])
->filterByReviewRoundIds([$reviewRound->getId()])
->getMany();
if ($reviewRoundDecisions->isEmpty()) {
return AuthorizationPolicy::AUTHORIZATION_DENY;
}
$lastEditorDecision = $reviewRoundDecisions->last();
if ($lastEditorDecision->getData('decision') != Decision::PENDING_REVISIONS) {
return AuthorizationPolicy::AUTHORIZATION_DENY;
}
// Made it through -- permit access.
return AuthorizationPolicy::AUTHORIZATION_PERMIT;
}
}
if (!PKP_STRICT_MODE) {
class_alias('\PKP\security\authorization\internal\SubmissionFileRequestedRevisionRequiredPolicy', '\SubmissionFileRequestedRevisionRequiredPolicy');
}