function edituser_site_submit(Pieform $form, $values)
{
    global $USER, $authobj, $SESSION;
    if (!($user = get_record('usr', 'id', $values['id']))) {
        return false;
    }
    if (is_using_probation()) {
        // Value should be between 0 and 10 inclusive
        $user->probation = ensure_valid_probation_points($values['probationpoints']);
    }
    if ($USER->get('admin') || get_config_plugin('artefact', 'file', 'institutionaloverride')) {
        $user->quota = $values['quota'];
        // check if the user has gone over the quota notify limit
        $quotanotifylimit = get_config_plugin('artefact', 'file', 'quotanotifylimit');
        if ($quotanotifylimit <= 0 || $quotanotifylimit >= 100) {
            $quotanotifylimit = 100;
        }
        $user->quotausedpercent = $user->quotaused / $user->quota * 100;
        $overlimit = false;
        if ($quotanotifylimit <= $user->quotausedpercent) {
            $overlimit = true;
        }
        $notified = get_field('usr_account_preference', 'value', 'field', 'quota_exceeded_notified', 'usr', $user->id);
        if ($overlimit && '1' !== $notified) {
            require_once get_config('docroot') . 'artefact/file/lib.php';
            ArtefactTypeFile::notify_users_threshold_exceeded(array($user), false);
            // no need to email admin as we can alert them right now
            $SESSION->add_error_msg(get_string('useroverquotathreshold', 'artefact.file', display_name($user)));
        } else {
            if ($notified && !$overlimit) {
                set_account_preference($user->id, 'quota_exceeded_notified', false);
            }
        }
    }
    $unexpire = $user->expiry && strtotime($user->expiry) < time() && (empty($values['expiry']) || $values['expiry'] > time());
    $newexpiry = db_format_timestamp($values['expiry']);
    if ($user->expiry != $newexpiry) {
        $user->expiry = $newexpiry;
        if ($unexpire) {
            $user->expirymailsent = 0;
            $user->lastaccess = db_format_timestamp(time());
        }
    }
    // Try to kick the user from any active login sessions, before saving data.
    require_once get_config('docroot') . 'auth/session.php';
    remove_user_sessions($user->id);
    if ($USER->get('admin')) {
        // Not editable by institutional admins
        $user->staff = (int) ($values['staff'] == 'on');
        $user->admin = (int) ($values['admin'] == 'on');
        if ($user->admin) {
            activity_add_admin_defaults(array($user->id));
        }
    }
    if ($values['maildisabled'] == 0 && get_account_preference($user->id, 'maildisabled') == 1) {
        // Reset the sent and bounce counts otherwise mail will be disabled
        // on the next send attempt
        $u = new StdClass();
        $u->email = $user->email;
        $u->id = $user->id;
        update_bounce_count($u, true);
        update_send_count($u, true);
    }
    set_account_preference($user->id, 'maildisabled', $values['maildisabled']);
    // process the change of the authinstance and or the remoteuser
    if (isset($values['authinstance']) && isset($values['remoteusername'])) {
        // Authinstance can be changed by institutional admins if both the
        // old and new authinstances belong to the admin's institutions
        $authinst = get_records_select_assoc('auth_instance', 'id = ? OR id = ?', array($values['authinstance'], $user->authinstance));
        // But don't bother if the auth instance doesn't take a remote username
        $authobj = AuthFactory::create($values['authinstance']);
        if ($USER->get('admin') || $USER->is_institutional_admin($authinst[$values['authinstance']]->institution) && ($USER->is_institutional_admin($authinst[$user->authinstance]->institution) || $user->authinstance == 1)) {
            if ($authobj->needs_remote_username()) {
                // determine the current remoteuser
                $current_remotename = get_field('auth_remote_user', 'remoteusername', 'authinstance', $user->authinstance, 'localusr', $user->id);
                if (!$current_remotename) {
                    $current_remotename = $user->username;
                }
                // if the remoteuser is empty
                if (strlen(trim($values['remoteusername'])) == 0) {
                    delete_records('auth_remote_user', 'authinstance', $user->authinstance, 'localusr', $user->id);
                }
                // what should the new remoteuser be
                $new_remoteuser = get_field('auth_remote_user', 'remoteusername', 'authinstance', $values['authinstance'], 'localusr', $user->id);
                // save the remotename for the target existence check
                $target_remotename = $new_remoteuser;
                if (!$new_remoteuser) {
                    $new_remoteuser = $user->username;
                }
                if (strlen(trim($values['remoteusername'])) > 0) {
                    // value changed on page - use it
                    if ($values['remoteusername'] != $current_remotename) {
                        $new_remoteuser = $values['remoteusername'];
                    }
                }
                // only update remote name if the input actually changed on the page  or it doesn't yet exist
                if ($current_remotename != $new_remoteuser || !$target_remotename) {
                    // only remove the ones related to this traget authinstance as we now allow multiple
                    // for dual login mechanisms
                    delete_records('auth_remote_user', 'authinstance', $values['authinstance'], 'localusr', $user->id);
                    insert_record('auth_remote_user', (object) array('authinstance' => $values['authinstance'], 'remoteusername' => $new_remoteuser, 'localusr' => $user->id));
                }
            }
            // update the ai on the user master
            $user->authinstance = $values['authinstance'];
            // update the global $authobj to match the new authinstance
            // this is used by the password/username change methods
            // if either/both has been requested at the same time
            $authobj = AuthFactory::create($user->authinstance);
        }
    }
    // Only change the pw if the new auth instance allows for it
    if (method_exists($authobj, 'change_password')) {
        $user->passwordchange = (int) (isset($values['passwordchange']) && $values['passwordchange'] == 'on' ? 1 : 0);
        if (isset($values['password']) && $values['password'] !== '') {
            $userobj = new User();
            $userobj = $userobj->find_by_id($user->id);
            $user->password = $authobj->change_password($userobj, $values['password']);
            $user->salt = $userobj->salt;
            unset($userobj);
        }
    } else {
        // inform the user that the chosen auth instance doesn't allow password changes
        // but only if they tried changing it
        if (isset($values['password']) && $values['password'] !== '') {
            $SESSION->add_error_msg(get_string('passwordchangenotallowed', 'admin'));
            // Set empty pw with salt
            $user->password = '';
            $user->salt = auth_get_random_salt();
        }
    }
    if (isset($values['username']) && $values['username'] !== '') {
        $userobj = new User();
        $userobj = $userobj->find_by_id($user->id);
        if ($userobj->username != $values['username']) {
            // Only change the username if the auth instance allows for it
            if (method_exists($authobj, 'change_username')) {
                // check the existence of the chosen username
                try {
                    if ($authobj->user_exists($values['username'])) {
                        // set an error message if it is already in use
                        $SESSION->add_error_msg(get_string('usernameexists', 'account'));
                    }
                } catch (AuthUnknownUserException $e) {
                    // update the username otherwise
                    $user->username = $authobj->change_username($userobj, $values['username']);
                }
            } else {
                // inform the user that the chosen auth instance doesn't allow username changes
                $SESSION->add_error_msg(get_string('usernamechangenotallowed', 'admin'));
            }
        }
        unset($userobj);
    }
    // OVERWRITE 4: insert
    if (isset($values['email']) && !empty($values['email']) && $values['email'] != $user->email) {
        global $CFG;
        $user->email = $values['email'];
        $mhr_user = $CFG->current_app->getUserById($user->id);
        $mhr_user->setEmailAddress($values['email']);
    }
    // END OVERWRITE 4
    db_begin();
    update_record('usr', $user);
    delete_records('usr_tag', 'usr', $user->id);
    if (is_array($values['tags'])) {
        $values['tags'] = check_case_sensitive($values['tags'], 'usr_tag');
        foreach (array_unique($values['tags']) as $tag) {
            if (empty($tag)) {
                continue;
            }
            insert_record('usr_tag', (object) array('usr' => $user->id, 'tag' => strtolower($tag)));
        }
    }
    db_commit();
    $SESSION->add_ok_msg(get_string('usersitesettingschanged', 'admin'));
    redirect('/admin/users/edit.php?id=' . $user->id);
}
Beispiel #2
0
 /**
  * This method updates the contents of the artefact table only.  If your
  * artefact has extra information in other tables, you need to override
  * this method, and call parent::commit() in your own function.
  */
 public function commit()
 {
     static $last_source, $last_output;
     $is_new = false;
     if (empty($this->dirty)) {
         return;
     }
     if (empty($this->author) && empty($this->authorname)) {
         $this->set_author();
     }
     db_begin();
     $fordb = new StdClass();
     foreach (get_object_vars($this) as $k => $v) {
         $fordb->{$k} = $v;
         if (in_array($k, array('mtime', 'ctime', 'atime')) && !empty($v)) {
             if ($v !== $last_source) {
                 $last_output = db_format_timestamp($v);
                 $last_source = $v;
             }
             $fordb->{$k} = $last_output;
         }
     }
     if (empty($this->id)) {
         $is_new = true;
         $this->id = insert_record('artefact', $fordb, 'id', true);
         if ($this->can_be_logged()) {
             $this->log('created');
         }
         $this->add_hierarchy_path($this->parent);
     } else {
         if ($this->can_be_logged()) {
             $this->log('edited');
         }
         update_record('artefact', $fordb, 'id');
         $this->update_hierarchy_path($this->parent);
     }
     if (!empty($this->group)) {
         $this->save_rolepermissions();
     }
     if (!$is_new) {
         $deleted = delete_records('artefact_tag', 'artefact', $this->id);
     }
     if (is_array($this->tags)) {
         $this->tags = check_case_sensitive($this->tags, 'artefact_tag');
         foreach (array_unique($this->tags) as $tag) {
             if (empty($tag)) {
                 continue;
             }
             insert_record('artefact_tag', (object) array('artefact' => $this->id, 'tag' => $tag));
         }
     }
     $this->postcommit_hook($is_new);
     handle_event('saveartefact', $this);
     $this->dirty = false;
     $this->deleted = false;
     db_commit();
 }
