Merge branch 'MDL-29662' of git://github.com/timhunt/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Mon, 3 Sep 2012 23:14:06 +0000 (01:14 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Mon, 3 Sep 2012 23:14:06 +0000 (01:14 +0200)
1  2 
lib/moodlelib.php

diff --combined lib/moodlelib.php
@@@ -3927,45 -3927,15 +3927,45 @@@ function truncate_userinfo($info) 
   * Any plugin that needs to purge user data should register the 'user_deleted' event.
   *
   * @param stdClass $user full user object before delete
 - * @return boolean always true
 + * @return boolean success
 + * @throws coding_exception if invalid $user parameter detected
   */
 -function delete_user($user) {
 +function delete_user(stdClass $user) {
      global $CFG, $DB;
      require_once($CFG->libdir.'/grouplib.php');
      require_once($CFG->libdir.'/gradelib.php');
      require_once($CFG->dirroot.'/message/lib.php');
      require_once($CFG->dirroot.'/tag/lib.php');
  
 +    // Make sure nobody sends bogus record type as parameter.
 +    if (!property_exists($user, 'id') or !property_exists($user, 'username')) {
 +        throw new coding_exception('Invalid $user parameter in delete_user() detected');
 +    }
 +
 +    // Better not trust the parameter and fetch the latest info,
 +    // this will be very expensive anyway.
 +    if (!$user = $DB->get_record('user', array('id'=>$user->id))) {
 +        debugging('Attempt to delete unknown user account.');
 +        return false;
 +    }
 +
 +    // There must be always exactly one guest record,
 +    // originally the guest account was identified by username only,
 +    // now we use $CFG->siteguest for performance reasons.
 +    if ($user->username === 'guest' or isguestuser($user)) {
 +        debugging('Guest user account can not be deleted.');
 +        return false;
 +    }
 +
 +    // Admin can be theoretically from different auth plugin,
 +    // but we want to prevent deletion of internal accoutns only,
 +    // if anything goes wrong ppl may force somebody to be admin via
 +    // config.php setting $CFG->siteadmins.
 +    if ($user->auth === 'manual' and is_siteadmin($user)) {
 +        debugging('Local administrator accounts can not be deleted.');
 +        return false;
 +    }
 +
      // delete all grades - backup is kept in grade_grades_history table
      grade_user_delete($user->id);
  
@@@ -4818,7 -4788,7 +4818,7 @@@ function shift_course_mod_dates($modnam
      foreach ($fields as $field) {
          $updatesql = "UPDATE {".$modname."}
                            SET $field = $field + ?
-                         WHERE course=? AND $field<>0 AND $field<>0";
+                         WHERE course=? AND $field<>0";
          $return = $DB->execute($updatesql, array($timeshift, $courseid)) && $return;
      }
  
@@@ -5012,12 -4982,12 +5012,12 @@@ function reset_course_userdata($data) 
      if ($allmods = $DB->get_records('modules') ) {
          foreach ($allmods as $mod) {
              $modname = $mod->name;
 -            if (!$DB->count_records($modname, array('course'=>$data->courseid))) {
 -                continue; // skip mods with no instances
 -            }
              $modfile = $CFG->dirroot.'/mod/'. $modname.'/lib.php';
              $moddeleteuserdata = $modname.'_reset_userdata';   // Function to delete user data
              if (file_exists($modfile)) {
 +                if (!$DB->count_records($modname, array('course'=>$data->courseid))) {
 +                    continue; // Skip mods with no instances
 +                }
                  include_once($modfile);
                  if (function_exists($moddeleteuserdata)) {
                      $modstatus = $moddeleteuserdata($data);