Make WordPress Core

Ticket #24153: 24153.3.diff

File 24153.3.diff, 3.9 KB (added by ericmann, 10 years ago)

Updated patch file, with tests

  • src/wp-admin/includes/post.php

     
    385385
    386386        wp_set_post_lock( $post_ID );
    387387
    388         if ( current_user_can( $ptype->cap->edit_others_posts ) ) {
     388        if ( current_user_can( $ptype->cap->edit_others_posts ) && current_user_can( $ptype->cap->publish_posts ) ) {
    389389                if ( ! empty( $post_data['sticky'] ) )
    390390                        stick_post( $post_ID );
    391391                else
  • tests/phpunit/tests/post.php

     
    950950                        $this->assertEquals( $value, $post->$field );
    951951                }
    952952        }
     953
     954        /**
     955         * If a post is sticky and is updated by a user that does not have the publish_post capability, it should _stay_
     956         * sticky.
     957         *
     958         * @ticket 24153
     959         */
     960        function test_user_without_publish_cannot_affect_sticky() {
     961                // Create a role with edit_others_posts
     962                add_role( 'grammarian', 'Grammarian', array(
     963                        'read'                 => true,
     964                        'edit_posts'           => true,
     965                        'edit_others_posts'    => true,
     966                        'edit_published_posts' => true,
     967                ) );
     968                $editor_user = $this->factory->user->create( array( 'role' => 'grammarian' ) );
     969                $old_uid = get_current_user_id();
     970                wp_set_current_user( $editor_user );
     971
     972                // Sanity Check
     973                $this->assertFalse( current_user_can( 'publish_posts' ) );
     974                $this->assertTrue( current_user_can( 'edit_others_posts' ) );
     975                $this->assertTrue( current_user_can( 'edit_published_posts' ) );
     976
     977                // Create a sticky post
     978                $post = $this->factory->post->create_and_get( array(
     979                        'post_title'   => 'Will be changed',
     980                        'post_content' => 'Will be changed',
     981                ) );
     982                stick_post( $post->ID );
     983
     984                // Sanity Check
     985                $this->assertTrue( is_sticky( $post->ID ) );
     986
     987                // Edit the post
     988                $post->post_title = 'Updated';
     989                $post->post_content = 'Updated';
     990                wp_update_post( $post );
     991
     992                // Make sure it's still sticky
     993                $saved_post = get_post( $post->ID );
     994                $this->assertTrue( is_sticky( $saved_post->ID ) );
     995                $this->assertEquals( 'Updated', $saved_post->post_title );
     996                $this->assertEquals( 'Updated', $saved_post->post_content );
     997
     998                // Teardown
     999                wp_set_current_user( $old_uid );
     1000        }
     1001
     1002        /**
     1003         * If the `edit_post()` method is invoked by a user without publish_posts permission, the sticky status of the post
     1004         * should not be changed.
     1005         *
     1006         * @ticket 24153
     1007         */
     1008        function test_user_without_publish_cannot_affect_sticky_with_edit_post() {
     1009                // Create a sticky post
     1010                $post = $this->factory->post->create_and_get( array(
     1011                        'post_title'   => 'Will be changed',
     1012                        'post_content' => 'Will be changed',
     1013                ) );
     1014                stick_post( $post->ID );
     1015
     1016                // Sanity Check
     1017                $this->assertTrue( is_sticky( $post->ID ) );
     1018
     1019                // Create a role with edit_others_posts
     1020                add_role( 'grammarian', 'Grammarian', array(
     1021                        'read'                 => true,
     1022                        'edit_posts'           => true,
     1023                        'edit_others_posts'    => true,
     1024                        'edit_published_posts' => true,
     1025                ) );
     1026                $editor_user = $this->factory->user->create( array( 'role' => 'grammarian' ) );
     1027                $old_uid = get_current_user_id();
     1028                wp_set_current_user( $editor_user );
     1029
     1030                // Sanity Check
     1031                $this->assertFalse( current_user_can( 'publish_posts' ) );
     1032                $this->assertTrue( current_user_can( 'edit_others_posts' ) );
     1033                $this->assertTrue( current_user_can( 'edit_published_posts' ) );
     1034
     1035                // Edit the post - The key 'sticky' is intentionally unset.
     1036                $data = array(
     1037                        'post_ID'      => $post->ID,
     1038                        'post_title'   => 'Updated',
     1039                        'post_content' => 'Updated',
     1040                );
     1041                edit_post( $data );
     1042
     1043                // Make sure it's still sticky
     1044                $saved_post = get_post( $post->ID );
     1045                $this->assertTrue( is_sticky( $saved_post->ID ) );
     1046                $this->assertEquals( 'Updated', $saved_post->post_title );
     1047                $this->assertEquals( 'Updated', $saved_post->post_content );
     1048
     1049                // Teardown
     1050                wp_set_current_user( $old_uid );
     1051        }
    9531052}