Make WordPress Core

Ticket #2775: 2775-pluggable.diff

File 2775-pluggable.diff, 13.0 KB (added by doit-cu, 18 years ago)

Make user management permissions pluggable.

  • wp-includes/version.php

     
    33// This just holds the version number, in a separate file so we can bump it without cluttering the SVN
    44
    55$wp_version = '2.1-alpha2';
    6 $wp_db_version = 3845;
     6$wp_db_version = 3859;
    77
    88?>
  • wp-includes/capabilities.php

     
    272272        $caps = array();
    273273
    274274        switch ($cap) {
    275         case 'delete_user':
    276                 $caps[] = 'delete_users';
     275        case 'external_edit_users':
     276                $caps[] = 'external_edit_users_real';
    277277                break;
    278         case 'edit_user':
    279                 $caps[] = 'edit_users';
    280                 break;
    281278        case 'delete_post':
    282279                $author_data = get_userdata($user_id);
    283280                //echo "post ID: {$args[0]}<br/>";
  • wp-admin/users.php

     
    2929                header('Location: ' . $redirect);
    3030        }
    3131
    32         if ( !current_user_can('edit_users') )
    33                 die(__('You can&#8217;t edit users.'));
     32        if ( !current_user_can('external_edit_users', null, $action, $_POST['new_role']) && !current_user_can('edit_users') )
     33                die(__('You can&#8217;t set that role.'));
    3434
    3535        $userids = $_POST['users'];
    3636        $update = 'promote';
    3737        foreach($userids as $id) {
    38                 if ( ! current_user_can('edit_user', $id) )
     38                if ( ! current_user_can('edit_users', $id) && ! current_user_can('external_edit_users', $id, 'promote', $_POST['new_role']) )
    3939                        die(__('You can&#8217;t edit that user.'));
    4040                // The new role of the current user must also have edit_users caps
    4141                if($id == $current_user->id && !$wp_roles->role_objects[$_POST['new_role']]->has_cap('edit_users')) {
     
    4343                        continue;
    4444                }
    4545
    46                 $user = new WP_User($id);
    47                 $user->set_role($_POST['new_role']);
    48         }
     46                if ( ! current_user_can('external_edit_users', $id, $action, $_POST['new_role']) && !current_user_can('edit_users') ){
     47                        die(__('You can&#8217;t edit that user.'));
     48                } else {
     49                        $user = new WP_User($id);
     50                        $user->set_role($_POST['new_role']);
     51                }
     52        }
    4953
    5054        header('Location: ' . add_query_arg('update', $update, $redirect));
    5155
     
    5963                header('Location: ' . $redirect);
    6064        }
    6165
    62         if ( !current_user_can('delete_users') )
     66        if ( !current_user_can('edit_users') && !current_user_can('external_edit_users', null, $action, null) )
    6367                die(__('You can&#8217;t delete users.'));
    6468
    6569        $userids = $_POST['users'];
    6670        $update = 'del';
    6771        $delete_count = 0;
    6872
    69         foreach ( (array) $userids as $id) {
    70                 if ( ! current_user_can('delete_user', $id) )
    71                         die(__('You can&#8217;t delete that user.'));
    72 
     73        foreach ($userids as $id) {
     74                if ( ! current_user_can('external_edit_users', $id, $action, null) && !current_user_can('edit_users') )
     75                        die(__('You can&#8217;t delete that user.'));
     76 
    7377                if($id == $current_user->id) {
    7478                        $update = 'err_admin_del';
    7579                        continue;
     
    98102        if ( empty($_POST['users']) )
    99103                header('Location: ' . $redirect);
    100104
    101         if ( !current_user_can('delete_users') )
     105        if ( !current_user_can('edit_users') )
    102106                $errors = new WP_Error('edit_users', __('You can&#8217;t delete users.'));
    103107
    104108        $userids = $_POST['users'];
     
    118122                $user = new WP_User($id);
    119123                if ( $id == $current_user->id ) {
    120124                        echo "<li>" . sprintf(__('ID #%1s: %2s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
     125                } elseif (!current_user_can('external_edit_users', $id, 'delete', null) && !current_user_can('edit_users')){
     126                        echo "<li>" . sprintf(__('ID #%1s: %2s <strong>This user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
    121127                } else {
    122128                        echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1s: %2s'), $id, $user->user_login) . "</li>\n";
    123129                        $go_delete = true;
     
    151157break;
    152158
    153159case 'adduser':
     160
    154161        check_admin_referer('add-user');
    155162
    156         if ( ! current_user_can('create_users') )
     163        if ( ! current_user_can('edit_users') && !current_user_can('external_edit_users', null, $action, $_POST['role']) )
    157164                die(__('You can&#8217;t create users.'));
    158165
    159166        $user_id = add_user();
     
    224231
    225232        // Make the user objects
    226233        foreach ( (array) $userids as $userid ) {
    227                 $tmp_user = new WP_User($userid);
    228                 $roles = $tmp_user->roles;
    229                 $role = array_shift($roles);
    230                 $roleclasses[$role][$tmp_user->user_login] = $tmp_user;
     234                if(current_user_can('external_edit_users', $userid, $action, null) || current_user_can('edit_users')){
     235                        $tmp_user = new WP_User($userid);
     236                        $roles = $tmp_user->roles;
     237                        $role = array_shift($roles);
     238                        $roleclasses[$role][$tmp_user->user_login] = $tmp_user;
     239                }
    231240        }
    232241
    233242        if ( isset($_GET['update']) ) :
     
    308317        <h3><?php printf(__('Results %1$s - %2$s of %3$s shown below'), $starton + 1, min($starton + $users_per_page, $total_users_for_this_query), $total_users_for_this_query); ?></h3>
    309318<table class="widefat">
    310319<?php
    311 foreach($roleclasses as $role => $roleclass) {
    312         ksort($roleclass);
     320if(count($roleclasses) > 0){
     321        foreach($roleclasses as $role => $roleclass) {
     322                ksort($roleclass);
     323
    313324?>
    314325
    315326<tr>
     
    333344?>
    334345
    335346</tbody>
    336 <?php } ?>
     347<?php
     348}
     349}
     350?>
    337351</table>
    338352
    339353<?php if ( $paging_text ) : ?>
     
    341355<?php endif; ?>
    342356
    343357        <h2><?php _e('Update Users'); ?></h2>
    344         <ul style="list-style:none;">
    345                 <li><input type="radio" name="action" id="action0" value="delete" /> <label for="action0"><?php _e('Delete checked users.'); ?></label></li>
    346                 <li>
    347                         <input type="radio" name="action" id="action1" value="promote" /> <label for="action1"><?php _e('Set the Role of checked users to:'); ?></label>
    348                         <select name="new_role"><?php wp_dropdown_roles(); ?></select>
    349                 </li>
    350         </ul>
     358  <ul style="list-style:none;">
     359        <li><input type="radio" name="action" id="action0" value="delete" /> <label for="action0"><?php _e('Delete checked users.'); ?></label></li>
     360        <li>
     361                <input type="radio" name="action" id="action1" value="promote" /> <label for="action1"><?php _e('Set the Role of checked users to:'); ?></label>
     362                <select name="new_role">
     363<?php
     364        foreach($wp_roles->role_names as $role => $name) {
     365                if(current_user_can('external_edit_users', null, 'promote', $role) || current_user_can('edit_users')){
     366                        $selected = ($role == get_settings('default_role')) ? ' selected="selected"' : '';
     367                        echo "<option value=\"{$role}\"{$selected}>{$name}</option>";
     368                }
     369        }
     370?>
     371</select>
     372        </li>
     373  </ul>
    351374        <p class="submit">
    352375                <?php echo $referer; ?>
    353376                <input type="submit" value="<?php _e('Update &raquo;'); ?>" />
     
    402425                <input name="pass2" type="password" id="pass2" /></td>
    403426        </tr>
    404427<?php endif; ?>
     428    <tr>
     429      <th scope="row"><?php _e('Role'); ?></th>
     430      <td><select name="role" id="role">
     431<?php
     432        foreach($wp_roles->role_names as $role => $name) {
     433                if(current_user_can('external_edit_users', null, 'promote', $role) || current_user_can('edit_users')){
     434                        $selected = ($role == get_settings('default_role')) ? ' selected="selected"' : '';
     435                        echo "<option value=\"{$role}\"{$selected}>{$name}</option>";
     436                }
     437        }
     438?>
     439</select></td>
     440    </tr>
     441  </table>
     442  <p class="submit">
     443    <input name="adduser" type="submit" id="addusersub" value="<?php _e('Add User &raquo;') ?>" />
     444  </p>
     445  </form>
    405446
    406         <tr>
    407                 <th scope="row"><?php _e('Role'); ?></th>
    408                 <td><select name="role" id="role">
    409                         <?php
    410                         if ( !$new_user_role )
    411                                 $new_user_role = get_settings('default_role');
    412                         wp_dropdown_roles($new_user_role);
    413                         ?>
    414                         </select>
    415                 </td>
    416         </tr>
    417 </table>
    418 <p class="submit">
    419         <?php echo $referer; ?>
    420         <input name="adduser" type="submit" id="addusersub" value="<?php _e('Add User &raquo;') ?>" />
    421 </p>
    422 </form>
    423 
    424447<?php if ( is_wp_error( $add_user_errors ) ) : ?>
    425448        <div class="error">
    426449                <ul>
     
    440463} // end of the $action switch
    441464
    442465include('admin-footer.php');
    443 ?>
    444  No newline at end of file
     466?>
  • wp-admin/admin-ajax.php

     
    210210        die($r);
    211211        break;
    212212case 'add-user' :
    213         if ( !current_user_can('edit_users') )
     213        if ( !current_user_can('edit_users') && !current_user_can('external_edit_users', null, 'adduser', $_POST['role']) )
    214214                die('-1');
    215215        require_once( ABSPATH . WPINC . '/registration-functions.php');
    216216        $user_id = add_user();
  • wp-admin/upgrade-functions.php

     
    173173        if ( $wp_current_db_version < 3308 )
    174174                upgrade_160();
    175175
    176         if ( $wp_current_db_version < 3845 )
     176        if ( $wp_current_db_version < 3859 )
    177177                upgrade_210();
    178178
    179179        $wp_rewrite->flush_rules();
     
    492492                }
    493493        }
    494494
    495         if ( $wp_current_db_version < 3845 ) {
     495        if ( $wp_current_db_version < 3859 ) {
    496496                populate_roles_210();
    497497        }
    498498
  • wp-admin/admin-functions.php

     
    414414
    415415        if (isset ($_POST['role'])) {
    416416                if($user_id != $current_user->id || $wp_roles->role_objects[$_POST['role']]->has_cap('edit_users'))
    417                         $user->role = $_POST['role'];
     417                        if(current_user_can('external_edit_users', $user_id, 'promote', $_POST['role']) || current_user_can('edit_users'))
     418                                $user->role = $_POST['role'];
    418419        }
    419420
    420421        if (isset ($_POST['email']))
     
    742743        }
    743744        $r .= "</td>\n\t\t<td>";
    744745        $edit_link = add_query_arg('wp_http_referer', wp_specialchars(urlencode(stripslashes($_SERVER['REQUEST_URI']))), "user-edit.php?user_id=$user_object->ID");
    745         if ( current_user_can('edit_user', $user_object->ID) )
     746        if ( current_user_can('edit_users', $user_object->ID) || current_user_can('external_edit_users', $user_object->ID, 'edit', null) )
    746747                $r .= "<a href='$edit_link' class='edit'>".__('Edit')."</a>";
    747748        $r .= "</td>\n\t</tr>";
    748749        return $r;
  • wp-admin/menu.php

     
    1010$menu[20] = array(__('Bookmarks'), 'manage_links', 'link-manager.php');
    1111$menu[25] = array(__('Presentation'), 'switch_themes', 'themes.php');
    1212$menu[30] = array(__('Plugins'), 'activate_plugins', 'plugins.php');
    13 if ( current_user_can('edit_users') )
     13if ( current_user_can('edit_users') || current_user_can('external_edit_users'))
    1414        $menu[35] = array(__('Users'), 'edit_users', 'users.php');
    1515else
    1616        $menu[35] = array(__('Profile'), 'read', 'profile.php');
     
    3737if ( current_user_can('edit_users') ) {
    3838        $submenu['users.php'][5] = array(__('Authors &amp; Users'), 'edit_users', 'users.php');
    3939        $submenu['users.php'][10] = array(__('Your Profile'), 'read', 'profile.php');
     40} elseif ( current_user_can('external_edit_users')) {
     41        $submenu['profile.php'][5] = array(__('Authors &amp; Users'), 'external_edit_users', 'users.php');
     42        $submenu['users.php'][10] = array(__('Your Profile'), 'read', 'profile.php');
    4043} else {
    4144        $submenu['profile.php'][5] = array(__('Your Profile'), 'read', 'profile.php');
    4245}
  • wp-admin/user-edit.php

     
    3939
    4040check_admin_referer('update-user_' . $user_id);
    4141
    42 if ( !current_user_can('edit_user', $user_id) )
     42if ( !current_user_can('external_edit_users', $user_id, 'edit', null) && !current_user_can('edit_users'))
    4343        $errors = new WP_Error('head', __('You do not have permission to edit this user.'));
    4444else
    4545        $errors = edit_user($user_id);
     
    5656
    5757$profileuser = new WP_User($user_id);
    5858
    59 if ( !current_user_can('edit_user', $user_id) )
     59if ( !current_user_can('external_edit_users', $user_id, 'edit', null) && !current_user_can('edit_users'))
    6060        if ( !is_wp_error( $errors ) )
    6161                $errors = new WP_Error('head', __('You do not have permission to edit this user.'));
    6262?>
     
    104104// print_r($profileuser);
    105105echo '<select name="role">';
    106106foreach($wp_roles->role_names as $role => $name) {
    107         $selected = ($profileuser->has_cap($role)) ? ' selected="selected"' : '';
    108         echo "<option value=\"{$role}\"{$selected}>{$name}</option>";
     107        if(current_user_can('external_edit_users', null, 'promote', $role) || current_user_can('edit_users')){
     108                $selected = ($profileuser->has_cap($role)) ? ' selected="selected"' : '';
     109                echo "<option value=\"{$role}\"{$selected}>{$name}</option>";
     110        }
    109111}
    110112echo '</select>';
    111113?></label></p>
  • wp-admin/upgrade-schema.php

     
    365365        }
    366366
    367367        $role = get_role('administrator');
    368         if ( ! empty($role) ) {
    369                 $role->add_cap('delete_users');
    370                 $role->add_cap('create_users');
    371         }
    372368
    373369        $role = get_role('author');
    374370        if ( ! empty($role) ) {