| 
<?php
 /**
 * This file implements an script which can be used to authenticate users with Auth MemCookie.
 * See: http://authmemcookie.sourceforge.net/
 *
 * The configuration for this script is stored in config/authmemcookie.php.
 *
 * The file extra/auth_memcookie.conf contains an example of how Auth Memcookie can be configured
 * to use simpleSAMLphp.
 */
 
 require_once('_include.php');
 
 try {
 /* Load simpleSAMLphp configuration. */
 $globalConfig = SimpleSAML_Configuration::getInstance();
 
 /* Check if this module is enabled. */
 if(!$globalConfig->getBoolean('enable.authmemcookie', FALSE)) {
 throw new SimpleSAML_Error_Error('NOACCESS');
 }
 
 /* Load Auth MemCookie configuration. */
 $amc = SimpleSAML_AuthMemCookie::getInstance();
 
 /* Determine the method we should use to authenticate the user and retrieve the attributes. */
 $loginMethod = $amc->getLoginMethod();
 switch($loginMethod) {
 case 'authsource':
 /* The default now. */
 $sourceId = $amc->getAuthSource();
 $s = new SimpleSAML_Auth_Simple($sourceId);
 break;
 case 'saml2':
 $s = new SimpleSAML_Auth_BWC('saml2/sp/initSSO.php', 'saml2');
 break;
 case 'shib13':
 $s = new SimpleSAML_Auth_BWC('shib13/sp/initSSO.php', 'shib13');
 break;
 default:
 /* Should never happen, as the login method is checked in the AuthMemCookie class. */
 throw new Exception('Invalid login method.');
 }
 
 /* Check if the user is authorized. We attempt to authenticate the user if not. */
 $s->requireAuth();
 
 /* Generate session id and save it in a cookie. */
 $sessionID = SimpleSAML_Utilities::generateID();
 
 $cookieName = $amc->getCookieName();
 
 $sessionHandler = SimpleSAML_SessionHandler::getSessionHandler();
 $sessionHandler->setCookie($cookieName, $sessionID);
 
 
 /* Generate the authentication information. */
 
 $attributes = $s->getAttributes();
 
 $authData = array();
 
 /* Username. */
 $usernameAttr = $amc->getUsernameAttr();
 if(!array_key_exists($usernameAttr, $attributes)) {
 throw new Exception('The user doesn\'t have an attribute named \'' . $usernameAttr .
 '\'. This attribute is expected to contain the username.');
 }
 $authData['UserName'] = $attributes[$usernameAttr];
 
 /* Groups. */
 $groupsAttr = $amc->getGroupsAttr();
 if($groupsAttr !== NULL) {
 if(!array_key_exists($groupsAttr, $attributes)) {
 throw new Exception('The user doesn\'t have an attribute named \'' . $groupsAttr .
 '\'. This attribute is expected to contain the groups the user is a member of.');
 }
 $authData['Groups'] = $attributes[$groupsAttr];
 } else {
 $authData['Groups'] = array();
 }
 
 $authData['RemoteIP'] = $_SERVER['REMOTE_ADDR'];
 
 foreach($attributes as $n => $v) {
 $authData['ATTR_' . $n] = $v;
 }
 
 
 /* Store the authentication data in the memcache server. */
 
 $data = '';
 foreach($authData as $n => $v) {
 if(is_array($v)) {
 $v = implode(':', $v);
 }
 
 $data .= $n . '=' . $v . "\r\n";
 }
 
 
 $memcache = $amc->getMemcache();
 $expirationTime = $s->getAuthData('Expire');
 $memcache->set($sessionID, $data, 0, $expirationTime);
 
 /* Register logout handler. */
 $session = SimpleSAML_Session::getSessionFromRequest();
 $session->registerLogoutHandler('SimpleSAML_AuthMemCookie', 'logoutHandler');
 
 /* Redirect the user back to this page to signal that the login is completed. */
 SimpleSAML_Utilities::redirectTrustedURL(SimpleSAML_Utilities::selfURL());
 } catch(Exception $e) {
 throw new SimpleSAML_Error_Error('CONFIG', $e);
 }
 
 |