| @ -0,0 +1,108 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/AuthenticationException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This interface defines methods that allow proxy-authenticated service handlers | |||
| * to interact with phpCAS. | |||
| * | |||
| * Proxy service handlers must implement this interface as well as call | |||
| * phpCAS::initializeProxiedService($this) at some point in their implementation. | |||
| * | |||
| * While not required, proxy-authenticated service handlers are encouraged to | |||
| * implement the CAS_ProxiedService_Testable interface to facilitate unit testing. | |||
| * | |||
| * @class CAS_AuthenticationException | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_AuthenticationException | |||
| extends RuntimeException | |||
| implements CAS_Exception | |||
| { | |||
| /** | |||
| * This method is used to print the HTML output when the user was not | |||
| * authenticated. | |||
| * | |||
| * @param CAS_Client $client phpcas client | |||
| * @param string $failure the failure that occured | |||
| * @param string $cas_url the URL the CAS server was asked for | |||
| * @param bool $no_response the response from the CAS server (other | |||
| * parameters are ignored if TRUE) | |||
| * @param bool $bad_response bad response from the CAS server ($err_code | |||
| * and $err_msg ignored if TRUE) | |||
| * @param string $cas_response the response of the CAS server | |||
| * @param int $err_code the error code given by the CAS server | |||
| * @param string $err_msg the error message given by the CAS server | |||
| */ | |||
| public function __construct($client,$failure,$cas_url,$no_response, | |||
| $bad_response='',$cas_response='',$err_code='',$err_msg='' | |||
| ) { | |||
| phpCAS::traceBegin(); | |||
| $lang = $client->getLangObj(); | |||
| $client->printHTMLHeader($lang->getAuthenticationFailed()); | |||
| printf( | |||
| $lang->getYouWereNotAuthenticated(), | |||
| htmlentities($client->getURL()), | |||
| isset($_SERVER['SERVER_ADMIN']) ? $_SERVER['SERVER_ADMIN']:'' | |||
| ); | |||
| phpCAS::trace('CAS URL: '.$cas_url); | |||
| phpCAS::trace('Authentication failure: '.$failure); | |||
| if ( $no_response ) { | |||
| phpCAS::trace('Reason: no response from the CAS server'); | |||
| } else { | |||
| if ( $bad_response ) { | |||
| phpCAS::trace('Reason: bad response from the CAS server'); | |||
| } else { | |||
| switch ($client->getServerVersion()) { | |||
| case CAS_VERSION_1_0: | |||
| phpCAS::trace('Reason: CAS error'); | |||
| break; | |||
| case CAS_VERSION_2_0: | |||
| case CAS_VERSION_3_0: | |||
| if ( empty($err_code) ) { | |||
| phpCAS::trace('Reason: no CAS error'); | |||
| } else { | |||
| phpCAS::trace('Reason: ['.$err_code.'] CAS error: '.$err_msg); | |||
| } | |||
| break; | |||
| } | |||
| } | |||
| phpCAS::trace('CAS response: '.$cas_response); | |||
| } | |||
| $client->printHTMLFooter(); | |||
| phpCAS::traceExit(); | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,105 @@ | |||
| <?php | |||
| /** | |||
| * Autoloader Class | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Autoload.php | |||
| * @category Authentication | |||
| * @package SimpleCAS | |||
| * @author Brett Bieber <brett.bieber@gmail.com> | |||
| * @copyright 2008 Regents of the University of Nebraska | |||
| * @license http://www1.unl.edu/wdn/wiki/Software_License BSD License | |||
| * @link http://code.google.com/p/simplecas/ | |||
| **/ | |||
| /** | |||
| * Autoload a class | |||
| * | |||
| * @param string $class Classname to load | |||
| * | |||
| * @return bool | |||
| */ | |||
| function CAS_autoload($class) | |||
| { | |||
| // Static to hold the Include Path to CAS | |||
| static $include_path; | |||
| // Check only for CAS classes | |||
| if (substr($class, 0, 4) !== 'CAS_') { | |||
| return false; | |||
| } | |||
| // Setup the include path if it's not already set from a previous call | |||
| if (empty($include_path)) { | |||
| $include_path = array(dirname(dirname(__FILE__)), dirname(dirname(__FILE__)) . '/../test/' ); | |||
| } | |||
| // Declare local variable to store the expected full path to the file | |||
| foreach ($include_path as $path) { | |||
| $file_path = $path . '/' . str_replace('_', '/', $class) . '.php'; | |||
| $fp = @fopen($file_path, 'r', true); | |||
| if ($fp) { | |||
| fclose($fp); | |||
| include $file_path; | |||
| if (!class_exists($class, false) && !interface_exists($class, false)) { | |||
| die( | |||
| new Exception( | |||
| 'Class ' . $class . ' was not present in ' . | |||
| $file_path . | |||
| ' [CAS_autoload]' | |||
| ) | |||
| ); | |||
| } | |||
| return true; | |||
| } | |||
| } | |||
| $e = new Exception( | |||
| 'Class ' . $class . ' could not be loaded from ' . | |||
| $file_path . ', file does not exist (Path="' | |||
| . implode(':', $include_path) .'") [CAS_autoload]' | |||
| ); | |||
| $trace = $e->getTrace(); | |||
| if (isset($trace[2]) && isset($trace[2]['function']) | |||
| && in_array($trace[2]['function'], array('class_exists', 'interface_exists')) | |||
| ) { | |||
| return false; | |||
| } | |||
| if (isset($trace[1]) && isset($trace[1]['function']) | |||
| && in_array($trace[1]['function'], array('class_exists', 'interface_exists')) | |||
| ) { | |||
| return false; | |||
| } | |||
| die ((string) $e); | |||
| } | |||
| // set up __autoload | |||
| if (function_exists('spl_autoload_register')) { | |||
| if (!(spl_autoload_functions()) | |||
| || !in_array('CAS_autoload', spl_autoload_functions()) | |||
| ) { | |||
| spl_autoload_register('CAS_autoload'); | |||
| if (function_exists('__autoload') | |||
| && !in_array('__autoload', spl_autoload_functions()) | |||
| ) { | |||
| // __autoload() was being used, but now would be ignored, add | |||
| // it to the autoload stack | |||
| spl_autoload_register('__autoload'); | |||
| } | |||
| } | |||
| } elseif (!function_exists('__autoload')) { | |||
| /** | |||
| * Autoload a class | |||
| * | |||
| * @param string $class Class name | |||
| * | |||
| * @return bool | |||
| */ | |||
| function __autoload($class) | |||
| { | |||
| return CAS_autoload($class); | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,385 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/CookieJar.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This class provides access to service cookies and handles parsing of response | |||
| * headers to pull out cookie values. | |||
| * | |||
| * @class CAS_CookieJar | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_CookieJar | |||
| { | |||
| private $_cookies; | |||
| /** | |||
| * Create a new cookie jar by passing it a reference to an array in which it | |||
| * should store cookies. | |||
| * | |||
| * @param array &$storageArray Array to store cookies | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct (array &$storageArray) | |||
| { | |||
| $this->_cookies =& $storageArray; | |||
| } | |||
| /** | |||
| * Store cookies for a web service request. | |||
| * Cookie storage is based on RFC 2965: http://www.ietf.org/rfc/rfc2965.txt | |||
| * | |||
| * @param string $request_url The URL that generated the response headers. | |||
| * @param array $response_headers An array of the HTTP response header strings. | |||
| * | |||
| * @return void | |||
| * | |||
| * @access private | |||
| */ | |||
| public function storeCookies ($request_url, $response_headers) | |||
| { | |||
| $urlParts = parse_url($request_url); | |||
| $defaultDomain = $urlParts['host']; | |||
| $cookies = $this->parseCookieHeaders($response_headers, $defaultDomain); | |||
| // var_dump($cookies); | |||
| foreach ($cookies as $cookie) { | |||
| // Enforce the same-origin policy by verifying that the cookie | |||
| // would match the url that is setting it | |||
| if (!$this->cookieMatchesTarget($cookie, $urlParts)) { | |||
| continue; | |||
| } | |||
| // store the cookie | |||
| $this->storeCookie($cookie); | |||
| phpCAS::trace($cookie['name'].' -> '.$cookie['value']); | |||
| } | |||
| } | |||
| /** | |||
| * Retrieve cookies applicable for a web service request. | |||
| * Cookie applicability is based on RFC 2965: http://www.ietf.org/rfc/rfc2965.txt | |||
| * | |||
| * @param string $request_url The url that the cookies will be for. | |||
| * | |||
| * @return array An array containing cookies. E.g. array('name' => 'val'); | |||
| * | |||
| * @access private | |||
| */ | |||
| public function getCookies ($request_url) | |||
| { | |||
| if (!count($this->_cookies)) { | |||
| return array(); | |||
| } | |||
| // If our request URL can't be parsed, no cookies apply. | |||
| $target = parse_url($request_url); | |||
| if ($target === false) { | |||
| return array(); | |||
| } | |||
| $this->expireCookies(); | |||
| $matching_cookies = array(); | |||
| foreach ($this->_cookies as $key => $cookie) { | |||
| if ($this->cookieMatchesTarget($cookie, $target)) { | |||
| $matching_cookies[$cookie['name']] = $cookie['value']; | |||
| } | |||
| } | |||
| return $matching_cookies; | |||
| } | |||
| /** | |||
| * Parse Cookies without PECL | |||
| * From the comments in http://php.net/manual/en/function.http-parse-cookie.php | |||
| * | |||
| * @param array $header array of header lines. | |||
| * @param string $defaultDomain The domain to use if none is specified in | |||
| * the cookie. | |||
| * | |||
| * @return array of cookies | |||
| */ | |||
| protected function parseCookieHeaders( $header, $defaultDomain ) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| $cookies = array(); | |||
| foreach ( $header as $line ) { | |||
| if ( preg_match('/^Set-Cookie2?: /i', $line)) { | |||
| $cookies[] = $this->parseCookieHeader($line, $defaultDomain); | |||
| } | |||
| } | |||
| phpCAS::traceEnd($cookies); | |||
| return $cookies; | |||
| } | |||
| /** | |||
| * Parse a single cookie header line. | |||
| * | |||
| * Based on RFC2965 http://www.ietf.org/rfc/rfc2965.txt | |||
| * | |||
| * @param string $line The header line. | |||
| * @param string $defaultDomain The domain to use if none is specified in | |||
| * the cookie. | |||
| * | |||
| * @return array | |||
| */ | |||
| protected function parseCookieHeader ($line, $defaultDomain) | |||
| { | |||
| if (!$defaultDomain) { | |||
| throw new CAS_InvalidArgumentException( | |||
| '$defaultDomain was not provided.' | |||
| ); | |||
| } | |||
| // Set our default values | |||
| $cookie = array( | |||
| 'domain' => $defaultDomain, | |||
| 'path' => '/', | |||
| 'secure' => false, | |||
| ); | |||
| $line = preg_replace('/^Set-Cookie2?: /i', '', trim($line)); | |||
| // trim any trailing semicolons. | |||
| $line = trim($line, ';'); | |||
| phpCAS::trace("Cookie Line: $line"); | |||
| // This implementation makes the assumption that semicolons will not | |||
| // be present in quoted attribute values. While attribute values that | |||
| // contain semicolons are allowed by RFC2965, they are hopefully rare | |||
| // enough to ignore for our purposes. Most browsers make the same | |||
| // assumption. | |||
| $attributeStrings = explode(';', $line); | |||
| foreach ( $attributeStrings as $attributeString ) { | |||
| // split on the first equals sign and use the rest as value | |||
| $attributeParts = explode('=', $attributeString, 2); | |||
| $attributeName = trim($attributeParts[0]); | |||
| $attributeNameLC = strtolower($attributeName); | |||
| if (isset($attributeParts[1])) { | |||
| $attributeValue = trim($attributeParts[1]); | |||
| // Values may be quoted strings. | |||
| if (strpos($attributeValue, '"') === 0) { | |||
| $attributeValue = trim($attributeValue, '"'); | |||
| // unescape any escaped quotes: | |||
| $attributeValue = str_replace('\"', '"', $attributeValue); | |||
| } | |||
| } else { | |||
| $attributeValue = null; | |||
| } | |||
| switch ($attributeNameLC) { | |||
| case 'expires': | |||
| $cookie['expires'] = strtotime($attributeValue); | |||
| break; | |||
| case 'max-age': | |||
| $cookie['max-age'] = (int)$attributeValue; | |||
| // Set an expiry time based on the max-age | |||
| if ($cookie['max-age']) { | |||
| $cookie['expires'] = time() + $cookie['max-age']; | |||
| } else { | |||
| // If max-age is zero, then the cookie should be removed | |||
| // imediately so set an expiry before now. | |||
| $cookie['expires'] = time() - 1; | |||
| } | |||
| break; | |||
| case 'secure': | |||
| $cookie['secure'] = true; | |||
| break; | |||
| case 'domain': | |||
| case 'path': | |||
| case 'port': | |||
| case 'version': | |||
| case 'comment': | |||
| case 'commenturl': | |||
| case 'discard': | |||
| case 'httponly': | |||
| $cookie[$attributeNameLC] = $attributeValue; | |||
| break; | |||
| default: | |||
| $cookie['name'] = $attributeName; | |||
| $cookie['value'] = $attributeValue; | |||
| } | |||
| } | |||
| return $cookie; | |||
| } | |||
| /** | |||
| * Add, update, or remove a cookie. | |||
| * | |||
| * @param array $cookie A cookie array as created by parseCookieHeaders() | |||
| * | |||
| * @return void | |||
| * | |||
| * @access protected | |||
| */ | |||
| protected function storeCookie ($cookie) | |||
| { | |||
| // Discard any old versions of this cookie. | |||
| $this->discardCookie($cookie); | |||
| $this->_cookies[] = $cookie; | |||
| } | |||
| /** | |||
| * Discard an existing cookie | |||
| * | |||
| * @param array $cookie An cookie | |||
| * | |||
| * @return void | |||
| * | |||
| * @access protected | |||
| */ | |||
| protected function discardCookie ($cookie) | |||
| { | |||
| if (!isset($cookie['domain']) | |||
| || !isset($cookie['path']) | |||
| || !isset($cookie['path']) | |||
| ) { | |||
| throw new CAS_InvalidArgumentException('Invalid Cookie array passed.'); | |||
| } | |||
| foreach ($this->_cookies as $key => $old_cookie) { | |||
| if ( $cookie['domain'] == $old_cookie['domain'] | |||
| && $cookie['path'] == $old_cookie['path'] | |||
| && $cookie['name'] == $old_cookie['name'] | |||
| ) { | |||
| unset($this->_cookies[$key]); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Go through our stored cookies and remove any that are expired. | |||
| * | |||
| * @return void | |||
| * | |||
| * @access protected | |||
| */ | |||
| protected function expireCookies () | |||
| { | |||
| foreach ($this->_cookies as $key => $cookie) { | |||
| if (isset($cookie['expires']) && $cookie['expires'] < time()) { | |||
| unset($this->_cookies[$key]); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Answer true if cookie is applicable to a target. | |||
| * | |||
| * @param array $cookie An array of cookie attributes. | |||
| * @param array $target An array of URL attributes as generated by parse_url(). | |||
| * | |||
| * @return bool | |||
| * | |||
| * @access private | |||
| */ | |||
| protected function cookieMatchesTarget ($cookie, $target) | |||
| { | |||
| if (!is_array($target)) { | |||
| throw new CAS_InvalidArgumentException( | |||
| '$target must be an array of URL attributes as generated by parse_url().' | |||
| ); | |||
| } | |||
| if (!isset($target['host'])) { | |||
| throw new CAS_InvalidArgumentException( | |||
| '$target must be an array of URL attributes as generated by parse_url().' | |||
| ); | |||
| } | |||
| // Verify that the scheme matches | |||
| if ($cookie['secure'] && $target['scheme'] != 'https') { | |||
| return false; | |||
| } | |||
| // Verify that the host matches | |||
| // Match domain and mulit-host cookies | |||
| if (strpos($cookie['domain'], '.') === 0) { | |||
| // .host.domain.edu cookies are valid for host.domain.edu | |||
| if (substr($cookie['domain'], 1) == $target['host']) { | |||
| // continue with other checks | |||
| } else { | |||
| // non-exact host-name matches. | |||
| // check that the target host a.b.c.edu is within .b.c.edu | |||
| $pos = strripos($target['host'], $cookie['domain']); | |||
| if (!$pos) { | |||
| return false; | |||
| } | |||
| // verify that the cookie domain is the last part of the host. | |||
| if ($pos + strlen($cookie['domain']) != strlen($target['host'])) { | |||
| return false; | |||
| } | |||
| // verify that the host name does not contain interior dots as per | |||
| // RFC 2965 section 3.3.2 Rejecting Cookies | |||
| // http://www.ietf.org/rfc/rfc2965.txt | |||
| $hostname = substr($target['host'], 0, $pos); | |||
| if (strpos($hostname, '.') !== false) { | |||
| return false; | |||
| } | |||
| } | |||
| } else { | |||
| // If the cookie host doesn't begin with '.', | |||
| // the host must case-insensitive match exactly | |||
| if (strcasecmp($target['host'], $cookie['domain']) !== 0) { | |||
| return false; | |||
| } | |||
| } | |||
| // Verify that the port matches | |||
| if (isset($cookie['ports']) | |||
| && !in_array($target['port'], $cookie['ports']) | |||
| ) { | |||
| return false; | |||
| } | |||
| // Verify that the path matches | |||
| if (strpos($target['path'], $cookie['path']) !== 0) { | |||
| return false; | |||
| } | |||
| return true; | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,59 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Exception.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * A root exception interface for all exceptions in phpCAS. | |||
| * | |||
| * All exceptions thrown in phpCAS should implement this interface to allow them | |||
| * to be caught as a category by clients. Each phpCAS exception should extend | |||
| * an appropriate SPL exception class that best fits its type. | |||
| * | |||
| * For example, an InvalidArgumentException in phpCAS should be defined as | |||
| * | |||
| * class CAS_InvalidArgumentException | |||
| * extends InvalidArgumentException | |||
| * implements CAS_Exception | |||
| * { } | |||
| * | |||
| * This definition allows the CAS_InvalidArgumentException to be caught as either | |||
| * an InvalidArgumentException or as a CAS_Exception. | |||
| * | |||
| * @class CAS_Exception | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| */ | |||
| interface CAS_Exception | |||
| { | |||
| } | |||
| ?> | |||
| @ -0,0 +1,86 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/GracefullTerminationException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * An exception for terminatinating execution or to throw for unit testing | |||
| * | |||
| * @class CAS_GracefullTerminationException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_GracefullTerminationException | |||
| extends RuntimeException | |||
| implements CAS_Exception | |||
| { | |||
| /** | |||
| * Test if exceptions should be thrown or if we should just exit. | |||
| * In production usage we want to just exit cleanly when prompting the user | |||
| * for a redirect without filling the error logs with uncaught exceptions. | |||
| * In unit testing scenarios we cannot exit or we won't be able to continue | |||
| * with our tests. | |||
| * | |||
| * @param string $message Message Text | |||
| * @param string $code Error code | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct ($message = 'Terminate Gracefully', $code = 0) | |||
| { | |||
| // Exit cleanly to avoid filling up the logs with uncaught exceptions. | |||
| if (self::$_exitWhenThrown) { | |||
| exit; | |||
| } else { | |||
| // Throw exceptions to allow unit testing to continue; | |||
| parent::__construct($message, $code); | |||
| } | |||
| } | |||
| private static $_exitWhenThrown = true; | |||
| /** | |||
| * Force phpcas to thow Exceptions instead of calling exit() | |||
| * Needed for unit testing. Generally shouldn't be used in production due to | |||
| * an increase in Apache error logging if CAS_GracefulTerminiationExceptions | |||
| * are not caught and handled. | |||
| * | |||
| * @return void | |||
| */ | |||
| public static function throwInsteadOfExiting() | |||
| { | |||
| self::$_exitWhenThrown = false; | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,46 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/InvalidArgumentException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Exception that denotes invalid arguments were passed. | |||
| * | |||
| * @class CAS_InvalidArgumentException | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_InvalidArgumentException | |||
| extends InvalidArgumentException | |||
| implements CAS_Exception | |||
| { | |||
| } | |||
| ?> | |||
| @ -0,0 +1,114 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Language/Catalan.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Iván-Benjamín García Torà <ivaniclixx@gmail.com> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Catalan language class | |||
| * | |||
| * @class CAS_Languages_Catalan | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Iván-Benjamín García Torà <ivaniclixx@gmail.com> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * @sa @link internalLang Internationalization @endlink | |||
| * @ingroup internalLang | |||
| */ | |||
| class CAS_Languages_Catalan implements CAS_Languages_LanguageInterface | |||
| { | |||
| /** | |||
| * Get the using server string | |||
| * | |||
| * @return string using server | |||
| */ | |||
| public function getUsingServer() | |||
| { | |||
| return 'usant servidor'; | |||
| } | |||
| /** | |||
| * Get authentication wanted string | |||
| * | |||
| * @return string authentication wanted | |||
| */ | |||
| public function getAuthenticationWanted() | |||
| { | |||
| return 'Autentificació CAS necessària!'; | |||
| } | |||
| /** | |||
| * Get logout string | |||
| * | |||
| * @return string logout | |||
| */ | |||
| public function getLogout() | |||
| { | |||
| return 'Sortida de CAS necessària!'; | |||
| } | |||
| /** | |||
| * Get the should have been redirected string | |||
| * | |||
| * @return string should habe been redirected | |||
| */ | |||
| public function getShouldHaveBeenRedirected() | |||
| { | |||
| return 'Ja hauria d\ haver estat redireccionat al servidor CAS. Feu click <a href="%s">aquí</a> per a continuar.'; | |||
| } | |||
| /** | |||
| * Get authentication failed string | |||
| * | |||
| * @return string authentication failed | |||
| */ | |||
| public function getAuthenticationFailed() | |||
| { | |||
| return 'Autentificació CAS fallida!'; | |||
| } | |||
| /** | |||
| * Get the your were not authenticated string | |||
| * | |||
| * @return string not authenticated | |||
| */ | |||
| public function getYouWereNotAuthenticated() | |||
| { | |||
| return '<p>No estàs autentificat.</p><p>Pots tornar a intentar-ho fent click <a href="%s">aquí</a>.</p><p>Si el problema persisteix hauría de contactar amb l\'<a href="mailto:%s">administrador d\'aquest llocc</a>.</p>'; | |||
| } | |||
| /** | |||
| * Get the service unavailable string | |||
| * | |||
| * @return string service unavailable | |||
| */ | |||
| public function getServiceUnavailable() | |||
| { | |||
| return 'El servei `<b>%s</b>\' no està disponible (<b>%s</b>).'; | |||
| } | |||
| } | |||
| @ -0,0 +1,114 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Language/English.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * English language class | |||
| * | |||
| * @class CAS_Languages_English | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * @sa @link internalLang Internationalization @endlink | |||
| * @ingroup internalLang | |||
| */ | |||
| class CAS_Languages_English implements CAS_Languages_LanguageInterface | |||
| { | |||
| /** | |||
| * Get the using server string | |||
| * | |||
| * @return string using server | |||
| */ | |||
| public function getUsingServer() | |||
| { | |||
| return 'using server'; | |||
| } | |||
| /** | |||
| * Get authentication wanted string | |||
| * | |||
| * @return string authentication wanted | |||
| */ | |||
| public function getAuthenticationWanted() | |||
| { | |||
| return 'CAS Authentication wanted!'; | |||
| } | |||
| /** | |||
| * Get logout string | |||
| * | |||
| * @return string logout | |||
| */ | |||
| public function getLogout() | |||
| { | |||
| return 'CAS logout wanted!'; | |||
| } | |||
| /** | |||
| * Get the should have been redirected string | |||
| * | |||
| * @return string should habe been redirected | |||
| */ | |||
| public function getShouldHaveBeenRedirected() | |||
| { | |||
| return 'You should already have been redirected to the CAS server. Click <a href="%s">here</a> to continue.'; | |||
| } | |||
| /** | |||
| * Get authentication failed string | |||
| * | |||
| * @return string authentication failed | |||
| */ | |||
| public function getAuthenticationFailed() | |||
| { | |||
| return 'CAS Authentication failed!'; | |||
| } | |||
| /** | |||
| * Get the your were not authenticated string | |||
| * | |||
| * @return string not authenticated | |||
| */ | |||
| public function getYouWereNotAuthenticated() | |||
| { | |||
| return '<p>You were not authenticated.</p><p>You may submit your request again by clicking <a href="%s">here</a>.</p><p>If the problem persists, you may contact <a href="mailto:%s">the administrator of this site</a>.</p>'; | |||
| } | |||
| /** | |||
| * Get the service unavailable string | |||
| * | |||
| * @return string service unavailable | |||
| */ | |||
| public function getServiceUnavailable() | |||
| { | |||
| return 'The service `<b>%s</b>\' is not available (<b>%s</b>).'; | |||
| } | |||
| } | |||
| @ -0,0 +1,116 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Language/French.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * French language class | |||
| * | |||
| * @class CAS_Languages_French | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * @sa @link internalLang Internationalization @endlink | |||
| * @ingroup internalLang | |||
| */ | |||
| class CAS_Languages_French implements CAS_Languages_LanguageInterface | |||
| { | |||
| /** | |||
| * Get the using server string | |||
| * | |||
| * @return string using server | |||
| */ | |||
| public function getUsingServer() | |||
| { | |||
| return 'utilisant le serveur'; | |||
| } | |||
| /** | |||
| * Get authentication wanted string | |||
| * | |||
| * @return string authentication wanted | |||
| */ | |||
| public function getAuthenticationWanted() | |||
| { | |||
| return 'Authentication CAS nécessaire !'; | |||
| } | |||
| /** | |||
| * Get logout string | |||
| * | |||
| * @return string logout | |||
| */ | |||
| public function getLogout() | |||
| { | |||
| return 'Déconnexion demandée !'; | |||
| } | |||
| /** | |||
| * Get the should have been redirected string | |||
| * | |||
| * @return string should habe been redirected | |||
| */ | |||
| public function getShouldHaveBeenRedirected() | |||
| { | |||
| return 'Vous auriez du etre redirigé(e) vers le serveur CAS. Cliquez <a href="%s">ici</a> pour continuer.'; | |||
| } | |||
| /** | |||
| * Get authentication failed string | |||
| * | |||
| * @return string authentication failed | |||
| */ | |||
| public function getAuthenticationFailed() | |||
| { | |||
| return 'Authentification CAS infructueuse !'; | |||
| } | |||
| /** | |||
| * Get the your were not authenticated string | |||
| * | |||
| * @return string not authenticated | |||
| */ | |||
| public function getYouWereNotAuthenticated() | |||
| { | |||
| return '<p>Vous n\'avez pas été authentifié(e).</p><p>Vous pouvez soumettre votre requete à nouveau en cliquant <a href="%s">ici</a>.</p><p>Si le problème persiste, vous pouvez contacter <a href="mailto:%s">l\'administrateur de ce site</a>.</p>'; | |||
| } | |||
| /** | |||
| * Get the service unavailable string | |||
| * | |||
| * @return string service unavailable | |||
| */ | |||
| public function getServiceUnavailable() | |||
| { | |||
| return 'Le service `<b>%s</b>\' est indisponible (<b>%s</b>)'; | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,116 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Language/German.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Henrik Genssen <hg@mediafactory.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * German language class | |||
| * | |||
| * @class CAS_Languages_German | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Henrik Genssen <hg@mediafactory.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * @sa @link internalLang Internationalization @endlink | |||
| * @ingroup internalLang | |||
| */ | |||
| class CAS_Languages_German implements CAS_Languages_LanguageInterface | |||
| { | |||
| /** | |||
| * Get the using server string | |||
| * | |||
| * @return string using server | |||
| */ | |||
| public function getUsingServer() | |||
| { | |||
| return 'via Server'; | |||
| } | |||
| /** | |||
| * Get authentication wanted string | |||
| * | |||
| * @return string authentication wanted | |||
| */ | |||
| public function getAuthenticationWanted() | |||
| { | |||
| return 'CAS Authentifizierung erforderlich!'; | |||
| } | |||
| /** | |||
| * Get logout string | |||
| * | |||
| * @return string logout | |||
| */ | |||
| public function getLogout() | |||
| { | |||
| return 'CAS Abmeldung!'; | |||
| } | |||
| /** | |||
| * Get the should have been redirected string | |||
| * | |||
| * @return string should habe been redirected | |||
| */ | |||
| public function getShouldHaveBeenRedirected() | |||
| { | |||
| return 'eigentlich häten Sie zum CAS Server weitergeleitet werden sollen. Drücken Sie <a href="%s">hier</a> um fortzufahren.'; | |||
| } | |||
| /** | |||
| * Get authentication failed string | |||
| * | |||
| * @return string authentication failed | |||
| */ | |||
| public function getAuthenticationFailed() | |||
| { | |||
| return 'CAS Anmeldung fehlgeschlagen!'; | |||
| } | |||
| /** | |||
| * Get the your were not authenticated string | |||
| * | |||
| * @return string not authenticated | |||
| */ | |||
| public function getYouWereNotAuthenticated() | |||
| { | |||
| return '<p>Sie wurden nicht angemeldet.</p><p>Um es erneut zu versuchen klicken Sie <a href="%s">hier</a>.</p><p>Wenn das Problem bestehen bleibt, kontaktieren Sie den <a href="mailto:%s">Administrator</a> dieser Seite.</p>'; | |||
| } | |||
| /** | |||
| * Get the service unavailable string | |||
| * | |||
| * @return string service unavailable | |||
| */ | |||
| public function getServiceUnavailable() | |||
| { | |||
| return 'Der Dienst `<b>%s</b>\' ist nicht verfügbar (<b>%s</b>).'; | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,115 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Language/Greek.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Vangelis Haniotakis <haniotak@ucnet.uoc.gr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Greek language class | |||
| * | |||
| * @class CAS_Languages_Greek | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Vangelis Haniotakis <haniotak@ucnet.uoc.gr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * @sa @link internalLang Internationalization @endlink | |||
| * @ingroup internalLang | |||
| */ | |||
| class CAS_Languages_Greek implements CAS_Languages_LanguageInterface | |||
| { | |||
| /** | |||
| * Get the using server string | |||
| * | |||
| * @return string using server | |||
| */ | |||
| public function getUsingServer() | |||
| { | |||
| return '÷ñçóéìïðïéåßôáé ï åîõðçñåôçôÞò'; | |||
| } | |||
| /** | |||
| * Get authentication wanted string | |||
| * | |||
| * @return string authentication wanted | |||
| */ | |||
| public function getAuthenticationWanted() | |||
| { | |||
| return 'Áðáéôåßôáé ç ôáõôïðïßçóç CAS!'; | |||
| } | |||
| /** | |||
| * Get logout string | |||
| * | |||
| * @return string logout | |||
| */ | |||
| public function getLogout() | |||
| { | |||
| return 'Áðáéôåßôáé ç áðïóýíäåóç áðü CAS!'; | |||
| } | |||
| /** | |||
| * Get the should have been redirected string | |||
| * | |||
| * @return string should habe been redirected | |||
| */ | |||
| public function getShouldHaveBeenRedirected() | |||
| { | |||
| return 'Èá Ýðñåðå íá åß÷áôå áíáêáôåõèõíèåß óôïí åîõðçñåôçôÞ CAS. ÊÜíôå êëßê <a href="%s">åäþ</a> ãéá íá óõíå÷ßóåôå.'; | |||
| } | |||
| /** | |||
| * Get authentication failed string | |||
| * | |||
| * @return string authentication failed | |||
| */ | |||
| public function getAuthenticationFailed() | |||
| { | |||
| return 'Ç ôáõôïðïßçóç CAS áðÝôõ÷å!'; | |||
| } | |||
| /** | |||
| * Get the your were not authenticated string | |||
| * | |||
| * @return string not authenticated | |||
| */ | |||
| public function getYouWereNotAuthenticated() | |||
| { | |||
| return '<p>Äåí ôáõôïðïéçèÞêáôå.</p><p>Ìðïñåßôå íá îáíáðñïóðáèÞóåôå, êÜíïíôáò êëßê <a href="%s">åäþ</a>.</p><p>Åáí ôï ðñüâëçìá åðéìåßíåé, åëÜôå óå åðáöÞ ìå ôïí <a href="mailto:%s">äéá÷åéñéóôÞ</a>.</p>'; | |||
| } | |||
| /** | |||
| * Get the service unavailable string | |||
| * | |||
| * @return string service unavailable | |||
| */ | |||
| public function getServiceUnavailable() | |||
| { | |||
| return 'Ç õðçñåóßá `<b>%s</b>\' äåí åßíáé äéáèÝóéìç (<b>%s</b>).'; | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,113 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Language/Japanese.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author fnorif <fnorif@yahoo.co.jp> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Japanese language class. Now Encoding is EUC-JP and LF | |||
| * | |||
| * @class CAS_Languages_Japanese | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author fnorif <fnorif@yahoo.co.jp> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| **/ | |||
| class CAS_Languages_Japanese implements CAS_Languages_LanguageInterface | |||
| { | |||
| /** | |||
| * Get the using server string | |||
| * | |||
| * @return string using server | |||
| */ | |||
| public function getUsingServer() | |||
| { | |||
| return 'using server'; | |||
| } | |||
| /** | |||
| * Get authentication wanted string | |||
| * | |||
| * @return string authentication wanted | |||
| */ | |||
| public function getAuthenticationWanted() | |||
| { | |||
| return 'CAS�ˤ��ǧ�ڤ�Ԥ��ޤ�'; | |||
| } | |||
| /** | |||
| * Get logout string | |||
| * | |||
| * @return string logout | |||
| */ | |||
| public function getLogout() | |||
| { | |||
| return 'CAS����?�����Ȥ��ޤ�!'; | |||
| } | |||
| /** | |||
| * Get the should have been redirected string | |||
| * | |||
| * @return string should habe been redirected | |||
| */ | |||
| public function getShouldHaveBeenRedirected() | |||
| { | |||
| return 'CAS�����Ф˹Ԥ�ɬ�פ�����ޤ�����ưŪ��ž������ʤ����� <a href="%s">������</a> ��å�����³�Ԥ��ޤ��'; | |||
| } | |||
| /** | |||
| * Get authentication failed string | |||
| * | |||
| * @return string authentication failed | |||
| */ | |||
| public function getAuthenticationFailed() | |||
| { | |||
| return 'CAS�ˤ��ǧ�ڤ˼��Ԥ��ޤ���'; | |||
| } | |||
| /** | |||
| * Get the your were not authenticated string | |||
| * | |||
| * @return string not authenticated | |||
| */ | |||
| public function getYouWereNotAuthenticated() | |||
| { | |||
| return '<p>ǧ�ڤǤ��ޤ���Ǥ���.</p><p>�⤦���٥ꥯ�����Ȥ������������<a href="%s">������</a>��å�.</p><p>���꤬��褷�ʤ����� <a href="mailto:%s">���Υ����Ȥδ����</a>���䤤��碌�Ƥ�������.</p>'; | |||
| } | |||
| /** | |||
| * Get the service unavailable string | |||
| * | |||
| * @return string service unavailable | |||
| */ | |||
| public function getServiceUnavailable() | |||
| { | |||
| return '�����ӥ� `<b>%s</b>\' �����ѤǤ��ޤ��� (<b>%s</b>).'; | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,96 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Language/LanguageInterface.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Language Interface class for all internationalization files | |||
| * | |||
| * @class CAS_Languages_LanguageInterface | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * @sa @link internalLang Internationalization @endlink | |||
| * @ingroup internalLang | |||
| */ | |||
| interface CAS_Languages_LanguageInterface | |||
| { | |||
| /** | |||
| * Get the using server string | |||
| * | |||
| * @return string using server | |||
| */ | |||
| public function getUsingServer(); | |||
| /** | |||
| * Get authentication wanted string | |||
| * | |||
| * @return string authentication wanted | |||
| */ | |||
| public function getAuthenticationWanted(); | |||
| /** | |||
| * Get logout string | |||
| * | |||
| * @return string logout | |||
| */ | |||
| public function getLogout(); | |||
| /** | |||
| * Get the should have been redirected string | |||
| * | |||
| * @return string should habe been redirected | |||
| */ | |||
| public function getShouldHaveBeenRedirected(); | |||
| /** | |||
| * Get authentication failed string | |||
| * | |||
| * @return string authentication failed | |||
| */ | |||
| public function getAuthenticationFailed(); | |||
| /** | |||
| * Get the your were not authenticated string | |||
| * | |||
| * @return string not authenticated | |||
| */ | |||
| public function getYouWereNotAuthenticated(); | |||
| /** | |||
| * Get the service unavailable string | |||
| * | |||
| * @return string service unavailable | |||
| */ | |||
| public function getServiceUnavailable(); | |||
| } | |||
| ?> | |||
| @ -0,0 +1,117 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Language/Spanish.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Iván-Benjamín García Torà <ivaniclixx@gmail.com> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Spanish language class | |||
| * | |||
| * @class CAS_Languages_Spanish | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Iván-Benjamín García Torà <ivaniclixx@gmail.com> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * @sa @link internalLang Internationalization @endlink | |||
| * @ingroup internalLang | |||
| */ | |||
| class CAS_Languages_Spanish implements CAS_Languages_LanguageInterface | |||
| { | |||
| /** | |||
| * Get the using server string | |||
| * | |||
| * @return string using server | |||
| */ | |||
| public function getUsingServer() | |||
| { | |||
| return 'usando servidor'; | |||
| } | |||
| /** | |||
| * Get authentication wanted string | |||
| * | |||
| * @return string authentication wanted | |||
| */ | |||
| public function getAuthenticationWanted() | |||
| { | |||
| return '¡Autentificación CAS necesaria!'; | |||
| } | |||
| /** | |||
| * Get logout string | |||
| * | |||
| * @return string logout | |||
| */ | |||
| public function getLogout() | |||
| { | |||
| return '¡Salida CAS necesaria!'; | |||
| } | |||
| /** | |||
| * Get the should have been redirected string | |||
| * | |||
| * @return string should habe been redirected | |||
| */ | |||
| public function getShouldHaveBeenRedirected() | |||
| { | |||
| return 'Ya debería haber sido redireccionado al servidor CAS. Haga click <a href="%s">aquí</a> para continuar.'; | |||
| } | |||
| /** | |||
| * Get authentication failed string | |||
| * | |||
| * @return string authentication failed | |||
| */ | |||
| public function getAuthenticationFailed() | |||
| { | |||
| return '¡Autentificación CAS fallida!'; | |||
| } | |||
| /** | |||
| * Get the your were not authenticated string | |||
| * | |||
| * @return string not authenticated | |||
| */ | |||
| public function getYouWereNotAuthenticated() | |||
| { | |||
| return '<p>No estás autentificado.</p><p>Puedes volver a intentarlo haciendo click <a href="%s">aquí</a>.</p><p>Si el problema persiste debería contactar con el <a href="mailto:%s">administrador de este sitio</a>.</p>'; | |||
| } | |||
| /** | |||
| * Get the service unavailable string | |||
| * | |||
| * @return string service unavailable | |||
| */ | |||
| public function getServiceUnavailable() | |||
| { | |||
| return 'El servicio `<b>%s</b>\' no está disponible (<b>%s</b>).'; | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,56 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/OutOfSequenceBeforeAuthenticationCallException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This class defines Exceptions that should be thrown when the sequence of | |||
| * operations is invalid. In this case it should be thrown when an | |||
| * authentication call has not yet happened. | |||
| * | |||
| * @class CAS_OutOfSequenceBeforeAuthenticationCallException | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_OutOfSequenceBeforeAuthenticationCallException | |||
| extends CAS_OutOfSequenceException | |||
| implements CAS_Exception | |||
| { | |||
| /** | |||
| * Return standard error meessage | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct () | |||
| { | |||
| parent::__construct('An authentication call hasn\'t happened yet.'); | |||
| } | |||
| } | |||
| @ -0,0 +1,58 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/OutOfSequenceBeforeClientException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This class defines Exceptions that should be thrown when the sequence of | |||
| * operations is invalid. In this case it should be thrown when the client() or | |||
| * proxy() call has not yet happened and no client or proxy object exists. | |||
| * | |||
| * @class CAS_OutOfSequenceBeforeClientException | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_OutOfSequenceBeforeClientException | |||
| extends CAS_OutOfSequenceException | |||
| implements CAS_Exception | |||
| { | |||
| /** | |||
| * Return standard error message | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct () | |||
| { | |||
| parent::__construct( | |||
| 'this method cannot be called before phpCAS::client() or phpCAS::proxy()' | |||
| ); | |||
| } | |||
| } | |||
| @ -0,0 +1,59 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/OutOfSequenceBeforeProxyException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This class defines Exceptions that should be thrown when the sequence of | |||
| * operations is invalid. In this case it should be thrown when the proxy() call | |||
| * has not yet happened and no proxy object exists. | |||
| * | |||
| * @class CAS_OutOfSequenceBeforeProxyException | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Joachim Fritschi <jfritschi@freenet.de> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_OutOfSequenceBeforeProxyException | |||
| extends CAS_OutOfSequenceException | |||
| implements CAS_Exception | |||
| { | |||
| /** | |||
| * Return standard error message | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct () | |||
| { | |||
| parent::__construct( | |||
| 'this method cannot be called before phpCAS::proxy()' | |||
| ); | |||
| } | |||
| } | |||
| @ -0,0 +1,49 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/OutOfSequenceException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This class defines Exceptions that should be thrown when the sequence of | |||
| * operations is invalid. Examples are: | |||
| * - Requesting the response before executing a request. | |||
| * - Changing the URL of a request after executing the request. | |||
| * | |||
| * @class CAS_OutOfSequenceException | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_OutOfSequenceException | |||
| extends BadMethodCallException | |||
| implements CAS_Exception | |||
| { | |||
| } | |||
| @ -0,0 +1,222 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/PGTStorage/AbstractStorage.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Basic class for PGT storage | |||
| * The CAS_PGTStorage_AbstractStorage class is a generic class for PGT storage. | |||
| * This class should not be instanciated itself but inherited by specific PGT | |||
| * storage classes. | |||
| * | |||
| * @class CAS_PGTStorage_AbstractStorage | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * @ingroup internalPGTStorage | |||
| */ | |||
| abstract class CAS_PGTStorage_AbstractStorage | |||
| { | |||
| /** | |||
| * @addtogroup internalPGTStorage | |||
| * @{ | |||
| */ | |||
| // ######################################################################## | |||
| // CONSTRUCTOR | |||
| // ######################################################################## | |||
| /** | |||
| * The constructor of the class, should be called only by inherited classes. | |||
| * | |||
| * @param CAS_Client $cas_parent the CAS _client instance that creates the | |||
| * current object. | |||
| * | |||
| * @return void | |||
| * | |||
| * @protected | |||
| */ | |||
| function __construct($cas_parent) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| if ( !$cas_parent->isProxy() ) { | |||
| phpCAS::error( | |||
| 'defining PGT storage makes no sense when not using a CAS proxy' | |||
| ); | |||
| } | |||
| phpCAS::traceEnd(); | |||
| } | |||
| // ######################################################################## | |||
| // DEBUGGING | |||
| // ######################################################################## | |||
| /** | |||
| * This virtual method returns an informational string giving the type of storage | |||
| * used by the object (used for debugging purposes). | |||
| * | |||
| * @return void | |||
| * | |||
| * @public | |||
| */ | |||
| function getStorageType() | |||
| { | |||
| phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); | |||
| } | |||
| /** | |||
| * This virtual method returns an informational string giving informations on the | |||
| * parameters of the storage.(used for debugging purposes). | |||
| * | |||
| * @return void | |||
| * | |||
| * @public | |||
| */ | |||
| function getStorageInfo() | |||
| { | |||
| phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); | |||
| } | |||
| // ######################################################################## | |||
| // ERROR HANDLING | |||
| // ######################################################################## | |||
| /** | |||
| * string used to store an error message. Written by | |||
| * PGTStorage::setErrorMessage(), read by PGTStorage::getErrorMessage(). | |||
| * | |||
| * @hideinitializer | |||
| * @deprecated not used. | |||
| */ | |||
| var $_error_message=false; | |||
| /** | |||
| * This method sets en error message, which can be read later by | |||
| * PGTStorage::getErrorMessage(). | |||
| * | |||
| * @param string $error_message an error message | |||
| * | |||
| * @return void | |||
| * | |||
| * @deprecated not used. | |||
| */ | |||
| function setErrorMessage($error_message) | |||
| { | |||
| $this->_error_message = $error_message; | |||
| } | |||
| /** | |||
| * This method returns an error message set by PGTStorage::setErrorMessage(). | |||
| * | |||
| * @return an error message when set by PGTStorage::setErrorMessage(), FALSE | |||
| * otherwise. | |||
| * | |||
| * @deprecated not used. | |||
| */ | |||
| function getErrorMessage() | |||
| { | |||
| return $this->_error_message; | |||
| } | |||
| // ######################################################################## | |||
| // INITIALIZATION | |||
| // ######################################################################## | |||
| /** | |||
| * a boolean telling if the storage has already been initialized. Written by | |||
| * PGTStorage::init(), read by PGTStorage::isInitialized(). | |||
| * | |||
| * @hideinitializer | |||
| */ | |||
| var $_initialized = false; | |||
| /** | |||
| * This method tells if the storage has already been intialized. | |||
| * | |||
| * @return a boolean | |||
| * | |||
| * @protected | |||
| */ | |||
| function isInitialized() | |||
| { | |||
| return $this->_initialized; | |||
| } | |||
| /** | |||
| * This virtual method initializes the object. | |||
| * | |||
| * @return void | |||
| */ | |||
| function init() | |||
| { | |||
| $this->_initialized = true; | |||
| } | |||
| // ######################################################################## | |||
| // PGT I/O | |||
| // ######################################################################## | |||
| /** | |||
| * This virtual method stores a PGT and its corresponding PGT Iuo. | |||
| * | |||
| * @param string $pgt the PGT | |||
| * @param string $pgt_iou the PGT iou | |||
| * | |||
| * @return void | |||
| * | |||
| * @note Should never be called. | |||
| * | |||
| */ | |||
| function write($pgt,$pgt_iou) | |||
| { | |||
| phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); | |||
| } | |||
| /** | |||
| * This virtual method reads a PGT corresponding to a PGT Iou and deletes | |||
| * the corresponding storage entry. | |||
| * | |||
| * @param string $pgt_iou the PGT iou | |||
| * | |||
| * @return void | |||
| * | |||
| * @note Should never be called. | |||
| */ | |||
| function read($pgt_iou) | |||
| { | |||
| phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called'); | |||
| } | |||
| /** @} */ | |||
| } | |||
| ?> | |||
| @ -0,0 +1,440 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/PGTStorage/Db.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Daniel Frett <daniel.frett@gmail.com> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| define('CAS_PGT_STORAGE_DB_DEFAULT_TABLE', 'cas_pgts'); | |||
| /** | |||
| * Basic class for PGT database storage | |||
| * The CAS_PGTStorage_Db class is a class for PGT database storage. | |||
| * | |||
| * @class CAS_PGTStorage_Db | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Daniel Frett <daniel.frett@gmail.com> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * @ingroup internalPGTStorageDb | |||
| */ | |||
| class CAS_PGTStorage_Db extends CAS_PGTStorage_AbstractStorage | |||
| { | |||
| /** | |||
| * @addtogroup internalCAS_PGTStorageDb | |||
| * @{ | |||
| */ | |||
| /** | |||
| * the PDO object to use for database interactions | |||
| */ | |||
| private $_pdo; | |||
| /** | |||
| * This method returns the PDO object to use for database interactions. | |||
| * | |||
| * @return the PDO object | |||
| */ | |||
| private function _getPdo() | |||
| { | |||
| return $this->_pdo; | |||
| } | |||
| /** | |||
| * database connection options to use when creating a new PDO object | |||
| */ | |||
| private $_dsn; | |||
| private $_username; | |||
| private $_password; | |||
| private $_table_options; | |||
| /** | |||
| * the table to use for storing/retrieving pgt's | |||
| */ | |||
| private $_table; | |||
| /** | |||
| * This method returns the table to use when storing/retrieving PGT's | |||
| * | |||
| * @return the name of the pgt storage table. | |||
| */ | |||
| private function _getTable() | |||
| { | |||
| return $this->_table; | |||
| } | |||
| // ######################################################################## | |||
| // DEBUGGING | |||
| // ######################################################################## | |||
| /** | |||
| * This method returns an informational string giving the type of storage | |||
| * used by the object (used for debugging purposes). | |||
| * | |||
| * @return an informational string. | |||
| */ | |||
| public function getStorageType() | |||
| { | |||
| return "db"; | |||
| } | |||
| /** | |||
| * This method returns an informational string giving informations on the | |||
| * parameters of the storage.(used for debugging purposes). | |||
| * | |||
| * @return an informational string. | |||
| * @public | |||
| */ | |||
| public function getStorageInfo() | |||
| { | |||
| return 'table=`'.$this->_getTable().'\''; | |||
| } | |||
| // ######################################################################## | |||
| // CONSTRUCTOR | |||
| // ######################################################################## | |||
| /** | |||
| * The class constructor. | |||
| * | |||
| * @param CAS_Client $cas_parent the CAS_Client instance that creates | |||
| * the object. | |||
| * @param string $dsn_or_pdo a dsn string to use for creating a PDO | |||
| * object or a PDO object | |||
| * @param string $username the username to use when connecting to | |||
| * the database | |||
| * @param string $password the password to use when connecting to | |||
| * the database | |||
| * @param string $table the table to use for storing and | |||
| * retrieving PGT's | |||
| * @param string $driver_options any driver options to use when | |||
| * connecting to the database | |||
| */ | |||
| public function __construct( | |||
| $cas_parent, $dsn_or_pdo, $username='', $password='', $table='', | |||
| $driver_options=null | |||
| ) { | |||
| phpCAS::traceBegin(); | |||
| // call the ancestor's constructor | |||
| parent::__construct($cas_parent); | |||
| // set default values | |||
| if ( empty($table) ) { | |||
| $table = CAS_PGT_STORAGE_DB_DEFAULT_TABLE; | |||
| } | |||
| if ( !is_array($driver_options) ) { | |||
| $driver_options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); | |||
| } | |||
| // store the specified parameters | |||
| if ($dsn_or_pdo instanceof PDO) { | |||
| $this->_pdo = $dsn_or_pdo; | |||
| } else { | |||
| $this->_dsn = $dsn_or_pdo; | |||
| $this->_username = $username; | |||
| $this->_password = $password; | |||
| $this->_driver_options = $driver_options; | |||
| } | |||
| // store the table name | |||
| $this->_table = $table; | |||
| phpCAS::traceEnd(); | |||
| } | |||
| // ######################################################################## | |||
| // INITIALIZATION | |||
| // ######################################################################## | |||
| /** | |||
| * This method is used to initialize the storage. Halts on error. | |||
| * | |||
| * @return void | |||
| */ | |||
| public function init() | |||
| { | |||
| phpCAS::traceBegin(); | |||
| // if the storage has already been initialized, return immediatly | |||
| if ($this->isInitialized()) { | |||
| return; | |||
| } | |||
| // initialize the base object | |||
| parent::init(); | |||
| // create the PDO object if it doesn't exist already | |||
| if (!($this->_pdo instanceof PDO)) { | |||
| try { | |||
| $this->_pdo = new PDO( | |||
| $this->_dsn, $this->_username, $this->_password, | |||
| $this->_driver_options | |||
| ); | |||
| } | |||
| catch(PDOException $e) { | |||
| phpCAS::error('Database connection error: ' . $e->getMessage()); | |||
| } | |||
| } | |||
| phpCAS::traceEnd(); | |||
| } | |||
| // ######################################################################## | |||
| // PDO database interaction | |||
| // ######################################################################## | |||
| /** | |||
| * attribute that stores the previous error mode for the PDO handle while | |||
| * processing a transaction | |||
| */ | |||
| private $_errMode; | |||
| /** | |||
| * This method will enable the Exception error mode on the PDO object | |||
| * | |||
| * @return void | |||
| */ | |||
| private function _setErrorMode() | |||
| { | |||
| // get PDO object and enable exception error mode | |||
| $pdo = $this->_getPdo(); | |||
| $this->_errMode = $pdo->getAttribute(PDO::ATTR_ERRMODE); | |||
| $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | |||
| } | |||
| /** | |||
| * this method will reset the error mode on the PDO object | |||
| * | |||
| * @return void | |||
| */ | |||
| private function _resetErrorMode() | |||
| { | |||
| // get PDO object and reset the error mode to what it was originally | |||
| $pdo = $this->_getPdo(); | |||
| $pdo->setAttribute(PDO::ATTR_ERRMODE, $this->_errMode); | |||
| } | |||
| // ######################################################################## | |||
| // database queries | |||
| // ######################################################################## | |||
| // these queries are potentially unsafe because the person using this library | |||
| // can set the table to use, but there is no reliable way to escape SQL | |||
| // fieldnames in PDO yet | |||
| /** | |||
| * This method returns the query used to create a pgt storage table | |||
| * | |||
| * @return the create table SQL, no bind params in query | |||
| */ | |||
| protected function createTableSql() | |||
| { | |||
| return 'CREATE TABLE ' . $this->_getTable() | |||
| . ' (pgt_iou VARCHAR(255) NOT NULL PRIMARY KEY, pgt VARCHAR(255) NOT NULL)'; | |||
| } | |||
| /** | |||
| * This method returns the query used to store a pgt | |||
| * | |||
| * @return the store PGT SQL, :pgt and :pgt_iou are the bind params contained | |||
| * in the query | |||
| */ | |||
| protected function storePgtSql() | |||
| { | |||
| return 'INSERT INTO ' . $this->_getTable() | |||
| . ' (pgt_iou, pgt) VALUES (:pgt_iou, :pgt)'; | |||
| } | |||
| /** | |||
| * This method returns the query used to retrieve a pgt. the first column | |||
| * of the first row should contain the pgt | |||
| * | |||
| * @return the retrieve PGT SQL, :pgt_iou is the only bind param contained | |||
| * in the query | |||
| */ | |||
| protected function retrievePgtSql() | |||
| { | |||
| return 'SELECT pgt FROM ' . $this->_getTable() . ' WHERE pgt_iou = :pgt_iou'; | |||
| } | |||
| /** | |||
| * This method returns the query used to delete a pgt. | |||
| * | |||
| * @return the delete PGT SQL, :pgt_iou is the only bind param contained in | |||
| * the query | |||
| */ | |||
| protected function deletePgtSql() | |||
| { | |||
| return 'DELETE FROM ' . $this->_getTable() . ' WHERE pgt_iou = :pgt_iou'; | |||
| } | |||
| // ######################################################################## | |||
| // PGT I/O | |||
| // ######################################################################## | |||
| /** | |||
| * This method creates the database table used to store pgt's and pgtiou's | |||
| * | |||
| * @return void | |||
| */ | |||
| public function createTable() | |||
| { | |||
| phpCAS::traceBegin(); | |||
| // initialize this PGTStorage object if it hasn't been initialized yet | |||
| if ( !$this->isInitialized() ) { | |||
| $this->init(); | |||
| } | |||
| // initialize the PDO object for this method | |||
| $pdo = $this->_getPdo(); | |||
| $this->_setErrorMode(); | |||
| try { | |||
| $pdo->beginTransaction(); | |||
| $query = $pdo->query($this->createTableSQL()); | |||
| $query->closeCursor(); | |||
| $pdo->commit(); | |||
| } | |||
| catch(PDOException $e) { | |||
| // attempt rolling back the transaction before throwing a phpCAS error | |||
| try { | |||
| $pdo->rollBack(); | |||
| } | |||
| catch(PDOException $e) { | |||
| } | |||
| phpCAS::error('error creating PGT storage table: ' . $e->getMessage()); | |||
| } | |||
| // reset the PDO object | |||
| $this->_resetErrorMode(); | |||
| phpCAS::traceEnd(); | |||
| } | |||
| /** | |||
| * This method stores a PGT and its corresponding PGT Iou in the database. | |||
| * Echoes a warning on error. | |||
| * | |||
| * @param string $pgt the PGT | |||
| * @param string $pgt_iou the PGT iou | |||
| * | |||
| * @return void | |||
| */ | |||
| public function write($pgt, $pgt_iou) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| // initialize the PDO object for this method | |||
| $pdo = $this->_getPdo(); | |||
| $this->_setErrorMode(); | |||
| try { | |||
| $pdo->beginTransaction(); | |||
| $query = $pdo->prepare($this->storePgtSql()); | |||
| $query->bindValue(':pgt', $pgt, PDO::PARAM_STR); | |||
| $query->bindValue(':pgt_iou', $pgt_iou, PDO::PARAM_STR); | |||
| $query->execute(); | |||
| $query->closeCursor(); | |||
| $pdo->commit(); | |||
| } | |||
| catch(PDOException $e) { | |||
| // attempt rolling back the transaction before throwing a phpCAS error | |||
| try { | |||
| $pdo->rollBack(); | |||
| } | |||
| catch(PDOException $e) { | |||
| } | |||
| phpCAS::error('error writing PGT to database: ' . $e->getMessage()); | |||
| } | |||
| // reset the PDO object | |||
| $this->_resetErrorMode(); | |||
| phpCAS::traceEnd(); | |||
| } | |||
| /** | |||
| * This method reads a PGT corresponding to a PGT Iou and deletes the | |||
| * corresponding db entry. | |||
| * | |||
| * @param string $pgt_iou the PGT iou | |||
| * | |||
| * @return the corresponding PGT, or FALSE on error | |||
| */ | |||
| public function read($pgt_iou) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| $pgt = false; | |||
| // initialize the PDO object for this method | |||
| $pdo = $this->_getPdo(); | |||
| $this->_setErrorMode(); | |||
| try { | |||
| $pdo->beginTransaction(); | |||
| // fetch the pgt for the specified pgt_iou | |||
| $query = $pdo->prepare($this->retrievePgtSql()); | |||
| $query->bindValue(':pgt_iou', $pgt_iou, PDO::PARAM_STR); | |||
| $query->execute(); | |||
| $pgt = $query->fetchColumn(0); | |||
| $query->closeCursor(); | |||
| // delete the specified pgt_iou from the database | |||
| $query = $pdo->prepare($this->deletePgtSql()); | |||
| $query->bindValue(':pgt_iou', $pgt_iou, PDO::PARAM_STR); | |||
| $query->execute(); | |||
| $query->closeCursor(); | |||
| $pdo->commit(); | |||
| } | |||
| catch(PDOException $e) { | |||
| // attempt rolling back the transaction before throwing a phpCAS error | |||
| try { | |||
| $pdo->rollBack(); | |||
| } | |||
| catch(PDOException $e) { | |||
| } | |||
| phpCAS::trace('error reading PGT from database: ' . $e->getMessage()); | |||
| } | |||
| // reset the PDO object | |||
| $this->_resetErrorMode(); | |||
| phpCAS::traceEnd(); | |||
| return $pgt; | |||
| } | |||
| /** @} */ | |||
| } | |||
| ?> | |||
| @ -0,0 +1,259 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/PGTStorage/AbstractStorage.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * The CAS_PGTStorage_File class is a class for PGT file storage. An instance of | |||
| * this class is returned by CAS_Client::SetPGTStorageFile(). | |||
| * | |||
| * @class CAS_PGTStorage_File | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| * | |||
| * @ingroup internalPGTStorageFile | |||
| */ | |||
| class CAS_PGTStorage_File extends CAS_PGTStorage_AbstractStorage | |||
| { | |||
| /** | |||
| * @addtogroup internalPGTStorageFile | |||
| * @{ | |||
| */ | |||
| /** | |||
| * a string telling where PGT's should be stored on the filesystem. Written by | |||
| * PGTStorageFile::PGTStorageFile(), read by getPath(). | |||
| * | |||
| * @private | |||
| */ | |||
| var $_path; | |||
| /** | |||
| * This method returns the name of the directory where PGT's should be stored | |||
| * on the filesystem. | |||
| * | |||
| * @return the name of a directory (with leading and trailing '/') | |||
| * | |||
| * @private | |||
| */ | |||
| function getPath() | |||
| { | |||
| return $this->_path; | |||
| } | |||
| // ######################################################################## | |||
| // DEBUGGING | |||
| // ######################################################################## | |||
| /** | |||
| * This method returns an informational string giving the type of storage | |||
| * used by the object (used for debugging purposes). | |||
| * | |||
| * @return an informational string. | |||
| * @public | |||
| */ | |||
| function getStorageType() | |||
| { | |||
| return "file"; | |||
| } | |||
| /** | |||
| * This method returns an informational string giving informations on the | |||
| * parameters of the storage.(used for debugging purposes). | |||
| * | |||
| * @return an informational string. | |||
| * @public | |||
| */ | |||
| function getStorageInfo() | |||
| { | |||
| return 'path=`'.$this->getPath().'\''; | |||
| } | |||
| // ######################################################################## | |||
| // CONSTRUCTOR | |||
| // ######################################################################## | |||
| /** | |||
| * The class constructor, called by CAS_Client::SetPGTStorageFile(). | |||
| * | |||
| * @param CAS_Client $cas_parent the CAS_Client instance that creates the object. | |||
| * @param string $path the path where the PGT's should be stored | |||
| * | |||
| * @return void | |||
| * | |||
| * @public | |||
| */ | |||
| function __construct($cas_parent,$path) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| // call the ancestor's constructor | |||
| parent::__construct($cas_parent); | |||
| if (empty($path)) { | |||
| $path = CAS_PGT_STORAGE_FILE_DEFAULT_PATH; | |||
| } | |||
| // check that the path is an absolute path | |||
| if (getenv("OS")=="Windows_NT") { | |||
| if (!preg_match('`^[a-zA-Z]:`', $path)) { | |||
| phpCAS::error('an absolute path is needed for PGT storage to file'); | |||
| } | |||
| } else { | |||
| if ( $path[0] != '/' ) { | |||
| phpCAS::error('an absolute path is needed for PGT storage to file'); | |||
| } | |||
| // store the path (with a leading and trailing '/') | |||
| $path = preg_replace('|[/]*$|', '/', $path); | |||
| $path = preg_replace('|^[/]*|', '/', $path); | |||
| } | |||
| $this->_path = $path; | |||
| phpCAS::traceEnd(); | |||
| } | |||
| // ######################################################################## | |||
| // INITIALIZATION | |||
| // ######################################################################## | |||
| /** | |||
| * This method is used to initialize the storage. Halts on error. | |||
| * | |||
| * @return void | |||
| * @public | |||
| */ | |||
| function init() | |||
| { | |||
| phpCAS::traceBegin(); | |||
| // if the storage has already been initialized, return immediatly | |||
| if ($this->isInitialized()) { | |||
| return; | |||
| } | |||
| // call the ancestor's method (mark as initialized) | |||
| parent::init(); | |||
| phpCAS::traceEnd(); | |||
| } | |||
| // ######################################################################## | |||
| // PGT I/O | |||
| // ######################################################################## | |||
| /** | |||
| * This method returns the filename corresponding to a PGT Iou. | |||
| * | |||
| * @param string $pgt_iou the PGT iou. | |||
| * | |||
| * @return a filename | |||
| * @private | |||
| */ | |||
| function getPGTIouFilename($pgt_iou) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| $filename = $this->getPath().$pgt_iou.'.plain'; | |||
| phpCAS::traceEnd($filename); | |||
| return $filename; | |||
| } | |||
| /** | |||
| * This method stores a PGT and its corresponding PGT Iou into a file. Echoes a | |||
| * warning on error. | |||
| * | |||
| * @param string $pgt the PGT | |||
| * @param string $pgt_iou the PGT iou | |||
| * | |||
| * @return void | |||
| * | |||
| * @public | |||
| */ | |||
| function write($pgt,$pgt_iou) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| $fname = $this->getPGTIouFilename($pgt_iou); | |||
| if (!file_exists($fname)) { | |||
| touch($fname); | |||
| // Chmod will fail on windows | |||
| @chmod($fname, 0600); | |||
| if ($f=fopen($fname, "w")) { | |||
| if (fputs($f, $pgt) === false) { | |||
| phpCAS::error('could not write PGT to `'.$fname.'\''); | |||
| } | |||
| phpCAS::trace('Successful write of PGT to `'.$fname.'\''); | |||
| fclose($f); | |||
| } else { | |||
| phpCAS::error('could not open `'.$fname.'\''); | |||
| } | |||
| } else { | |||
| phpCAS::error('File exists: `'.$fname.'\''); | |||
| } | |||
| phpCAS::traceEnd(); | |||
| } | |||
| /** | |||
| * This method reads a PGT corresponding to a PGT Iou and deletes the | |||
| * corresponding file. | |||
| * | |||
| * @param string $pgt_iou the PGT iou | |||
| * | |||
| * @return the corresponding PGT, or FALSE on error | |||
| * | |||
| * @public | |||
| */ | |||
| function read($pgt_iou) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| $pgt = false; | |||
| $fname = $this->getPGTIouFilename($pgt_iou); | |||
| if (file_exists($fname)) { | |||
| if (!($f=fopen($fname, "r"))) { | |||
| phpCAS::error('could not open `'.$fname.'\''); | |||
| } else { | |||
| if (($pgt=fgets($f)) === false) { | |||
| phpCAS::error('could not read PGT from `'.$fname.'\''); | |||
| } | |||
| phpCAS::trace('Successful read of PGT to `'.$fname.'\''); | |||
| fclose($f); | |||
| } | |||
| // delete the PGT file | |||
| @unlink($fname); | |||
| } else { | |||
| phpCAS::error('No such file `'.$fname.'\''); | |||
| } | |||
| phpCAS::traceEnd($pgt); | |||
| return $pgt; | |||
| } | |||
| /** @} */ | |||
| } | |||
| ?> | |||
| @ -0,0 +1,72 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxiedService.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This interface defines methods that allow proxy-authenticated service handlers | |||
| * to interact with phpCAS. | |||
| * | |||
| * Proxy service handlers must implement this interface as well as call | |||
| * phpCAS::initializeProxiedService($this) at some point in their implementation. | |||
| * | |||
| * While not required, proxy-authenticated service handlers are encouraged to | |||
| * implement the CAS_ProxiedService_Testable interface to facilitate unit testing. | |||
| * | |||
| * @class CAS_ProxiedService | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| interface CAS_ProxiedService | |||
| { | |||
| /** | |||
| * Answer a service identifier (URL) for whom we should fetch a proxy ticket. | |||
| * | |||
| * @return string | |||
| * @throws Exception If no service url is available. | |||
| */ | |||
| public function getServiceUrl (); | |||
| /** | |||
| * Register a proxy ticket with the ProxiedService that it can use when | |||
| * making requests. | |||
| * | |||
| * @param string $proxyTicket Proxy ticket string | |||
| * | |||
| * @return void | |||
| * @throws InvalidArgumentException If the $proxyTicket is invalid. | |||
| * @throws CAS_OutOfSequenceException If called after a proxy ticket has | |||
| * already been initialized/set. | |||
| */ | |||
| public function setProxyTicket ($proxyTicket); | |||
| } | |||
| ?> | |||
| @ -0,0 +1,149 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxiedService/Abstract.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This class implements common methods for ProxiedService implementations included | |||
| * with phpCAS. | |||
| * | |||
| * @class CAS_ProxiedService_Abstract | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| abstract class CAS_ProxiedService_Abstract | |||
| implements CAS_ProxiedService, CAS_ProxiedService_Testable | |||
| { | |||
| /** | |||
| * The proxy ticket that can be used when making service requests. | |||
| * @var string $_proxyTicket; | |||
| */ | |||
| private $_proxyTicket; | |||
| /** | |||
| * Register a proxy ticket with the Proxy that it can use when making requests. | |||
| * | |||
| * @param string $proxyTicket proxy ticket | |||
| * | |||
| * @return void | |||
| * @throws InvalidArgumentException If the $proxyTicket is invalid. | |||
| * @throws CAS_OutOfSequenceException If called after a proxy ticket has | |||
| * already been initialized/set. | |||
| */ | |||
| public function setProxyTicket ($proxyTicket) | |||
| { | |||
| if (empty($proxyTicket)) { | |||
| throw new CAS_InvalidArgumentException( | |||
| 'Trying to initialize with an empty proxy ticket.' | |||
| ); | |||
| } | |||
| if (!empty($this->_proxyTicket)) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Already initialized, cannot change the proxy ticket.' | |||
| ); | |||
| } | |||
| $this->_proxyTicket = $proxyTicket; | |||
| } | |||
| /** | |||
| * Answer the proxy ticket to be used when making requests. | |||
| * | |||
| * @return string | |||
| * @throws CAS_OutOfSequenceException If called before a proxy ticket has | |||
| * already been initialized/set. | |||
| */ | |||
| protected function getProxyTicket () | |||
| { | |||
| if (empty($this->_proxyTicket)) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'No proxy ticket yet. Call $this->initializeProxyTicket() to aquire the proxy ticket.' | |||
| ); | |||
| } | |||
| return $this->_proxyTicket; | |||
| } | |||
| /** | |||
| * @var CAS_Client $_casClient; | |||
| */ | |||
| private $_casClient; | |||
| /** | |||
| * Use a particular CAS_Client->initializeProxiedService() rather than the | |||
| * static phpCAS::initializeProxiedService(). | |||
| * | |||
| * This method should not be called in standard operation, but is needed for unit | |||
| * testing. | |||
| * | |||
| * @param CAS_Client $casClient cas client | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after a proxy ticket has | |||
| * already been initialized/set. | |||
| */ | |||
| public function setCasClient (CAS_Client $casClient) | |||
| { | |||
| if (!empty($this->_proxyTicket)) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Already initialized, cannot change the CAS_Client.' | |||
| ); | |||
| } | |||
| $this->_casClient = $casClient; | |||
| } | |||
| /** | |||
| * Fetch our proxy ticket. | |||
| * | |||
| * Descendent classes should call this method once their service URL is available | |||
| * to initialize their proxy ticket. | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after a proxy ticket has | |||
| * already been initialized. | |||
| */ | |||
| protected function initializeProxyTicket() | |||
| { | |||
| if (!empty($this->_proxyTicket)) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Already initialized, cannot initialize again.' | |||
| ); | |||
| } | |||
| // Allow usage of a particular CAS_Client for unit testing. | |||
| if (empty($this->_casClient)) { | |||
| phpCAS::initializeProxiedService($this); | |||
| } else { | |||
| $this->_casClient->initializeProxiedService($this); | |||
| } | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,46 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxiedService/Exception.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * An Exception for problems communicating with a proxied service. | |||
| * | |||
| * @class CAS_ProxiedService_Exception | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_ProxiedService_Exception | |||
| extends Exception | |||
| implements CAS_Exception | |||
| { | |||
| } | |||
| ?> | |||
| @ -0,0 +1,91 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxiedService/Http.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This interface defines methods that clients should use for configuring, sending, | |||
| * and receiving proxied HTTP requests. | |||
| * | |||
| * @class CAS_ProxiedService_Http | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| interface CAS_ProxiedService_Http | |||
| { | |||
| /********************************************************* | |||
| * Configure the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Set the URL of the Request | |||
| * | |||
| * @param string $url Url to set | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setUrl ($url); | |||
| /********************************************************* | |||
| * 2. Send the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Perform the request. | |||
| * | |||
| * @return bool TRUE on success, FALSE on failure. | |||
| * @throws CAS_OutOfSequenceException If called multiple times. | |||
| */ | |||
| public function send (); | |||
| /********************************************************* | |||
| * 3. Access the response | |||
| *********************************************************/ | |||
| /** | |||
| * Answer the headers of the response. | |||
| * | |||
| * @return array An array of header strings. | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseHeaders (); | |||
| /** | |||
| * Answer the body of response. | |||
| * | |||
| * @return string | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseBody (); | |||
| } | |||
| ?> | |||
| @ -0,0 +1,360 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxiedService/Http/Abstract.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This class implements common methods for ProxiedService implementations included | |||
| * with phpCAS. | |||
| * | |||
| * @class CAS_ProxiedService_Http_Abstract | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| abstract class CAS_ProxiedService_Http_Abstract extends | |||
| CAS_ProxiedService_Abstract implements CAS_ProxiedService_Http | |||
| { | |||
| /** | |||
| * The HTTP request mechanism talking to the target service. | |||
| * | |||
| * @var CAS_Request_RequestInterface $requestHandler | |||
| */ | |||
| protected $requestHandler; | |||
| /** | |||
| * The storage mechanism for cookies set by the target service. | |||
| * | |||
| * @var CAS_CookieJar $_cookieJar | |||
| */ | |||
| private $_cookieJar; | |||
| /** | |||
| * Constructor. | |||
| * | |||
| * @param CAS_Request_RequestInterface $requestHandler request handler object | |||
| * @param CAS_CookieJar $cookieJar cookieJar object | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct(CAS_Request_RequestInterface $requestHandler, | |||
| CAS_CookieJar $cookieJar | |||
| ) { | |||
| $this->requestHandler = $requestHandler; | |||
| $this->_cookieJar = $cookieJar; | |||
| } | |||
| /** | |||
| * The target service url. | |||
| * @var string $_url; | |||
| */ | |||
| private $_url; | |||
| /** | |||
| * Answer a service identifier (URL) for whom we should fetch a proxy ticket. | |||
| * | |||
| * @return string | |||
| * @throws Exception If no service url is available. | |||
| */ | |||
| public function getServiceUrl() | |||
| { | |||
| if (empty($this->_url)) { | |||
| throw new CAS_ProxiedService_Exception( | |||
| 'No URL set via ' . get_class($this) . '->setUrl($url).' | |||
| ); | |||
| } | |||
| return $this->_url; | |||
| } | |||
| /********************************************************* | |||
| * Configure the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Set the URL of the Request | |||
| * | |||
| * @param string $url url to set | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setUrl($url) | |||
| { | |||
| if ($this->hasBeenSent()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot set the URL, request already sent.' | |||
| ); | |||
| } | |||
| if (!is_string($url)) { | |||
| throw new CAS_InvalidArgumentException('$url must be a string.'); | |||
| } | |||
| $this->_url = $url; | |||
| } | |||
| /********************************************************* | |||
| * 2. Send the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Perform the request. | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called multiple times. | |||
| * @throws CAS_ProxyTicketException If there is a proxy-ticket failure. | |||
| * The code of the Exception will be one of: | |||
| * PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE | |||
| * PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE | |||
| * PHPCAS_SERVICE_PT_FAILURE | |||
| * @throws CAS_ProxiedService_Exception If there is a failure sending the | |||
| * request to the target service. | |||
| */ | |||
| public function send() | |||
| { | |||
| if ($this->hasBeenSent()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot send, request already sent.' | |||
| ); | |||
| } | |||
| phpCAS::traceBegin(); | |||
| // Get our proxy ticket and append it to our URL. | |||
| $this->initializeProxyTicket(); | |||
| $url = $this->getServiceUrl(); | |||
| if (strstr($url, '?') === false) { | |||
| $url = $url . '?ticket=' . $this->getProxyTicket(); | |||
| } else { | |||
| $url = $url . '&ticket=' . $this->getProxyTicket(); | |||
| } | |||
| try { | |||
| $this->makeRequest($url); | |||
| } catch (Exception $e) { | |||
| phpCAS::traceEnd(); | |||
| throw $e; | |||
| } | |||
| } | |||
| /** | |||
| * Indicator of the number of requests (including redirects performed. | |||
| * | |||
| * @var int $_numRequests; | |||
| */ | |||
| private $_numRequests = 0; | |||
| /** | |||
| * The response headers. | |||
| * | |||
| * @var array $_responseHeaders; | |||
| */ | |||
| private $_responseHeaders = array(); | |||
| /** | |||
| * The response status code. | |||
| * | |||
| * @var string $_responseStatusCode; | |||
| */ | |||
| private $_responseStatusCode = ''; | |||
| /** | |||
| * The response headers. | |||
| * | |||
| * @var string $_responseBody; | |||
| */ | |||
| private $_responseBody = ''; | |||
| /** | |||
| * Build and perform a request, following redirects | |||
| * | |||
| * @param string $url url for the request | |||
| * | |||
| * @return void | |||
| * @throws CAS_ProxyTicketException If there is a proxy-ticket failure. | |||
| * The code of the Exception will be one of: | |||
| * PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE | |||
| * PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE | |||
| * PHPCAS_SERVICE_PT_FAILURE | |||
| * @throws CAS_ProxiedService_Exception If there is a failure sending the | |||
| * request to the target service. | |||
| */ | |||
| protected function makeRequest($url) | |||
| { | |||
| // Verify that we are not in a redirect loop | |||
| $this->_numRequests++; | |||
| if ($this->_numRequests > 4) { | |||
| $message = 'Exceeded the maximum number of redirects (3) in proxied service request.'; | |||
| phpCAS::trace($message); | |||
| throw new CAS_ProxiedService_Exception($message); | |||
| } | |||
| // Create a new request. | |||
| $request = clone $this->requestHandler; | |||
| $request->setUrl($url); | |||
| // Add any cookies to the request. | |||
| $request->addCookies($this->_cookieJar->getCookies($url)); | |||
| // Add any other parts of the request needed by concrete classes | |||
| $this->populateRequest($request); | |||
| // Perform the request. | |||
| phpCAS::trace('Performing proxied service request to \'' . $url . '\''); | |||
| if (!$request->send()) { | |||
| $message = 'Could not perform proxied service request to URL`' | |||
| . $url . '\'. ' . $request->getErrorMessage(); | |||
| phpCAS::trace($message); | |||
| throw new CAS_ProxiedService_Exception($message); | |||
| } | |||
| // Store any cookies from the response; | |||
| $this->_cookieJar->storeCookies($url, $request->getResponseHeaders()); | |||
| // Follow any redirects | |||
| if ($redirectUrl = $this->getRedirectUrl($request->getResponseHeaders()) | |||
| ) { | |||
| phpCAS::trace('Found redirect:' . $redirectUrl); | |||
| $this->makeRequest($redirectUrl); | |||
| } else { | |||
| $this->_responseHeaders = $request->getResponseHeaders(); | |||
| $this->_responseBody = $request->getResponseBody(); | |||
| $this->_responseStatusCode = $request->getResponseStatusCode(); | |||
| } | |||
| } | |||
| /** | |||
| * Add any other parts of the request needed by concrete classes | |||
| * | |||
| * @param CAS_Request_RequestInterface $request request interface object | |||
| * | |||
| * @return void | |||
| */ | |||
| abstract protected function populateRequest( | |||
| CAS_Request_RequestInterface $request | |||
| ); | |||
| /** | |||
| * Answer a redirect URL if a redirect header is found, otherwise null. | |||
| * | |||
| * @param array $responseHeaders response header to extract a redirect from | |||
| * | |||
| * @return string or null | |||
| */ | |||
| protected function getRedirectUrl(array $responseHeaders) | |||
| { | |||
| // Check for the redirect after authentication | |||
| foreach ($responseHeaders as $header) { | |||
| if ( preg_match('/^(Location:|URI:)\s*([^\s]+.*)$/', $header, $matches) | |||
| ) { | |||
| return trim(array_pop($matches)); | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| /********************************************************* | |||
| * 3. Access the response | |||
| *********************************************************/ | |||
| /** | |||
| * Answer true if our request has been sent yet. | |||
| * | |||
| * @return bool | |||
| */ | |||
| protected function hasBeenSent() | |||
| { | |||
| return ($this->_numRequests > 0); | |||
| } | |||
| /** | |||
| * Answer the headers of the response. | |||
| * | |||
| * @return array An array of header strings. | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseHeaders() | |||
| { | |||
| if (!$this->hasBeenSent()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot access response, request not sent yet.' | |||
| ); | |||
| } | |||
| return $this->_responseHeaders; | |||
| } | |||
| /** | |||
| * Answer HTTP status code of the response | |||
| * | |||
| * @return int | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseStatusCode() | |||
| { | |||
| if (!$this->hasBeenSent()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot access response, request not sent yet.' | |||
| ); | |||
| } | |||
| return $this->_responseStatusCode; | |||
| } | |||
| /** | |||
| * Answer the body of response. | |||
| * | |||
| * @return string | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseBody() | |||
| { | |||
| if (!$this->hasBeenSent()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot access response, request not sent yet.' | |||
| ); | |||
| } | |||
| return $this->_responseBody; | |||
| } | |||
| /** | |||
| * Answer the cookies from the response. This may include cookies set during | |||
| * redirect responses. | |||
| * | |||
| * @return array An array containing cookies. E.g. array('name' => 'val'); | |||
| */ | |||
| public function getCookies() | |||
| { | |||
| return $this->_cookieJar->getCookies($this->getServiceUrl()); | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,85 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxiedService/Http/Get.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This class is used to make proxied service requests via the HTTP GET method. | |||
| * | |||
| * Usage Example: | |||
| * | |||
| * try { | |||
| * $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_GET); | |||
| * $service->setUrl('http://www.example.com/path/'); | |||
| * $service->send(); | |||
| * if ($service->getResponseStatusCode() == 200) | |||
| * return $service->getResponseBody(); | |||
| * else | |||
| * // The service responded with an error code 404, 500, etc. | |||
| * throw new Exception('The service responded with an error.'); | |||
| * | |||
| * } catch (CAS_ProxyTicketException $e) { | |||
| * if ($e->getCode() == PHPCAS_SERVICE_PT_FAILURE) | |||
| * return "Your login has timed out. You need to log in again."; | |||
| * else | |||
| * // Other proxy ticket errors are from bad request format | |||
| * // (shouldn't happen) or CAS server failure (unlikely) | |||
| * // so lets just stop if we hit those. | |||
| * throw $e; | |||
| * } catch (CAS_ProxiedService_Exception $e) { | |||
| * // Something prevented the service request from being sent or received. | |||
| * // We didn't even get a valid error response (404, 500, etc), so this | |||
| * // might be caused by a network error or a DNS resolution failure. | |||
| * // We could handle it in some way, but for now we will just stop. | |||
| * throw $e; | |||
| * } | |||
| * | |||
| * @class CAS_ProxiedService_Http_Get | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_ProxiedService_Http_Get | |||
| extends CAS_ProxiedService_Http_Abstract | |||
| { | |||
| /** | |||
| * Add any other parts of the request needed by concrete classes | |||
| * | |||
| * @param CAS_Request_RequestInterface $request request interface | |||
| * | |||
| * @return void | |||
| */ | |||
| protected function populateRequest (CAS_Request_RequestInterface $request) | |||
| { | |||
| // do nothing, since the URL has already been sent and that is our | |||
| // only data. | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,152 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxiedService/Http/Post.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This class is used to make proxied service requests via the HTTP POST method. | |||
| * | |||
| * Usage Example: | |||
| * | |||
| * try { | |||
| * $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_POST); | |||
| * $service->setUrl('http://www.example.com/path/'); | |||
| * $service->setContentType('text/xml'); | |||
| * $service->setBody('<?xml version="1.0"?'.'><methodCall><methodName>example.search</methodName></methodCall>'); | |||
| * $service->send(); | |||
| * if ($service->getResponseStatusCode() == 200) | |||
| * return $service->getResponseBody(); | |||
| * else | |||
| * // The service responded with an error code 404, 500, etc. | |||
| * throw new Exception('The service responded with an error.'); | |||
| * | |||
| * } catch (CAS_ProxyTicketException $e) { | |||
| * if ($e->getCode() == PHPCAS_SERVICE_PT_FAILURE) | |||
| * return "Your login has timed out. You need to log in again."; | |||
| * else | |||
| * // Other proxy ticket errors are from bad request format | |||
| * // (shouldn't happen) or CAS server failure (unlikely) so lets just | |||
| * // stop if we hit those. | |||
| * throw $e; | |||
| * } catch (CAS_ProxiedService_Exception $e) { | |||
| * // Something prevented the service request from being sent or received. | |||
| * // We didn't even get a valid error response (404, 500, etc), so this | |||
| * // might be caused by a network error or a DNS resolution failure. | |||
| * // We could handle it in some way, but for now we will just stop. | |||
| * throw $e; | |||
| * } | |||
| * | |||
| * @class CAS_ProxiedService_Http_Post | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_ProxiedService_Http_Post | |||
| extends CAS_ProxiedService_Http_Abstract | |||
| { | |||
| /** | |||
| * The content-type of this request | |||
| * | |||
| * @var string $_contentType | |||
| */ | |||
| private $_contentType; | |||
| /** | |||
| * The body of the this request | |||
| * | |||
| * @var string $_body | |||
| */ | |||
| private $_body; | |||
| /** | |||
| * Set the content type of this POST request. | |||
| * | |||
| * @param string $contentType content type | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setContentType ($contentType) | |||
| { | |||
| if ($this->hasBeenSent()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot set the content type, request already sent.' | |||
| ); | |||
| } | |||
| $this->_contentType = $contentType; | |||
| } | |||
| /** | |||
| * Set the body of this POST request. | |||
| * | |||
| * @param string $body body to set | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setBody ($body) | |||
| { | |||
| if ($this->hasBeenSent()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot set the body, request already sent.' | |||
| ); | |||
| } | |||
| $this->_body = $body; | |||
| } | |||
| /** | |||
| * Add any other parts of the request needed by concrete classes | |||
| * | |||
| * @param CAS_Request_RequestInterface $request request interface class | |||
| * | |||
| * @return void | |||
| */ | |||
| protected function populateRequest (CAS_Request_RequestInterface $request) | |||
| { | |||
| if (empty($this->_contentType) && !empty($this->_body)) { | |||
| throw new CAS_ProxiedService_Exception( | |||
| "If you pass a POST body, you must specify a content type via " | |||
| .get_class($this).'->setContentType($contentType).' | |||
| ); | |||
| } | |||
| $request->makePost(); | |||
| if (!empty($this->_body)) { | |||
| $request->addHeader('Content-Type: '.$this->_contentType); | |||
| $request->addHeader('Content-Length: '.strlen($this->_body)); | |||
| $request->setPostBody($this->_body); | |||
| } | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,280 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxiedService/Imap.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Provides access to a proxy-authenticated IMAP stream | |||
| * | |||
| * @class CAS_ProxiedService_Imap | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_ProxiedService_Imap | |||
| extends CAS_ProxiedService_Abstract | |||
| { | |||
| /** | |||
| * The username to send via imap_open. | |||
| * | |||
| * @var string $_username; | |||
| */ | |||
| private $_username; | |||
| /** | |||
| * Constructor. | |||
| * | |||
| * @param string $username Username | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct ($username) | |||
| { | |||
| if (!is_string($username) || !strlen($username)) { | |||
| throw new CAS_InvalidArgumentException('Invalid username.'); | |||
| } | |||
| $this->_username = $username; | |||
| } | |||
| /** | |||
| * The target service url. | |||
| * @var string $_url; | |||
| */ | |||
| private $_url; | |||
| /** | |||
| * Answer a service identifier (URL) for whom we should fetch a proxy ticket. | |||
| * | |||
| * @return string | |||
| * @throws Exception If no service url is available. | |||
| */ | |||
| public function getServiceUrl () | |||
| { | |||
| if (empty($this->_url)) { | |||
| throw new CAS_ProxiedService_Exception( | |||
| 'No URL set via '.get_class($this).'->getServiceUrl($url).' | |||
| ); | |||
| } | |||
| return $this->_url; | |||
| } | |||
| /********************************************************* | |||
| * Configure the Stream | |||
| *********************************************************/ | |||
| /** | |||
| * Set the URL of the service to pass to CAS for proxy-ticket retrieval. | |||
| * | |||
| * @param string $url Url to set | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the stream has been opened. | |||
| */ | |||
| public function setServiceUrl ($url) | |||
| { | |||
| if ($this->hasBeenOpened()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot set the URL, stream already opened.' | |||
| ); | |||
| } | |||
| if (!is_string($url) || !strlen($url)) { | |||
| throw new CAS_InvalidArgumentException('Invalid url.'); | |||
| } | |||
| $this->_url = $url; | |||
| } | |||
| /** | |||
| * The mailbox to open. See the $mailbox parameter of imap_open(). | |||
| * | |||
| * @var string $_mailbox | |||
| */ | |||
| private $_mailbox; | |||
| /** | |||
| * Set the mailbox to open. See the $mailbox parameter of imap_open(). | |||
| * | |||
| * @param string $mailbox Mailbox to set | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the stream has been opened. | |||
| */ | |||
| public function setMailbox ($mailbox) | |||
| { | |||
| if ($this->hasBeenOpened()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot set the mailbox, stream already opened.' | |||
| ); | |||
| } | |||
| if (!is_string($mailbox) || !strlen($mailbox)) { | |||
| throw new CAS_InvalidArgumentException('Invalid mailbox.'); | |||
| } | |||
| $this->_mailbox = $mailbox; | |||
| } | |||
| /** | |||
| * A bit mask of options to pass to imap_open() as the $options parameter. | |||
| * | |||
| * @var int $_options | |||
| */ | |||
| private $_options = null; | |||
| /** | |||
| * Set the options for opening the stream. See the $options parameter of | |||
| * imap_open(). | |||
| * | |||
| * @param int $options Options for the stream | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the stream has been opened. | |||
| */ | |||
| public function setOptions ($options) | |||
| { | |||
| if ($this->hasBeenOpened()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot set options, stream already opened.' | |||
| ); | |||
| } | |||
| if (!is_int($options)) { | |||
| throw new CAS_InvalidArgumentException('Invalid options.'); | |||
| } | |||
| $this->_options = $options; | |||
| } | |||
| /********************************************************* | |||
| * 2. Open the stream | |||
| *********************************************************/ | |||
| /** | |||
| * Open the IMAP stream (similar to imap_open()). | |||
| * | |||
| * @return resource Returns an IMAP stream on success | |||
| * @throws CAS_OutOfSequenceException If called multiple times. | |||
| * @throws CAS_ProxyTicketException If there is a proxy-ticket failure. | |||
| * The code of the Exception will be one of: | |||
| * PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE | |||
| * PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE | |||
| * PHPCAS_SERVICE_PT_FAILURE | |||
| * @throws CAS_ProxiedService_Exception If there is a failure sending the | |||
| * request to the target service. | |||
| */ | |||
| public function open () | |||
| { | |||
| if ($this->hasBeenOpened()) { | |||
| throw new CAS_OutOfSequenceException('Stream already opened.'); | |||
| } | |||
| if (empty($this->_mailbox)) { | |||
| throw new CAS_ProxiedService_Exception( | |||
| 'You must specify a mailbox via '.get_class($this) | |||
| .'->setMailbox($mailbox)' | |||
| ); | |||
| } | |||
| phpCAS::traceBegin(); | |||
| // Get our proxy ticket and append it to our URL. | |||
| $this->initializeProxyTicket(); | |||
| phpCAS::trace('opening IMAP mailbox `'.$this->_mailbox.'\'...'); | |||
| $this->_stream = @imap_open( | |||
| $this->_mailbox, $this->_username, $this->getProxyTicket(), | |||
| $this->_options | |||
| ); | |||
| if ($this->_stream) { | |||
| phpCAS::trace('ok'); | |||
| } else { | |||
| phpCAS::trace('could not open mailbox'); | |||
| // @todo add localization integration. | |||
| $message = 'IMAP Error: '.$this->_url.' '. var_export(imap_errors(), true); | |||
| phpCAS::trace($message); | |||
| throw new CAS_ProxiedService_Exception($message); | |||
| } | |||
| phpCAS::traceEnd(); | |||
| return $this->_stream; | |||
| } | |||
| /** | |||
| * Answer true if our request has been sent yet. | |||
| * | |||
| * @return bool | |||
| */ | |||
| protected function hasBeenOpened () | |||
| { | |||
| return !empty($this->_stream); | |||
| } | |||
| /********************************************************* | |||
| * 3. Access the result | |||
| *********************************************************/ | |||
| /** | |||
| * The IMAP stream | |||
| * | |||
| * @var resource $_stream | |||
| */ | |||
| private $_stream; | |||
| /** | |||
| * Answer the IMAP stream | |||
| * | |||
| * @return resource | |||
| */ | |||
| public function getStream () | |||
| { | |||
| if (!$this->hasBeenOpened()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot access stream, not opened yet.' | |||
| ); | |||
| } | |||
| return $this->_stream; | |||
| } | |||
| /** | |||
| * CAS_Client::serviceMail() needs to return the proxy ticket for some reason, | |||
| * so this method provides access to it. | |||
| * | |||
| * @return string | |||
| * @throws CAS_OutOfSequenceException If called before the stream has been | |||
| * opened. | |||
| */ | |||
| public function getImapProxyTicket () | |||
| { | |||
| if (!$this->hasBeenOpened()) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot access errors, stream not opened yet.' | |||
| ); | |||
| } | |||
| return $this->getProxyTicket(); | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,75 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxiedService/Testabel.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This interface defines methods that allow proxy-authenticated service handlers | |||
| * to be tested in unit tests. | |||
| * | |||
| * Classes implementing this interface SHOULD store the CAS_Client passed and | |||
| * initialize themselves with that client rather than via the static phpCAS | |||
| * method. For example: | |||
| * | |||
| * / ** | |||
| * * Fetch our proxy ticket. | |||
| * * / | |||
| * protected function initializeProxyTicket() { | |||
| * // Allow usage of a particular CAS_Client for unit testing. | |||
| * if (is_null($this->casClient)) | |||
| * phpCAS::initializeProxiedService($this); | |||
| * else | |||
| * $this->casClient->initializeProxiedService($this); | |||
| * } | |||
| * | |||
| * @class CAS_ProxiedService_Testabel | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| interface CAS_ProxiedService_Testable | |||
| { | |||
| /** | |||
| * Use a particular CAS_Client->initializeProxiedService() rather than the | |||
| * static phpCAS::initializeProxiedService(). | |||
| * | |||
| * This method should not be called in standard operation, but is needed for unit | |||
| * testing. | |||
| * | |||
| * @param CAS_Client $casClient Cas client object | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after a proxy ticket has | |||
| * already been initialized/set. | |||
| */ | |||
| public function setCasClient (CAS_Client $casClient); | |||
| } | |||
| ?> | |||
| @ -0,0 +1,127 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxyChain.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * A normal proxy-chain definition that lists each level of the chain as either | |||
| * a string or regular expression. | |||
| * | |||
| * @class CAS_ProxyChain | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_ProxyChain | |||
| implements CAS_ProxyChain_Interface | |||
| { | |||
| protected $chain = array(); | |||
| /** | |||
| * A chain is an array of strings or regexp strings that will be matched | |||
| * against. Regexp will be matched with preg_match and strings will be | |||
| * matched from the beginning. A string must fully match the beginning of | |||
| * an proxy url. So you can define a full domain as acceptable or go further | |||
| * down. | |||
| * Proxies have to be defined in reverse from the service to the user. If a | |||
| * user hits service A get proxied via B to service C the list of acceptable | |||
| * proxies on C would be array(B,A); | |||
| * | |||
| * @param array $chain A chain of proxies | |||
| */ | |||
| public function __construct(array $chain) | |||
| { | |||
| // Ensure that we have an indexed array | |||
| $this->chain = array_values($chain); | |||
| } | |||
| /** | |||
| * Match a list of proxies. | |||
| * | |||
| * @param array $list The list of proxies in front of this service. | |||
| * | |||
| * @return bool | |||
| */ | |||
| public function matches(array $list) | |||
| { | |||
| $list = array_values($list); // Ensure that we have an indexed array | |||
| if ($this->isSizeValid($list)) { | |||
| $mismatch = false; | |||
| foreach ($this->chain as $i => $search) { | |||
| $proxy_url = $list[$i]; | |||
| if (preg_match('/^\/.*\/[ixASUXu]*$/s', $search)) { | |||
| if (preg_match($search, $proxy_url)) { | |||
| phpCAS::trace( | |||
| "Found regexp " . $search . " matching " . $proxy_url | |||
| ); | |||
| } else { | |||
| phpCAS::trace( | |||
| "No regexp match " . $search . " != " . $proxy_url | |||
| ); | |||
| $mismatch = true; | |||
| break; | |||
| } | |||
| } else { | |||
| if (strncasecmp($search, $proxy_url, strlen($search)) == 0) { | |||
| phpCAS::trace( | |||
| "Found string " . $search . " matching " . $proxy_url | |||
| ); | |||
| } else { | |||
| phpCAS::trace( | |||
| "No match " . $search . " != " . $proxy_url | |||
| ); | |||
| $mismatch = true; | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| if (!$mismatch) { | |||
| phpCAS::trace("Proxy chain matches"); | |||
| return true; | |||
| } | |||
| } else { | |||
| phpCAS::trace("Proxy chain skipped: size mismatch"); | |||
| } | |||
| return false; | |||
| } | |||
| /** | |||
| * Validate the size of the the list as compared to our chain. | |||
| * | |||
| * @param array $list List of proxies | |||
| * | |||
| * @return bool | |||
| */ | |||
| protected function isSizeValid (array $list) | |||
| { | |||
| return (sizeof($this->chain) == sizeof($list)); | |||
| } | |||
| } | |||
| @ -0,0 +1,119 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxyChain/AllowedList.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * ProxyChain is a container for storing chains of valid proxies that can | |||
| * be used to validate proxied requests to a service | |||
| * | |||
| * @class CAS_ProxyChain_AllowedList | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_ProxyChain_AllowedList | |||
| { | |||
| private $_chains = array(); | |||
| /** | |||
| * Check whether proxies are allowed by configuration | |||
| * | |||
| * @return bool | |||
| */ | |||
| public function isProxyingAllowed() | |||
| { | |||
| return (count($this->_chains) > 0); | |||
| } | |||
| /** | |||
| * Add a chain of proxies to the list of possible chains | |||
| * | |||
| * @param CAS_ProxyChain_Interface $chain A chain of proxies | |||
| * | |||
| * @return void | |||
| */ | |||
| public function allowProxyChain(CAS_ProxyChain_Interface $chain) | |||
| { | |||
| $this->_chains[] = $chain; | |||
| } | |||
| /** | |||
| * Check if the proxies found in the response match the allowed proxies | |||
| * | |||
| * @param array $proxies list of proxies to check | |||
| * | |||
| * @return bool whether the proxies match the allowed proxies | |||
| */ | |||
| public function isProxyListAllowed(array $proxies) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| if (empty($proxies)) { | |||
| phpCAS::trace("No proxies were found in the response"); | |||
| phpCAS::traceEnd(true); | |||
| return true; | |||
| } elseif (!$this->isProxyingAllowed()) { | |||
| phpCAS::trace("Proxies are not allowed"); | |||
| phpCAS::traceEnd(false); | |||
| return false; | |||
| } else { | |||
| $res = $this->contains($proxies); | |||
| phpCAS::traceEnd($res); | |||
| return $res; | |||
| } | |||
| } | |||
| /** | |||
| * Validate the proxies from the proxy ticket validation against the | |||
| * chains that were definded. | |||
| * | |||
| * @param array $list List of proxies from the proxy ticket validation. | |||
| * | |||
| * @return if any chain fully matches the supplied list | |||
| */ | |||
| public function contains(array $list) | |||
| { | |||
| phpCAS::traceBegin(); | |||
| $count = 0; | |||
| foreach ($this->_chains as $chain) { | |||
| phpCAS::trace("Checking chain ". $count++); | |||
| if ($chain->matches($list)) { | |||
| phpCAS::traceEnd(true); | |||
| return true; | |||
| } | |||
| } | |||
| phpCAS::trace("No proxy chain matches."); | |||
| phpCAS::traceEnd(false); | |||
| return false; | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,64 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxyChain/Any.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * A proxy-chain definition that will match any list of proxies. | |||
| * | |||
| * Use this class for quick testing or in certain production screnarios you | |||
| * might want to allow allow any other valid service to proxy your service. | |||
| * | |||
| * THIS CLASS IS HOWEVER NOT RECOMMENDED FOR PRODUCTION AND HAS SECURITY | |||
| * IMPLICATIONS: YOU ARE ALLOWING ANY SERVICE TO ACT ON BEHALF OF A USER | |||
| * ON THIS SERVICE. | |||
| * | |||
| * @class CAS_ProxyChain_Any | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_ProxyChain_Any | |||
| implements CAS_ProxyChain_Interface | |||
| { | |||
| /** | |||
| * Match a list of proxies. | |||
| * | |||
| * @param array $list The list of proxies in front of this service. | |||
| * | |||
| * @return bool | |||
| */ | |||
| public function matches(array $list) | |||
| { | |||
| phpCAS::trace("Using CAS_ProxyChain_Any. No proxy validation is performed."); | |||
| return true; | |||
| } | |||
| } | |||
| @ -0,0 +1,53 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxyChain/Interface.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * An interface for classes that define a list of allowed proxies in front of | |||
| * the current application. | |||
| * | |||
| * @class CAS_ProxyChain_Interface | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| interface CAS_ProxyChain_Interface | |||
| { | |||
| /** | |||
| * Match a list of proxies. | |||
| * | |||
| * @param array $list The list of proxies in front of this service. | |||
| * | |||
| * @return bool | |||
| */ | |||
| public function matches(array $list); | |||
| } | |||
| @ -0,0 +1,59 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/ProxyChain/Trusted.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * A proxy-chain definition that defines a chain up to a trusted proxy and | |||
| * delegates the resposibility of validating the rest of the chain to that | |||
| * trusted proxy. | |||
| * | |||
| * @class CAS_ProxyChain_Trusted | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_ProxyChain_Trusted | |||
| extends CAS_ProxyChain | |||
| implements CAS_ProxyChain_Interface | |||
| { | |||
| /** | |||
| * Validate the size of the the list as compared to our chain. | |||
| * | |||
| * @param array $list list of proxies | |||
| * | |||
| * @return bool | |||
| */ | |||
| protected function isSizeValid (array $list) | |||
| { | |||
| return (sizeof($this->chain) <= sizeof($list)); | |||
| } | |||
| } | |||
| @ -0,0 +1,71 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @class CAS/ProxyTicketException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| * | |||
| */ | |||
| /** | |||
| * An Exception for errors related to fetching or validating proxy tickets. | |||
| * | |||
| * @class CAS_ProxyTicketException | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_ProxyTicketException | |||
| extends BadMethodCallException | |||
| implements CAS_Exception | |||
| { | |||
| /** | |||
| * Constructor | |||
| * | |||
| * @param string $message Message text | |||
| * @param int $code Error code | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct ($message, $code = PHPCAS_SERVICE_PT_FAILURE) | |||
| { | |||
| // Warn if the code is not in our allowed list | |||
| $ptCodes = array( | |||
| PHPCAS_SERVICE_PT_FAILURE, | |||
| PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, | |||
| PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE, | |||
| ); | |||
| if (!in_array($code, $ptCodes)) { | |||
| trigger_error( | |||
| 'Invalid code '.$code | |||
| .' passed. Must be one of PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, or PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE.' | |||
| ); | |||
| } | |||
| parent::__construct($message, $code); | |||
| } | |||
| } | |||
| @ -0,0 +1,379 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Request/AbstractRequest.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Provides support for performing web-requests via curl | |||
| * | |||
| * @class CAS_Request_AbstractRequest | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| abstract class CAS_Request_AbstractRequest | |||
| implements CAS_Request_RequestInterface | |||
| { | |||
| protected $url = null; | |||
| protected $cookies = array(); | |||
| protected $headers = array(); | |||
| protected $isPost = false; | |||
| protected $postBody = null; | |||
| protected $caCertPath = null; | |||
| protected $validateCN = true; | |||
| private $_sent = false; | |||
| private $_responseHeaders = array(); | |||
| private $_responseBody = null; | |||
| private $_errorMessage = ''; | |||
| /********************************************************* | |||
| * Configure the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Set the URL of the Request | |||
| * | |||
| * @param string $url Url to set | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setUrl ($url) | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| $this->url = $url; | |||
| } | |||
| /** | |||
| * Add a cookie to the request. | |||
| * | |||
| * @param string $name Name of entry | |||
| * @param string $value value of entry | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function addCookie ($name, $value) | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| $this->cookies[$name] = $value; | |||
| } | |||
| /** | |||
| * Add an array of cookies to the request. | |||
| * The cookie array is of the form | |||
| * array('cookie_name' => 'cookie_value', 'cookie_name2' => cookie_value2') | |||
| * | |||
| * @param array $cookies cookies to add | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function addCookies (array $cookies) | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| $this->cookies = array_merge($this->cookies, $cookies); | |||
| } | |||
| /** | |||
| * Add a header string to the request. | |||
| * | |||
| * @param string $header Header to add | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function addHeader ($header) | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| $this->headers[] = $header; | |||
| } | |||
| /** | |||
| * Add an array of header strings to the request. | |||
| * | |||
| * @param array $headers headers to add | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function addHeaders (array $headers) | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| $this->headers = array_merge($this->headers, $headers); | |||
| } | |||
| /** | |||
| * Make the request a POST request rather than the default GET request. | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function makePost () | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| $this->isPost = true; | |||
| } | |||
| /** | |||
| * Add a POST body to the request | |||
| * | |||
| * @param string $body body to add | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setPostBody ($body) | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| if (!$this->isPost) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Cannot add a POST body to a GET request, use makePost() first.' | |||
| ); | |||
| } | |||
| $this->postBody = $body; | |||
| } | |||
| /** | |||
| * Specify the path to an SSL CA certificate to validate the server with. | |||
| * | |||
| * @param string $caCertPath path to cert | |||
| * @param bool $validate_cn valdiate CN of certificate | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setSslCaCert ($caCertPath,$validate_cn=true) | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| $this->caCertPath = $caCertPath; | |||
| $this->validateCN = $validate_cn; | |||
| } | |||
| /********************************************************* | |||
| * 2. Send the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Perform the request. | |||
| * | |||
| * @return bool TRUE on success, FALSE on failure. | |||
| * @throws CAS_OutOfSequenceException If called multiple times. | |||
| */ | |||
| public function send () | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot send again.' | |||
| ); | |||
| } | |||
| if (is_null($this->url) || !$this->url) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'A url must be specified via setUrl() before the request can be sent.' | |||
| ); | |||
| } | |||
| $this->_sent = true; | |||
| return $this->sendRequest(); | |||
| } | |||
| /** | |||
| * Send the request and store the results. | |||
| * | |||
| * @return bool TRUE on success, FALSE on failure. | |||
| */ | |||
| abstract protected function sendRequest (); | |||
| /** | |||
| * Store the response headers. | |||
| * | |||
| * @param array $headers headers to store | |||
| * | |||
| * @return void | |||
| */ | |||
| protected function storeResponseHeaders (array $headers) | |||
| { | |||
| $this->_responseHeaders = array_merge($this->_responseHeaders, $headers); | |||
| } | |||
| /** | |||
| * Store a single response header to our array. | |||
| * | |||
| * @param string $header header to store | |||
| * | |||
| * @return void | |||
| */ | |||
| protected function storeResponseHeader ($header) | |||
| { | |||
| $this->_responseHeaders[] = $header; | |||
| } | |||
| /** | |||
| * Store the response body. | |||
| * | |||
| * @param string $body body to store | |||
| * | |||
| * @return void | |||
| */ | |||
| protected function storeResponseBody ($body) | |||
| { | |||
| $this->_responseBody = $body; | |||
| } | |||
| /** | |||
| * Add a string to our error message. | |||
| * | |||
| * @param string $message message to add | |||
| * | |||
| * @return void | |||
| */ | |||
| protected function storeErrorMessage ($message) | |||
| { | |||
| $this->_errorMessage .= $message; | |||
| } | |||
| /********************************************************* | |||
| * 3. Access the response | |||
| *********************************************************/ | |||
| /** | |||
| * Answer the headers of the response. | |||
| * | |||
| * @return array An array of header strings. | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseHeaders () | |||
| { | |||
| if (!$this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has not been sent yet. Cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| return $this->_responseHeaders; | |||
| } | |||
| /** | |||
| * Answer HTTP status code of the response | |||
| * | |||
| * @return int | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseStatusCode () | |||
| { | |||
| if (!$this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has not been sent yet. Cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| if (!preg_match( | |||
| '/HTTP\/[0-9.]+\s+([0-9]+)\s*(.*)/', | |||
| $this->_responseHeaders[0], $matches | |||
| ) | |||
| ) { | |||
| throw new CAS_Request_Exception( | |||
| 'Bad response, no status code was found in the first line.' | |||
| ); | |||
| } | |||
| return intval($matches[1]); | |||
| } | |||
| /** | |||
| * Answer the body of response. | |||
| * | |||
| * @return string | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseBody () | |||
| { | |||
| if (!$this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has not been sent yet. Cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| return $this->_responseBody; | |||
| } | |||
| /** | |||
| * Answer a message describing any errors if the request failed. | |||
| * | |||
| * @return string | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getErrorMessage () | |||
| { | |||
| if (!$this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has not been sent yet. Cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| return $this->_errorMessage; | |||
| } | |||
| } | |||
| @ -0,0 +1,146 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Request/AbstractRequest.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This interface defines a class library for performing multiple web requests | |||
| * in batches. Implementations of this interface may perform requests serially | |||
| * or in parallel. | |||
| * | |||
| * @class CAS_Request_CurlMultiRequest | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_Request_CurlMultiRequest | |||
| implements CAS_Request_MultiRequestInterface | |||
| { | |||
| private $_requests = array(); | |||
| private $_sent = false; | |||
| /********************************************************* | |||
| * Add Requests | |||
| *********************************************************/ | |||
| /** | |||
| * Add a new Request to this batch. | |||
| * Note, implementations will likely restrict requests to their own concrete | |||
| * class hierarchy. | |||
| * | |||
| * @param CAS_Request_RequestInterface $request reqest to add | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| * @throws CAS_InvalidArgumentException If passed a Request of the wrong | |||
| * implmentation. | |||
| */ | |||
| public function addRequest (CAS_Request_RequestInterface $request) | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| if (!$request instanceof CAS_Request_CurlRequest) { | |||
| throw new CAS_InvalidArgumentException( | |||
| 'As a CAS_Request_CurlMultiRequest, I can only work with CAS_Request_CurlRequest objects.' | |||
| ); | |||
| } | |||
| $this->_requests[] = $request; | |||
| } | |||
| /** | |||
| * Retrieve the number of requests added to this batch. | |||
| * | |||
| * @return number of request elements | |||
| */ | |||
| public function getNumRequests() | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot '.__METHOD__ | |||
| ); | |||
| } | |||
| return count($this->_requests); | |||
| } | |||
| /********************************************************* | |||
| * 2. Send the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Perform the request. After sending, all requests will have their | |||
| * responses poulated. | |||
| * | |||
| * @return bool TRUE on success, FALSE on failure. | |||
| * @throws CAS_OutOfSequenceException If called multiple times. | |||
| */ | |||
| public function send () | |||
| { | |||
| if ($this->_sent) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'Request has already been sent cannot send again.' | |||
| ); | |||
| } | |||
| if (!count($this->_requests)) { | |||
| throw new CAS_OutOfSequenceException( | |||
| 'At least one request must be added via addRequest() before the multi-request can be sent.' | |||
| ); | |||
| } | |||
| $this->_sent = true; | |||
| // Initialize our handles and configure all requests. | |||
| $handles = array(); | |||
| $multiHandle = curl_multi_init(); | |||
| foreach ($this->_requests as $i => $request) { | |||
| $handle = $request->_initAndConfigure(); | |||
| curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); | |||
| $handles[$i] = $handle; | |||
| curl_multi_add_handle($multiHandle, $handle); | |||
| } | |||
| // Execute the requests in parallel. | |||
| do { | |||
| curl_multi_exec($multiHandle, $running); | |||
| } while ($running > 0); | |||
| // Populate all of the responses or errors back into the request objects. | |||
| foreach ($this->_requests as $i => $request) { | |||
| $buf = curl_multi_getcontent($handles[$i]); | |||
| $request->_storeResponseBody($buf); | |||
| curl_multi_remove_handle($multiHandle, $handles[$i]); | |||
| curl_close($handles[$i]); | |||
| } | |||
| curl_multi_close($multiHandle); | |||
| } | |||
| } | |||
| @ -0,0 +1,200 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Request/CurlRequest.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Provides support for performing web-requests via curl | |||
| * | |||
| * @class CAS_Request_CurlRequest | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_Request_CurlRequest | |||
| extends CAS_Request_AbstractRequest | |||
| implements CAS_Request_RequestInterface | |||
| { | |||
| /** | |||
| * Set additional curl options | |||
| * | |||
| * @param array $options option to set | |||
| * | |||
| * @return void | |||
| */ | |||
| public function setCurlOptions (array $options) | |||
| { | |||
| $this->_curlOptions = $options; | |||
| } | |||
| private $_curlOptions = array(); | |||
| /** | |||
| * Send the request and store the results. | |||
| * | |||
| * @return bool true on success, false on failure. | |||
| */ | |||
| protected function sendRequest () | |||
| { | |||
| phpCAS::traceBegin(); | |||
| /********************************************************* | |||
| * initialize the CURL session | |||
| *********************************************************/ | |||
| $ch = $this->_initAndConfigure(); | |||
| /********************************************************* | |||
| * Perform the query | |||
| *********************************************************/ | |||
| $buf = curl_exec($ch); | |||
| if ( $buf === false ) { | |||
| phpCAS::trace('curl_exec() failed'); | |||
| $this->storeErrorMessage( | |||
| 'CURL error #'.curl_errno($ch).': '.curl_error($ch) | |||
| ); | |||
| $res = false; | |||
| } else { | |||
| $this->storeResponseBody($buf); | |||
| phpCAS::trace("Response Body: \n".$buf."\n"); | |||
| $res = true; | |||
| } | |||
| // close the CURL session | |||
| curl_close($ch); | |||
| phpCAS::traceEnd($res); | |||
| return $res; | |||
| } | |||
| /** | |||
| * Internal method to initialize our cURL handle and configure the request. | |||
| * This method should NOT be used outside of the CurlRequest or the | |||
| * CurlMultiRequest. | |||
| * | |||
| * @return resource The cURL handle on success, false on failure | |||
| */ | |||
| private function _initAndConfigure() | |||
| { | |||
| /********************************************************* | |||
| * initialize the CURL session | |||
| *********************************************************/ | |||
| $ch = curl_init($this->url); | |||
| if (version_compare(PHP_VERSION, '5.1.3', '>=')) { | |||
| //only avaible in php5 | |||
| curl_setopt_array($ch, $this->_curlOptions); | |||
| } else { | |||
| foreach ($this->_curlOptions as $key => $value) { | |||
| curl_setopt($ch, $key, $value); | |||
| } | |||
| } | |||
| /********************************************************* | |||
| * Set SSL configuration | |||
| *********************************************************/ | |||
| if ($this->caCertPath) { | |||
| if ($this->validateCN) { | |||
| curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); | |||
| } else { | |||
| curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); | |||
| } | |||
| curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); | |||
| curl_setopt($ch, CURLOPT_CAINFO, $this->caCertPath); | |||
| phpCAS::trace('CURL: Set CURLOPT_CAINFO ' . $this->caCertPath); | |||
| } else { | |||
| curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); | |||
| curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); | |||
| } | |||
| /********************************************************* | |||
| * Configure curl to capture our output. | |||
| *********************************************************/ | |||
| // return the CURL output into a variable | |||
| curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | |||
| // get the HTTP header with a callback | |||
| curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, '_curlReadHeaders')); | |||
| /********************************************************* | |||
| * Add cookie headers to our request. | |||
| *********************************************************/ | |||
| if (count($this->cookies)) { | |||
| $cookieStrings = array(); | |||
| foreach ($this->cookies as $name => $val) { | |||
| $cookieStrings[] = $name.'='.$val; | |||
| } | |||
| curl_setopt($ch, CURLOPT_COOKIE, implode(';', $cookieStrings)); | |||
| } | |||
| /********************************************************* | |||
| * Add any additional headers | |||
| *********************************************************/ | |||
| if (count($this->headers)) { | |||
| curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers); | |||
| } | |||
| /********************************************************* | |||
| * Flag and Body for POST requests | |||
| *********************************************************/ | |||
| if ($this->isPost) { | |||
| curl_setopt($ch, CURLOPT_POST, 1); | |||
| curl_setopt($ch, CURLOPT_POSTFIELDS, $this->postBody); | |||
| } | |||
| return $ch; | |||
| } | |||
| /** | |||
| * Store the response body. | |||
| * This method should NOT be used outside of the CurlRequest or the | |||
| * CurlMultiRequest. | |||
| * | |||
| * @param string $body body to stor | |||
| * | |||
| * @return void | |||
| */ | |||
| private function _storeResponseBody ($body) | |||
| { | |||
| $this->storeResponseBody($body); | |||
| } | |||
| /** | |||
| * Internal method for capturing the headers from a curl request. | |||
| * | |||
| * @param handle $ch handle of curl | |||
| * @param string $header header | |||
| * | |||
| * @return void | |||
| */ | |||
| private function _curlReadHeaders ($ch, $header) | |||
| { | |||
| $this->storeResponseHeader($header); | |||
| return strlen($header); | |||
| } | |||
| } | |||
| @ -0,0 +1,45 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Request/Exception.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * An Exception for problems performing requests | |||
| * | |||
| * @class CAS_Request_Exception | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_Request_Exception | |||
| extends Exception | |||
| implements CAS_Exception | |||
| { | |||
| } | |||
| @ -0,0 +1,83 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Request/MultiRequestInterface.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This interface defines a class library for performing multiple web requests | |||
| * in batches. Implementations of this interface may perform requests serially | |||
| * or in parallel. | |||
| * | |||
| * @class CAS_Request_MultiRequestInterface | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| interface CAS_Request_MultiRequestInterface | |||
| { | |||
| /********************************************************* | |||
| * Add Requests | |||
| *********************************************************/ | |||
| /** | |||
| * Add a new Request to this batch. | |||
| * Note, implementations will likely restrict requests to their own concrete | |||
| * class hierarchy. | |||
| * | |||
| * @param CAS_Request_RequestInterface $request request interface | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been | |||
| * sent. | |||
| * @throws CAS_InvalidArgumentException If passed a Request of the wrong | |||
| * implmentation. | |||
| */ | |||
| public function addRequest (CAS_Request_RequestInterface $request); | |||
| /** | |||
| * Retrieve the number of requests added to this batch. | |||
| * | |||
| * @return number of request elements | |||
| */ | |||
| public function getNumRequests (); | |||
| /********************************************************* | |||
| * 2. Send the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Perform the request. After sending, all requests will have their | |||
| * responses poulated. | |||
| * | |||
| * @return bool TRUE on success, FALSE on failure. | |||
| * @throws CAS_OutOfSequenceException If called multiple times. | |||
| */ | |||
| public function send (); | |||
| } | |||
| @ -0,0 +1,179 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/Request/RequestInterface.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * This interface defines a class library for performing web requests. | |||
| * | |||
| * @class CAS_Request_RequestInterface | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| interface CAS_Request_RequestInterface | |||
| { | |||
| /********************************************************* | |||
| * Configure the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Set the URL of the Request | |||
| * | |||
| * @param string $url url to set | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setUrl ($url); | |||
| /** | |||
| * Add a cookie to the request. | |||
| * | |||
| * @param string $name name of cookie | |||
| * @param string $value value of cookie | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function addCookie ($name, $value); | |||
| /** | |||
| * Add an array of cookies to the request. | |||
| * The cookie array is of the form | |||
| * array('cookie_name' => 'cookie_value', 'cookie_name2' => cookie_value2') | |||
| * | |||
| * @param array $cookies cookies to add | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function addCookies (array $cookies); | |||
| /** | |||
| * Add a header string to the request. | |||
| * | |||
| * @param string $header header to add | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function addHeader ($header); | |||
| /** | |||
| * Add an array of header strings to the request. | |||
| * | |||
| * @param array $headers headers to add | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function addHeaders (array $headers); | |||
| /** | |||
| * Make the request a POST request rather than the default GET request. | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function makePost (); | |||
| /** | |||
| * Add a POST body to the request | |||
| * | |||
| * @param string $body body to add | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setPostBody ($body); | |||
| /** | |||
| * Specify the path to an SSL CA certificate to validate the server with. | |||
| * | |||
| * @param string $caCertPath path to cert file | |||
| * @param boolean $validate_cn validate CN of SSL certificate | |||
| * | |||
| * @return void | |||
| * @throws CAS_OutOfSequenceException If called after the Request has been sent. | |||
| */ | |||
| public function setSslCaCert ($caCertPath, $validate_cn = true); | |||
| /********************************************************* | |||
| * 2. Send the Request | |||
| *********************************************************/ | |||
| /** | |||
| * Perform the request. | |||
| * | |||
| * @return bool TRUE on success, FALSE on failure. | |||
| * @throws CAS_OutOfSequenceException If called multiple times. | |||
| */ | |||
| public function send (); | |||
| /********************************************************* | |||
| * 3. Access the response | |||
| *********************************************************/ | |||
| /** | |||
| * Answer the headers of the response. | |||
| * | |||
| * @return array An array of header strings. | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseHeaders (); | |||
| /** | |||
| * Answer HTTP status code of the response | |||
| * | |||
| * @return int | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseStatusCode (); | |||
| /** | |||
| * Answer the body of response. | |||
| * | |||
| * @return string | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getResponseBody (); | |||
| /** | |||
| * Answer a message describing any errors if the request failed. | |||
| * | |||
| * @return string | |||
| * @throws CAS_OutOfSequenceException If called before the Request has been sent. | |||
| */ | |||
| public function getErrorMessage (); | |||
| } | |||
| @ -0,0 +1,70 @@ | |||
| <?php | |||
| /** | |||
| * Licensed to Jasig under one or more contributor license | |||
| * agreements. See the NOTICE file distributed with this work for | |||
| * additional information regarding copyright ownership. | |||
| * | |||
| * Jasig licenses this file to you under the Apache License, | |||
| * Version 2.0 (the "License"); you may not use this file except in | |||
| * compliance with the License. You may obtain a copy of the License at: | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| * PHP Version 5 | |||
| * | |||
| * @file CAS/InvalidArgumentException.php | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| /** | |||
| * Exception that denotes invalid arguments were passed. | |||
| * | |||
| * @class CAS_InvalidArgumentException | |||
| * @category Authentication | |||
| * @package PhpCAS | |||
| * @author Adam Franco <afranco@middlebury.edu> | |||
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 | |||
| * @link https://wiki.jasig.org/display/CASC/phpCAS | |||
| */ | |||
| class CAS_TypeMismatchException | |||
| extends CAS_InvalidArgumentException | |||
| { | |||
| /** | |||
| * Constructor, provides a nice message. | |||
| * | |||
| * @param mixed $argument Argument | |||
| * @param string $argumentName Argument Name | |||
| * @param string $type Type | |||
| * @param string $message Error Message | |||
| * @param integer $code Code | |||
| * | |||
| * @return void | |||
| */ | |||
| public function __construct ( | |||
| $argument, $argumentName, $type, $message = '', $code = 0 | |||
| ) { | |||
| if (is_object($argument)) { | |||
| $foundType = get_class($argument).' object'; | |||
| } else { | |||
| $foundType = gettype($argument); | |||
| } | |||
| parent::__construct( | |||
| 'type mismatched for parameter ' | |||
| . $argumentName . ' (should be \'' . $type .' \'), ' | |||
| . $foundType . ' given. ' . $message, $code | |||
| ); | |||
| } | |||
| } | |||
| ?> | |||
| @ -0,0 +1,201 @@ | |||
| Apache License | |||
| Version 2.0, January 2004 | |||
| http://www.apache.org/licenses/ | |||
| TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | |||
| 1. Definitions. | |||
| "License" shall mean the terms and conditions for use, reproduction, | |||
| and distribution as defined by Sections 1 through 9 of this document. | |||
| "Licensor" shall mean the copyright owner or entity authorized by | |||
| the copyright owner that is granting the License. | |||
| "Legal Entity" shall mean the union of the acting entity and all | |||
| other entities that control, are controlled by, or are under common | |||
| control with that entity. For the purposes of this definition, | |||
| "control" means (i) the power, direct or indirect, to cause the | |||
| direction or management of such entity, whether by contract or | |||
| otherwise, or (ii) ownership of fifty percent (50%) or more of the | |||
| outstanding shares, or (iii) beneficial ownership of such entity. | |||
| "You" (or "Your") shall mean an individual or Legal Entity | |||
| exercising permissions granted by this License. | |||
| "Source" form shall mean the preferred form for making modifications, | |||
| including but not limited to software source code, documentation | |||
| source, and configuration files. | |||
| "Object" form shall mean any form resulting from mechanical | |||
| transformation or translation of a Source form, including but | |||
| not limited to compiled object code, generated documentation, | |||
| and conversions to other media types. | |||
| "Work" shall mean the work of authorship, whether in Source or | |||
| Object form, made available under the License, as indicated by a | |||
| copyright notice that is included in or attached to the work | |||
| (an example is provided in the Appendix below). | |||
| "Derivative Works" shall mean any work, whether in Source or Object | |||
| form, that is based on (or derived from) the Work and for which the | |||
| editorial revisions, annotations, elaborations, or other modifications | |||
| represent, as a whole, an original work of authorship. For the purposes | |||
| of this License, Derivative Works shall not include works that remain | |||
| separable from, or merely link (or bind by name) to the interfaces of, | |||
| the Work and Derivative Works thereof. | |||
| "Contribution" shall mean any work of authorship, including | |||
| the original version of the Work and any modifications or additions | |||
| to that Work or Derivative Works thereof, that is intentionally | |||
| submitted to Licensor for inclusion in the Work by the copyright owner | |||
| or by an individual or Legal Entity authorized to submit on behalf of | |||
| the copyright owner. For the purposes of this definition, "submitted" | |||
| means any form of electronic, verbal, or written communication sent | |||
| to the Licensor or its representatives, including but not limited to | |||
| communication on electronic mailing lists, source code control systems, | |||
| and issue tracking systems that are managed by, or on behalf of, the | |||
| Licensor for the purpose of discussing and improving the Work, but | |||
| excluding communication that is conspicuously marked or otherwise | |||
| designated in writing by the copyright owner as "Not a Contribution." | |||
| "Contributor" shall mean Licensor and any individual or Legal Entity | |||
| on behalf of whom a Contribution has been received by Licensor and | |||
| subsequently incorporated within the Work. | |||
| 2. Grant of Copyright License. Subject to the terms and conditions of | |||
| this License, each Contributor hereby grants to You a perpetual, | |||
| worldwide, non-exclusive, no-charge, royalty-free, irrevocable | |||
| copyright license to reproduce, prepare Derivative Works of, | |||
| publicly display, publicly perform, sublicense, and distribute the | |||
| Work and such Derivative Works in Source or Object form. | |||
| 3. Grant of Patent License. Subject to the terms and conditions of | |||
| this License, each Contributor hereby grants to You a perpetual, | |||
| worldwide, non-exclusive, no-charge, royalty-free, irrevocable | |||
| (except as stated in this section) patent license to make, have made, | |||
| use, offer to sell, sell, import, and otherwise transfer the Work, | |||
| where such license applies only to those patent claims licensable | |||
| by such Contributor that are necessarily infringed by their | |||
| Contribution(s) alone or by combination of their Contribution(s) | |||
| with the Work to which such Contribution(s) was submitted. If You | |||
| institute patent litigation against any entity (including a | |||
| cross-claim or counterclaim in a lawsuit) alleging that the Work | |||
| or a Contribution incorporated within the Work constitutes direct | |||
| or contributory patent infringement, then any patent licenses | |||
| granted to You under this License for that Work shall terminate | |||
| as of the date such litigation is filed. | |||
| 4. Redistribution. You may reproduce and distribute copies of the | |||
| Work or Derivative Works thereof in any medium, with or without | |||
| modifications, and in Source or Object form, provided that You | |||
| meet the following conditions: | |||
| (a) You must give any other recipients of the Work or | |||
| Derivative Works a copy of this License; and | |||
| (b) You must cause any modified files to carry prominent notices | |||
| stating that You changed the files; and | |||
| (c) You must retain, in the Source form of any Derivative Works | |||
| that You distribute, all copyright, patent, trademark, and | |||
| attribution notices from the Source form of the Work, | |||
| excluding those notices that do not pertain to any part of | |||
| the Derivative Works; and | |||
| (d) If the Work includes a "NOTICE" text file as part of its | |||
| distribution, then any Derivative Works that You distribute must | |||
| include a readable copy of the attribution notices contained | |||
| within such NOTICE file, excluding those notices that do not | |||
| pertain to any part of the Derivative Works, in at least one | |||
| of the following places: within a NOTICE text file distributed | |||
| as part of the Derivative Works; within the Source form or | |||
| documentation, if provided along with the Derivative Works; or, | |||
| within a display generated by the Derivative Works, if and | |||
| wherever such third-party notices normally appear. The contents | |||
| of the NOTICE file are for informational purposes only and | |||
| do not modify the License. You may add Your own attribution | |||
| notices within Derivative Works that You distribute, alongside | |||
| or as an addendum to the NOTICE text from the Work, provided | |||
| that such additional attribution notices cannot be construed | |||
| as modifying the License. | |||
| You may add Your own copyright statement to Your modifications and | |||
| may provide additional or different license terms and conditions | |||
| for use, reproduction, or distribution of Your modifications, or | |||
| for any such Derivative Works as a whole, provided Your use, | |||
| reproduction, and distribution of the Work otherwise complies with | |||
| the conditions stated in this License. | |||
| 5. Submission of Contributions. Unless You explicitly state otherwise, | |||
| any Contribution intentionally submitted for inclusion in the Work | |||
| by You to the Licensor shall be under the terms and conditions of | |||
| this License, without any additional terms or conditions. | |||
| Notwithstanding the above, nothing herein shall supersede or modify | |||
| the terms of any separate license agreement you may have executed | |||
| with Licensor regarding such Contributions. | |||
| 6. Trademarks. This License does not grant permission to use the trade | |||
| names, trademarks, service marks, or product names of the Licensor, | |||
| except as required for reasonable and customary use in describing the | |||
| origin of the Work and reproducing the content of the NOTICE file. | |||
| 7. Disclaimer of Warranty. Unless required by applicable law or | |||
| agreed to in writing, Licensor provides the Work (and each | |||
| Contributor provides its Contributions) on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | |||
| implied, including, without limitation, any warranties or conditions | |||
| of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | |||
| PARTICULAR PURPOSE. You are solely responsible for determining the | |||
| appropriateness of using or redistributing the Work and assume any | |||
| risks associated with Your exercise of permissions under this License. | |||
| 8. Limitation of Liability. In no event and under no legal theory, | |||
| whether in tort (including negligence), contract, or otherwise, | |||
| unless required by applicable law (such as deliberate and grossly | |||
| negligent acts) or agreed to in writing, shall any Contributor be | |||
| liable to You for damages, including any direct, indirect, special, | |||
| incidental, or consequential damages of any character arising as a | |||
| result of this License or out of the use or inability to use the | |||
| Work (including but not limited to damages for loss of goodwill, | |||
| work stoppage, computer failure or malfunction, or any and all | |||
| other commercial damages or losses), even if such Contributor | |||
| has been advised of the possibility of such damages. | |||
| 9. Accepting Warranty or Additional Liability. While redistributing | |||
| the Work or Derivative Works thereof, You may choose to offer, | |||
| and charge a fee for, acceptance of support, warranty, indemnity, | |||
| or other liability obligations and/or rights consistent with this | |||
| License. However, in accepting such obligations, You may act only | |||
| on Your own behalf and on Your sole responsibility, not on behalf | |||
| of any other Contributor, and only if You agree to indemnify, | |||
| defend, and hold each Contributor harmless for any liability | |||
| incurred by, or claims asserted against, such Contributor by reason | |||
| of your accepting any such warranty or additional liability. | |||
| END OF TERMS AND CONDITIONS | |||
| APPENDIX: How to apply the Apache License to your work. | |||
| To apply the Apache License to your work, attach the following | |||
| boilerplate notice, with the fields enclosed by brackets "[]" | |||
| replaced with your own identifying information. (Don't include | |||
| the brackets!) The text should be enclosed in the appropriate | |||
| comment syntax for the file format. We also recommend that a | |||
| file or class name and description of purpose be included on the | |||
| same "printed page" as the copyright notice for easier | |||
| identification within third-party archives. | |||
| Copyright [yyyy] [name of copyright owner] | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| @ -0,0 +1,81 @@ | |||
| Copyright 2007-2011, JA-SIG, Inc. | |||
| This project includes software developed by Jasig. | |||
| http://www.jasig.org/ | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this software except in compliance with the License. | |||
| You may obtain a copy of the License at: | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| =========================================================================== | |||
| Copyright © 2003-2007, The ESUP-Portail consortium | |||
| Requirements for sources originally licensed under the New BSD License: | |||
| Redistribution and use in source and binary forms, with or without | |||
| modification, are permitted provided that the following conditions | |||
| are met: | |||
| - Redistributions of source code must retain the above copyright notice, | |||
| this list of conditions and the following disclaimer. | |||
| - Redistributions in binary form must reproduce the above copyright notice, | |||
| this list of conditions and the following disclaimer in the documentation | |||
| and/or other materials provided with the distribution. | |||
| - Neither the name of JA-SIG, Inc. nor the names of its contributors may be | |||
| used to endorse or promote products derived from this software without | |||
| specific prior written permission. | |||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||
| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||
| ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | |||
| LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |||
| CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||
| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |||
| CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||
| ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGE. | |||
| =========================================================================== | |||
| Copyright (c) 2009, Regents of the University of Nebraska | |||
| All rights reserved. | |||
| Requirements for CAS_Autloader originally licensed under the New BSD License: | |||
| Redistribution and use in source and binary forms, with or without modification, | |||
| are permitted provided that the following conditions are met: | |||
| Redistributions of source code must retain the above copyright notice, this list | |||
| of conditions and the following disclaimer. | |||
| Redistributions in binary form must reproduce the above copyright notice, this | |||
| list of conditions and the following disclaimer in the documentation and/or | |||
| other materials provided with the distribution. | |||
| Neither the name of the University of Nebraska nor the names of its contributors | |||
| may be used to endorse or promote products derived from this software without | |||
| specific prior written permission. | |||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||
| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||
| ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | |||
| LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |||
| CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||
| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |||
| CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||
| ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGE. | |||
| @ -0,0 +1,31 @@ | |||
| phpCAS | |||
| ======= | |||
| phpCAS is an authentication library that allows PHP applications to easily authenticate | |||
| users via a Central Authentication Service (CAS) server. | |||
| Please see the phpCAS website for more information: | |||
| https://wiki.jasig.org/display/CASC/phpCAS | |||
| [](https://travis-ci.org/Jasig/phpCAS) | |||
| LICENSE | |||
| ------- | |||
| Copyright 2007-2015, JA-SIG, Inc. | |||
| This project includes software developed by Jasig. | |||
| http://www.jasig.org/ | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this software except in compliance with the License. | |||
| You may obtain a copy of the License at: | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||