Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
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
/**
1441 ariadna 106
 * Sets a Moodle cookie with an encrypted username
1 efrain 107
 *
108
 * @param string $username to encrypt and place in a cookie, '' means delete current cookie
109
 */
110
function set_moodle_cookie($username) {
111
    global $CFG;
112
 
113
    if (NO_MOODLE_COOKIES) {
114
        return;
115
    }
116
 
117
    if (empty($CFG->rememberusername)) {
118
        // erase current and do not store permanent cookies
119
        $username = '';
120
    }
121
 
122
    if ($username === 'guest') {
123
        // keep previous cookie in case of guest account login
124
        return;
125
    }
126
 
127
    $cookiename = 'MOODLEID1_'.$CFG->sessioncookie;
128
 
129
    $cookiesecure = is_moodle_cookie_secure();
130
 
131
    // Delete old cookie.
132
    setcookie($cookiename, '', time() - HOURSECS, $CFG->sessioncookiepath, $CFG->sessioncookiedomain, $cookiesecure, $CFG->cookiehttponly);
133
 
134
    if ($username !== '') {
135
        // Set username cookie for 60 days.
1441 ariadna 136
        setcookie($cookiename, \core\encryption::encrypt($username), time() + (DAYSECS * 60), $CFG->sessioncookiepath,
137
            $CFG->sessioncookiedomain, $cookiesecure, $CFG->cookiehttponly);
1 efrain 138
    }
139
}
140
 
141
/**
1441 ariadna 142
 * Gets a Moodle cookie with an encrypted username
1 efrain 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
 
1441 ariadna 159
    try {
160
        $username = \core\encryption::decrypt($_COOKIE[$cookiename] ?? '');
161
        if ($username === 'guest' || $username === 'nobody') {
1 efrain 162
            // backwards compatibility - we do not set these cookies any more
163
            $username = '';
164
        }
165
        return $username;
1441 ariadna 166
    } catch (\moodle_exception $ex) {
167
        return '';
1 efrain 168
    }
169
}