Beispiel #3
0
 /**
  * This method updates the contents of the view table only.
  */
 public function commit()
 {
     if (empty($this->dirty)) {
         return;
     }
     $fordb = new StdClass();
     foreach (get_object_vars($this) as $k => $v) {
         $fordb->{$k} = $v;
         if (in_array($k, array('mtime', 'ctime', 'atime', 'startdate', 'stopdate', 'submittedtime')) && !empty($v)) {
             $fordb->{$k} = db_format_timestamp($v);
         }
     }
     db_begin();
     if (empty($this->id)) {
         // users are only allowed one profile view
         if ($this->type == 'profile' && record_exists('view', 'owner', $this->owner, 'type', 'profile')) {
             throw new SystemException(get_string('onlonlyyoneprofileviewallowed', 'error'));
         }
         $this->id = insert_record('view', $fordb, 'id', true);
     } else {
         update_record('view', $fordb, 'id');
     }
     if (isset($this->tags)) {
         $this->tags = check_case_sensitive($this->tags, 'view_tag');
         delete_records('view_tag', 'view', $this->get('id'));
         foreach ($this->get_tags() as $tag) {
             //truncate the tag before insert it into the database
             $tag = substr($tag, 0, 128);
             insert_record('view_tag', (object) array('view' => $this->get('id'), 'tag' => $tag));
         }
     }
     if (isset($this->copynewgroups)) {
         delete_records('view_autocreate_grouptype', 'view', $this->get('id'));
         foreach ($this->copynewgroups as $grouptype) {
             insert_record('view_autocreate_grouptype', (object) array('view' => $this->get('id'), 'grouptype' => $grouptype));
         }
     }
     if (isset($this->columnsperrow)) {
         delete_records('view_rows_columns', 'view', $this->get('id'));
         foreach ($this->get_columnsperrow() as $viewrow) {
             insert_record('view_rows_columns', (object) array('view' => $this->get('id'), 'row' => $viewrow->row, 'columns' => $viewrow->columns));
         }
     }
     db_commit();
     $this->dirty = false;
     $this->deleted = false;
 }
Beispiel #4
0
 /**
  * This method updates the contents of the collection table only.
  */
 public function commit()
 {
     $fordb = new StdClass();
     foreach (get_object_vars($this) as $k => $v) {
         $fordb->{$k} = $v;
         if (in_array($k, array('mtime', 'ctime', 'submittedtime')) && !empty($v)) {
             $fordb->{$k} = db_format_timestamp($v);
         }
     }
     db_begin();
     // if id is not empty we are editing an existing collection
     if (!empty($this->id)) {
         update_record('collection', $fordb, 'id');
     } else {
         $id = insert_record('collection', $fordb, 'id', true);
         if ($id) {
             $this->set('id', $id);
         }
     }
     if (isset($this->tags)) {
         delete_records('collection_tag', 'collection', $this->get('id'));
         $tags = check_case_sensitive($this->get_tags(), 'collection_tag');
         foreach ($tags as $tag) {
             //truncate the tag before insert it into the database
             $tag = substr($tag, 0, 128);
             insert_record('collection_tag', (object) array('collection' => $this->get('id'), 'tag' => $tag));
         }
     }
     db_commit();
 }