Changeset 3208188
- Timestamp:
- 12/15/2024 01:30:35 PM (14 months ago)
- Location:
- user-role-editor/trunk
- Files:
-
- 5 edited
-
changelog.txt (modified) (1 diff)
-
includes/classes/ajax-processor.php (modified) (3 diffs)
-
includes/classes/grant-roles.php (modified) (12 diffs)
-
js/users-grant-roles.js (modified) (3 diffs)
-
readme.txt (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
user-role-editor/trunk/changelog.txt
r3201795 r3208188 1 1 CHANGES LOG (full version). 2 2 =========================== 3 4 = [4.64.4] 15.12.2024 = 5 * Security Fix: Users - "Add Role", "Revoke Role" buttons: Cross-Site request forgery to privilege escalation was possible due to missed nonce validation. This issue was discovered and responsibly reported by vgo0. 3 6 4 7 = [4.64.3] 03.12.2024 = -
user-role-editor/trunk/includes/classes/ajax-processor.php
r3037617 r3208188 42 42 43 43 protected function get_required_cap() { 44 45 if ( $this->action=='grant_roles' || $this->action=='get_user_roles' ) { 44 $promote_users_actions = array( 45 'grant_roles', 46 'get_user_roles', 47 'add_role_to_user', 48 'revoke_role_from_user' 49 ); 50 if ( in_array( $this->action, $promote_users_actions ) ) { 46 51 $cap = 'promote_users'; 47 52 } else { … … 235 240 } 236 241 // end of grant_roles() 237 242 243 244 protected function add_role_to_user() { 245 246 $answer = URE_Grant_Roles::add_role(); 247 248 return $answer; 249 250 } 251 // end of add_role_to_user() 252 253 254 protected function revoke_role_from_user() { 255 256 $answer = URE_Grant_Roles::revoke_role(); 257 258 return $answer; 259 260 } 261 // end of add_role_to_user() 238 262 239 263 protected function get_user_roles() { … … 330 354 $answer = $this->grant_roles(); 331 355 break; 356 case 'add_role_to_user': 357 $answer = $this->add_role_to_user(); 358 break; 359 case 'revoke_role_from_user': 360 $answer = $this->revoke_role_from_user(); 361 break; 332 362 case 'get_user_roles': 333 363 $answer = $this->get_user_roles(); -
user-role-editor/trunk/includes/classes/grant-roles.php
r3201795 r3208188 21 21 public function __construct() { 22 22 23 $this->lib = URE_Lib::get_instance(); 23 $this->lib = URE_Lib::get_instance(); 24 24 25 25 add_action( 'load-users.php', array( $this, 'load' ) ); … … 33 33 add_action('restrict_manage_users', array($this, 'show_roles_manage_html') ); 34 34 add_action('admin_head', array(User_Role_Editor::get_instance(), 'add_css_to_users_page') ); 35 add_action('admin_enqueue_scripts', array($this, 'load_js') ); 36 37 $this->update_roles(); 35 add_action('admin_enqueue_scripts', array($this, 'load_js') ); 38 36 39 37 } … … 66 64 67 65 68 private function add_role( $users ) { 69 70 if ( !empty( $_REQUEST['ure_add_role'] ) ) { 71 $role = $_REQUEST['ure_add_role']; 72 } else { 73 $role = $_REQUEST['ure_add_role_2']; 74 } 75 66 public static function add_role() { 67 68 if ( !current_user_can('promote_users') ) { 69 $answer = array('result'=>'error', 'message'=>esc_html__('Not enough permissions', 'user-role-editor') ); 70 return $answer; 71 } 72 73 if ( empty( $_REQUEST['users'] ) ) { 74 $answer = array('result'=>'error', 'message'=>esc_html__('Empty users list', 'user-role-editor') ); 75 return $answer; 76 } 77 $users = (array) $_REQUEST['users']; 78 if ( !self::validate_users( $users ) ) { 79 $answer = array('result'=>'error', 'message'=>esc_html__('Can not edit user or invalid data at the users list', 'user-role-editor') ); 80 return $answer; 81 } 82 83 $lib = URE_Lib::get_instance(); 84 $role = $lib->get_request_var('role', 'post', 'string'); 76 85 if ( !self::validate_roles( array($role=>$role) ) ) { 77 return; 78 } 79 80 $done = false; 86 $answer = array('result'=>'error', 'message'=>esc_html__('Invalid role', 'user-role-editor') ); 87 return $answer; 88 } 89 90 $quantity = 0; 81 91 foreach( $users as $user_id ) { 82 92 $user = get_user_by( 'id', $user_id ); … … 84 94 continue; 85 95 } 86 if ( empty( $user->roles) || !in_array( $role, $user->roles ) ) {96 if ( empty( $user->roles ) || !in_array( $role, $user->roles ) ) { 87 97 $user->add_role( $role ); 88 $done = true; 89 } 90 } 91 92 if ( $done ) { 93 // Redirect to the users screen. 94 if ( wp_redirect( add_query_arg( 'update', 'promote', 'users.php' ) ) ) { 95 exit; 96 } 97 } 98 $quantity++; 99 } 100 } 101 102 if ( $quantity>0 ) { 103 // translators: template %d is a quantity of users to whom role was added 104 $message = sprintf( esc_html__('Role added to %d user(s).', 'user-role-editor'), $quantity ); 105 $answer = array('result'=>'success', 'message'=>$message ); 106 } else { 107 $answer = array('result'=>'error', 'message'=>esc_html__('Error: Role not added', 'user-role-editor') ); 108 } 109 110 return $answer; 98 111 } 99 112 // end of add_role() 100 113 101 114 102 private function is_try_remove_admin_from_himself( $user_id, $role) {115 private static function is_try_remove_admin_from_himself( $user_id, $role) { 103 116 104 117 $result = false; … … 129 142 return $result; 130 143 } 131 132 133 private function revoke_role( $users ) { 134 135 if ( !empty( $_REQUEST['ure_revoke_role'] ) ) { 136 $role = $_REQUEST['ure_revoke_role']; 137 } else { 138 $role = $_REQUEST['ure_revoke_role_2']; 139 } 140 144 // end of is_try_remove_admin_from_himself() 145 146 147 public static function revoke_role() { 148 149 if ( !current_user_can('promote_users') ) { 150 $answer = array('result'=>'error', 'message'=>esc_html__('Not enough permissions', 'user-role-editor') ); 151 return $answer; 152 } 153 154 if ( empty( $_REQUEST['users'] ) ) { 155 $answer = array('result'=>'error', 'message'=>esc_html__('Empty users list', 'user-role-editor') ); 156 return $answer; 157 } 158 $users = (array) $_REQUEST['users']; 159 if ( !self::validate_users( $users ) ) { 160 $answer = array('result'=>'error', 'message'=>esc_html__('Can not edit user or invalid data at the users list', 'user-role-editor') ); 161 return $answer; 162 } 163 164 $lib = URE_Lib::get_instance(); 165 $role = $lib->get_request_var('role', 'post', 'string'); 141 166 if ( !self::validate_roles( array($role=>$role) ) ) { 142 return; 143 } 144 145 $done = false; 167 $answer = array('result'=>'error', 'message'=>esc_html__('Invalid role', 'user-role-editor') ); 168 return $answer; 169 } 170 171 $quantity = 0; 146 172 foreach( $users as $user_id ) { 147 173 $user = get_user_by( 'id', $user_id ); 148 if ( empty( $user ) ) {174 if ( empty( $user ) ) { 149 175 continue; 150 176 } 151 if ( $this->is_try_remove_admin_from_himself( $user_id, $role ) ) {177 if ( self::is_try_remove_admin_from_himself( $user_id, $role ) ) { 152 178 continue; 153 179 } 154 180 if ( is_array($user->roles) && in_array( $role, $user->roles ) ) { 155 181 $user->remove_role( $role ); 156 $done = true; 157 } 158 } 159 if ( $done ) { 160 if ( wp_redirect( add_query_arg( 'update', 'promote', 'users.php' ) ) ) { 161 exit; 162 } 163 } 182 $quantity++; 183 } 184 } 185 186 if ( $quantity>0 ) { 187 // translators: template %d is a quantity of users to whom role was added 188 $message = sprintf( esc_html__('Role revoked from %d user(s).', 'user-role-editor'), $quantity ); 189 $answer = array('result'=>'success', 'message'=>$message ); 190 } else { 191 $answer = array('result'=>'error', 'message'=>esc_html__('Error: Role not revoked', 'user-role-editor') ); 192 } 193 194 return $answer; 164 195 } 165 196 // end of revoke_role() … … 191 222 192 223 193 private static function validate_roles( $roles) {194 195 if ( !is_array($roles)) {224 private static function validate_roles( $roles ) { 225 226 if ( !is_array( $roles ) ) { 196 227 return false; 197 228 } … … 199 230 $lib = URE_Lib::get_instance(); 200 231 $editable_roles = $lib->get_all_editable_roles(); 201 $valid_roles = array_keys( $editable_roles);202 foreach( $roles as $role) {203 if ( !in_array($role, $valid_roles)) {232 $valid_roles = array_keys( $editable_roles ); 233 foreach( $roles as $role ) { 234 if ( !in_array( $role, $valid_roles ) ) { 204 235 return false; 205 236 } … … 299 330 300 331 $users = $_POST['users']; 301 if ( !self::validate_users($users)) {302 $answer = array('result'=>'error', 'message'=>esc_html__('Can not edit user or invalid data at the users list', 'user-role-editor') );332 if ( !self::validate_users( $users ) ) { 333 $answer = array('result'=>'error', 'message'=>esc_html__('Can not edit user or invalid data at the users list', 'user-role-editor') ); 303 334 return $answer; 304 335 } … … 441 472 ?> 442 473 443 <input type="button" name="ure_grant_roles<?php echo $button_number;?>" id="ure_grant_roles<?php echo $button_number;?>" class="button" 474 <input type="button" name="ure_grant_roles<?php echo $button_number;?>" id="ure_grant_roles<?php echo $button_number;?>" class="button" 444 475 value="<?php esc_html_e('Grant Roles', 'user-role-editor');?>"> 445 476 446 477 <label class="screen-reader-text" for="ure_add_role<?php echo $button_number;?>"><?php esc_html_e( 'Add role…', 'user-role-editor' ); ?></label> 447 478 <select name="ure_add_role<?php echo $button_number;?>" id="ure_add_role<?php echo $button_number;?>" style="display: inline-block; float: none;"> … … 449 480 <?php echo $roles_options_list; ?> 450 481 </select> 451 <?php submit_button( esc_html__( 'Add', 'user-role-editor' ), 'secondary', 'ure_add_role_submit'.$button_number, false ); ?> 482 <input type="button" name="ure_add_role_button<?php echo $button_number;?>" id="ure_add_role_button<?php echo $button_number;?>" class="button" 483 value="<?php esc_html_e('Add', 'user-role-editor');?>"> 452 484 453 485 <label class="screen-reader-text" for="ure_revoke_role<?php echo $button_number;?>"><?php esc_html_e( 'Revoke role…', 'user-role-editor' ); ?></label> … … 456 488 <?php echo $roles_options_list; ?> 457 489 </select> 458 <?php submit_button( esc_html__( 'Revoke', 'user-role-editor' ), 'secondary', 'ure_revoke_role_submit'.$button_number, false ); ?> 490 <input type="button" name="ure_revoke_role_button<?php echo $button_number;?>" id="ure_revoke_role_button<?php echo $button_number;?>" class="button" 491 value="<?php esc_html_e('Revoke', 'user-role-editor');?>"> 459 492 460 493 … … 491 524 'select_users_first' => esc_html__('Select users to which you wish to grant roles!', 'user-role-editor'), 492 525 'select_roles_first' => esc_html__('Select role(s) which you wish to grant!', 'user-role-editor'), 526 'select_role_first' => esc_html__('Select role first!', 'user-role-editor'), 527 'select_users_to_add_role' => esc_html__('Select users to which you wish to add role!', 'user-role-editor'), 528 'select_users_to_revoke_role' => esc_html__('Select users from which you wish revoke role!', 'user-role-editor'), 493 529 'show_wp_change_role' => $show_wp_change_role ? 1: 0 494 530 )); -
user-role-editor/trunk/js/users-grant-roles.js
r2715703 r3208188 11 11 ure_prepare_grant_roles_dialog(); 12 12 }); 13 jQuery('#ure_add_role_button').click(function() { 14 ure_add_role( 1 ); 15 }); 16 jQuery('#ure_add_role_button_2').click(function() { 17 ure_add_role( 2 ); 18 }); 19 jQuery('#ure_revoke_role_button').click(function() { 20 ure_revoke_role( 1 ); 21 }); 22 jQuery('#ure_revoke_role_button_2').click(function() { 23 ure_revoke_role( 2 ); 24 }); 25 13 26 14 27 if (ure_users_grant_roles_data.show_wp_change_role!=1) { … … 124 137 'primary_role': primary_role, 125 138 'other_roles': other_roles, 126 'wp_nonce': ure_users_grant_roles_data.wp_nonce}; 139 'wp_nonce': ure_users_grant_roles_data.wp_nonce 140 }; 141 jQuery.post(ajaxurl, data, ure_page_reload, 'json'); 142 143 return true; 144 } 145 146 147 function ure_add_role( control_number ) { 148 var users = ure_get_selected_checkboxes('users'); 149 if ( users.length===0 ) { 150 alert( ure_users_grant_roles_data.select_users_to_add_role ); 151 return; 152 } 153 154 var modifier = ( control_number===2 ) ? '_2' : ''; 155 var role = jQuery('#ure_add_role'+ modifier).val(); 156 if ( role.length===0 ) { 157 alert( ure_users_grant_roles_data.select_role_first ); 158 return; 159 } 160 161 jQuery('#ure_task_status').show(); 162 var data = { 163 'action': 'ure_ajax', 164 'sub_action':'add_role_to_user', 165 'users': users, 166 'role': role, 167 'wp_nonce': ure_users_grant_roles_data.wp_nonce 168 }; 169 jQuery.post(ajaxurl, data, ure_page_reload, 'json'); 170 171 return true; 172 } 173 174 175 function ure_revoke_role( control_number ) { 176 var users = ure_get_selected_checkboxes('users'); 177 if ( users.length===0 ) { 178 alert( ure_users_grant_roles_data.select_users_to_revoke_role ); 179 return; 180 } 181 182 var modifier = ( control_number===2 ) ? '_2' : ''; 183 var role = jQuery('#ure_revoke_role'+ modifier).val(); 184 if ( role.length===0 ) { 185 alert( ure_users_grant_roles_data.select_role_first ); 186 return; 187 } 188 189 jQuery('#ure_task_status').show(); 190 var data = { 191 'action': 'ure_ajax', 192 'sub_action':'revoke_role_from_user', 193 'users': users, 194 'role': role, 195 'wp_nonce': ure_users_grant_roles_data.wp_nonce 196 }; 127 197 jQuery.post(ajaxurl, data, ure_page_reload, 'json'); 128 198 … … 164 234 var url = ure_set_url_arg('update', 'promote'); 165 235 document.location = url; 166 } 236 237 } -
user-role-editor/trunk/readme.txt
r3202014 r3208188 82 82 83 83 == Changelog = 84 = [4.64.4] 15.12.2024 = 85 * Security Fix: Users - "Add Role", "Revoke Role" buttons: Cross-Site request forgery to privilege escalation was possible due to missed nonce validation. This issue was discovered and responsibly reported by vgo0. 84 86 85 87 = [4.64.3] 03.12.2024 = … … 87 89 * Fix: PHP Notice: "Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the <code>user-role-editor</code> domain was triggered too early." was fixed (shown only for those who used own .mo translation file installed). 88 90 * Fix: Miscellaneous translation functionality (l18n) usage enhancements were applied. 89 90 = [4.64.2] 19.02.2024 =91 * Update: Marked as compatible with WordPress 6.4.392 * Update: URE_Advertisement: rand() is replaced with wp_rand().93 * Update: URE_Ajax_Proccessor: json_encode() is replaced with wp_json_encode().94 * Update: User_Role_Editor::load_translation(): load_plugin_textdomain() is called with the 2nd parameter value false, instead of deprecated ''.95 * Update: URE_Lib::is_right_admin_path(): parse_url() is replaced with wp_parse_url().96 * Update: URE_Lib::user_is_admin() does not call WP_User::has_cap() to enhance performance.97 * Update: Plugin version was added to CSS loaded to the "Users", "Users->User Role Editor", "Settings->User Role Editor" pages.98 * Update: All JavaScript files are loaded in footer now.99 * Fix: "Users->Add New Users". Unneeded extra '<table></table>' HTML tags was removed (thanks to Alejandro A. for this bug report).100 101 = [4.64.1] 24.10.2023 =102 * Update: Marked as compatible with WordPress 6.4103 * Fix: Notice shown by PHP 8.3 is removed: PHP Deprecated: Creation of dynamic property URE_Editor::$hide_pro_banner is deprecated in /wp-content/plugins/user-role-editor/includes/classes/editor.php on line 166104 * Fix: Notice shown by PHP 8.3 is removed: PHP Deprecated: Creation of dynamic property URE_Role_View::$caps_to_remove is deprecated in /wp-content/plugins/user-role-editor/includes/classes/role-view.php on line 23105 * Fix: Notice shown by PHP 8.3 is removed: PHP Deprecated: Function utf8_decode() is deprecated in /wp-content/plugins/user-role-editor-pro/includes/classes/editor.php on line 984106 107 91 108 92 File changelog.txt contains the full list of changes. … … 116 100 == Upgrade Notice == 117 101 118 = [4.64.2] 19.02.2023 = 119 * Update: URE_Advertisement: rand() is replaced with wp_rand(). 120 * Update: URE_Ajax_Proccessor: json_encode() is replaced with wp_json_encode(). 121 * Update: User_Role_Editor::load_translation(): load_plugin_textdomain() is called with the 2nd parameter value false, instead of deprecated ''. 122 * Update: URE_Lib::is_right_admin_path(): parse_url() is replaced with wp_parse_url(). 123 * Update: URE_Lib::user_is_admin() does not call WP_User::has_cap() to enhance performance. 124 * Update: Plugin version was added to CSS loaded to the "Users", "Users->User Role Editor", "Settings->User Role Editor" pages. 125 * Update: All JavaScript files are loaded in footer now. 126 * Fix: "Users->Add New Users". Unneeded extra '<table></table>' HTML tags was removed (thanks to Alejandro A. for this bug report). 102 = [4.64.4] 15.12.2024 = 103 * Security Fix: Users - "Add Role", "Revoke Role" buttons: Cross-Site request forgery to privilege escalation was possible due to missed nonce validation. This issue was discovered and responsibly reported by vgo0.
Note: See TracChangeset
for help on using the changeset viewer.