Make WordPress Core

Ticket #5942: owner-role-r6947.patch

File owner-role-r6947.patch, 9.5 KB (added by tellyworth, 16 years ago)
  • wp-includes/version.php

     
    1616 *
    1717 * @global int $wp_db_version
    1818 */
    19 $wp_db_version = 6846;
     19$wp_db_version = 6848;
    2020
    2121?>
  • wp-includes/capabilities.php

     
    288288        switch ($cap) {
    289289        case 'delete_user':
    290290                $caps[] = 'delete_users';
     291                if ( !empty($args[0]) ) {
     292                        $user_to_delete = new WP_User($args[0]);
     293                        if ( $user_to_delete->has_cap('owner') )
     294                                $caps[] = 'delete_owner';
     295                }               
    291296                break;
    292297        case 'edit_user':
    293298                if ( !isset($args[0]) || $user_id != $args[0] ) {
    294299                        $caps[] = 'edit_users';
    295300                }
     301                if ( isset($args[0]) ) {
     302                        $user_to_edit = new WP_User($args[0]);
     303                        if ( $user_to_edit->has_cap('owner') )
     304                                $caps[] = 'edit_owner';
     305                }               
    296306                break;
    297307        case 'delete_post':
    298308                $author_data = get_userdata($user_id);
  • wp-content/plugins/transfer-ownership.php

     
     1<?php
     2/*
     3Plugin Name: Transfer Ownership
     4Plugin URI: http://wordpress.org/
     5Description: This provides a UI for the owner of a blog to transfer ownership to a different administrator.
     6Author: Alex Shiels
     7Version: 1.0
     8Author URI: http://thresholdstate.com/
     9*/
     10
     11class transfer_ownership {
     12       
     13        var $errors = array();
     14       
     15        function _show_errors() {
     16                if ( $this->errors ) {
     17                        echo '<div id="message" class="error">';
     18                        foreach ($this->errors as $err) {
     19                                echo "<p>{$err}</p>";
     20                        }
     21                        echo '</div>';
     22                }
     23        }
     24
     25        function transfer_ownership() {
     26                $this->reallydeleteblog = false;
     27                add_action('admin_menu', array(&$this, 'admin_menu'));
     28                add_action('admin_footer', array(&$this, 'admin_footer'));
     29        }
     30
     31        function admin_footer() {
     32                global $wpdb;
     33
     34                if( $this->reallydeleteblog == true ) {
     35                        wpmu_delete_blog( $wpdb->blogid );
     36                }
     37        }
     38
     39        function admin_menu() {
     40                add_submenu_page('users.php', __('Transfer Ownership'), __('Transfer Ownership'), 'transfer_ownership', 'transfer-ownership', array(&$this, 'plugin_content'));
     41        }
     42
     43        function plugin_content() {
     44                if ( !empty($_POST['confirm']) )
     45                        return $this->confirm_post();
     46                elseif ( !empty($_POST['transfer']) )
     47                        return $this->transfer_post();
     48                else
     49                        return $this->transfer_form();
     50        }
     51       
     52       
     53        function transfer_form() {
     54                global $current_user;
     55               
     56                $blogurl = get_option('home');
     57                $blogname = get_bloginfo('name');
     58               
     59                // find all the administrator users
     60                $users = get_users_of_blog();
     61                $administrators = array();
     62                foreach ($users as $user) {
     63                        $_user = new WP_User($user->user_id);
     64                        if ( $_user->has_cap('administrator') )
     65                                $administrators[] = $user;
     66                }
     67
     68                if ( count($administrators) < 2 ) { ?>
     69                        <div class="wrap">
     70                                <h2><?php _e('Transfer Ownership'); ?></h2>
     71                                <p><?php printf(__('You are currently the owner of <a href="%s">%s</a>.  You may use this page to transfer ownership of this blog to someone else.  First you need to make that person an Administrator.'), $blogurl); ?></p>
     72                        </div><?php
     73                        return;
     74                }
     75               
     76                ?>
     77<div class="wrap">
     78                <?php $this->_show_errors(); ?>
     79<h2><?php _e('Transfer Ownership'); ?></h2>
     80<p><?php printf(__('You are currently the owner of <a href="%s">%s</a>.  You may use this page to transfer ownership of this blog to another administrator.'), $blogurl, $blogname); ?></p>
     81<p><strong><?php _e('This is a permanent change that cannot be undone.'); ?></strong></p>
     82
     83<form method="POST" action="">
     84<h3><?php _e('New Owner:'); ?></h3>
     85<table class="widefat">
     86<tbody>
     87<tr class="thead">
     88        <th scope="col" class="check-column"></th>
     89        <th><?php _e('Username') ?></th>
     90        <th><?php _e('Name') ?></th>
     91        <th><?php _e('E-mail') ?></th>
     92</tr>
     93</tbody>
     94<tbody id="users" class="list:user user-list">
     95       
     96        <?php
     97        foreach ( $administrators as $candidate ) {
     98                echo "<tr>";
     99                $checked = '';
     100                if ( $candidate->user_id == $current_user->ID )
     101                        $checked = " checked='checked'";
     102                echo "<th scope='row' class='check-column'><input type='radio' name='new-owner' id='new-owner-{$candidate->user_id}' value='{$candidate->user_id}'{$checked} /></th>\n";
     103                echo "<td><label for='new-owner-{$candidate->user_id}'>{$candidate->user_login}</label></td>";
     104                echo "<td>{$candidate->first_name} {$candidate->last_name}</td>";
     105                echo "<td>{$candidate->user_email}</td>";
     106                echo "</tr>\n";
     107        }
     108        ?>
     109</tbody>
     110</table>
     111<?php wp_nonce_field('transfer-owner') ?>
     112<p class="submit"><input type="submit" name="transfer" value="<?php _e('Transfer'); ?>" /></p>
     113</form>
     114</div>
     115                <?php
     116        }
     117       
     118        function transfer_post() {
     119                check_admin_referer('transfer-owner');
     120               
     121                global $current_user;
     122               
     123                if ( $_POST['new-owner'] == $current_user->ID ) {
     124                        $this->errors[] = __('You are already the owner.');
     125                        return $this->transfer_form();
     126                }
     127               
     128                // no action, just show the confirmation form
     129                return $this->confirm_form();
     130        }
     131       
     132        function confirm_form() {
     133                $new_owner_id = intval($_POST['new-owner']);
     134                $new_owner = new WP_User($new_owner_id);
     135               
     136                ?>
     137<div class="wrap">
     138                <?php $this->_show_errors(); ?>
     139        <h2><?php _e('Confirm Transfer of Ownership'); ?></h2>
     140<p><?php printf( __('Please confirm that you would like to transfer ownership of the blog <a href="%s">%s</a> to %s (%s).'), get_option('home'), get_bloginfo('name'), $new_owner->user_login, $new_owner->user_email); ?>
     141</p>
     142<p><?php _e('You must enter your password to complete the transfer.'); ?></p>
     143<form method="POST" action="">
     144<p><label for="confirm-password"><?php _e('Password:'); ?></label>
     145        <input type="password" name="password" id="confirm-password" />
     146        <input type="hidden" name="new-owner" value="<?php echo $new_owner_id; ?>" />
     147        <?php wp_nonce_field('confirm-owner') ?>
     148</p>
     149<p class="submit"><input type="submit" name="confirm" value="<?php _e('Confirm'); ?>" /></p>
     150</form>
     151       
     152</div>
     153                <?php
     154        }
     155       
     156        function confirm_post() {
     157                check_admin_referer('confirm-owner');
     158                if ( !current_user_can('transfer_ownership') )
     159                        wp_die(__('You can&#8217;t transfer ownership.'));
     160                       
     161                global $current_user;
     162                $auth = wp_authenticate($current_user->user_login, $_POST['password']);
     163                if ( is_wp_error($auth) ) {
     164                        $this->errors[] = $auth->get_error_message();
     165                        return $this->confirm_form();
     166                }
     167                       
     168                $new_owner = new WP_User( intval($_POST['new-owner']) );
     169               
     170                // make sure the new owner is valid
     171                if ( empty($new_owner->ID) or !$new_owner->has_cap('administrator') ) {
     172                        $this->errors[] = __('Invalid user selected');
     173                        return $this->transfer_form();
     174                }
     175               
     176                // transfer ownership
     177                $new_owner->add_cap('owner');
     178                $current_user->remove_cap('owner');
     179               
     180                ?>
     181                        <div id="message" class="updated fade">
     182                                <p><?php printf( __('%s is the new owner of <a href="%s">%s</a>.'), $new_owner->user_login, get_option('home'), get_bloginfo('name') ); ?></p>
     183                        </div>
     184                <?
     185        }
     186}
     187
     188$transfer_ownership = new transfer_ownership();
     189
     190?>
     191 No newline at end of file
  • wp-admin/includes/schema.php

     
    416416        if ( !empty( $role ) ) {
    417417                $role->add_cap( 'edit_dashboard' );
    418418        }
     419
     420        if ( !get_role('owner') ) {
     421                add_role('owner', _c('Owner|User role'), array(
     422                        'edit_owner' => true,
     423                        'transfer_ownership' => true,
     424                ));
     425        }
    419426}
    420427
    421428?>
  • wp-admin/includes/template.php

     
    896896        global $wp_roles;
    897897        $r = '';
    898898        foreach( $wp_roles->role_names as $role => $name ) {
     899                if ( $role == 'owner' and !current_user_can('create_owner') )
     900                        continue;
    899901                $name = translate_with_context($name);
    900902                if ( $default == $role ) // Make default first in list
    901903                        $p = "\n\t<option selected='selected' value='$role'>$name</option>";
  • wp-admin/includes/upgrade.php

     
    4343
    4444        $user = new WP_User($user_id);
    4545        $user->set_role('administrator');
     46        $user->set_role('owner');
    4647
    4748        wp_install_defaults($user_id);
    4849
     
    197198
    198199        if ( $wp_current_db_version < 6124 )
    199200                upgrade_230_old_tables();
    200 
     201               
    201202        if ( $wp_current_db_version < 6689 )
    202203                upgrade_250();
    203204
     205        if ( $wp_current_db_version < 6848 )
     206                upgrade_owner();
     207
    204208        maybe_disable_automattic_widgets();
    205209
    206210        $wp_rewrite->flush_rules();
     
    727731        }
    728732}
    729733
     734function upgrade_owner() {
     735        global $wpdb;
     736       
     737        // find the owner and give them the role, starting with the admin_email
     738        if ( $admin_id = $wpdb->get_var($wpdb->prepare("SELECT ID FROM $wpdb->users WHERE user_email = %s", get_option('admin_email'))) ) {
     739                $admin = new WP_User($admin_id);
     740                $admin->add_role('owner');
     741        }
     742        else {
     743                // if there's only one admin, make her the owner
     744                $users = get_users_of_blog();
     745                $admins = array();
     746                foreach ($users as $user) {
     747                        $_user = new WP_User($user->ID);
     748                        if ( $_user->has_cap('administrator') )
     749                                $admins[] = $_user;
     750                }
     751                if ( count($admins) == 1 )
     752                        $admins[0]->add_role('owner');
     753        }
     754}
     755
    730756// The functions we use to actually do stuff
    731757
    732758// General