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

154 lines
4.7 KiB
PHP

<?php
/**
* @file classes/security/authorization/DataObjectRequiredPolicy.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 DataObjectRequiredPolicy
*
* @ingroup security_authorization
*
* @brief Abstract base class for policies that check for a data object from a parameter.
*/
namespace PKP\security\authorization;
use Exception;
use PKP\core\PKPRequest;
class DataObjectRequiredPolicy extends AuthorizationPolicy
{
/** @var PKPRequest */
public $_request;
/** @var array */
public $_args;
public ?string $_parameterName;
/** @var array */
public $_operations;
//
// Getters and Setters
//
/**
* Return the request.
*
* @return PKPRequest
*/
public function &getRequest()
{
return $this->_request;
}
/**
* Return the request arguments
*
* @return array
*/
public function &getArgs()
{
return $this->_args;
}
/**
* Constructor
*
* @param PKPRequest $request
* @param array $args request parameters
* @param ?string $parameterName the request parameter we expect
* @param string $message
* @param array $operations Optional list of operations for which this check takes effect. If specified, operations outside this set will not be checked against this policy.
*/
public function __construct($request, &$args, ?string $parameterName, $message = null, $operations = null)
{
parent::__construct($message);
$this->_request = $request;
assert(is_array($args));
$this->_args = & $args;
$this->_parameterName = $parameterName;
$this->_operations = $operations;
}
//
// Implement template methods from AuthorizationPolicy
//
/**
* @see AuthorizationPolicy::effect()
*/
public function effect()
{
// Check if the object is required for the requested Op. (No operations means check for all.)
if (is_array($this->_operations) && !in_array($this->_request->getRequestedOp(), $this->_operations)) {
return AuthorizationPolicy::AUTHORIZATION_PERMIT;
} else {
return $this->dataObjectEffect();
}
}
//
// Protected helper method
//
/**
* Test the data object's effect
*
* @return int AUTHORIZATION_DENY|AUTHORIZATION_ACCEPT
*/
public function dataObjectEffect()
{
// Deny by default. Must be implemented by subclass.
return AuthorizationPolicy::AUTHORIZATION_DENY;
}
/**
* Identifies a data object id in the request.
*
* @param bool $lookOnlyByParameterName True iff page router
* requests should only look for named parameters.
*
* @return int|false returns false if no valid submission id could be found.
*/
public function getDataObjectId($lookOnlyByParameterName = false)
{
// Identify the data object id.
$router = $this->_request->getRouter();
switch (true) {
case $router instanceof \PKP\core\PKPPageRouter:
if ($this->_parameterName !== null && ctype_digit((string) $this->_request->getUserVar($this->_parameterName))) {
// We may expect a object id in the user vars
return (int) $this->_request->getUserVar($this->_parameterName);
} elseif (!$lookOnlyByParameterName && isset($this->_args[0]) && ctype_digit((string) $this->_args[0])) {
// Or the object id can be expected as the first path in the argument list
return (int) $this->_args[0];
}
break;
case $router instanceof \PKP\core\PKPComponentRouter:
// We expect a named object id argument.
if ($this->_parameterName !== null && isset($this->_args[$this->_parameterName])
&& ctype_digit((string) $this->_args[$this->_parameterName])) {
return (int) $this->_args[$this->_parameterName];
}
break;
case $router instanceof \PKP\core\APIRouter:
if ($this->_parameterName !== null) {
$handler = $router->getHandler();
return $handler->getParameter($this->_parameterName);
}
break;
default: throw new Exception('DataObjectRequiredPolicy does not support routers of type ' . get_class($router) . '!');
}
return false;
}
}
if (!PKP_STRICT_MODE) {
class_alias('\PKP\security\authorization\DataObjectRequiredPolicy', '\DataObjectRequiredPolicy');
}