Make WordPress Core

Ticket #2775: 2775-pluggable-meta-caps2.diff

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

     
    276276        $caps = array();
    277277
    278278        switch ($cap) {
    279         case 'delete_user':
    280                 $caps[] = 'delete_users';
    281                 break;
    282         case 'edit_user':
    283                 $caps[] = 'edit_users';
    284                 break;
    285279        case 'delete_post':
    286280                $author_data = get_userdata($user_id);
    287281                //echo "post ID: {$args[0]}<br/>";
     
    423417                        $caps[] = 'read_private_pages';
    424418                break;
    425419        default:
    426                 // If no meta caps match, return the original cap.
    427                 $caps[] = $cap;
     420                // If no meta caps match, see if any plugin caps match.
     421                $plugin_caps = apply_filters('maps_cap', $cap, $user_id, $args);
     422                if(is_array($plugin_caps)){
     423                        $caps = array_merge($caps, $plugin_caps);
     424                } else {
     425                        $caps[] = $cap;
     426                }
    428427        }
    429428
    430429        return $caps;
  • wp-admin/users.php

     
    127127                wp_redirect($redirect);
    128128        }
    129129
    130         if ( !current_user_can('edit_users') )
     130        if ( !current_user_can('edit_users', array('target_id'=>null, 'action'=>$action, 'target_state'=>$_POST['new_role'])) )
    131131                wp_die(__('You can&#8217;t edit users.'));
    132132
    133133        $userids = $_POST['users'];
    134134        $update = 'promote';
    135135        foreach($userids as $id) {
    136                 if ( ! current_user_can('edit_user', $id) )
     136                if ( !current_user_can('edit_users', array('target_id'=>$id, 'action'=>$action, 'target_state'=>$_POST['new_role'])) )
    137137                        wp_die(__('You can&#8217;t edit that user.'));
    138138                // The new role of the current user must also have edit_users caps
    139139                if($id == $current_user->id && !$wp_roles->role_objects[$_POST['new_role']]->has_cap('edit_users')) {
     
    141141                        continue;
    142142                }
    143143
    144                 $user = new WP_User($id);
    145                 $user->set_role($_POST['new_role']);
    146         }
     144                if ( !current_user_can('edit_users', array('target_id'=>$id, 'action'=>$action, 'target_state'=>$_POST['new_role'])) ) {
     145                        die(__('You can&#8217;t edit that user.'));
     146                } else {
     147                        $user = new WP_User($id);
     148                        $user->set_role($_POST['new_role']);
     149                }
     150        }
    147151
    148152        wp_redirect(add_query_arg('update', $update, $redirect));
    149153
     
    157161                wp_redirect($redirect);
    158162        }
    159163
    160         if ( !current_user_can('delete_users') )
     164        if ( !current_user_can('edit_users', array('target_id'=>null, 'action'=>$action, 'target_state'=>null)) )
    161165                wp_die(__('You can&#8217;t delete users.'));
    162166
    163167        $userids = $_POST['users'];
    164168        $update = 'del';
    165169        $delete_count = 0;
    166170
    167         foreach ( (array) $userids as $id) {
    168                 if ( ! current_user_can('delete_user', $id) )
     171        foreach ($userids as $id) {
     172                if ( !current_user_can('edit_users', array('target_id'=>$id, 'action'=>$action, 'target_state'=>null)) )
    169173                        wp_die(__('You can&#8217;t delete that user.'));
    170 
     174 
    171175                if($id == $current_user->id) {
    172176                        $update = 'err_admin_del';
    173177                        continue;
     
    196200        if ( empty($_POST['users']) )
    197201                wp_redirect($redirect);
    198202
    199         if ( !current_user_can('delete_users') )
     203        if ( !current_user_can('edit_users') )
    200204                $errors = new WP_Error('edit_users', __('You can&#8217;t delete users.'));
    201205
    202206        $userids = $_POST['users'];
     
    216220                $user = new WP_User($id);
    217221                if ( $id == $current_user->id ) {
    218222                        echo "<li>" . sprintf(__('ID #%1s: %2s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
     223                } elseif (!current_user_can('edit_users', array('target_id'=>$id, 'action'=>'delete', 'target_state'=>null))){
     224                        echo "<li>" . sprintf(__('ID #%1s: %2s <strong>This user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
    219225                } else {
    220226                        echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1s: %2s'), $id, $user->user_login) . "</li>\n";
    221227                        $go_delete = true;
     
    249255break;
    250256
    251257case 'adduser':
     258
    252259        check_admin_referer('add-user');
    253260
    254         if ( ! current_user_can('create_users') )
     261        if ( ! current_user_can('edit_users', array('target_id'=>null, 'action'=>$action, 'target_state'=>$_POST['role'])) )
    255262                wp_die(__('You can&#8217;t create users.'));
    256263
    257264        $user_id = add_user();
     
    275282
    276283        // Make the user objects
    277284        foreach ( $wp_user_search->get_results() as $userid ) {
    278                 $tmp_user = new WP_User($userid);
    279                 $roles = $tmp_user->roles;
    280                 $role = array_shift($roles);
    281                 $roleclasses[$role][$tmp_user->user_login] = $tmp_user;
     285                if(current_user_can('edit_users', array('target_id'=>$userid, 'action'=>$action, 'target_state'=>null))){
     286                        $tmp_user = new WP_User($userid);
     287                        $roles = $tmp_user->roles;
     288                        $role = array_shift($roles);
     289                        $roleclasses[$role][$tmp_user->user_login] = $tmp_user;
     290                }
    282291        }
    283292
    284293        if ( isset($_GET['update']) ) :
     
    372381<?php wp_nonce_field('bulk-users') ?>
    373382<table class="widefat">
    374383<?php
    375 foreach($roleclasses as $role => $roleclass) {
    376         ksort($roleclass);
     384if(count($roleclasses) > 0){
     385        foreach($roleclasses as $role => $roleclass) {
     386                ksort($roleclass);
     387
    377388?>
    378389
    379390<tr>
     
    401412?>
    402413
    403414</tbody>
    404 <?php } ?>
     415<?php
     416}
     417}
     418?>
    405419</table>
    406420
    407421<?php if ( $wp_user_search->results_are_paged() ) : ?>
     
    409423<?php endif; ?>
    410424
    411425        <h2><?php _e('Update Users'); ?></h2>
    412         <ul style="list-style:none;">
    413                 <li><input type="radio" name="action" id="action0" value="delete" /> <label for="action0"><?php _e('Delete checked users.'); ?></label></li>
    414                 <li>
    415                         <input type="radio" name="action" id="action1" value="promote" /> <label for="action1"><?php _e('Set the Role of checked users to:'); ?></label>
    416                         <select name="new_role" onchange="getElementById('action1').checked = 'true'"><?php wp_dropdown_roles(); ?></select>
    417                 </li>
    418         </ul>
     426  <ul style="list-style:none;">
     427        <li><input type="radio" name="action" id="action0" value="delete" /> <label for="action0"><?php _e('Delete checked users.'); ?></label></li>
     428        <li>
     429                <input type="radio" name="action" id="action1" value="promote" /> <label for="action1"><?php _e('Set the Role of checked users to:'); ?></label>
     430                <select name="new_role" onchange="getElementByID('action1').checked = 'true'">
     431<?php
     432        foreach($wp_roles->role_names as $role => $name) {
     433                if(current_user_can('edit_users', array('target_id'=>null, 'action'=>'promote', 'target_state'=>$role))){
     434                        $selected = ($role == get_settings('default_role')) ? ' selected="selected"' : '';
     435                        echo "<option value=\"{$role}\"{$selected}>{$name}</option>";
     436                }
     437        }
     438?>
     439</select>
     440        </li>
     441  </ul>
    419442        <p class="submit" style="width: 420px">
    420443                <?php echo $referer; ?>
    421444                <input type="submit" value="<?php _e('Bulk Update &raquo;'); ?>" />
     
    469492                <input name="pass2" type="password" id="pass2" /></td>
    470493        </tr>
    471494<?php endif; ?>
     495    <tr>
     496      <th scope="row"><?php _e('Role'); ?></th>
     497      <td><select name="role" id="role">
     498<?php
     499        foreach($wp_roles->role_names as $role => $name) {
     500                if(current_user_can('edit_users', array('target_id'=>null, 'action'=>'promote', 'target_state'=>$role))){
     501                        $selected = ($role == get_settings('default_role')) ? ' selected="selected"' : '';
     502                        echo "<option value=\"{$role}\"{$selected}>{$name}</option>";
     503                }
     504        }
     505?>
     506</select></td>
     507    </tr>
     508  </table>
     509  <p class="submit">
     510    <input name="adduser" type="submit" id="addusersub" value="<?php _e('Add User &raquo;') ?>" />
     511  </p>
     512  </form>
    472513
    473         <tr>
    474                 <th scope="row"><?php _e('Role'); ?></th>
    475                 <td><select name="role" id="role">
    476                         <?php
    477                         if ( !$new_user_role )
    478                                 $new_user_role = get_settings('default_role');
    479                         wp_dropdown_roles($new_user_role);
    480                         ?>
    481                         </select>
    482                 </td>
    483         </tr>
    484 </table>
    485 <p class="submit">
    486         <?php echo $referer; ?>
    487         <input name="adduser" type="submit" id="addusersub" value="<?php _e('Add User &raquo;') ?>" />
    488 </p>
    489 </form>
    490 
    491514<?php if ( is_wp_error( $add_user_errors ) ) : ?>
    492515        <div class="error">
    493516                <ul>
     
    507530} // end of the $action switch
    508531
    509532include('admin-footer.php');
    510 ?>
    511  No newline at end of file
     533?>
  • wp-admin/admin-ajax.php

     
    199199        die($r);
    200200        break;
    201201case 'add-user' :
    202         if ( !current_user_can('edit_users') )
     202        if ( !current_user_can('edit_users', array('target_id'=>null, 'action'=>$_POST['action'], 'target_state'=>$_POST['role'])) )
    203203                die('-1');
    204204        require_once(ABSPATH . WPINC . '/registration.php');
    205205        $user_id = add_user();
  • wp-admin/admin-functions.php

     
    415415
    416416        if (isset ($_POST['role']) && current_user_can('edit_users')) {
    417417                if($user_id != $current_user->id || $wp_roles->role_objects[$_POST['role']]->has_cap('edit_users'))
    418                         $user->role = $_POST['role'];
     418                        if(current_user_can('edit_users', array('target_id'=>$user_id, $action=>'promote', 'target_state'=>$_POST['role'])))
     419                                $user->role = $_POST['role'];
    419420        }
    420421
    421422        if (isset ($_POST['email']))
     
    791792        }
    792793        $r .= "</td>\n\t\t<td>";
    793794        $edit_link = add_query_arg('wp_http_referer', wp_specialchars(urlencode(stripslashes($_SERVER['REQUEST_URI']))), "user-edit.php?user_id=$user_object->ID");
    794         if ( current_user_can('edit_user', $user_object->ID) )
     795        if ( current_user_can('edit_users', array('target_id'=>$user_object->ID, 'action'=>'edit', 'target_state'=>null)) )
    795796                $r .= "<a href='$edit_link' class='edit'>".__('Edit')."</a>";
    796797        $r .= "</td>\n\t</tr>";
    797798        return $r;
  • wp-admin/user-edit.php

     
    2525
    2626check_admin_referer('update-user_' . $user_id);
    2727
    28 if ( !current_user_can('edit_user', $user_id) )
     28if ( !current_user_can('edit_users', array('target_id'=>$user_id, 'action'=>$action, 'target_state'=>null)))
    2929        $errors = new WP_Error('head', __('You do not have permission to edit this user.'));
    3030else
    3131        $errors = edit_user($user_id);
     
    4242
    4343$profileuser = new WP_User($user_id);
    4444
    45 if ( !current_user_can('edit_user', $user_id) )
     45if ( !current_user_can('edit_users', array('target_id'=>$user_id, 'action'=>'edit', 'target_state'=>null)))
    4646        if ( !is_wp_error( $errors ) )
    4747                $errors = new WP_Error('head', __('You do not have permission to edit this user.'));
    4848?>
     
    9292$role_list = '';
    9393$user_has_role = false;
    9494foreach($wp_roles->role_names as $role => $name) {
    95         if ( $profileuser->has_cap($role) ) {
    96                 $selected = ' selected="selected"';
    97                 $user_has_role = true;
    98         } else {
    99                 $selected = '';
     95        if(current_user_can('edit_users', array('target_id'=>null, 'action'=>'promote', 'target_state'=>$role))){
     96                if ( $profileuser->has_cap($role) ) {
     97                        $selected = ' selected="selected"';
     98                        $user_has_role = true;
     99                } else {
     100                        $selected = '';
     101                }
     102                $role_list .= "<option value=\"{$role}\"{$selected}>{$name}</option>";
    100103        }
    101         $role_list .= "<option value=\"{$role}\"{$selected}>{$name}</option>";
    102104}
    103105if ( $user_has_role )
    104106        $role_list .= '<option value="">' . __('&mdash; No role for this blog &mdash;') . '</option>';
  • wp-admin/upgrade-schema.php

     
    364364                $role->add_cap('read_private_pages');
    365365        }
    366366
    367         $role = get_role('administrator');
    368         if ( ! empty($role) ) {
    369                 $role->add_cap('delete_users');
    370                 $role->add_cap('create_users');
    371         }
    372 
    373367        $role = get_role('author');
    374368        if ( ! empty($role) ) {
    375369                $role->add_cap('delete_posts');