MDL-13811: Merged fix to work when email is disabled
[moodle.git] / user / edit.php
1 <?php // $Id$
3     require_once('../config.php');
4     require_once($CFG->libdir.'/gdlib.php');
5     require_once($CFG->dirroot.'/user/edit_form.php');
6     require_once($CFG->dirroot.'/user/editlib.php');
7     require_once($CFG->dirroot.'/user/profile/lib.php');
9     httpsrequired();
11     $userid = optional_param('id', $USER->id, PARAM_INT);    // user id
12     $course = optional_param('course', SITEID, PARAM_INT);   // course id (defaults to Site)
13     $cancelemailchange = optional_param('cancelemailchange', false, PARAM_INT);   // course id (defaults to Site)
15     if (!$course = $DB->get_record('course', array('id'=>$course))) {
16         print_error('invalidcourseid');
17     }
19     if ($course->id != SITEID) {
20         require_login($course);
21     } else if (!isloggedin()) {
22         if (empty($SESSION->wantsurl)) {
23             $SESSION->wantsurl = $CFG->httpswwwroot.'/user/edit.php';
24         }
25         redirect($CFG->httpswwwroot.'/login/index.php');
26     }
28     // Guest can not edit
29     if (isguestuser()) {
30         print_error('guestnoeditprofile');
31     }
33     // The user profile we are editing
34     if (!$user = $DB->get_record('user', array('id'=>$userid))) {
35         print_error('invaliduserid');
36     }
38     // Guest can not be edited
39     if (isguestuser($user)) {
40         print_error('guestnoeditprofile');
41     }
43     // User interests separated by commas
44     if (!empty($CFG->usetags)) {
45         require_once($CFG->dirroot.'/tag/lib.php');
46         $user->interests = tag_get_tags_csv('user', $user->id, TAG_RETURN_TEXT);
47     }
49     // remote users cannot be edited
50     if (is_mnet_remote_user($user)) {
51         redirect($CFG->wwwroot . "/user/view.php?course={$course->id}");
52     }
54     if ($course->id == SITEID) {
55         $coursecontext = get_context_instance(CONTEXT_SYSTEM);   // SYSTEM context
56     } else {
57         $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);   // Course context
58     }
59     $systemcontext   = get_context_instance(CONTEXT_SYSTEM);
60     $personalcontext = get_context_instance(CONTEXT_USER, $user->id);
62     // check access control
63     if ($user->id == $USER->id) {
64         //editing own profile - require_login() MUST NOT be used here, it would result in infinite loop!
65         if (!has_capability('moodle/user:editownprofile', $systemcontext)) {
66             print_error('cannotedityourprofile');
67         }
69     } else {
70         // teachers, parents, etc.
71         require_capability('moodle/user:editprofile', $personalcontext);
72         // no editing of guest user account
73         if (isguestuser($user->id)) {
74             print_error('guestnoeditprofileother');
75         }
76         // no editing of primary admin!
77         if (is_primary_admin($user->id)) {
78             print_error('adminprimarynoedit');
79         }
80     }
82     if ($user->deleted) {
83         print_header();
84         print_heading(get_string('userdeleted'));
85         print_footer($course);
86         die;
87     }
89     // Process email change cancellation
90     if ($cancelemailchange) {
91         cancel_email_update($user->id);
92     }
94     //load user preferences
95     useredit_load_preferences($user);
97     //Load custom profile fields data
98     profile_load_data($user);
101     //create form
102     $userform = new user_edit_form();
103     $userform->set_data($user);
105     $email_changed = false;
107     if ($usernew = $userform->get_data()) {
109         add_to_log($course->id, 'user', 'update', "view.php?id=$user->id&course=$course->id", '');
111         $email_changed_html = '';
113         if ($CFG->emailchangeconfirmation) {
114             // Handle change of email carefully for non-trusted users
115             if ($user->email != $usernew->email && !has_capability('moodle/user:update', $systemcontext)) {
116                 $a = new stdClass();
117                 $a->newemail = $usernew->preference_newemail = $usernew->email;
118                 $usernew->preference_newemailkey = random_string(20);
119                 $usernew->preference_newemailattemptsleft = 3;
120                 $a->oldemail = $usernew->email = $user->email;
122                 $email_changed_html = print_box(get_string('auth_changingemailaddress', 'auth', $a), 'generalbox', 'notice', true);
123                 $email_changed_html .= print_continue("$CFG->wwwroot/user/view.php?id=$user->id&amp;course=$course->id", true);
124                 $email_changed = true;
125             }
126         }
128         $authplugin = get_auth_plugin($user->auth);
130         $usernew->timemodified = time();
132         if (!$DB->update_record('user', $usernew)) {
133             print_error('cannotupdateprofile');
134         }
136         // pass a true $userold here
137         if (! $authplugin->user_update($user, $userform->get_data())) {
138             // auth update failed, rollback for moodle
139             $DB->update_record('user', $user);
140             print_error('cannotupdateprofile');
141         }
143         //update preferences
144         useredit_update_user_preference($usernew);
146         //update interests
147         if (!empty($CFG->usetags)) {
148             useredit_update_interests($usernew, $usernew->interests);
149         }
151         //update user picture
152         if (!empty($CFG->gdversion) and empty($CFG->disableuserimages)) {
153             useredit_update_picture($usernew, $userform);
154         }
156         // update mail bounces
157         useredit_update_bounces($user, $usernew);
159         /// update forum track preference
160         useredit_update_trackforums($user, $usernew);
162         // save custom profile fields data
163         profile_save_data($usernew);
165         // If email was changed, send confirmation email now
166         if ($email_changed && $CFG->emailchangeconfirmation) {
167             $temp_user = fullclone($user);
168             $temp_user->email = $usernew->preference_newemail;
169             $temp_user->emailstop = NULL;
171             $a = new stdClass();
172             $a->url = $CFG->wwwroot . '/user/emailupdate.php?key=' . $usernew->preference_newemailkey . '&id=' . $user->id;
173             $a->site = $SITE->fullname;
174             $a->fullname = fullname($user, true);
176             $emailupdatemessage = get_string('auth_emailupdatemessage', 'auth', $a);
177             $emailupdatetitle = get_string('auth_emailupdatetitle', 'auth', $a);
179             if (!$mail_results = email_to_user($temp_user, get_admin(), $emailupdatetitle, $emailupdatemessage)) {
180                 die("could not send email!");
181             }
182         }
184         // reload from db
185         $usernew = $DB->get_record('user', array('id'=>$user->id));
186         events_trigger('user_updated', $usernew);
188         if ($USER->id == $user->id) {
189             // Override old $USER session variable if needed
190             foreach ((array)$usernew as $variable => $value) {
191                 $USER->$variable = $value;
192             }
193         }
195         if (!$email_changed || !$CFG->emailchangeconfirmation) {
196             redirect("$CFG->wwwroot/user/view.php?id=$user->id&course=$course->id");
197         }
198     }
201 /// Display page header
202     $streditmyprofile = get_string('editmyprofile');
203     $strparticipants  = get_string('participants');
204     $userfullname     = fullname($user, true);
206     $navlinks = array();
207     if (has_capability('moodle/course:viewparticipants', $coursecontext) || has_capability('moodle/site:viewparticipants', $systemcontext)) {
208         $navlinks[] = array('name' => $strparticipants, 'link' => "index.php?id=$course->id", 'type' => 'misc');
209     }
210     $navlinks[] = array('name' => $userfullname,
211                         'link' => "view.php?id=$user->id&amp;course=$course->id",
212                         'type' => 'misc');
213     $navlinks[] = array('name' => $streditmyprofile, 'link' => null, 'type' => 'misc');
214     $navigation = build_navigation($navlinks);
215     print_header("$course->shortname: $streditmyprofile", $course->fullname, $navigation, "");
217     /// Print tabs at the top
218     $showroles = 1;
219     $currenttab = 'editprofile';
220     require('tabs.php');
222     if ($email_changed) {
223         echo $email_changed_html;
224     } else {
225     /// Finally display THE form
226         $userform->display();
227     }
229 /// and proper footer
230     print_footer($course);
232 ?>