diff --git a/auth/shibboleth/login.php b/auth/shibboleth/login.php index d27c1179065..a974adf5d9b 100644 --- a/auth/shibboleth/login.php +++ b/auth/shibboleth/login.php @@ -38,7 +38,7 @@ httpsrequired(); $loginurl = (!empty($CFG->alternateloginurl)) ? $CFG->alternateloginurl : ''; - if (get_moodle_cookie() == '') { + if (get_moodle_cookie() == '') { set_moodle_cookie('nobody'); // To help search for cookies } diff --git a/blocks/login/block_login.php b/blocks/login/block_login.php index 6152507c83f..8d924e885fc 100644 --- a/blocks/login/block_login.php +++ b/blocks/login/block_login.php @@ -36,7 +36,7 @@ class block_login extends block_base { // TODO: now that we have multiauth it is hard to find out if there is a way to change password $forgot = $wwwroot . '/login/forgot_password.php'; - $username = $SESSION->get_moodle_cookie() === 'nobody' ? '' : $SESSION->get_moodle_cookie(); + $username = get_moodle_cookie() === 'nobody' ? '' : get_moodle_cookie(); $this->content->footer = ''; $this->content->text = ''; diff --git a/index.php b/index.php index 351c584b22f..2e6c363fbd9 100644 --- a/index.php +++ b/index.php @@ -85,8 +85,8 @@ } - if ($SESSION->get_moodle_cookie() == '') { - $SESSION->set_moodle_cookie('nobody'); // To help search for cookies on login page + if (get_moodle_cookie() == '') { + set_moodle_cookie('nobody'); // To help search for cookies on login page } if (!empty($USER->id)) { diff --git a/lib/filelib.php b/lib/filelib.php index 972498d5f25..52bac5755a4 100644 --- a/lib/filelib.php +++ b/lib/filelib.php @@ -1037,7 +1037,7 @@ function send_file($path, $filename, $lifetime = 'default' , $filter=0, $pathiss //cookieless mode - rewrite links @header('Content-Type: text/html'); $path = $pathisstring ? $path : implode('', file($path)); - $path = $SESSION->sid_ob_rewrite($path); + $path = sid_ob_rewrite($path); $filesize = strlen($path); $pathisstring = true; } else if ($mimetype == 'text/plain') { @@ -1063,7 +1063,7 @@ function send_file($path, $filename, $lifetime = 'default' , $filter=0, $pathiss $output = format_text($text, FORMAT_HTML, $options, $COURSE->id); if (!empty($CFG->usesid) && empty($_COOKIE['MoodleSession'.$CFG->sessioncookie])) { //cookieless mode - rewrite links - $output = $SESSION->sid_ob_rewrite($output); + $output = sid_ob_rewrite($output); } @header('Content-Length: '.strlen($output)); @@ -1079,7 +1079,7 @@ function send_file($path, $filename, $lifetime = 'default' , $filter=0, $pathiss $output = '
'. format_text($text, FORMAT_MOODLE, $options, $COURSE->id) .''; if (!empty($CFG->usesid) && empty($_COOKIE['MoodleSession'.$CFG->sessioncookie])) { //cookieless mode - rewrite links - $output = $SESSION->sid_ob_rewrite($output); + $output = sid_ob_rewrite($output); } @header('Content-Length: '.strlen($output)); @@ -1224,7 +1224,7 @@ function send_stored_file($stored_file, $lifetime=86400 , $filter=0, $forcedownl //cookieless mode - rewrite links @header('Content-Type: text/html'); $text = $stored_file->get_content(); - $text = $SESSION->sid_ob_rewrite($text); + $text = sid_ob_rewrite($text); $filesize = strlen($text); $filtered = true; } else if ($mimetype == 'text/plain') { @@ -1250,7 +1250,7 @@ function send_stored_file($stored_file, $lifetime=86400 , $filter=0, $forcedownl $output = format_text($text, FORMAT_HTML, $options, $COURSE->id); if (!empty($CFG->usesid) && empty($_COOKIE['MoodleSession'.$CFG->sessioncookie])) { //cookieless mode - rewrite links - $output = $SESSION->sid_ob_rewrite($output); + $output = sid_ob_rewrite($output); } @header('Content-Length: '.strlen($output)); @@ -1266,7 +1266,7 @@ function send_stored_file($stored_file, $lifetime=86400 , $filter=0, $forcedownl $output = '
'. format_text($text, FORMAT_MOODLE, $options, $COURSE->id) .''; if (!empty($CFG->usesid) && empty($_COOKIE['MoodleSession'.$CFG->sessioncookie])) { //cookieless mode - rewrite links - $output = $SESSION->sid_ob_rewrite($output); + $output = sid_ob_rewrite($output); } @header('Content-Length: '.strlen($output)); diff --git a/lib/moodlelib.php b/lib/moodlelib.php index c2e01cec690..f8dea4c536b 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -1827,55 +1827,6 @@ function dayofweek($day, $month, $year) { /// USER AUTHENTICATION AND LOGIN //////////////////////////////////////// -/** - * Makes sure that $USER->sesskey exists, if $USER itself exists. It sets a new sesskey - * if one does not already exist, but does not overwrite existing sesskeys. Returns the - * sesskey string if $USER exists, or boolean false if not. - * - * @uses $USER - * @return string - */ -function sesskey() { - global $USER; - - if(!isset($USER)) { - return false; - } - - if (empty($USER->sesskey)) { - $USER->sesskey = random_string(10); - } - - return $USER->sesskey; -} - - -/** - * For security purposes, this function will check that the currently - * given sesskey (passed as a parameter to the script or this function) - * matches that of the current user. - * - * @param string $sesskey optionally provided sesskey - * @return bool - */ -function confirm_sesskey($sesskey=NULL) { - global $USER; - - if (!empty($USER->ignoresesskey) || !empty($CFG->ignoresesskey)) { - return true; - } - - if (empty($sesskey)) { - $sesskey = required_param('sesskey', PARAM_RAW); // Check script parameters - } - - if (!isset($USER->sesskey)) { - return false; - } - - return ($USER->sesskey === $sesskey); -} - /** * Setup all global $CFG course variables, set locale and also themes * This function can be used on pages that do not require login instead of require_login() @@ -2202,7 +2153,7 @@ function require_logout() { } } - $SESSION->terminate(); + get_session()->terminate(); } /** @@ -3205,12 +3156,12 @@ function complete_user_login($user) { update_user_login_times(); if (empty($CFG->nolastloggedin)) { - $SESSION->set_moodle_cookie($USER->username); + set_moodle_cookie($USER->username); } else { // do not store last logged in user in cookie // auth plugins can temporarily override this from loginpage_hook() // do not save $CFG->nolastloggedin in database! - $SESSION->set_moodle_cookie('nobody'); + set_moodle_cookie('nobody'); } set_login_session_preferences(); diff --git a/lib/sessionlib.php b/lib/sessionlib.php index 8e34ef54202..577608f3810 100644 --- a/lib/sessionlib.php +++ b/lib/sessionlib.php @@ -1,158 +1,81 @@ prepare_cookies(); $this->init_session_storage(); if (!empty($CFG->usesid) && empty($_COOKIE['MoodleSession'.$CFG->sessioncookie])) { - $this->sid_start_ob(); + sid_start_ob(); } - if (!NO_MOODLE_COOKIES) { + if (NO_MOODLE_COOKIES) { + $_SESSION = array(); + $_SESSION['SESSION'] = new object(); + $_SESSION['USER'] = new object(); + + } else { session_name('MoodleSession'.$CFG->sessioncookie); session_set_cookie_params(0, $CFG->sessioncookiepath, $CFG->sessioncookiedomain, $CFG->cookiesecure, $CFG->cookiehttponly); @session_start(); if (!isset($_SESSION['SESSION'])) { $_SESSION['SESSION'] = new object(); - $_SESSION['SESSION']->session_test = random_string(10); - if (!empty($_COOKIE['MoodleSessionTest'.$CFG->sessioncookie])) { - $_SESSION['SESSION']->has_timed_out = true; - } - setcookie('MoodleSessionTest'.$CFG->sessioncookie, $_SESSION['SESSION']->session_test, 0, $CFG->sessioncookiepath, $CFG->sessioncookiedomain, $CFG->cookiesecure, $CFG->cookiehttponly); - $_COOKIE['MoodleSessionTest'.$CFG->sessioncookie] = $_SESSION['SESSION']->session_test; } if (!isset($_SESSION['USER'])) { $_SESSION['USER'] = new object(); } - - if (!isset($_SESSION['USER']->id)) { - $_SESSION['USER']->id = 0; // to enable proper function of $CFG->notloggedinroleid hack - if (isset($CFG->mnet_localhost_id)) { - $_SESSION['USER']->mnethostid = $CFG->mnet_localhost_id; - } - } - - $this->session = null; - - } else { - $this->session = new object(); } - } - /** - * Verify session, this detects problems with "switched" sessions - * or multiple different wwwroot used at the same time. - */ - public function session_verify() { - global $CFG; - - /// disable checks when working in cookieless mode - if (empty($CFG->usesid) || !empty($_COOKIE['MoodleSession'.$CFG->sessioncookie])) { - if ($this->session != NULL) { - if (empty($_COOKIE['MoodleSessionTest'.$CFG->sessioncookie])) { - $this->report_session_error(); - } else if (isset($this->session->session_test) && $_COOKIE['MoodleSessionTest'.$CFG->sessioncookie] != $this->session->session_test) { - $this->report_session_error(); - } + if (!isset($_SESSION['USER']->id)) { + $_SESSION['USER']->id = 0; // to enable proper function of $CFG->notloggedinroleid hack + if (isset($CFG->mnet_localhost_id)) { + $_SESSION['USER']->mnethostid = $CFG->mnet_localhost_id; } } } - /** - * Report serious problem detected in suer session - */ - function report_session_error() { - global $CFG, $FULLME; - - if (empty($CFG->lang)) { - $CFG->lang = "en"; - } - // Set up default theme and locale - theme_setup(); - moodle_setlocale(); - - //clear session cookies - setcookie('MoodleSession'.$CFG->sessioncookie, '', time() - 3600, $CFG->sessioncookiepath, $CFG->sessioncookiedomain, $CFG->cookiesecure, $CFG->cookiehttponly); - setcookie('MoodleSessionTest'.$CFG->sessioncookie, '', time() - 3600, $CFG->sessioncookiepath, $CFG->sessioncookiedomain, $CFG->cookiesecure, $CFG->cookiehttponly); - - //increment database error counters - if (isset($CFG->session_error_counter)) { - set_config('session_error_counter', 1 + $CFG->session_error_counter); - } else { - set_config('session_error_counter', 1); - } - redirect($FULLME, get_string('sessionerroruser2', 'error'), 5); - } - /** * Terminates active moodle session */ public function terminate() { global $CFG, $SESSION, $USER; - // Initialize variable to pass-by-reference to headers_sent(&$file, &$line) - $file = null; - $line = null; - if (headers_sent($file, $line)) { - error_log('MoodleSessionTest cookie could not be set in moodlelib.php:'.__LINE__); - error_log('Headers were already sent in file: '.$file.' on line '.$line); - } else { - setcookie('MoodleSessionTest'.$CFG->sessioncookie, '', time() - 3600, $CFG->sessioncookiepath, $CFG->sessioncookiedomain, $CFG->cookiesecure, $CFG->cookiehttponly); - } - - $this->session = new object(); - $_SESSION = array(); + $_SESSION = array(); + $SESSION = new object(); $USER = new object(); $USER->id = 0; if (isset($CFG->mnet_localhost_id)) { $USER->mnethostid = $CFG->mnet_localhost_id; } + // Initialize variable to pass-by-reference to headers_sent(&$file, &$line) + $file = null; + $line = null; + if (headers_sent($file, $line)) { + error_log('Can not terminate session properly - headers were already sent in file: '.$file.' on line '.$line); + } else { + // TODO: regenerate session ID here + + } + @session_write_close(); } - - public function __set($name, $value) { - if (!is_null($this->session)) { - $this->session->{$name} = $value; - } else { - $_SESSION['SESSION']->{$name} = $value; - } - } - - public function &__get($name) { // this is a weird hack for this stupid bug http://bugs.php.net/bug.php?id=39449 - if (!is_null($this->session)) { - return $this->session->{$name}; - } else { - return $_SESSION['SESSION']->{$name}; - } - } - - public function __isset($name) { - if (!is_null($this->session)) { - return isset($this->session->{$name}); - } else { - return isset($_SESSION['SESSION']->{$name}); - } - } - - public function __unset($name) { - if (!is_null($this->session)) { - unset($this->session->{$name}); - } else { - unset($_SESSION['SESSION']->{$name}); - } - } - /** * Prepare cookies and varions system settings */ @@ -199,9 +122,6 @@ class moodle_session { if (!empty($_COOKIE['MoodleSession'.$CFG->sessioncookie]) && $_COOKIE['MoodleSession'.$CFG->sessioncookie] == "deleted") { unset($_COOKIE['MoodleSession'.$CFG->sessioncookie]); } - if (!empty($_COOKIE['MoodleSessionTest'.$CFG->sessioncookie]) && $_COOKIE['MoodleSessionTest'.$CFG->sessioncookie] == "deleted") { - unset($_COOKIE['MoodleSessionTest'.$CFG->sessioncookie]); - } } /** @@ -234,185 +154,235 @@ class moodle_session { } } } +} - /** - * Sets a moodle cookie with a weakly encrypted string - * - * @uses $CFG - * @uses DAYSECS - * @uses HOURSECS - * @param string $thing The string to encrypt and place in a cookie - */ - public static function set_moodle_cookie($thing) { - global $CFG; +/** + * Makes sure that $USER->sesskey exists, if $USER itself exists. It sets a new sesskey + * if one does not already exist, but does not overwrite existing sesskeys. Returns the + * sesskey string if $USER exists, or boolean false if not. + * + * @uses $USER + * @return string + */ +function sesskey() { + global $USER; - if ($thing == 'guest') { // Ignore guest account - return; - } - - $cookiename = 'MOODLEID_'.$CFG->sessioncookie; - - $days = 60; - $seconds = DAYSECS*$days; - - // no need to set secure or http cookie only here - it is not secret - setcookie($cookiename, '', time() - HOURSECS, $CFG->sessioncookiepath, $CFG->sessioncookiedomain); - setcookie($cookiename, rc4encrypt($thing), time()+$seconds, $CFG->sessioncookiepath, $CFG->sessioncookiedomain); + if(!isset($USER)) { + return false; } - /** - * Gets a moodle cookie with a weakly encrypted string - * - * @uses $CFG - * @return string - */ - public static function get_moodle_cookie() { - global $CFG; - - $cookiename = 'MOODLEID_'.$CFG->sessioncookie; - - if (empty($_COOKIE[$cookiename])) { - return ''; - } else { - $thing = rc4decrypt($_COOKIE[$cookiename]); - return ($thing == 'guest') ? '': $thing; // Ignore guest account - } + if (empty($USER->sesskey)) { + $USER->sesskey = random_string(10); } - /** - * Enable cookieless sessions by including $CFG->usesid=true; - * in config.php. - * Based on code from php manual by Richard at postamble.co.uk - * Attempts to use cookies if cookies not present then uses session ids attached to all urls and forms to pass session id from page to page. - * If site is open to google, google is given guest access as usual and there are no sessions. No session ids will be attached to urls for googlebot. - * This doesn't require trans_sid to be turned on but this is recommended for better performance - * you should put : - * session.use_trans_sid = 1 - * in your php.ini file and make sure that you don't have a line like this in your php.ini - * session.use_only_cookies = 1 - * @author Richard at postamble.co.uk and Jamie Pratt - * @license http://www.gnu.org/copyleft/gpl.html GNU Public License - */ - /** - * You won't call this function directly. This function is used to process - * text buffered by php in an output buffer. All output is run through this function - * before it is ouput. - * @param string $buffer is the output sent from php - * @return string the output sent to the browser - */ - public static function sid_ob_rewrite($buffer){ - $replacements = array( - '/(<\s*(a|link|script|frame|area)\s[^>]*(href|src)\s*=\s*")([^"]*)(")/i', - '/(<\s*(a|link|script|frame|area)\s[^>]*(href|src)\s*=\s*\')([^\']*)(\')/i'); + return $USER->sesskey; +} - $buffer = preg_replace_callback($replacements, array('moodle_session', 'sid_rewrite_link_tag'), $buffer); - $buffer = preg_replace('/