only admins can change user classes, and they should be protected from moderators
This commit is contained in:
		
							parent
							
								
									cf621c066c
								
							
						
					
					
						commit
						eccea620ba
					
				| @ -50,6 +50,7 @@ $_user_class_base = new UserClass("base", null, array( | |||||||
| 	"mass_tag_edit" => False, | 	"mass_tag_edit" => False, | ||||||
| 	"report_image" => False, | 	"report_image" => False, | ||||||
| 	"view_image_report" => False, | 	"view_image_report" => False, | ||||||
|  | 	"protected" => False, | ||||||
| )); | )); | ||||||
| $_user_classes["anonymous"] = new UserClass("anonymous", $_user_class_base, array( | $_user_classes["anonymous"] = new UserClass("anonymous", $_user_class_base, array( | ||||||
| 	"edit_image_tag" => "tag_edit_anon", | 	"edit_image_tag" => "tag_edit_anon", | ||||||
| @ -83,6 +84,7 @@ $_user_classes["admin"] = new UserClass("admin", $_user_class_base, array( | |||||||
| 	"mass_tag_edit" => True, | 	"mass_tag_edit" => True, | ||||||
| 	"report_image" => True, | 	"report_image" => True, | ||||||
| 	"view_image_report" => True, | 	"view_image_report" => True, | ||||||
|  | 	"protected" => True, | ||||||
| )); | )); | ||||||
| 
 | 
 | ||||||
| foreach(unserialize(EXTRA_USER_CLASSES) as $class_info) { | foreach(unserialize(EXTRA_USER_CLASSES) as $class_info) { | ||||||
|  | |||||||
| @ -89,10 +89,30 @@ class UserPage extends Extension { | |||||||
| 				$page->set_redirect(make_link()); | 				$page->set_redirect(make_link()); | ||||||
| 			} | 			} | ||||||
| 			else if($event->get_arg(0) == "change_pass") { | 			else if($event->get_arg(0) == "change_pass") { | ||||||
| 				$this->change_password_wrapper($page); | 				if(isset($_POST['id']) && isset($_POST['pass1']) && isset($_POST['pass2'])) { | ||||||
|  | 					$duser = User::by_id($_POST['id']); | ||||||
|  | 					$pass1 = $_POST['pass1']; | ||||||
|  | 					$pass2 = $_POST['pass2']; | ||||||
|  | 					$this->change_password_wrapper($duser, $pass1, $pass2); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 			else if($event->get_arg(0) == "change_email") { | 			else if($event->get_arg(0) == "change_email") { | ||||||
| 				$this->change_email_wrapper($page); | 				if(isset($_POST['id']) && isset($_POST['address'])) { | ||||||
|  | 					$duser = User::by_id($_POST['id']); | ||||||
|  | 					$address = $_POST['address']; | ||||||
|  | 					$this->change_email_wrapper($duser, $address); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			else if($event->get_arg(0) == "change_class") { | ||||||
|  | 				global $_user_classes; | ||||||
|  | 				if(isset($_POST['id']) && isset($_POST['class'])) { | ||||||
|  | 					$duser = User::by_id($_POST['id']); | ||||||
|  | 					$class = $_POST['class']; | ||||||
|  | 					if(!array_key_exists($class, $_user_classes)) { | ||||||
|  | 						throw Exception("Invalid user class: ".html_escape($class)); | ||||||
|  | 					} | ||||||
|  | 					$this->change_class_wrapper($duser, $class); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 			else if($event->get_arg(0) == "recover") { | 			else if($event->get_arg(0) == "recover") { | ||||||
| 				$user = User::by_name($_POST['username']); | 				$user = User::by_name($_POST['username']); | ||||||
| @ -130,9 +150,6 @@ class UserPage extends Extension { | |||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			else if($event->get_arg(0) == "set_more") { |  | ||||||
| 				$this->set_more_wrapper(); |  | ||||||
| 			} |  | ||||||
| 			else if($event->get_arg(0) == "list") { | 			else if($event->get_arg(0) == "list") { | ||||||
| // select users.id,name,joindate,admin,
 | // select users.id,name,joindate,admin,
 | ||||||
| // (select count(*) from images where images.owner_id=users.id) as images,
 | // (select count(*) from images where images.owner_id=users.id) as images,
 | ||||||
| @ -339,26 +356,50 @@ class UserPage extends Extension { | |||||||
| 	} | 	} | ||||||
| //}}}
 | //}}}
 | ||||||
| // Things done *to* the user {{{
 | // Things done *to* the user {{{
 | ||||||
| 	private function change_password_wrapper(Page $page) { | 	private function user_can_edit_user(User $a, User $b) { | ||||||
| 		global $user; | 		if($a->is_anonymous()) { | ||||||
| 		global $config; |  | ||||||
| 		global $database; |  | ||||||
| 
 |  | ||||||
| 		if($user->is_anonymous()) { |  | ||||||
| 			$this->theme->display_error(401, "Error", "You aren't logged in"); | 			$this->theme->display_error(401, "Error", "You aren't logged in"); | ||||||
| 		} | 		} | ||||||
| 		else if(isset($_POST['id']) && isset($_POST['pass1']) && isset($_POST['pass2'])) { | 		if($a->name == $b->name) { | ||||||
| 			$id = $_POST['id']; | 			return true; | ||||||
| 			$pass1 = $_POST['pass1']; | 		} | ||||||
| 			$pass2 = $_POST['pass2']; | 		if($b->can("protected")) { | ||||||
| 
 | 			if($a->class->name == "admin") { | ||||||
| 			$duser = User::by_id($id); | 				return true; | ||||||
| 
 |  | ||||||
| 			if((!$user->can("change_user_info")) && ($duser->name != $user->name)) { |  | ||||||
| 				$this->theme->display_error(401, "Error", |  | ||||||
| 						"You need to be an admin to change other people's passwords"); |  | ||||||
| 			} | 			} | ||||||
| 			else if($pass1 != $pass2) { | 			else { | ||||||
|  | 				$this->theme->display_error(401, "Error", "You need to be an admin to change other people's details"); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			if($a->can("edit_user_info")) { | ||||||
|  | 				return true; | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				$this->theme->display_error(401, "Error", "You need to be an admin to change other people's details"); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private function redirect_to_user(User $duser) { | ||||||
|  | 		global $page, $user; | ||||||
|  | 
 | ||||||
|  | 		if($user->id == $duser->id) { | ||||||
|  | 			$page->set_mode("redirect"); | ||||||
|  | 			$page->set_redirect(make_link("user")); | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			$page->set_mode("redirect"); | ||||||
|  | 			$page->set_redirect(make_link("user/{$duser->name}")); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private function change_password_wrapper(User $duser, $pass1, $pass2) { | ||||||
|  | 		global $user; | ||||||
|  | 
 | ||||||
|  | 		if($this->user_can_edit_user($user, $duser)) { | ||||||
|  | 			if($pass1 != $pass2) { | ||||||
| 				$this->theme->display_error(400, "Error", "Passwords don't match"); | 				$this->theme->display_error(400, "Error", "Passwords don't match"); | ||||||
| 			} | 			} | ||||||
| 			else { | 			else { | ||||||
| @ -367,80 +408,28 @@ class UserPage extends Extension { | |||||||
| 
 | 
 | ||||||
| 				if($id == $user->id) { | 				if($id == $user->id) { | ||||||
| 					$this->set_login_cookie($duser->name, $pass1); | 					$this->set_login_cookie($duser->name, $pass1); | ||||||
| 					$page->set_mode("redirect"); |  | ||||||
| 					$page->set_redirect(make_link("user")); |  | ||||||
| 				} |  | ||||||
| 				else { |  | ||||||
| 					$page->set_mode("redirect"); |  | ||||||
| 					$page->set_redirect(make_link("user/{$duser->name}")); |  | ||||||
| 				} | 				} | ||||||
|  | 				$this->redirect_to_user($duser); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private function change_email_wrapper(Page $page) { | 	private function change_email_wrapper(User $duser, /*string(email)*/ $address) { | ||||||
| 		global $user; | 		global $user; | ||||||
| 		global $config; |  | ||||||
| 		global $database; |  | ||||||
| 
 | 
 | ||||||
| 		if($user->is_anonymous()) { | 		if($this->user_can_edit_user($user, $duser)) { | ||||||
| 			$this->theme->display_error(401, "Error", "You aren't logged in"); | 			$duser->set_email($address); | ||||||
| 		} | 			$this->redirect_to_user($duser); | ||||||
| 		else if(isset($_POST['id']) && isset($_POST['address'])) { |  | ||||||
| 			$id = $_POST['id']; |  | ||||||
| 			$address = $_POST['address']; |  | ||||||
| 
 |  | ||||||
| 			$duser = User::by_id($id); |  | ||||||
| 
 |  | ||||||
| 			if((!$user->can("change_user_info")) && ($duser->name != $user->name)) { |  | ||||||
| 				$this->theme->display_error(401, "Error", |  | ||||||
| 						"You need to be an admin to change other people's addressess"); |  | ||||||
| 			} |  | ||||||
| 			else { |  | ||||||
| 				$duser->set_email($address); |  | ||||||
| 
 |  | ||||||
| 				if($id == $user->id) { |  | ||||||
| 					$page->set_mode("redirect"); |  | ||||||
| 					$page->set_redirect(make_link("user")); |  | ||||||
| 				} |  | ||||||
| 				else { |  | ||||||
| 					$page->set_mode("redirect"); |  | ||||||
| 					$page->set_redirect(make_link("user/{$duser->name}")); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private function set_more_wrapper() { | 	private function change_class_wrapper(User $duser, /*string(class)*/ $class) { | ||||||
| 		global $config, $database, $page, $user; | 		global $user; | ||||||
| 
 |  | ||||||
| 		$page->set_title("Error"); |  | ||||||
| 		$page->set_heading("Error"); |  | ||||||
| 		$page->add_block(new NavBlock()); |  | ||||||
| 		if(!$user->can("change_user_info")) { |  | ||||||
| 			$page->add_block(new Block("Not Admin", "Only admins can edit accounts")); |  | ||||||
| 		} |  | ||||||
| 		else if(!isset($_POST['id']) || !is_numeric($_POST['id'])) { |  | ||||||
| 			$page->add_block(new Block("No ID Specified", |  | ||||||
| 					"You need to specify the account number to edit")); |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			global $_user_classes; |  | ||||||
| 			$class = $_POST['class']; |  | ||||||
| 			if(!array_key_exists($class, $_user_classes)) { |  | ||||||
| 				throw Exception("Invalid user class: ".html_escape($class)); |  | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
|  | 		if($user->class->name == "admin") { | ||||||
| 			$duser = User::by_id($_POST['id']); | 			$duser = User::by_id($_POST['id']); | ||||||
| 			$duser->set_class($class); | 			$duser->set_class($class); | ||||||
| 
 | 			$this->redirect_to_user($duser); | ||||||
| 			$page->set_mode("redirect"); |  | ||||||
| 			if($duser->id == $user->id) { |  | ||||||
| 				$page->set_redirect(make_link("user")); |  | ||||||
| 			} |  | ||||||
| 			else { |  | ||||||
| 				$page->set_redirect(make_link("user/{$duser->name}")); |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| // }}}
 | // }}}
 | ||||||
|  | |||||||
| @ -173,11 +173,11 @@ class UserPageTheme extends Themelet { | |||||||
| 			</form> | 			</form> | ||||||
| 			";
 | 			";
 | ||||||
| 
 | 
 | ||||||
| 			if($user->can("change_user_info")) { | 			if($user->class->name == "admin") { | ||||||
| 				$i_user_id = int_escape($duser->id); | 				$i_user_id = int_escape($duser->id); | ||||||
| 				$h_is_admin = $duser->is_admin() ? " checked" : ""; | 				$h_is_admin = $duser->is_admin() ? " checked" : ""; | ||||||
| 				$html .= " | 				$html .= " | ||||||
| 					<p>".make_form(make_link("user_admin/set_more"))." | 					<p>".make_form(make_link("user_admin/change_class"))." | ||||||
| 						<input type='hidden' name='id' value='$i_user_id'> | 						<input type='hidden' name='id' value='$i_user_id'> | ||||||
| 						Class: <select name='class'> | 						Class: <select name='class'> | ||||||
| 				";
 | 				";
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user