WordPress.org

Make WordPress Core

Ticket #38412: 38412.5.diff

File 38412.5.diff, 5.2 KB (added by tharsheblows, 4 years ago)

respect filter on object meta, unit test

  • src/wp-includes/capabilities.php

     
    297297                        break;
    298298                }
    299299
    300                 $caps = map_meta_cap( "edit_{$object_type}", $user_id, $object_id );
    301 
    302300                $meta_key = isset( $args[1] ) ? $args[1] : false;
    303301
    304302                $has_filter = has_filter( "auth_{$object_type}_meta_{$meta_key}" ) || has_filter( "auth_{$object_type}_{$sub_type}_meta_{$meta_key}" );
     
    314312                        }
    315313                } elseif ( $meta_key && is_protected_meta( $meta_key, $object_type ) ) {
    316314                        $caps[] = $cap;
     315                } else {
     316                        $caps = map_meta_cap( "edit_{$object_type}", $user_id, $object_id );
    317317                }
    318318                break;
    319319        case 'edit_comment':
  • src/wp-includes/meta.php

     
    10341034        $args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key );
    10351035        $args = wp_parse_args( $args, $defaults );
    10361036
    1037         // If `auth_callback` is not provided, fall back to `is_protected_meta()`.
    1038         if ( empty( $args['auth_callback'] ) ) {
    1039                 if ( is_protected_meta( $meta_key, $object_type ) ) {
    1040                         $args['auth_callback'] = '__return_false';
    1041                 } else {
    1042                         $args['auth_callback'] = '__return_true';
    1043                 }
    1044         }
    1045 
    10461037        // Back-compat: old sanitize and auth callbacks are applied to all of an object type.
    10471038        if ( is_callable( $args['sanitize_callback'] ) ) {
    10481039                add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 3 );
  • tests/phpunit/tests/meta/registerMeta.php

     
    44 */
    55class Tests_Meta_Register_Meta extends WP_UnitTestCase {
    66        protected static $post_id;
     7        protected static $users;
    78
    89        public static function wpSetUpBeforeClass( $factory ) {
    910                self::$post_id = $factory->post->create();
     11                self::$users = array(
     12                        'administrator' => $factory->user->create_and_get( array( 'role' => 'administrator' ) ),
     13                        'subscriber'        => $factory->user->create_and_get( array( 'role' => 'subscriber' ) ),
     14                );
    1015        }
    1116
    1217        public function _old_sanitize_meta_cb( $meta_value, $meta_key, $meta_type ) {
     
    7479                                        'description' => '',
    7580                                        'single' => false,
    7681                                        'sanitize_callback' => null,
    77                                         'auth_callback' => '__return_true',
     82                                        'auth_callback' => null,
    7883                                        'show_in_rest' => false,
    7984                                ),
    8085                        ),
     
    96101                                        'description' => '',
    97102                                        'single' => false,
    98103                                        'sanitize_callback' => null,
    99                                         'auth_callback' => '__return_true',
     104                                        'auth_callback' => null,
    100105                                        'show_in_rest' => false,
    101106                                ),
    102107                        ),
     
    148153                                        'description' => '',
    149154                                        'single' => false,
    150155                                        'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ),
    151                                         'auth_callback' => '__return_true',
     156                                        'auth_callback' => null,
    152157                                        'show_in_rest' => false,
    153158                                ),
    154159                        ),
     
    172177                $this->assertEquals( 'new_sanitized_key new sanitized', $meta );
    173178        }
    174179
     180        public function test_register_meta_with_new_auth_callback_parameter() {
     181
     182                wp_set_current_user(  self::$users['subscriber']->ID );
     183               
     184                register_meta( 'post', 'no_auth_cb_1', array() );
     185                $subscriber_can_update = false;
     186                if( current_user_can( 'edit_post_meta', self::$post_id, 'no_auth_cb_1' ) ){
     187                        $subscriber_can_update = update_post_meta( self::$post_id, 'no_auth_cb_1', 'bar1' );
     188                }
     189                unregister_meta_key( 'post', 'no_auth_cb_1' );
     190                $this->assertFalse( $subscriber_can_update );
     191
     192                register_meta( 'post', 'auth_cb_true', array( 'auth_callback' =>  '__return_true' ) );
     193                $subscriber_can_update = false;
     194                if( current_user_can( 'edit_post_meta', self::$post_id, 'auth_cb_true' ) ){
     195                        $subscriber_can_update = update_post_meta( self::$post_id, 'auth_cb_true', 'bar1' );
     196                }
     197                unregister_meta_key( 'post', 'auth_cb_true' );
     198                $this->assertNotEmpty( $subscriber_can_update );
     199               
     200                wp_set_current_user( self::$users['administrator']->ID );
     201
     202                register_meta( 'post', 'no_auth_cb_2', array() );
     203                $admin_can_update = false;
     204                if( current_user_can( 'edit_post_meta', self::$post_id, 'no_auth_cb_2' ) ){
     205                        $admin_can_update = update_post_meta( self::$post_id, 'no_auth_cb_2', 'bar2' );
     206                }
     207                unregister_meta_key( 'post', 'no_auth_cb_2' );
     208                $this->assertNotEmpty( $admin_can_update );
     209           
     210                register_meta( 'post', 'auth_cb_false', array( 'auth_callback' => '__return_false' ) );
     211                $admin_can_update = false;
     212                if( current_user_can( 'edit_post_meta', self::$post_id, 'auth_cb_false' ) ){
     213                        $admin_can_update = update_post_meta( self::$post_id, 'auth_cb_false', 'bar2' );
     214                }
     215                unregister_meta_key( 'post', 'auth_cb_false' );
     216                $this->assertFalse( $admin_can_update );
     217        }
     218
    175219        public function test_register_meta_unregistered_meta_key_removes_sanitize_filter() {
    176220                register_meta( 'post', 'new_sanitized_key', array( 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
    177221                unregister_meta_key( 'post', 'new_sanitized_key' );