3f037d73129369b7aebd04cb42557d0992870251
[moodle.git] / auth / email / auth.php
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/>.
17 /**
18  * Authentication Plugin: Email Authentication
19  *
20  * @author Martin Dougiamas
21  * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
22  * @package auth_email
23  */
25 defined('MOODLE_INTERNAL') || die();
27 require_once($CFG->libdir.'/authlib.php');
29 /**
30  * Email authentication plugin.
31  */
32 class auth_plugin_email extends auth_plugin_base {
34     /**
35      * Constructor.
36      */
37     function auth_plugin_email() {
38         $this->authtype = 'email';
39         $this->config = get_config('auth/email');
40     }
42     /**
43      * Returns true if the username and password work and false if they are
44      * wrong or don't exist.
45      *
46      * @param string $username The username
47      * @param string $password The password
48      * @return bool Authentication success or failure.
49      */
50     function user_login ($username, $password) {
51         global $CFG, $DB;
52         if ($user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>$CFG->mnet_localhost_id))) {
53             return validate_internal_user_password($user, $password);
54         }
55         return false;
56     }
58     /**
59      * Updates the user's password.
60      *
61      * called when the user password is updated.
62      *
63      * @param  object  $user        User table object  (with system magic quotes)
64      * @param  string  $newpassword Plaintext password (with system magic quotes)
65      * @return boolean result
66      *
67      */
68     function user_update_password($user, $newpassword) {
69         $user = get_complete_user_data('id', $user->id);
70         // This will also update the stored hash to the latest algorithm
71         // if the existing hash is using an out-of-date algorithm (or the
72         // legacy md5 algorithm).
73         return update_internal_user_password($user, $newpassword);
74     }
76     function can_signup() {
77         return true;
78     }
80     /**
81      * Sign up a new user ready for confirmation.
82      * Password is passed in plaintext.
83      *
84      * @param object $user new user object
85      * @param boolean $notify print notice with link and terminate
86      */
87     function user_signup($user, $notify=true) {
88         global $CFG, $DB;
89         require_once($CFG->dirroot.'/user/profile/lib.php');
90         require_once($CFG->dirroot.'/user/lib.php');
92         $plainpassword = $user->password;
93         $user->password = hash_internal_user_password($user->password);
94         if (empty($user->calendartype)) {
95             $user->calendartype = $CFG->calendartype;
96         }
98         $user->id = user_create_user($user, false, false);
100         user_add_password_history($user->id, $plainpassword);
102         // Save any custom profile field information.
103         profile_save_data($user);
105         // Trigger event.
106         \core\event\user_created::create_from_userid($user->id)->trigger();
108         if (! send_confirmation_email($user)) {
109             print_error('auth_emailnoemail','auth_email');
110         }
112         if ($notify) {
113             global $CFG, $PAGE, $OUTPUT;
114             $emailconfirm = get_string('emailconfirm');
115             $PAGE->navbar->add($emailconfirm);
116             $PAGE->set_title($emailconfirm);
117             $PAGE->set_heading($PAGE->course->fullname);
118             echo $OUTPUT->header();
119             notice(get_string('emailconfirmsent', '', $user->email), "$CFG->wwwroot/index.php");
120         } else {
121             return true;
122         }
123     }
125     /**
126      * Returns true if plugin allows confirming of new users.
127      *
128      * @return bool
129      */
130     function can_confirm() {
131         return true;
132     }
134     /**
135      * Confirm the new user as registered.
136      *
137      * @param string $username
138      * @param string $confirmsecret
139      */
140     function user_confirm($username, $confirmsecret) {
141         global $DB;
142         $user = get_complete_user_data('username', $username);
144         if (!empty($user)) {
145             if ($user->auth != $this->authtype) {
146                 return AUTH_CONFIRM_ERROR;
148             } else if ($user->secret == $confirmsecret && $user->confirmed) {
149                 return AUTH_CONFIRM_ALREADY;
151             } else if ($user->secret == $confirmsecret) {   // They have provided the secret key to get in
152                 $DB->set_field("user", "confirmed", 1, array("id"=>$user->id));
153                 return AUTH_CONFIRM_OK;
154             }
155         } else {
156             return AUTH_CONFIRM_ERROR;
157         }
158     }
160     function prevent_local_passwords() {
161         return false;
162     }
164     /**
165      * Returns true if this authentication plugin is 'internal'.
166      *
167      * @return bool
168      */
169     function is_internal() {
170         return true;
171     }
173     /**
174      * Returns true if this authentication plugin can change the user's
175      * password.
176      *
177      * @return bool
178      */
179     function can_change_password() {
180         return true;
181     }
183     /**
184      * Returns the URL for changing the user's pw, or empty if the default can
185      * be used.
186      *
187      * @return moodle_url
188      */
189     function change_password_url() {
190         return null; // use default internal method
191     }
193     /**
194      * Returns true if plugin allows resetting of internal password.
195      *
196      * @return bool
197      */
198     function can_reset_password() {
199         return true;
200     }
202     /**
203      * Returns true if plugin can be manually set.
204      *
205      * @return bool
206      */
207     function can_be_manually_set() {
208         return true;
209     }
211     /**
212      * Prints a form for configuring this authentication plugin.
213      *
214      * This function is called from admin/auth.php, and outputs a full page with
215      * a form for configuring this plugin.
216      *
217      * @param array $page An object containing all the data for this page.
218      */
219     function config_form($config, $err, $user_fields) {
220         include "config.html";
221     }
223     /**
224      * Processes and stores configuration data for this authentication plugin.
225      */
226     function process_config($config) {
227         // set to defaults if undefined
228         if (!isset($config->recaptcha)) {
229             $config->recaptcha = false;
230         }
232         // save settings
233         set_config('recaptcha', $config->recaptcha, 'auth/email');
234         return true;
235     }
237     /**
238      * Returns whether or not the captcha element is enabled, and the admin settings fulfil its requirements.
239      * @return bool
240      */
241     function is_captcha_enabled() {
242         global $CFG;
243         return isset($CFG->recaptchapublickey) && isset($CFG->recaptchaprivatekey) && get_config("auth/{$this->authtype}", 'recaptcha');
244     }