From 2c23f318ce1318ab6ee38d170955e026c357f134 Mon Sep 17 00:00:00 2001 From: Eric Rasmussen <erasmussen2@unl.edu> Date: Tue, 26 Jan 2010 23:22:53 +0000 Subject: [PATCH] SimpleCAS dir for cas_auth_unl --- plugins/cas_auth_unl/SimpleCAS.php | 274 +++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 plugins/cas_auth_unl/SimpleCAS.php diff --git a/plugins/cas_auth_unl/SimpleCAS.php b/plugins/cas_auth_unl/SimpleCAS.php new file mode 100644 index 00000000..f9002949 --- /dev/null +++ b/plugins/cas_auth_unl/SimpleCAS.php @@ -0,0 +1,274 @@ +<?php +/** + * This is a CAS client authentication library for PHP 5. + * + * <code> + * <?php + * $protocol = new SimpleCAS_Protocol_Version2('login.unl.edu', 443, 'cas'); + * $client = SimpleCAS::client($protocol); + * $client->forceAuthentication(); + * + * if (isset($_GET['logout'])) { + * $client->logout(); + * } + * + * if ($client->isAuthenticated()) { + * echo '<h1>Authentication Successful!</h1>'; + * echo '<p>The user\'s login is '.$client->getUsername().'</p>'; + * echo '<a href="?logout">Logout</a>'; + * } + * </code> + * + * PHP version 5 + * + * @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/ + */ +class SimpleCAS +{ + /** + * Version of the CAS library. + */ + const VERSION = '0.0.1'; + + /** + * Singleton CAS object + * + * @var CAS + */ + static private $_instance; + + /** + * Is user authenticated? + * + * @var bool + */ + private $_authenticated = false; + + /** + * Protocol for the server running the CAS service. + * + * @var SimpleCAS_Protocol + */ + protected $protocol; + + /** + * User's login name if authenticated. + * + * @var string + */ + protected $username; + + /** + * (Optional) alternative service URL to return to after CAS authentication. + * + * @var string + */ + static protected $url; + + /** + * Construct a CAS client object. + * + * @param SimpleCAS_Protocol $protocol Protocol to use for authentication. + */ + private function __construct(SimpleCAS_Protocol $protocol) + { + $this->protocol = $protocol; + + if ($this->protocol instanceof SimpleCAS_SingleSignOut + && isset($_POST)) { + if ($ticket = $this->protocol->validateLogoutRequest($_POST)) { + $this->logout($ticket); + } + } + + if (session_id() == '') { + session_start(); + } + + if (isset($_SESSION['__SIMPLECAS_TICKET'])) { + $this->_authenticated = true; + } + + + if ($this->_authenticated == false + && isset($_GET['ticket'])) { + $this->validateTicket($_GET['ticket']); + } + } + + /** + * Checks a ticket to see if it is valid. + * + * If the CAS server verifies the ticket, a session is created and the user + * is marked as authenticated. + * + * @param string $ticket Ticket from the CAS Server + * + * @return bool + */ + protected function validateTicket($ticket) + { + if ($uid = $this->protocol->validateTicket($ticket, self::getURL())) { + $this->setAuthenticated($uid); + $this->redirect(self::getURL()); + return true; + } else { + return false; + } + } + + /** + * Marks the current session as authenticated. + * + * @param string $uid User name returned by the CAS server. + * + * @return void + */ + protected function setAuthenticated($uid) + { + $_SESSION['__SIMPLECAS_TICKET'] = true; + $_SESSION['__SIMPLECAS_UID'] = $uid; + $this->_authenticated = true; + } + + /** + * Return the authenticated user's login name. + * + * @return string + */ + public function getUsername() + { + return $_SESSION['__SIMPLECAS_UID']; + } + + /** + * Singleton interface, returns CAS object. + * + * @param CAS_Server $server CAS Server object + * + * @return CAS + */ + static public function client(SimpleCAS_Protocol $protocol) + { + if (!isset(self::$_instance)) { + self::$_instance = new self($protocol); + } + + return self::$_instance; + } + + /** + * If client is not authenticated, this will redirecting to login and exit. + * + * Otherwise, return the CAS object. + * + * @return CAS + */ + function forceAuthentication() + { + if (!$this->isAuthenticated()) { + self::redirect($this->protocol->getLoginURL(self::getURL())); + } + return $this; + } + + /** + * Check if this user has been authenticated or not. + * + * @return bool + */ + function isAuthenticated() + { + return $this->_authenticated; + } + + /** + * Destroys session data for this client, redirects to the server logout + * url. + * + * @param string $url URL to provide the client on logout. + * + * @return void + */ + public function logout($url = '') + { + session_destroy(); + if (empty($url)) { + $url = self::getURL(); + } + $this->redirect($this->protocol->getLogoutURL($url)); + } + + /** + * Returns the current URL without CAS affecting parameters. + * + * @return string url + */ + static public function getURL() + { + if (!empty(self::$url)) { + return self::$url; + } + if (isset($_SERVER['HTTPS']) + && !empty($_SERVER['HTTPS']) + && $_SERVER['HTTPS'] == 'on') { + $protocol = 'https'; + } else { + $protocol = 'http'; + } + + $url = $protocol.'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; + + $replacements = array('/\?logout/' => '', + '/&ticket=[^&]*/' => '', + '/\?ticket=[^&;]*/' => '?', + '/\?%26/' => '?', + '/\?&/' => '?', + '/\?$/' => ''); + + $url = preg_replace(array_keys($replacements), + array_values($replacements), $url); + + return $url; + } + + /** + * Set an alternative return URL + * + * @param string $url alternative return URL + * + * @return void + */ + public static function setURL($url) + { + self::$url = $url; + } + + /** + * Send a header to redirect the client to another URL. + * + * @param string $url URL to redirect the client to. + * + * @return void + */ + public static function redirect($url) + { + header("Location: $url"); + exit(); + } + + /** + * Get the version of the CAS library + * + * @return string + */ + static public function getVersion() + { + return self::VERSION; + } +} -- GitLab