From e07e95e95eda4bbd9f0891d8a82d560235262db6 Mon Sep 17 00:00:00 2001 From: Tim van Dijen <tvdijen@gmail.com> Date: Fri, 5 Jan 2018 00:03:45 +0100 Subject: [PATCH] PSR-2 --- modules/cas/lib/Auth/Source/CAS.php | 454 ++++++++++++++-------------- 1 file changed, 231 insertions(+), 223 deletions(-) diff --git a/modules/cas/lib/Auth/Source/CAS.php b/modules/cas/lib/Auth/Source/CAS.php index ca700d57e..9d7a030ac 100644 --- a/modules/cas/lib/Auth/Source/CAS.php +++ b/modules/cas/lib/Auth/Source/CAS.php @@ -8,228 +8,236 @@ * @author Danny Bollaert, UGent. * @package SimpleSAMLphp */ -class sspmod_cas_Auth_Source_CAS extends SimpleSAML_Auth_Source { - - /** - * The string used to identify our states. - */ - const STAGE_INIT = 'sspmod_cas_Auth_Source_CAS.state'; - - /** - * The key of the AuthId field in the state. - */ - const AUTHID = 'sspmod_cas_Auth_Source_CAS.AuthId'; - - - /** - * @var array with ldap configuration - */ - private $_ldapConfig; - - /** - * @var cas configuration - */ - private $_casConfig; - - /** - * @var cas chosen validation method - */ - private $_validationMethod; - /** - * @var cas login method - */ - private $_loginMethod; - - - /** - * Constructor for this authentication source. - * - * @param array $info Information about this authentication source. - * @param array $config Configuration. - */ - public function __construct($info, $config) { - assert(is_array($info)); - assert(is_array($config)); - - // Call the parent constructor first, as required by the interface - parent::__construct($info, $config); - - if (!array_key_exists('cas', $config)){ - throw new Exception('cas authentication source is not properly configured: missing [cas]'); - } - - if (!array_key_exists('ldap', $config)){ - throw new Exception('ldap authentication source is not properly configured: missing [ldap]'); - } - - $this->_casConfig = $config['cas']; - $this->_ldapConfig = $config['ldap']; - - if(isset($this->_casConfig['serviceValidate'])){ - $this->_validationMethod = 'serviceValidate'; - }elseif(isset($this->_casConfig['validate'])){ - $this->_validationMethod = 'validate'; - }else{ - throw new Exception("validate or serviceValidate not specified"); - } - - if(isset($this->_casConfig['login'])){ - $this->_loginMethod = $this->_casConfig['login']; - }else{ - throw new Exception("cas login URL not specified"); - } - } - - - /** - * This the most simple version of validating, this provides only authentication validation - * - * @param string $ticket - * @param string $service - * @return list username and attributes - */ - private function casValidate($ticket, $service){ - $url = \SimpleSAML\Utils\HTTP::addURLParameters($this->_casConfig['validate'], array( - 'ticket' => $ticket, - 'service' => $service, - )); - $result = \SimpleSAML\Utils\HTTP::fetch($url); - $res = preg_split("/\r?\n/",$result); - - if (strcmp($res[0], "yes") == 0) { - return array($res[1], array()); - } else { - throw new Exception("Failed to validate CAS service ticket: $ticket"); - } - } - - - /** - * Uses the cas service validate, this provides additional attributes - * - * @param string $ticket - * @param string $service - * @return list username and attributes - */ - private function casServiceValidate($ticket, $service){ - $url = \SimpleSAML\Utils\HTTP::addURLParameters($this->_casConfig['serviceValidate'], array( - 'ticket' => $ticket, - 'service' => $service, - )); - $result = \SimpleSAML\Utils\HTTP::fetch($url); - - $dom = \SAML2\DOMDocumentFactory::fromString($result); - $xPath = new DOMXpath($dom); - $xPath->registerNamespace("cas", 'http://www.yale.edu/tp/cas'); - $success = $xPath->query("/cas:serviceResponse/cas:authenticationSuccess/cas:user"); - if ($success->length == 0) { - $failure = $xPath->evaluate("/cas:serviceResponse/cas:authenticationFailure"); - throw new Exception("Error when validating CAS service ticket: " . $failure->item(0)->textContent); - } else { - - $attributes = array(); - if ($casattributes = $this->_casConfig['attributes']) { # some has attributes in the xml - attributes is a list of XPath expressions to get them - foreach ($casattributes as $name => $query) { - $attrs = $xPath->query($query); - foreach ($attrs as $attrvalue) $attributes[$name][] = $attrvalue->textContent; - } - } - $casusername = $success->item(0)->textContent; - - return array($casusername, $attributes); - - } - } - - - /** - * Main validation method, redirects to correct method - * (keeps finalStep clean) - * - * @param string $ticket - * @param string $service - * @return list username and attributes - */ - protected function casValidation($ticket, $service){ - switch($this->_validationMethod){ - case 'validate': - return $this->casValidate($ticket, $service); - break; - case 'serviceValidate': - return $this->casServiceValidate($ticket, $service); - break; - default: - throw new Exception("validate or serviceValidate not specified"); - } - } - - - /** - * Called by linkback, to finish validate/ finish logging in. - * @param state $state - * @return list username, casattributes/ldap attributes - */ - public function finalStep(&$state) { - - - $ticket = $state['cas:ticket']; - $stateID = SimpleSAML_Auth_State::saveState($state, self::STAGE_INIT); - $service = SimpleSAML\Module::getModuleURL('cas/linkback.php', array('stateID' => $stateID)); - list($username, $casattributes) = $this->casValidation($ticket, $service); - $ldapattributes = array(); - if ($this->_ldapConfig['servers']) { - $ldap = new SimpleSAML_Auth_LDAP($this->_ldapConfig['servers'], $this->_ldapConfig['enable_tls']); - $ldapattributes = $ldap->validate($this->_ldapConfig, $username); - } - $attributes = array_merge_recursive($casattributes, $ldapattributes); - $state['Attributes'] = $attributes; - - SimpleSAML_Auth_Source::completeAuth($state); - } - - - /** - * Log-in using cas - * - * @param array &$state Information about the current authentication. - */ - public function authenticate(&$state) { - assert(is_array($state)); - - // We are going to need the authId in order to retrieve this authentication source later - $state[self::AUTHID] = $this->authId; - - $stateID = SimpleSAML_Auth_State::saveState($state, self::STAGE_INIT); - - - - $serviceUrl = SimpleSAML\Module::getModuleURL('cas/linkback.php', array('stateID' => $stateID)); - - \SimpleSAML\Utils\HTTP::redirectTrustedURL($this->_loginMethod, array( - 'service' => $serviceUrl)); - } - - - /** - * Log out from this authentication source. - * - * This function should be overridden if the authentication source requires special - * steps to complete a logout operation. - * - * If the logout process requires a redirect, the state should be saved. Once the - * logout operation is completed, the state should be restored, and completeLogout - * should be called with the state. If this operation can be completed without - * showing the user a page, or redirecting, this function should return. - * - * @param array &$state Information about the current logout operation. - */ - public function logout(&$state) { - assert(is_array($state)); - $logoutUrl = $this->_casConfig['logout']; - - SimpleSAML_Auth_State::deleteState($state); - // we want cas to log us out - \SimpleSAML\Utils\HTTP::redirectTrustedURL($logoutUrl); - } +class sspmod_cas_Auth_Source_CAS extends SimpleSAML_Auth_Source +{ + /** + * The string used to identify our states. + */ + const STAGE_INIT = 'sspmod_cas_Auth_Source_CAS.state'; + + /** + * The key of the AuthId field in the state. + */ + const AUTHID = 'sspmod_cas_Auth_Source_CAS.AuthId'; + + /** + * @var array with ldap configuration + */ + private $_ldapConfig; + + /** + * @var cas configuration + */ + private $_casConfig; + + /** + * @var cas chosen validation method + */ + + private $_validationMethod; + /** + * @var cas login method + */ + private $_loginMethod; + + /** + * Constructor for this authentication source. + * + * @param array $info Information about this authentication source. + * @param array $config Configuration. + */ + public function __construct($info, $config) + { + assert(is_array($info)); + assert(is_array($config)); + + // Call the parent constructor first, as required by the interface + parent::__construct($info, $config); + + if (!array_key_exists('cas', $config)) { + throw new Exception('cas authentication source is not properly configured: missing [cas]'); + } + + if (!array_key_exists('ldap', $config)) { + throw new Exception('ldap authentication source is not properly configured: missing [ldap]'); + } + + $this->_casConfig = $config['cas']; + $this->_ldapConfig = $config['ldap']; + + if (isset($this->_casConfig['serviceValidate'])) { + $this->_validationMethod = 'serviceValidate'; + } elseif(isset($this->_casConfig['validate'])) { + $this->_validationMethod = 'validate'; + } else { + throw new Exception("validate or serviceValidate not specified"); + } + + if (isset($this->_casConfig['login'])) { + $this->_loginMethod = $this->_casConfig['login']; + } else { + throw new Exception("cas login URL not specified"); + } + } + + + /** + * This the most simple version of validating, this provides only authentication validation + * + * @param string $ticket + * @param string $service + * + * @return list username and attributes + */ + private function casValidate($ticket, $service) + { + $url = \SimpleSAML\Utils\HTTP::addURLParameters($this->_casConfig['validate'], array( + 'ticket' => $ticket, + 'service' => $service, + )); + $result = \SimpleSAML\Utils\HTTP::fetch($url); + $res = preg_split("/\r?\n/",$result); + + if (strcmp($res[0], "yes") == 0) { + return array($res[1], array()); + } else { + throw new Exception("Failed to validate CAS service ticket: $ticket"); + } + } + + + /** + * Uses the cas service validate, this provides additional attributes + * + * @param string $ticket + * @param string $service + * + * @return list username and attributes + */ + private function casServiceValidate($ticket, $service) + { + $url = \SimpleSAML\Utils\HTTP::addURLParameters( + $this->_casConfig['serviceValidate'], + array( + 'ticket' => $ticket, + 'service' => $service, + ) + ); + $result = \SimpleSAML\Utils\HTTP::fetch($url); + + $dom = \SAML2\DOMDocumentFactory::fromString($result); + $xPath = new DOMXpath($dom); + $xPath->registerNamespace("cas", 'http://www.yale.edu/tp/cas'); + $success = $xPath->query("/cas:serviceResponse/cas:authenticationSuccess/cas:user"); + if ($success->length == 0) { + $failure = $xPath->evaluate("/cas:serviceResponse/cas:authenticationFailure"); + throw new Exception("Error when validating CAS service ticket: " . $failure->item(0)->textContent); + } else { + $attributes = array(); + if ($casattributes = $this->_casConfig['attributes']) { # some has attributes in the xml - attributes is a list of XPath expressions to get them + foreach ($casattributes as $name => $query) { + $attrs = $xPath->query($query); + foreach ($attrs as $attrvalue) { + $attributes[$name][] = $attrvalue->textContent; + } + } + } + $casusername = $success->item(0)->textContent; + + return array($casusername, $attributes); + } + } + + + /** + * Main validation method, redirects to correct method + * (keeps finalStep clean) + * + * @param string $ticket + * @param string $service + * @return list username and attributes + */ + protected function casValidation($ticket, $service) + { + switch ($this->_validationMethod) + { + case 'validate': + return $this->casValidate($ticket, $service); + break; + case 'serviceValidate': + return $this->casServiceValidate($ticket, $service); + break; + default: + throw new Exception("validate or serviceValidate not specified"); + } + } + + + /** + * Called by linkback, to finish validate/ finish logging in. + * @param state $state + * @return list username, casattributes/ldap attributes + */ + public function finalStep(&$state) + { + $ticket = $state['cas:ticket']; + $stateID = SimpleSAML_Auth_State::saveState($state, self::STAGE_INIT); + $service = SimpleSAML\Module::getModuleURL('cas/linkback.php', array('stateID' => $stateID)); + list($username, $casattributes) = $this->casValidation($ticket, $service); + $ldapattributes = array(); + + if ($this->_ldapConfig['servers']) { + $ldap = new SimpleSAML_Auth_LDAP($this->_ldapConfig['servers'], $this->_ldapConfig['enable_tls']); + $ldapattributes = $ldap->validate($this->_ldapConfig, $username); + } + $attributes = array_merge_recursive($casattributes, $ldapattributes); + $state['Attributes'] = $attributes; + + SimpleSAML_Auth_Source::completeAuth($state); + } + + + /** + * Log-in using cas + * + * @param array &$state Information about the current authentication. + */ + public function authenticate(&$state) + { + assert(is_array($state)); + + // We are going to need the authId in order to retrieve this authentication source later + $state[self::AUTHID] = $this->authId; + + $stateID = SimpleSAML_Auth_State::saveState($state, self::STAGE_INIT); + + $serviceUrl = SimpleSAML\Module::getModuleURL('cas/linkback.php', array('stateID' => $stateID)); + + \SimpleSAML\Utils\HTTP::redirectTrustedURL($this->_loginMethod, array('service' => $serviceUrl)); + } + + + /** + * Log out from this authentication source. + * + * This function should be overridden if the authentication source requires special + * steps to complete a logout operation. + * + * If the logout process requires a redirect, the state should be saved. Once the + * logout operation is completed, the state should be restored, and completeLogout + * should be called with the state. If this operation can be completed without + * showing the user a page, or redirecting, this function should return. + * + * @param array &$state Information about the current logout operation. + */ + public function logout(&$state) + { + assert(is_array($state)); + $logoutUrl = $this->_casConfig['logout']; + + SimpleSAML_Auth_State::deleteState($state); + // we want cas to log us out + \SimpleSAML\Utils\HTTP::redirectTrustedURL($logoutUrl); + } } -- GitLab