| @ -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. | |||||