WordPress.org

Make WordPress Core

Ticket #17850: 17850.7.diff

File 17850.7.diff, 7.1 KB (added by ryan, 7 years ago)

register_meta() and edit_post_meta cap, proof of concept.

  • wp-includes/post-template.php

     
    735735                echo "<ul class='post-meta'>\n";
    736736                foreach ( (array) $keys as $key ) {
    737737                        $keyt = trim($key);
    738                         if ( '_' == $keyt[0] )
     738                        if ( is_hidden_meta( $keyt ) )
    739739                                continue;
    740740                        $values = array_map('trim', get_post_custom_values($key));
    741741                        $value = implode($values,', ');
  • wp-includes/class-wp-xmlrpc-server.php

     
    234234
    235235                foreach ( (array) has_meta($post_id) as $meta ) {
    236236                        // Don't expose protected fields.
    237                         if ( strpos($meta['meta_key'], '_wp_') === 0 ) {
     237                        if ( is_protected_meta( $meta['meta_key'], 'post' ) ) {
    238238                                continue;
    239239                        }
    240240
     
    264264                                $meta['id'] = (int) $meta['id'];
    265265
    266266                                if ( isset($meta['key']) ) {
    267                                         update_meta($meta['id'], $meta['key'], $meta['value']);
     267                                        if ( current_user_can( 'edit_post_meta', $meta['key'], $post_id ) )
     268                                                update_meta($meta['id'], $meta['key'], $meta['value']);
     269                                } else {
     270                                        if ( ! is_protected_meta( $meta['key'] ) )
     271                                                delete_meta($meta['id']);
    268272                                }
    269                                 else {
    270                                         delete_meta($meta['id']);
    271                                 }
     273                        } else {
     274                                if ( ! is_protected_meta( $meta['key'] ) )
     275                                        add_post_meta( $post_id, $meta['key'], $meta['value'] );
    272276                        }
    273                         else {
    274                                 $_POST['metakeyinput'] = $meta['key'];
    275                                 $_POST['metavalue'] = $meta['value'];
    276                                 add_meta($post_id);
    277                         }
    278277                }
    279278        }
    280279
  • wp-includes/capabilities.php

     
    951951                else
    952952                        $caps[] = $post_type->cap->read_private_posts;
    953953                break;
     954        case 'edit_post_meta':
     955        case 'delete_post_meta':
     956        case 'create_post_meta':
     957                $post = get_post( $args[1] );
     958                $post_type_object = get_post_type_object( $post->post_type );
     959                $caps = map_meta_cap( $post_type_object->cap->edit_post, $user_id, $post->ID );
     960
     961                global $_wp_meta;
     962                if ( isset( $_wp_meta[ 'post' ][ $args[ 0 ] ] ) && isset( $_wp_meta[ 'post' ][ $args[ 0 ] ]->auth_callback ) ) {
     963                        $meta_cb = $_wp_meta[ 'post' ][ $args[ 0 ] ]->auth_callback;
     964                        $allowed = call_user_func( $meta_cb, $meta_key, $post->ID, $user_id );
     965                        if ( ! $allowed )
     966                                $caps[] = $cap;
     967                } elseif ( is_protected_meta( $args[ 0 ], 'post' ) ) {
     968                        $caps[] = $cap;
     969                }
     970                break;
    954971        case 'edit_comment':
    955972                $comment = get_comment( $args[0] );
    956973                $post = get_post( $comment->comment_post_ID );
  • wp-includes/meta.php

     
    588588 * @return bool True if the key is protected, false otherwise.
    589589 */
    590590function is_protected_meta( $meta_key, $meta_type = null ) {
    591         $protected = (  '_' == $meta_key[0] );
     591        $protected = ( '_' == $meta_key[0] );
    592592
    593593        return apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type );
    594594}
    595595
    596596/**
     597 * Determine whether a meta key is hidden
     598 *
     599 * @since 3.2.0
     600 *
     601 * @param string $meta_key Meta key
     602 * @return bool True if the key is hidden, false otherwise.
     603 */
     604function is_hidden_meta( $meta_key, $meta_type = null ) {
     605        $hidden = ( '_' == $meta_key[0] );
     606
     607        return apply_filters( 'is_hidden_meta', $hidden, $meta_key, $meta_type );
     608}
     609
     610/**
    597611 * Sanitize meta value
    598612 *
    599613 * @since 3.1.3
     
    603617 * @param string $meta_type Type of meta
    604618 * @return mixed Sanitized $meta_value
    605619 */
    606 function sanitize_meta( $meta_key, $meta_value, $meta_type = null ) {
    607         return apply_filters( 'sanitize_meta', $meta_value, $meta_key, $meta_type );
     620function sanitize_meta( $meta_key, $meta_value, $meta_type ) {
     621        return apply_filters( "sanitize_{$meta_type}_meta_{$meta_key}", $meta_value, $meta_key, $meta_type );
    608622}
    609623
     624function register_meta( $meta_key, $meta_type, $args = array() ) {
     625        global $_wp_meta;
     626
     627        $_wp_meta[ $meta_type ][ $meta_key ] = (object) $args;
     628}
     629
    610630?>
  • wp-admin/admin-ajax.php

     
    396396        if ( !$meta = get_post_meta_by_id( $id ) )
    397397                die('1');
    398398
    399         if ( !current_user_can( 'edit_post', $meta->post_id ) || is_protected_meta( $meta->meta_key ) )
     399        if ( !current_user_can( 'delete_post_meta', $meta->meta_key, $meta->post_id ) || is_hidden_meta( $meta->meta_key ) )
    400400                die('-1');
    401401        if ( delete_meta( $meta->meta_id ) )
    402402                die('1');
     
    868868                        die(__('Please provide a custom field value.'));
    869869                if ( !$meta = get_post_meta_by_id( $mid ) )
    870870                        die('0'); // if meta doesn't exist
    871                 if ( !current_user_can( 'edit_post', $meta->post_id ) )
     871                if ( is_hidden_meta( $meta->meta_key ) || !current_user_can( 'edit_post_meta', $meta->meta_key, $meta->post_id ) )
    872872                        die('-1');
    873                 if ( is_protected_meta( $meta->meta_key ) )
    874                         die('-1');
    875873                if ( $meta->meta_value != stripslashes($value) || $meta->meta_key != stripslashes($key) ) {
    876874                        if ( !$u = update_meta( $mid, $key, $value ) )
    877875                                die('0'); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems).
  • wp-admin/includes/post.php

     
    207207                                continue;
    208208                        if ( $meta->post_id != $post_ID )
    209209                                continue;
    210                         if ( is_protected_meta( $value['key'] ) )
     210                        if ( is_hidden_meta( $value['key'] ) || !current_user_can( 'edit_post_meta', $value['key'], $post_ID ) )
    211211                                continue;
    212212                        update_meta( $key, $value['key'], $value['value'] );
    213213                }
     
    219219                                continue;
    220220                        if ( $meta->post_id != $post_ID )
    221221                                continue;
    222                         if ( is_protected_meta( $meta->meta_key ) )
     222                        if ( is_hidden_meta( $meta->meta_key ) || !current_user_can( 'edit_post_meta', $meta->meta_key, $post_ID ) )
    223223                                continue;
    224224                        delete_meta( $key );
    225225                }
     
    662662                if ( $metakeyinput)
    663663                        $metakey = $metakeyinput; // default
    664664
    665                 if ( is_protected_meta( $metakey ) )
     665                if ( is_hidden_meta( $metakey ) || is_protected_meta( $metakey, 'post' ) )
    666666                        return false;
    667667
    668668                wp_cache_delete($post_ID, 'post_meta');
     
    770770
    771771        $meta_key = stripslashes($meta_key);
    772772
    773         if ( is_protected_meta( $meta_key ) )
     773        if ( is_protected_meta( $meta_key, 'post' ) )
    774774                return false;
    775775
    776776        if ( '' === trim( $meta_value ) )
  • wp-admin/includes/template.php

     
    466466function _list_meta_row( $entry, &$count ) {
    467467        static $update_nonce = false;
    468468
    469         if ( is_protected_meta( $entry['meta_key'] ) )
     469        if ( is_hidden_meta( $entry['meta_key'] ) || is_protected_meta( $entry['meta_key'], 'post' ) )
    470470                return;
    471471
    472472        if ( !$update_nonce )