26 import(
'lib.pkp.classes.security.authorization.PolicySet');
28 define(
'AUTHORIZATION_NOT_APPLICABLE', 0x03);
45 $this->_rootPolicySet =
new PolicySet(COMBINING_DENY_OVERRIDES);
58 $this->_rootPolicySet->setEffectIfNoPolicyApplies($decisionIfNoPolicyApplies);
68 function addPolicy($policyOrPolicySet, $addToTop =
false) {
69 $this->_rootPolicySet->addPolicy($policyOrPolicySet, $addToTop);
77 $this->_authorizationMessages[] = $message;
95 if (isset($this->_authorizedContext[$assocType])) {
96 return $this->_authorizedContext[$assocType];
126 assert($decision !== AUTHORIZATION_NOT_APPLICABLE);
129 if ($decision === AUTHORIZATION_DENY && !is_null($callOnDeny)) {
130 assert(is_array($callOnDeny) && count($callOnDeny) == 3);
131 list($classOrObject, $method, $parameters) = $callOnDeny;
132 $methodCall = array($classOrObject, $method);
133 assert(is_callable($methodCall));
134 call_user_func_array($methodCall, $parameters);
153 $combiningAlgorithm = $policySet->getCombiningAlgorithm();
154 switch($combiningAlgorithm) {
155 case COMBINING_DENY_OVERRIDES:
156 $dominantEffect = AUTHORIZATION_DENY;
157 $overriddenEffect = AUTHORIZATION_PERMIT;
160 case COMBINING_PERMIT_OVERRIDES:
161 $dominantEffect = AUTHORIZATION_PERMIT;
162 $overriddenEffect = AUTHORIZATION_DENY;
170 $decision = $policySet->getEffectIfNoPolicyApplies();
175 $decidedByOverriddenEffect =
false;
182 foreach($policySet->getPolicies() as $policy) {
185 case is_a($policy,
'AuthorizationPolicy'):
191 $policy->setAuthorizedContext($context);
194 if ($policy->applies()) {
196 $effect = $policy->effect();
198 $effect = AUTHORIZATION_NOT_APPLICABLE;
202 case is_a($policy,
'PolicySet'):
212 if ($effect === AUTHORIZATION_NOT_APPLICABLE)
continue;
213 assert($effect === AUTHORIZATION_PERMIT || $effect === AUTHORIZATION_DENY);
216 if (is_a($policy,
'AuthorizationPolicy') && $effect == AUTHORIZATION_DENY
217 && $policy->hasAdvice(AUTHORIZATION_ADVICE_DENY_MESSAGE)) {
222 if ($effect === $overriddenEffect) {
223 $decidedByOverriddenEffect =
true;
226 if (is_a($policy,
'AuthorizationPolicy') && $dominantEffect == AUTHORIZATION_DENY
227 && $policy->hasAdvice(AUTHORIZATION_ADVICE_CALL_ON_DENY)) {
228 $callOnDeny = $policy->getAdvice(AUTHORIZATION_ADVICE_CALL_ON_DENY);
233 return $dominantEffect;
240 if ($decidedByOverriddenEffect) $decision = $overriddenEffect;