Esempio n. 1
0
 /**
  * Calculate policy intersection as specified in Wrap-Up Procedure 6.1.5.g.
  *
  * @param ValidatorState $state
  * @param array $policies
  * @return ValidatorState
  */
 public function calculateIntersection(ValidatorState $state, array $policies)
 {
     $tree = clone $this;
     $valid_policy_node_set = $tree->_validPolicyNodeSet();
     // 2. If the valid_policy of any node in the valid_policy_node_set
     // is not in the user-initial-policy-set and is not anyPolicy,
     // delete this node and all its children.
     $valid_policy_node_set = array_filter($valid_policy_node_set, function (PolicyNode $node) use($policies) {
         if ($node->isAnyPolicy()) {
             return true;
         }
         if (in_array($node->validPolicy(), $policies)) {
             return true;
         }
         $node->remove();
         return false;
     });
     // array of valid policy OIDs
     $valid_policy_set = array_map(function (PolicyNode $node) {
         return $node->validPolicy();
     }, $valid_policy_node_set);
     // 3. If the valid_policy_tree includes a node of depth n with
     // the valid_policy anyPolicy and the user-initial-policy-set
     // is not any-policy
     foreach ($tree->_nodesAtDepth($state->index()) as $node) {
         if ($node->hasParent() && $node->isAnyPolicy()) {
             // a. Set P-Q to the qualifier_set in the node of depth n
             // with valid_policy anyPolicy.
             $pq = $node->qualifiers();
             // b. For each P-OID in the user-initial-policy-set that is not
             // the valid_policy of a node in the valid_policy_node_set,
             // create a child node whose parent is the node of depth n-1
             // with the valid_policy anyPolicy.
             $poids = array_diff($policies, $valid_policy_set);
             foreach ($tree->_nodesAtDepth($state->index() - 1) as $parent) {
                 if ($parent->isAnyPolicy()) {
                     // Set the values in the child node as follows:
                     // set the valid_policy to P-OID, set the qualifier_set
                     // to P-Q, and set the expected_policy_set to {P-OID}.
                     foreach ($poids as $poid) {
                         $parent->addChild(new PolicyNode($poid, $pq, array($poid)));
                     }
                     break;
                 }
             }
             // c. Delete the node of depth n with the
             // valid_policy anyPolicy.
             $node->remove();
         }
     }
     // 4. If there is a node in the valid_policy_tree of depth n-1 or less
     // without any child nodes, delete that node. Repeat this step until
     // there are no nodes of depth n-1 or less without children.
     if (!$tree->_pruneTree($state->index() - 1)) {
         return $state->withoutValidPolicyTree();
     }
     return $state->withValidPolicyTree($tree);
 }