Make WordPress Core

Ticket #2775: 2775.diff

File 2775.diff, 5.6 KB (added by doit-cu, 18 years ago)
  • wp-includes/capabilities.php

     
    7777        {
    7878                return isset($this->role_names[$role]);
    7979        }
     80
     81        function compare_caps($role1, $role2){
     82                //make life easy on ourselves...
     83                $caps1 = array();
     84                $caps2 = array();
     85
     86                if(is_array($role1)){
     87                        foreach($role1 as $r1){
     88                                $caps1 = array_merge($this->roles[$r1]['capabilities'], $caps1);
     89                        }
     90                } else {
     91                        $caps1 = $this->roles[$role1]['capabilities'];
     92                }
     93                if(is_array($role2)){
     94                        foreach($role2 as $r2){
     95                                $caps2 = array_merge($this->roles[$r2]['capabilities'], $caps2);
     96                        }
     97                } else {
     98                        $caps2 = $this->roles[$role2]['capabilities'];
     99                }
     100       
     101                //if role1 and role2 are equal, return 0
     102                if(array_diff_assoc($caps1, $caps2) == array() && array_diff_assoc($caps2, $caps1) == array()){
     103                        return 0;
     104                }
     105
     106                //if role2 is a proper subset of role1, return 1
     107                if(array_diff_assoc($caps2, array_intersect_assoc($caps1, $caps2)) == array()){
     108                        return 1;
     109                }
     110
     111                //if role1 is a proper subset of role2, return -1
     112                if(array_diff_assoc($caps1, array_intersect_assoc($caps2, $caps1)) == array()){
     113                        return -1;
     114                }
     115
     116                //if role1 and role2 have exclusive elements, return 0
     117                return 0;
     118        }
    80119}
    81120
    82121class WP_Role {
  • wp-admin/users.php

     
    77
    88$action = $_REQUEST['action'];
    99$update = '';
     10global $wp_roles;
    1011
    1112switch ($action) {
    1213
     
    3031                }
    3132
    3233                $user = new WP_User($id);
    33                 $user->set_role($_POST['new_role']);
     34
     35                if($wp_roles->compare_caps($current_user->roles, $user->roles) !== 1){
     36                        die(__('You do not have permission to edit '.$user->user_login.'.'));
     37                } elseif ($wp_roles->compare_caps($current_user->roles, $_POST['new_role']) !== 1){
     38                        die(__('You do not have permission to set role '.$_POST['new_role'].'.'));
     39                } else {
     40                        $user->set_role($_POST['new_role']);
     41                }
    3442        }
    3543
    3644        header('Location: users.php?update=' . $update);
     
    5664                        $update = 'err_admin_del';
    5765                        continue;
    5866                }
     67
     68                $user = new WP_User($id);
     69
     70                if($wp_roles->compare_caps($current_user->roles, $user->roles) !== 1){
     71                        die(__('You do not have permission to edit '.$user->user_login.'.'));
     72                }
     73
    5974                switch($_POST['delete_option']) {
    6075                case 'delete':
    6176                        wp_delete_user($id);
     
    8398
    8499        $userids = $_POST['users'];
    85100
     101        $cannot_delete = array();
     102        $cannot_delete_names = array();
     103        foreach($userids as $userid){
     104                $user = new WP_User($userid);
     105                if($wp_roles->compare_caps($current_user->roles, $user->roles)!==1){
     106                        array_push($cannot_delete, $userid);
     107                        array_push($cannot_delete_names, $user->user_login);
     108                }
     109        }
     110
     111        $userids = array_diff($userids, $cannot_delete);
     112        if($cannot_delete !== array()){
     113                $error = new WP_Error('edit_users', __('You cannot delete the following users: '.explode(',', $cannot_delete_names).'.'));
     114        }
     115
    86116        include ('admin-header.php');
    87117?>
    88118<form action="" method="post" name="updateusers" id="updateusers">
     
    151181
    152182        foreach($userids as $userid) {
    153183                $tmp_user = new WP_User($userid);
    154                 $roles = $tmp_user->roles;
    155                 $role = array_shift($roles);
    156                 $roleclasses[$role][$tmp_user->user_login] = $tmp_user;
     184                if($wp_roles->compare_caps($current_user->roles, $tmp_user->roles) === 1){
     185                        $roles = $tmp_user->roles;
     186                        $role = array_shift($roles);
     187                        $roleclasses[$role][$tmp_user->user_login] = $tmp_user;
     188                }
    157189        }
    158190
    159191        ?>
     
    209241        <h2><?php _e('User List by Role'); ?></h2>
    210242<table class="widefat">
    211243<?php
    212 foreach($roleclasses as $role => $roleclass) {
    213         ksort($roleclass);
     244if($roleclasses != array()){
     245        foreach($roleclasses as $role => $roleclass) {
     246                ksort($roleclass);
    214247?>
    215248
    216249<tr>
     
    238271
    239272</tbody>
    240273<?php
     274        }
    241275}
    242276?>
    243277</table>
     
    295329<?php endif; ?>
    296330    <tr>
    297331      <th scope="row"><?php _e('Role'); ?></th>
    298       <td><select name="role" id="role"><?php wp_dropdown_roles( get_settings('default_role') ); ?></select></td>
     332      <td><select name="role" id="role">
     333<?php
     334        foreach($wp_roles->role_names as $role => $name) {
     335                if($wp_roles->compare_caps($current_user->roles, $role)===1){
     336                        $selected = ($role == get_settings('default_role')) ? ' selected="selected"' : '';
     337                        echo "<option value=\"{$role}\"{$selected}>{$name}</option>";
     338                }
     339        }
     340?>
     341</select></td>
    299342    </tr>
    300343  </table>
    301344  <p class="submit">
  • wp-admin/user-edit.php

     
    2121        }
    2222}
    2323
     24global $wp_roles;
     25
    2426switch ($action) {
    2527case 'switchposts':
    2628
     
    3436
    3537check_admin_referer('update-user_' . $user_id);
    3638
    37 if (!current_user_can('edit_users'))
     39$profileuser = new WP_User($user_id);
     40
     41if (!current_user_can('edit_users') || $wp_roles->compare_caps($current_user->roles, $profileuser->roles) !== 1)
    3842        $errors = new WP_Error('head', __('You do not have permission to edit this user.'));
    3943else
    4044        $errors = edit_user($user_id);
     
    4953
    5054$profileuser = new WP_User($user_id);
    5155
    52 if (!current_user_can('edit_users'))
     56if (!current_user_can('edit_users') || $wp_roles->compare_caps($current_user->roles, $profileuser->roles) !== 1)
    5357        if ( !is_wp_error( $errors ) )
    5458                $errors = new WP_Error('head', __('You do not have permission to edit this user.'));
    5559?>
     
    6872        ?>
    6973        </ul>
    7074</div>
    71 <?php endif; ?>
     75<?php else: ?>
    7276
    7377<div class="wrap">
    7478<h2><?php _e('Edit User'); ?></h2>
     
    200204 </p>
    201205</form>
    202206</div>
     207<?php endif; ?>
    203208<?php
    204209break;
    205210}