WordPress.org

Make WordPress Core

Ticket #5540: user_role-r6506.patch

File user_role-r6506.patch, 8.1 KB (added by tellyworth, 10 years ago)
  • wordpress/wp-includes/wp-db.php

     
    3333        var $options;
    3434        var $postmeta;
    3535        var $usermeta;
     36        var $user_role;
    3637        var $terms;
    3738        var $term_taxonomy;
    3839        var $term_relationships;
    39         var $tables = array('users', 'usermeta', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options',
     40        var $tables = array('users', 'usermeta', 'user_role', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options',
    4041                        'postmeta', 'terms', 'term_taxonomy', 'term_relationships');
    4142        var $charset;
    4243        var $collate;
  • wordpress/wp-includes/version.php

     
    33// This holds the version number in a separate file so we can bump it without cluttering the SVN
    44
    55$wp_version = '2.4-bleeding';
    6 $wp_db_version = 6124;
     6$wp_db_version = 6506;
    77
    88?>
  • wordpress/wp-includes/capabilities.php

     
    178178                if ( ! isset($wp_roles) )
    179179                        $wp_roles = new WP_Roles();
    180180
    181                 //Filter out caps that are not role names and assign to $this->roles
     181                //This handles the old usermeta capabilities if present
    182182                if(is_array($this->caps))
    183183                        $this->roles = array_filter(array_keys($this->caps), array(&$wp_roles, 'is_role'));
     184               
     185                // Fetch roles from the user_role table
     186                global $wpdb, $blog_id;
     187                $user_id = intval($this->ID);
     188                $roles = $wpdb->get_col("SELECT role FROM {$wpdb->user_role} WHERE blog_id = {$blog_id} AND user_id = {$user_id}");
     189                if ($roles)
     190                        $this->roles = array_filter($roles, array(&$wp_roles, 'is_role'));
    184191
    185192                //Build $allcaps from role caps, overlay user's $caps
    186193                $this->allcaps = array();
    187194                foreach( (array) $this->roles as $role) {
     195                        $this->allcaps[$role] = true;
    188196                        $role = $wp_roles->get_role($role);
    189197                        $this->allcaps = array_merge($this->allcaps, $role->capabilities);
    190198                }
     
    192200        }
    193201
    194202        function add_role($role) {
     203                if ( !is_role($role) )
     204                        return new WP_Error( 'invalid_user_role', sprintf(__('Invalid user role: %s'), $role) );
     205                       
    195206                $this->caps[$role] = true;
    196                 update_usermeta($this->ID, $this->cap_key, $this->caps);
     207                global $wpdb, $blog_id;
     208                $user_id = intval($this->ID);
     209                $role = $wpdb->escape($role);
     210                $wpdb->query( "INSERT INTO {$wpdb->user_role} (blog_id, user_id, role) VALUES ({$blog_id}, {$user_id}, '{$role}')" );
    197211                $this->get_role_caps();
    198212                $this->update_user_level_from_caps();
    199213        }
    200214
    201215        function remove_role($role) {
    202                 if ( empty($this->roles[$role]) || (count($this->roles) <= 1) )
    203                         return;
    204216                unset($this->caps[$role]);
    205                 update_usermeta($this->ID, $this->cap_key, $this->caps);
     217                global $wpdb, $blog_id;
     218                $user_id = intval($this->ID);
     219                $role = $wpdb->escape($role);
     220                $wpdb->query( "DELETE FROM {$wpdb->user_role} WHERE blog_id = {$blog_id} AND user_id = {$user_id} AND role = '{$role}'" );
    206221                $this->get_role_caps();
    207222        }
    208223
    209224        function set_role($role) {
    210                 foreach($this->roles as $oldrole)
    211                         unset($this->caps[$oldrole]);
     225                foreach($this->roles as $oldrole) {
     226                        if ($oldrole != $role)
     227                                $this->remove_role($oldrole);
     228                }
    212229                if ( !empty($role) ) {
    213                         $this->caps[$role] = true;
    214                         $this->roles = array($role => true);
     230                        if ( !in_array($role, $this->roles) )
     231                                $this->add_role($role);
    215232                } else {
    216233                        $this->roles = false;
    217234                }
    218                 update_usermeta($this->ID, $this->cap_key, $this->caps);
    219                 $this->get_role_caps();
    220                 $this->update_user_level_from_caps();
    221235        }
    222236
    223237        function level_reduction($max, $item) {
     
    259273        function has_cap($cap) {
    260274                if ( is_numeric($cap) )
    261275                        $cap = $this->translate_level_to_cap($cap);
    262 
     276                       
    263277                $args = array_slice(func_get_args(), 1);
    264278                $args = array_merge(array($cap, $this->ID), $args);
    265279                $caps = call_user_func_array('map_meta_cap', $args);
     
    481495        return $wp_roles->remove_role($role);
    482496}
    483497
     498function is_role($role) {
     499        global $wp_roles;
     500
     501        if ( ! isset($wp_roles) )
     502                $wp_roles = new WP_Roles();
     503
     504        return $wp_roles->is_role($role);
     505}
     506
    484507?>
  • wordpress/wp-includes/user.php

     
    5252        global $wpdb, $blog_id;
    5353        if ( empty($id) )
    5454                $id = (int) $blog_id;
    55         $users = $wpdb->get_results( "SELECT user_id, user_login, display_name, user_email, meta_value FROM $wpdb->users, $wpdb->usermeta WHERE " . $wpdb->users . ".ID = " . $wpdb->usermeta . ".user_id AND meta_key = '" . $wpdb->prefix . "capabilities' ORDER BY {$wpdb->usermeta}.user_id" );
     55        $users = $wpdb->get_results( "SELECT user_id, user_login, display_name, user_email, meta_value FROM {$wpdb->users}, {$wpdb->user_role} WHERE {$wpdb->users}.ID = {$wpdb->user_role}.user_id ORDER BY {$wpdb->user_role}.user_id" );
    5656        return $users;
    5757}
    5858
  • wordpress/wp-admin/includes/schema.php

     
    143143  PRIMARY KEY  (umeta_id),
    144144  KEY user_id (user_id),
    145145  KEY meta_key (meta_key)
    146 ) $charset_collate;";
     146) $charset_collate;
     147CREATE TABLE IF NOT EXISTS $wpdb->user_role (
     148  user_role_id bigint(20) NOT NULL auto_increment,
     149  blog_id bigint(20) NOT NULL default '0',
     150  user_id bigint(20) NOT NULL default '0',
     151  role varchar(32) NOT NULL default '',
     152  PRIMARY KEY  (user_role_id),
     153  KEY user_blog (blog_id,user_id),
     154  KEY user_id (user_id)
     155) $charset_collate;
     156";
    147157
    148158function populate_options() {
    149159        global $wpdb, $wp_db_version;
  • wordpress/wp-admin/includes/user.php

     
    266266
    267267        $wpdb->query("DELETE FROM $wpdb->users WHERE ID = $id");
    268268        $wpdb->query("DELETE FROM $wpdb->usermeta WHERE user_id = '$id'");
     269        $wpdb->query("DELETE FROM $wpdb->user_role WHERE user_id = '$id'");
    269270
    270271        wp_cache_delete($id, 'users');
    271272        wp_cache_delete($user->user_login, 'userlogins');
  • wordpress/wp-admin/includes/upgrade.php

     
    197197
    198198        if ( $wp_current_db_version < 6124 )
    199199                upgrade_230_old_tables();
     200               
     201        global $wpdb, $blog_id;
     202        if ( $wp_current_db_version < 6506 )
     203                upgrade_user_roles($wpdb->prefix, $blog_id);
    200204
    201205        maybe_disable_automattic_widgets();
    202206
     
    715719        $wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'");
    716720}
    717721
     722function upgrade_user_roles($prefix, $blog_id) {
     723        // convert the old capabilities usermeta into user_role rows
     724        // old usermeta rows are removed
     725       
     726        global $wpdb;
     727        $prefix = $wpdb->escape($prefix);
     728        $blog_id = intval($blog_id);
     729        $users = $wpdb->get_results( "SELECT umeta_id, user_id, meta_value FROM {$wpdb->usermeta} WHERE meta_key = '{$prefix}capabilities' ORDER BY {$wpdb->usermeta}.user_id" );
    718730
     731        foreach ($users as $user) {
     732                // find any usermeta capabilites that are roles, and insert them as user_role rows
     733                $caps = unserialize($user->meta_value);
     734                foreach ( $caps as $cap => $active ) {
     735                        if ( is_role($cap) ) {
     736                                if ($active) {
     737                                        $role = strtolower($cap);
     738                                        $wpdb->insert( $wpdb->user_role, array('blog_id' => $blog_id, 'user_id' => $user->user_id, 'role' => $role) );
     739                                }
     740                                unset( $caps[$cap] );
     741                        }
     742
     743                }
     744
     745                // write any remaining caps as usermeta capabilities
     746                $newcaps = maybe_serialize($caps);
     747                $wpdb->update( $wpdb->usermeta, array('meta_value' => $newcaps), array('umeta_id' => $user->umeta_id) );
     748                wp_cache_delete($user->user_id, 'users');
     749        }
     750}
     751
    719752// The functions we use to actually do stuff
    720753
    721754// General