WordPress.org

Make WordPress Core

Ticket #38412: 38412.diff

File 38412.diff, 3.5 KB (added by tharsheblows, 5 years ago)

check meta update and delete capabilities using correct object type

  • wp-includes/rest-api/fields/class-wp-rest-meta-fields.php

     
    9393         */
    9494        public function update_value( $request, $object_id ) {
    9595                $fields = $this->get_registered_fields();
    96 
    9796                foreach ( $fields as $name => $args ) {
    9897                        if ( ! array_key_exists( $name, $request ) ) {
    9998                                continue;
     
    125124         * @return bool|WP_Error True if meta field is deleted, error otherwise.
    126125         */
    127126        protected function delete_meta_value( $object_id, $name ) {
    128                 if ( ! current_user_can( 'delete_post_meta', $object_id, $name ) ) {
     127                $meta_type = $this->get_meta_type();
     128                if ( ! current_user_can( "delete_{$meta_type}_meta", $object_id, $name ) ) {
    129129                        return new WP_Error(
    130130                                'rest_cannot_delete',
    131131                                sprintf( __( 'You do not have permission to edit the %s custom field.' ), $name ),
     
    133133                        );
    134134                }
    135135
    136                 if ( ! delete_metadata( $this->get_meta_type(), $object_id, wp_slash( $name ) ) ) {
     136                if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $name ) ) ) {
    137137                        return new WP_Error(
    138138                                'rest_meta_database_error',
    139139                                __( 'Could not delete meta value from database.' ),
     
    155155         * @return bool|WP_Error True if meta fields are updated, error otherwise.
    156156         */
    157157        protected function update_multi_meta_value( $object_id, $name, $values ) {
    158                 if ( ! current_user_can( 'edit_post_meta', $object_id, $name ) ) {
     158                $meta_type = $this->get_meta_type();
     159                if ( ! current_user_can( "edit_{$meta_type}_meta", $object_id, $name ) ) {
    159160                        return new WP_Error(
    160161                                'rest_cannot_update',
    161162                                sprintf( __( 'You do not have permission to edit the %s custom field.' ), $name ),
     
    163164                        );
    164165                }
    165166
    166                 $current = get_metadata( $this->get_meta_type(), $object_id, $name, false );
     167                $current = get_metadata( $meta_type, $object_id, $name, false );
    167168
    168169                $to_remove = $current;
    169170                $to_add = $values;
     
    187188                // once.
    188189                $to_remove = array_unique( $to_remove );
    189190                foreach ( $to_remove as $value ) {
    190                         if ( ! delete_metadata( $this->get_meta_type(), $object_id, wp_slash( $name ), wp_slash( $value ) ) ) {
     191                        if ( ! delete_metadata( $meta_type, $object_id, wp_slash( $name ), wp_slash( $value ) ) ) {
    191192                                return new WP_Error(
    192193                                        'rest_meta_database_error',
    193194                                        __( 'Could not update meta value in database.' ),
     
    196197                        }
    197198                }
    198199                foreach ( $to_add as $value ) {
    199                         if ( ! add_metadata( $this->get_meta_type(), $object_id, wp_slash( $name ), wp_slash( $value ) ) ) {
     200                        if ( ! add_metadata( $meta_type, $object_id, wp_slash( $name ), wp_slash( $value ) ) ) {
    200201                                return new WP_Error(
    201202                                        'rest_meta_database_error',
    202203                                        __( 'Could not update meta value in database.' ),
     
    217218         * @return bool|WP_Error True if meta field is updated, error otherwise.
    218219         */
    219220        protected function update_meta_value( $object_id, $name, $value ) {
    220                 if ( ! current_user_can( 'edit_post_meta', $object_id, $name ) ) {
     221                $meta_type = $this->get_meta_type();
     222                if ( ! current_user_can(  "edit_{$meta_type}_meta", $object_id, $name ) ) {
    221223                        return new WP_Error(
    222224                                'rest_cannot_update',
    223225                                sprintf( __( 'You do not have permission to edit the %s custom field.' ), $name ),
     
    225227                        );
    226228                }
    227229
    228                 $meta_type  = $this->get_meta_type();
    229230                $meta_key   = wp_slash( $name );
    230231                $meta_value = wp_slash( $value );
    231232