Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
   1  <?php
   2  
   3  /**
   4   * Licensed to Jasig under one or more contributor license
   5   * agreements. See the NOTICE file distributed with this work for
   6   * additional information regarding copyright ownership.
   7   *
   8   * Jasig licenses this file to you under the Apache License,
   9   * Version 2.0 (the "License"); you may not use this file except in
  10   * compliance with the License. You may obtain a copy of the License at:
  11   *
  12   * http://www.apache.org/licenses/LICENSE-2.0
  13   *
  14   * Unless required by applicable law or agreed to in writing, software
  15   * distributed under the License is distributed on an "AS IS" BASIS,
  16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17   * See the License for the specific language governing permissions and
  18   * limitations under the License.
  19   *
  20   * PHP Version 5
  21   *
  22   * @file     CAS/ProxyChain/AllowedList.php
  23   * @category Authentication
  24   * @package  PhpCAS
  25   * @author   Adam Franco <afranco@middlebury.edu>
  26   * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License 2.0
  27   * @link     https://wiki.jasig.org/display/CASC/phpCAS
  28   */
  29  
  30  
  31  /**
  32   * ProxyChain is a container for storing chains of valid proxies that can
  33   * be used to validate proxied requests to a service
  34   *
  35   * @class    CAS_ProxyChain_AllowedList
  36   * @category Authentication
  37   * @package  PhpCAS
  38   * @author   Adam Franco <afranco@middlebury.edu>
  39   * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License 2.0
  40   * @link     https://wiki.jasig.org/display/CASC/phpCAS
  41   */
  42  
  43  class CAS_ProxyChain_AllowedList
  44  {
  45  
  46      private $_chains = array();
  47  
  48      /**
  49       * Check whether proxies are allowed by configuration
  50       *
  51       * @return bool
  52       */
  53      public function isProxyingAllowed()
  54      {
  55          return (count($this->_chains) > 0);
  56      }
  57  
  58      /**
  59       * Add a chain of proxies to the list of possible chains
  60       *
  61       * @param CAS_ProxyChain_Interface $chain A chain of proxies
  62       *
  63       * @return void
  64       */
  65      public function allowProxyChain(CAS_ProxyChain_Interface $chain)
  66      {
  67          $this->_chains[] = $chain;
  68      }
  69  
  70      /**
  71       * Check if the proxies found in the response match the allowed proxies
  72       *
  73       * @param array $proxies list of proxies to check
  74       *
  75       * @return bool whether the proxies match the allowed proxies
  76       */
  77      public function isProxyListAllowed(array $proxies)
  78      {
  79          phpCAS::traceBegin();
  80          if (empty($proxies)) {
  81              phpCAS::trace("No proxies were found in the response");
  82              phpCAS::traceEnd(true);
  83              return true;
  84          } elseif (!$this->isProxyingAllowed()) {
  85              phpCAS::trace("Proxies are not allowed");
  86              phpCAS::traceEnd(false);
  87              return false;
  88          } else {
  89              $res = $this->contains($proxies);
  90              phpCAS::traceEnd($res);
  91              return $res;
  92          }
  93      }
  94  
  95      /**
  96       * Validate the proxies from the proxy ticket validation against the
  97       * chains that were definded.
  98       *
  99       * @param array $list List of proxies from the proxy ticket validation.
 100       *
 101       * @return bool if any chain fully matches the supplied list
 102       */
 103      public function contains(array $list)
 104      {
 105          phpCAS::traceBegin();
 106          $count = 0;
 107          foreach ($this->_chains as $chain) {
 108              phpCAS::trace("Checking chain ". $count++);
 109              if ($chain->matches($list)) {
 110                  phpCAS::traceEnd(true);
 111                  return true;
 112              }
 113          }
 114          phpCAS::trace("No proxy chain matches.");
 115          phpCAS::traceEnd(false);
 116          return false;
 117      }
 118  }
 119  ?>