diff --git a/auth/mnet/auth.php b/auth/mnet/auth.php index b94e92f7900..b352e34b6b0 100644 --- a/auth/mnet/auth.php +++ b/auth/mnet/auth.php @@ -209,39 +209,24 @@ class auth_plugin_mnet extends auth_plugin_base { return $url; } - /** - * after a successful login, land.php will call complete_user_login - * which will in turn regenerate the session id. - * this means that what is stored in mnet_session table needs updating. - * - */ - function update_session_id() { - global $USER, $DB; - return $DB->set_field('mnet_session', 'session_id', session_id(), array('username' => $USER->username, 'mnethostid' => $USER->mnethostid, 'useragent' => sha1($_SERVER['HTTP_USER_AGENT']))); - } - /** * This function confirms the remote (ID provider) host's mnet session * by communicating the token and UA over the XMLRPC transport layer, and * returns the local user record on success. * - * @param string $token The random session token. - * @param string $remotewwwroot The ID provider wwwroot. + * @param string $token The random session token. + * @param mnet_peer $remotepeer The ID provider mnet_peer object. * @return array The local user record. */ - function confirm_mnet_session($token, $remotewwwroot) { + function confirm_mnet_session($token, $remotepeer) { global $CFG, $DB; require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; // verify the remote host is configured locally before attempting RPC call - if (! $remotehost = $DB->get_record('mnet_host', array('wwwroot' => $remotewwwroot, 'deleted' => 0))) { + if (! $remotehost = $DB->get_record('mnet_host', array('wwwroot' => $remotepeer->wwwroot, 'deleted' => 0))) { print_error('notpermittedtoland', 'mnet'); } - // get the originating (ID provider) host info - $remotepeer = new mnet_peer(); - $remotepeer->set_wwwroot($remotewwwroot); - // set up the RPC request $mnetrequest = new mnet_xmlrpc_client(); $mnetrequest->set_method('auth/mnet/auth.php/user_authorise'); @@ -258,7 +243,7 @@ class auth_plugin_mnet extends auth_plugin_base { list($code, $message) = array_map('trim',explode(':', $errormessage, 2)); if($code == 702) { $site = get_site(); - print_error('mnet_session_prohibited', 'mnet', $remotewwwroot, format_string($site->fullname)); + print_error('mnet_session_prohibited', 'mnet', $remotepeer->wwwroot, format_string($site->fullname)); exit; } $message .= "ERROR $code:
$errormessage
"; @@ -302,14 +287,8 @@ class auth_plugin_mnet extends auth_plugin_base { print_error('sso_mnet_login_refused', 'mnet', '', array($localuser->username, $remotehost->name)); } - $session_gc_maxlifetime = 1440; - // update the local user record with remote user data foreach ((array) $remoteuser as $key => $val) { - if ($key == 'session.gc_maxlifetime') { - $session_gc_maxlifetime = $val; - continue; - } // TODO: fetch image if it has changed if ($key == 'imagehash') { @@ -367,27 +346,6 @@ class auth_plugin_mnet extends auth_plugin_base { $DB->update_record('user', $localuser); - // set up the session - $mnet_session = $DB->get_record('mnet_session', - array('userid'=>$localuser->id, 'mnethostid'=>$remotepeer->id, - 'useragent'=>sha1($_SERVER['HTTP_USER_AGENT']))); - if ($mnet_session == false) { - $mnet_session = new object(); - $mnet_session->mnethostid = $remotepeer->id; - $mnet_session->userid = $localuser->id; - $mnet_session->username = $localuser->username; - $mnet_session->useragent = sha1($_SERVER['HTTP_USER_AGENT']); - $mnet_session->token = $token; // Needed to support simultaneous sessions - // and preserving DB rec uniqueness - $mnet_session->confirm_timeout = time(); - $mnet_session->expires = time() + (integer)$session_gc_maxlifetime; - $mnet_session->session_id = session_id(); - $mnet_session->id = $DB->insert_record('mnet_session', $mnet_session); - } else { - $mnet_session->expires = time() + (integer)$session_gc_maxlifetime; - $DB->update_record('mnet_session', $mnet_session); - } - if (!$firsttime) { // repeat customer! let the IDP know about enrolments // we have for this user. @@ -453,6 +411,43 @@ class auth_plugin_mnet extends auth_plugin_base { return $localuser; } + + /** + * creates (or updates) the mnet session once + * {@see confirm_mnet_session} and {@see complete_user_login} have both been called + * + * @param stdclass $user the local user (must exist already + * @param string $token the jump/land token + * @param mnet_peer $remotepeer the mnet_peer object of this users's idp + */ + public function update_mnet_session($user, $token, $remotepeer) { + global $DB; + $session_gc_maxlifetime = 1440; + if (isset($user->session_gc_maxlifetime)) { + $session_gc_maxlifetime = $user->session_gc_maxlifetime; + } + if (!$mnet_session = $DB->get_record('mnet_session', + array('userid'=>$user->id, 'mnethostid'=>$remotepeer->id, + 'useragent'=>sha1($_SERVER['HTTP_USER_AGENT'])))) { + $mnet_session = new object(); + $mnet_session->mnethostid = $remotepeer->id; + $mnet_session->userid = $user->id; + $mnet_session->username = $user->username; + $mnet_session->useragent = sha1($_SERVER['HTTP_USER_AGENT']); + $mnet_session->token = $token; // Needed to support simultaneous sessions + // and preserving DB rec uniqueness + $mnet_session->confirm_timeout = time(); + $mnet_session->expires = time() + (integer)$session_gc_maxlifetime; + $mnet_session->session_id = session_id(); + $mnet_session->id = $DB->insert_record('mnet_session', $mnet_session); + } else { + $mnet_session->expires = time() + (integer)$session_gc_maxlifetime; + $DB->update_record('mnet_session', $mnet_session); + } + } + + + /** * Invoke this function _on_ the IDP to update it with enrolment info local to * the SP right after calling user_authorise() diff --git a/auth/mnet/land.php b/auth/mnet/land.php index c9748f91bb7..1bcd01ea5e0 100644 --- a/auth/mnet/land.php +++ b/auth/mnet/land.php @@ -33,12 +33,16 @@ if (!is_enabled_auth('mnet')) { // confirm the MNET session $mnetauth = get_auth_plugin('mnet'); -$localuser = $mnetauth->confirm_mnet_session($token, $remotewwwroot); +$remotepeer = new mnet_peer(); +$remotepeer->set_wwwroot($remotewwwroot); +// this creates the local user account if necessary, or updates it if it already exists +$localuser = $mnetauth->confirm_mnet_session($token, $remotepeer); // log in $user = get_complete_user_data('id', $localuser->id, $localuser->mnethostid); complete_user_login($user); -$mnetauth->update_session_id(); +// now that we've logged in, set up the mnet session properly +$mnetauth->update_mnet_session($user, $token, $remotepeer); if (!empty($localuser->mnet_foreign_host_array)) { $USER->mnet_foreign_host_array = $localuser->mnet_foreign_host_array;