| 1 | efrain | 1 | <?php
 | 
        
           |  |  | 2 | // This file is part of Moodle - http://moodle.org/
 | 
        
           |  |  | 3 | //
 | 
        
           |  |  | 4 | // Moodle is free software: you can redistribute it and/or modify
 | 
        
           |  |  | 5 | // it under the terms of the GNU General Public License as published by
 | 
        
           |  |  | 6 | // the Free Software Foundation, either version 3 of the License, or
 | 
        
           |  |  | 7 | // (at your option) any later version.
 | 
        
           |  |  | 8 | //
 | 
        
           |  |  | 9 | // Moodle is distributed in the hope that it will be useful,
 | 
        
           |  |  | 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
        
           |  |  | 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
        
           |  |  | 12 | // GNU General Public License for more details.
 | 
        
           |  |  | 13 | //
 | 
        
           |  |  | 14 | // You should have received a copy of the GNU General Public License
 | 
        
           |  |  | 15 | // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 | 
        
           |  |  | 16 |   | 
        
           |  |  | 17 | /**
 | 
        
           |  |  | 18 |  * @package    core
 | 
        
           |  |  | 19 |  * @subpackage session
 | 
        
           |  |  | 20 |  * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
 | 
        
           |  |  | 21 |  * @copyright  2008, 2009 Petr Skoda  {@link http://skodak.org}
 | 
        
           |  |  | 22 |  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 | 
        
           |  |  | 23 |  */
 | 
        
           |  |  | 24 |   | 
        
           |  |  | 25 | defined('MOODLE_INTERNAL') || die();
 | 
        
           |  |  | 26 |   | 
        
           |  |  | 27 |   | 
        
           |  |  | 28 | /**
 | 
        
           |  |  | 29 |  * Makes sure that $USER->sesskey exists, if $USER itself exists. It sets a new sesskey
 | 
        
           |  |  | 30 |  * if one does not already exist, but does not overwrite existing sesskeys. Returns the
 | 
        
           |  |  | 31 |  * sesskey string if $USER exists, or boolean false if not.
 | 
        
           |  |  | 32 |  *
 | 
        
           |  |  | 33 |  * @uses $USER
 | 
        
           |  |  | 34 |  * @return string
 | 
        
           |  |  | 35 |  */
 | 
        
           |  |  | 36 | function sesskey() {
 | 
        
           |  |  | 37 |     // note: do not use $USER because it may not be initialised yet
 | 
        
           |  |  | 38 |     if (empty($_SESSION['USER']->sesskey)) {
 | 
        
           |  |  | 39 |         if (!isset($_SESSION['USER'])) {
 | 
        
           |  |  | 40 |             // This should never happen,
 | 
        
           |  |  | 41 |             // do not mess with session and globals here,
 | 
        
           |  |  | 42 |             // let any checks fail instead!
 | 
        
           |  |  | 43 |             return false;
 | 
        
           |  |  | 44 |         }
 | 
        
           |  |  | 45 |         $_SESSION['USER']->sesskey = random_string(10);
 | 
        
           |  |  | 46 |     }
 | 
        
           |  |  | 47 |   | 
        
           |  |  | 48 |     return $_SESSION['USER']->sesskey;
 | 
        
           |  |  | 49 | }
 | 
        
           |  |  | 50 |   | 
        
           |  |  | 51 |   | 
        
           |  |  | 52 | /**
 | 
        
           |  |  | 53 |  * Check the sesskey and return true of false for whether it is valid.
 | 
        
           |  |  | 54 |  * (You might like to imagine this function is called sesskey_is_valid().)
 | 
        
           |  |  | 55 |  *
 | 
        
           |  |  | 56 |  * Every script that lets the user perform a significant action (that is,
 | 
        
           |  |  | 57 |  * changes data in the database) should check the sesskey before doing the action.
 | 
        
           |  |  | 58 |  * Depending on your code flow, you may want to use the {@link require_sesskey()}
 | 
        
           |  |  | 59 |  * helper function.
 | 
        
           |  |  | 60 |  *
 | 
        
           |  |  | 61 |  * @param string $sesskey The sesskey value to check (optional). Normally leave this blank
 | 
        
           |  |  | 62 |  *      and this function will do required_param('sesskey', ...).
 | 
        
           |  |  | 63 |  * @return bool whether the sesskey sent in the request matches the one stored in the session.
 | 
        
           |  |  | 64 |  */
 | 
        
           |  |  | 65 | function confirm_sesskey($sesskey=NULL) {
 | 
        
           |  |  | 66 |     global $USER;
 | 
        
           |  |  | 67 |   | 
        
           |  |  | 68 |     if (!empty($USER->ignoresesskey)) {
 | 
        
           |  |  | 69 |         return true;
 | 
        
           |  |  | 70 |     }
 | 
        
           |  |  | 71 |   | 
        
           |  |  | 72 |     if (empty($sesskey)) {
 | 
        
           |  |  | 73 |         $sesskey = required_param('sesskey', PARAM_RAW);  // Check script parameters
 | 
        
           |  |  | 74 |     }
 | 
        
           |  |  | 75 |   | 
        
           |  |  | 76 |     return (sesskey() === $sesskey);
 | 
        
           |  |  | 77 | }
 | 
        
           |  |  | 78 |   | 
        
           |  |  | 79 | /**
 | 
        
           |  |  | 80 |  * Check the session key using {@link confirm_sesskey()},
 | 
        
           |  |  | 81 |  * and cause a fatal error if it does not match.
 | 
        
           |  |  | 82 |  */
 | 
        
           |  |  | 83 | function require_sesskey() {
 | 
        
           |  |  | 84 |     if (!confirm_sesskey()) {
 | 
        
           |  |  | 85 |         throw new \moodle_exception('invalidsesskey');
 | 
        
           |  |  | 86 |     }
 | 
        
           |  |  | 87 | }
 | 
        
           |  |  | 88 |   | 
        
           |  |  | 89 | /**
 | 
        
           |  |  | 90 |  * Determine wether the secure flag should be set on cookies
 | 
        
           |  |  | 91 |  * @return bool
 | 
        
           |  |  | 92 |  */
 | 
        
           |  |  | 93 | function is_moodle_cookie_secure() {
 | 
        
           |  |  | 94 |     global $CFG;
 | 
        
           |  |  | 95 |   | 
        
           |  |  | 96 |     if (!isset($CFG->cookiesecure)) {
 | 
        
           |  |  | 97 |         return false;
 | 
        
           |  |  | 98 |     }
 | 
        
           |  |  | 99 |     if (!is_https() and empty($CFG->sslproxy)) {
 | 
        
           |  |  | 100 |         return false;
 | 
        
           |  |  | 101 |     }
 | 
        
           |  |  | 102 |     return !empty($CFG->cookiesecure);
 | 
        
           |  |  | 103 | }
 | 
        
           |  |  | 104 |   | 
        
           |  |  | 105 | /**
 | 
        
           |  |  | 106 |  * Sets a moodle cookie with a weakly encrypted username
 | 
        
           |  |  | 107 |  *
 | 
        
           |  |  | 108 |  * @param string $username to encrypt and place in a cookie, '' means delete current cookie
 | 
        
           |  |  | 109 |  * @return void
 | 
        
           |  |  | 110 |  */
 | 
        
           |  |  | 111 | function set_moodle_cookie($username) {
 | 
        
           |  |  | 112 |     global $CFG;
 | 
        
           |  |  | 113 |   | 
        
           |  |  | 114 |     if (NO_MOODLE_COOKIES) {
 | 
        
           |  |  | 115 |         return;
 | 
        
           |  |  | 116 |     }
 | 
        
           |  |  | 117 |   | 
        
           |  |  | 118 |     if (empty($CFG->rememberusername)) {
 | 
        
           |  |  | 119 |         // erase current and do not store permanent cookies
 | 
        
           |  |  | 120 |         $username = '';
 | 
        
           |  |  | 121 |     }
 | 
        
           |  |  | 122 |   | 
        
           |  |  | 123 |     if ($username === 'guest') {
 | 
        
           |  |  | 124 |         // keep previous cookie in case of guest account login
 | 
        
           |  |  | 125 |         return;
 | 
        
           |  |  | 126 |     }
 | 
        
           |  |  | 127 |   | 
        
           |  |  | 128 |     $cookiename = 'MOODLEID1_'.$CFG->sessioncookie;
 | 
        
           |  |  | 129 |   | 
        
           |  |  | 130 |     $cookiesecure = is_moodle_cookie_secure();
 | 
        
           |  |  | 131 |   | 
        
           |  |  | 132 |     // Delete old cookie.
 | 
        
           |  |  | 133 |     setcookie($cookiename, '', time() - HOURSECS, $CFG->sessioncookiepath, $CFG->sessioncookiedomain, $cookiesecure, $CFG->cookiehttponly);
 | 
        
           |  |  | 134 |   | 
        
           |  |  | 135 |     if ($username !== '') {
 | 
        
           |  |  | 136 |         // Set username cookie for 60 days.
 | 
        
           |  |  | 137 |         setcookie($cookiename, rc4encrypt($username), time() + (DAYSECS * 60), $CFG->sessioncookiepath, $CFG->sessioncookiedomain, $cookiesecure, $CFG->cookiehttponly);
 | 
        
           |  |  | 138 |     }
 | 
        
           |  |  | 139 | }
 | 
        
           |  |  | 140 |   | 
        
           |  |  | 141 | /**
 | 
        
           |  |  | 142 |  * Gets a moodle cookie with a weakly encrypted username
 | 
        
           |  |  | 143 |  *
 | 
        
           |  |  | 144 |  * @return string username
 | 
        
           |  |  | 145 |  */
 | 
        
           |  |  | 146 | function get_moodle_cookie() {
 | 
        
           |  |  | 147 |     global $CFG;
 | 
        
           |  |  | 148 |   | 
        
           |  |  | 149 |     if (NO_MOODLE_COOKIES) {
 | 
        
           |  |  | 150 |         return '';
 | 
        
           |  |  | 151 |     }
 | 
        
           |  |  | 152 |   | 
        
           |  |  | 153 |     if (empty($CFG->rememberusername)) {
 | 
        
           |  |  | 154 |         return '';
 | 
        
           |  |  | 155 |     }
 | 
        
           |  |  | 156 |   | 
        
           |  |  | 157 |     $cookiename = 'MOODLEID1_'.$CFG->sessioncookie;
 | 
        
           |  |  | 158 |   | 
        
           |  |  | 159 |     if (empty($_COOKIE[$cookiename])) {
 | 
        
           |  |  | 160 |         return '';
 | 
        
           |  |  | 161 |     } else {
 | 
        
           |  |  | 162 |         $username = rc4decrypt($_COOKIE[$cookiename]);
 | 
        
           |  |  | 163 |         if ($username === 'guest' or $username === 'nobody') {
 | 
        
           |  |  | 164 |             // backwards compatibility - we do not set these cookies any more
 | 
        
           |  |  | 165 |             $username = '';
 | 
        
           |  |  | 166 |         }
 | 
        
           |  |  | 167 |         return $username;
 | 
        
           |  |  | 168 |     }
 | 
        
           |  |  | 169 | }
 |