From 31415adb56d5611409c4945b22735980998ab1a4 Mon Sep 17 00:00:00 2001 From: Eric Rasmussen <erasmussen2@unl.edu> Date: Tue, 22 Dec 2009 20:24:10 +0000 Subject: [PATCH] clean up the CAS login --- cas_auth/start.php | 405 ++++++++++----------------------------------- 1 file changed, 88 insertions(+), 317 deletions(-) diff --git a/cas_auth/start.php b/cas_auth/start.php index 1ac305f3..160228c9 100644 --- a/cas_auth/start.php +++ b/cas_auth/start.php @@ -4,7 +4,7 @@ * * @package cas_auth * @license http://www.gnu.org/licenses/gpl.html - * @author Xavier Roussel <xavier.roussel@uvsq.fr> + * @author Xavier Roussel <xavier.roussel@uvsq.fr> (Modified for UNL CAS by Eric Rasmussen) * @copyright UVSQ 2008 * @link http://www.uvsq.fr */ @@ -52,8 +52,7 @@ * @param string * @return array Associative array. */ - function formatPostalAddress() - { + function formatPostalAddress() { /* this is a faculty postal address Currently of the form: ### ___ UNL 68588-#### @@ -92,63 +91,53 @@ } return $address; - } + } } // Include main cas lib - include_once 'cas/CAS.php'; - $casInitialized = false; + include_once 'cas/CAS.php'; /** * CAS Authentication init * */ - function cas_auth_init() - { - // global config + function cas_auth_init() { global $CONFIG; // plugin config $config = find_plugin_settings('cas_auth'); // todo : send message to user - if (!$config) return false; - - // CAS auth required - if ( $_REQUEST['loginwith'] == 'UNLlogin' && !isset($_REQUEST['ticket']) ) - { - createCas(); - } - // CAS auth done - if ( $_REQUEST['loginwith'] == 'UNLlogin' && (isset($_REQUEST['ticket']) || isset($_REQUEST['email'])) ) - { - // Check CAS auth the CAS way just in case - if ( checkCas() ) { + if (!$config) + return false; + + if ($_GET['loginwith'] == 'UNLlogin') { + if (checkCas()) { $_SESSION['loggedWithCAS'] = true; $cas_user = getUserCas(); - if(ldapAuthenticate( $cas_user )) { + if (casAuthenticate($cas_user)) { system_message(elgg_echo('loginok')); $cas_user = str_replace('-','_',$cas_user); //user is logged in now, this is the last step - forward based on whether they have logged in before $lastlogin_date = $_SESSION['user']->last_login; - if (!$lastlogin_date){ + if (!$lastlogin_date) { forward('mod/profile/edit.php?firstlogin=yes'); } forward("pg/profile/unl_" . $cas_user); + } else { + register_error(elgg_echo('loginerror')); } - else register_error(elgg_echo('loginerror')); + } else { + createCas(); } - else register_error(elgg_echo('loginerror')); } + // The CAS ticket is lost, log out - if ( $_SESSION['loggedWithCAS'] && !checkCas() ) { + if ($_SESSION['loggedWithCAS'] && !checkCas()) { $_SESSION['loggedWithCAS'] = false; forward($CONFIG->url.'/action/logout'); - } - - - + } } @@ -157,10 +146,9 @@ // Register the initialisation function register_elgg_event_handler('init','system','cas_auth_init'); // Register CAS logout to main logout only if user logged with CAS - if (isset($_SESSION['loggedWithCAS']) && $_SESSION['loggedWithCAS']===true) { + if (isset($_SESSION['loggedWithCAS']) && $_SESSION['loggedWithCAS']==true) { register_elgg_event_handler('logout', 'user', 'logoutCas'); - } - + } /* set up login page */ register_page_handler('login', 'login_page_handler'); @@ -175,7 +163,6 @@ } } - /** * CAS client initialization * @@ -186,6 +173,7 @@ phpCAS::client(CAS_VERSION_2_0, $config->casurl, (int) $config->casport , $config->casuri ); $GLOBALS[casInitialized] = true; } + return true; } /** @@ -195,6 +183,7 @@ function createCas() { initCas(); phpCAS::forceAuthentication(); + return true; } /** @@ -207,7 +196,8 @@ if (phpCAS::checkAuthentication()) { return true; } - else return false; + else + return false; } /** @@ -227,307 +217,88 @@ global $CONFIG; initCas(); phpCAS::logout($CONFIG->url.'/action/logout'); + return true; } - - - /** - * LDAP authentication - * - * @param string $username Go around PAM handler credentials (CAS can't return a password) - * @return boolean - */ - function ldapAuthenticate($username) - { - // Nothing to do if LDAP module not installed -// if (!function_exists('ldap_connect')) { -// return false; -// } - - // Get configuration settings -// $config = find_plugin_settings('ldap_auth'); - // Nothing to do if not configured -// if (!$config) -// { -// return false; -// } - - if (empty($username)) { + /** + * Perform an CAS authentication check + * + * @param string $username + * @return boolean + */ + function casAuthenticate($username){ + if (empty($username)) return false; - } - - // Perform the authentication - return ldapCheck(/*$config, */$username); - } - - /** - * Perform an LDAP authentication check - * - * @param ElggPlugin $config - * @param string $username - * @return boolean - */ - function ldapCheck(/*$config, */$username) - { -/* $host = $config->hostname; - - // No point continuing - if(empty($host)) - { - error_log("LDAP error: no host configured."); - return; - } - $port = $config->port; - $version = $config->version; - $basedn = $config->basedn; - $filter_attr = $config->filter_attr; - $search_attr = $config->search_attr; - $bind_dn = $config->ldap_bind_dn; - $bind_pwd = $config->ldap_bind_pwd; - $user_create = $config->user_create; - $start_tls = $config->start_tls; - - ($user_create == 'on') ? $user_create = true : $user_create = false; - ($start_tls == 'on') ? $start_tls = true : $start_tls = false; - - $port ? $port : $port = 389; - $version ? $version : $version = 3; - $filter_attr ? $filter_attr : $filter_attr = 'uid'; - $basedn ? $basedn = array_map('trim', explode(':', $basedn)) : $basedn = array(); - - if (!empty($search_attr)) - { - // $search_attr as in "email:email_address, name:name_name"; - $pairs = array_map('trim',explode(',', $search_attr)); + // we're making this copy for use in the peoplefinderservices call later + // we dont want to call peoplefinderservices here since we dont need to every time a SSO user logs in + $casusername = $username; + + //We're going to make every UNL SSO user have an elgg profile name as such: unl_erasmussen2 + //and not allow friends of unl who register via elgg to pick names that begin with "unl_" + //This way, we won't have to deal with the case where someone registers erasmussen2 on elgg, then + //the real erasmussen2 signs in for the first time with UNL SSO and is logged in as the elgg user erasmussen2 + //rather then having a new account created. + $username = 'unl_' . $username; + //Replace the hyphen in a student's name with an underscore + $username = str_replace('-','_',$username); - $values = array(); + + if ($user = get_user_by_username($username)) { + // User exists, login + return login($user); + } else { + // Valid login but user doesn't exist + $pf_user_info = peoplefinderServices($casusername); - foreach ($pairs as $pair) - { - $parts = array_map('trim', explode(':', $pair)); + $name = $pf_user_info->cn; - $values[$parts[0]] = $parts[1]; + if (isset($_REQUEST['email'])) { + $email = $_REQUEST['email']; + } else { + if($pf_user_info->mail) + forward($CONFIG->url . 'mod/cas_auth/views/default/account/getemail.php?e=' . $pf_user_info->mail); + else + forward($CONFIG->url . 'mod/cas_auth/views/default/account/getemail.php'); } - - $search_attr = $values; - } - else - { - $search_attr = array('dn' => 'dn'); - } -*/ -/* // Create a connection - if ($ds = ldapConnect($host, $port, $version, $bind_dn, $bind_pwd)) - { - if ($start_tls and !ldap_start_tls($ds)) return false; - - // Perform a search - foreach ($basedn as $this_ldap_basedn) - { - $ldap_user_info = ldapDoAuth($ds, $this_ldap_basedn, $username, $filter_attr, $search_attr); - - if($ldap_user_info) - { -*/ - - // we're making this copy for use in the peoplefinderservices call later - // we dont want to call peoplefinderservices here since we dont need to every time a SSO user logs in - $casusername = $username; - - //We're going to make every UNL SSO user have an elgg profile name as such: unl_erasmussen2 - //and not allow friends of unl who register via elgg to pick names that begin with "unl_" - //This way, we won't have to deal with the case where someone registers erasmussen2 on elgg, then - //the real erasmussen2 signs in for the first time with UNL SSO and is logged in as the elgg user erasmussen2 - //rather then having a new account created. - $username = 'unl_' . $username; - //Replace the hyphen in a student's name with an underscore - $username = str_replace('-','_',$username); - + + try { + if ($user_guid = register_user($username, 'generic', $name, $email, false, 0, '', true)) { + $thisuser = get_user($user_guid); - if ($user = get_user_by_username($username)) - { - // User exists, login - return login($user); + //pre-populate profile fields with data from Peoplefinder Services + $address = $pf_user_info->formatPostalAddress(); + $thisuser->profile_country = 'USA'; + $thisuser->profile_state = $address['region']; + $thisuser->profile_city = $address['locality']; + if($address['locality'] == 'Omaha') { + $thisuser->longitude = -95.9; + $thisuser->latitude = 41.25; + } else { //this is going to cover Lincoln and everyone else + $thisuser->longitude = -96.7; + $thisuser->latitude = 40.82; } - else - { - // Valid login but user doesn't exist - $pf_user_info = peoplefinderServices($casusername); - - //if ($user_create) - //{ - // $name = $ldap_user_info['firstname']; - $name = $pf_user_info->cn; - - // if (isset($ldap_user_info['lastname'])) - // { - // $name = $name . " " . $ldap_user_info['lastname']; - // } - - // - /* if(!empty($pf_user_info->mail)) - { - ($pf_user_info->mail) ? $email = $pf_user_info->mail : $email = null; - } - else*/ if( isset($_REQUEST['email']) ){ - $email = $_REQUEST['email']; - } - else - { - if($pf_user_info->mail) - forward($CONFIG->url . 'mod/cas_auth/views/default/account/getemail.php?e=' . $pf_user_info->mail); - else - forward($CONFIG->url . 'mod/cas_auth/views/default/account/getemail.php'); - } - - /* if ($user_guid = register_user($username, 'generic', $name, $email, false, 0, '', true)) - { - // Success, credentials valid and account has been created - return login(get_user($user_guid)); - } - else - { - register_error(elgg_echo("registerbad")); - return false; - } - */ - - - try { - if ($user_guid = register_user($username, 'generic', $name, $email, false, 0, '', true)) - { - $thisuser = get_user($user_guid); - - //pre-populate profile fields with data from Peoplefinder Services - $address = $pf_user_info->formatPostalAddress(); - $thisuser->profile_country = 'USA'; - $thisuser->profile_state = $address['region']; - $thisuser->profile_city = $address['locality']; - if($address['locality'] == 'Omaha') { - $thisuser->longitude = -95.9; - $thisuser->latitude = 41.25; - } else { //this is going to cover Lincoln and everyone else - $thisuser->longitude = -96.7; - $thisuser->latitude = 40.82; - } - - - return login($thisuser); - } else { - register_error(elgg_echo("registerbad")); - } - } catch (RegistrationException $r) { - register_error($r->getMessage()); - } - //} - //else - //{ - // register_error(elgg_echo("ldap_auth:no_account")); - // return false; - //} - } -/* } - } - // Close the connection - ldap_close($ds); - return false; - } - else - { - return false; - } -*/ } - - /** - * Create an LDAP connection - * - * @param string $host - * @param int $port - * @param int $version - * @param string $bind_dn - * @param string $bind_pwd - * @return mixed LDAP link identifier on success, or false on error - */ -/* function ldapConnect($host, $port, $version, $bind_dn, $bind_pwd) - { - $ds = @ldap_connect($host, $port); - - @ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, $version); - // Start the LDAP bind process - $ldapbind = null; - - if ($ds) - { - if ($bind_dn != '') - { - $ldapbind = @ldap_bind($ds, $bind_dn, $bind_pwd); - } - else - { - // Anonymous bind - $ldapbind = @ldap_bind($ds); + + return login($thisuser); + } else { + register_error(elgg_echo("registerbad")); + } + } catch (RegistrationException $r) { + register_error($r->getMessage()); } + } - else - { - // Unable to connect - error_log('Unable to connect to the LDAP server: '.ldap_error($ds)); - return false; - } - - if (!$ldapbind) - { - error_log('Unable to bind to the LDAP server with provided credentials: '.ldap_error($ds)); - ldap_close($ds); - return false; - } - return $ds; - } -*/ - /** - * Performs actual LDAP authentication - * - * @param object $ds LDAP link identifier - * @param string $basedn - * @param string $username - * @param string $filter_attr - * @param string $search_attr - * @return mixed array with search attributes or false on error - */ -/* function ldapDoAuth($ds, $basedn, $username, $filter_attr, $search_attr) - { - $sr = @ldap_search($ds, $basedn, $filter_attr ."=". $username, array_values($search_attr)); - if(!$sr) - { - error_log('Unable to perform LDAP search: '.ldap_error($ds)); - return false; - } - - $entry = ldap_get_entries($ds, $sr); - if(!$entry or !$entry[0]) - { - return false; // didn't find username - } - - // We have a bind, a valid login - foreach (array_keys($search_attr) as $attr) - { - $ldap_user_info[$attr] = $entry[0][$search_attr[$attr]][0]; - } - return $ldap_user_info; - } -*/ + + } + /** * Gets a UNL SSO user's info from Peoplefinder Services * * @param string $username * @return array of information from PF Services */ - function peoplefinderServices($username) - { + function peoplefinderServices($username){ $pfrecord = unserialize(file_get_contents('http://peoplefinder.unl.edu/service.php?uid=' . $username . '&format=php')); - return $pfrecord; } ?> \ No newline at end of file -- GitLab