* for details. * * We try to stick closely enough to XACML concepts to make sure that * future improvements to the authorization framework can be done in a * consistent manner. * * This of course doesn't mean that we are "XACML compliant" in any way. */ namespace PKP\security\authorization; class AuthorizationPolicy { public const AUTHORIZATION_PERMIT = 1; public const AUTHORIZATION_DENY = 2; public const AUTHORIZATION_ADVICE_DENY_MESSAGE = 1; public const AUTHORIZATION_ADVICE_CALL_ON_DENY = 2; /** @var array advice to be returned to the decision point */ public $_advice = []; /** * @var array a list of authorized context objects that should be * returned to the caller */ public $_authorizedContext = []; /** * Constructor * * @param string $message */ public function __construct($message = null) { if (!is_null($message)) { $this->setAdvice(self::AUTHORIZATION_ADVICE_DENY_MESSAGE, $message); } } // // Setters and Getters // /** * Set an advice * * @param int $adviceType */ public function setAdvice($adviceType, $adviceContent) { $this->_advice[$adviceType] = $adviceContent; } /** * Whether this policy implements * the given advice type. * * @param int $adviceType * * @return bool */ public function hasAdvice($adviceType) { return isset($this->_advice[$adviceType]); } /** * Get advice for the given advice type. * * @param int $adviceType */ public function &getAdvice($adviceType) { if ($this->hasAdvice($adviceType)) { return $this->_advice[$adviceType]; } else { $nullVar = null; return $nullVar; } } /** * Add an object to the authorized context * * @param int $assocType */ public function addAuthorizedContextObject($assocType, &$authorizedObject) { $this->_authorizedContext[$assocType] = & $authorizedObject; } /** * Check whether an object already exists in the * authorized context. * * @param int $assocType * * @return bool */ public function hasAuthorizedContextObject($assocType) { return isset($this->_authorizedContext[$assocType]); } /** * Retrieve an object from the authorized context * * @param int $assocType * * @return mixed will return null if the context * for the given assoc type does not exist. */ public function &getAuthorizedContextObject($assocType) { if ($this->hasAuthorizedContextObject($assocType)) { return $this->_authorizedContext[$assocType]; } else { $nullVar = null; return $nullVar; } } /** * Set the authorized context * * @return array */ public function setAuthorizedContext(&$authorizedContext) { $this->_authorizedContext = & $authorizedContext; } /** * Get the authorized context * * @return array */ public function &getAuthorizedContext() { return $this->_authorizedContext; } // // Protected template methods to be implemented by sub-classes // /** * Whether this policy applies. * * @return bool */ public function applies() { // Policies apply by default return true; } /** * This method must return a value of either * AUTHORIZATION_DENY or AUTHORIZATION_PERMIT. */ public function effect() { // Deny by default. return self::AUTHORIZATION_DENY; } } if (!PKP_STRICT_MODE) { class_alias('\PKP\security\authorization\AuthorizationPolicy', '\AuthorizationPolicy'); foreach ([ 'AUTHORIZATION_PERMIT', 'AUTHORIZATION_DENY', 'AUTHORIZATION_ADVICE_DENY_MESSAGE', 'AUTHORIZATION_ADVICE_CALL_ON_DENY', ] as $constantName) { define($constantName, constant('\AuthorizationPolicy::' . $constantName)); } }