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); }
/** * 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(); }
/** * 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; }
/** * 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(); }