diff --git a/core/user.class.php b/core/user.class.php index a6eafc38..679e0fa6 100644 --- a/core/user.class.php +++ b/core/user.class.php @@ -202,6 +202,20 @@ class User { log_info("core-user", 'Set class for '.$this->name.' to '.$class); } + /** + * @param string $name + */ + public function set_name(/*string*/ $name) { + global $database; + if(User::by_name($name)) { + throw new Exception("Desired username is already in use"); + } + $old_name = $this->name; + $this->name = $name; + $database->Execute("UPDATE users SET name=:name WHERE id=:id", array("name"=>$this->name, "id"=>$this->id)); + log_info("core-user", "Changed username for {$old_name} to {$this->name}"); + } + /** * @param string $password */ diff --git a/core/userclass.class.php b/core/userclass.class.php index 05cd96cd..45ddb1fe 100644 --- a/core/userclass.class.php +++ b/core/userclass.class.php @@ -90,6 +90,7 @@ new UserClass("base", null, array( "view_ip" => False, # view IP addresses associated with things "ban_ip" => False, + "edit_user_name" => False, "edit_user_password" => False, "edit_user_info" => False, # email address, etc "edit_user_class" => False, @@ -155,6 +156,7 @@ new UserClass("admin", "base", array( "edit_image_lock" => True, "view_ip" => True, "ban_ip" => True, + "edit_user_name" => True, "edit_user_password" => True, "edit_user_info" => True, "edit_user_class" => True, diff --git a/ext/user/main.php b/ext/user/main.php index 99f9bf4c..e5791f4d 100644 --- a/ext/user/main.php +++ b/ext/user/main.php @@ -189,6 +189,16 @@ class UserPage extends Extension { return; } + else if($event->get_arg(0) == "change_name") { + if(isset($_POST['id']) && isset($_POST['name'])) { + $duser = User::by_id($_POST['id']); + if ( ! $duser instanceof User) { + throw new NullUserException("Error: the user id does not exist!"); + } + $name = $_POST['name']; + $this->change_name_wrapper($duser, $name); + } + } else if($event->get_arg(0) == "change_pass") { if(isset($_POST['id']) && isset($_POST['pass1']) && isset($_POST['pass2'])) { $duser = User::by_id($_POST['id']); @@ -527,6 +537,20 @@ class UserPage extends Extension { } } + private function change_name_wrapper(User $duser, $name) { + global $user; + + if($user->can('edit_user_name') && $this->user_can_edit_user($user, $duser)) { + $duser->set_name($name); + flash_message("Username changed"); + // TODO: set login cookie if user changed themselves + $this->redirect_to_user($duser); + } + else { + $this->theme->display_error(400, "Error", "Permission denied"); + } + } + /** * @param User $duser * @param string $pass1 diff --git a/ext/user/theme.php b/ext/user/theme.php index bdf55a13..80390bc0 100644 --- a/ext/user/theme.php +++ b/ext/user/theme.php @@ -165,8 +165,21 @@ class UserPageTheme extends Themelet { $html = ""; if($duser->id != $config->get_int('anon_id')){ //justa fool-admin protection so they dont mess around with anon users. + if($user->can('edit_user_name')) { + $html .= " +
".make_form(make_link("user_admin/change_name"))." + +
Change Name | |
---|---|
New name | |
".make_form(make_link("user_admin/change_pass"))."