Make WordPress Core

Ticket #43751: 43751.2.diff

File 43751.2.diff, 6.7 KB (added by danielbachhuber, 6 years ago)
  • src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php

    diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php
    index 26f462e4f3..f66a3d351b 100644
    a b class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    558558                        'type'     => $type,
    559559                );
    560560
     561                $size_check = self::check_upload_size( $file_data );
     562                if ( is_wp_error( $size_check ) ) {
     563                        return $size_check;
     564                }
     565
    561566                $overrides = array(
    562567                        'test_form' => false,
    563568                );
    class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    725730                        $overrides['action'] = 'wp_handle_mock_upload';
    726731                }
    727732
     733                $size_check = self::check_upload_size( $files['file'] );
     734                if ( is_wp_error( $size_check ) ) {
     735                        return $size_check;
     736                }
     737
    728738                /** Include admin functions to get access to wp_handle_upload() */
    729739                require_once ABSPATH . 'wp-admin/includes/admin.php';
    730740
    class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { 
    762772                return $media_types;
    763773        }
    764774
     775        /**
     776         * Determine if uploaded file exceeds space quota on multisite.
     777         *
     778         * Replicates check_upload_size().
     779         *
     780         * @since 4.9.8
     781         *
     782         * @param array $file $_FILES array for a given file.
     783         * @return true|WP_Error True if can upload, error for errors.
     784         */
     785        protected function check_upload_size( $file ) {
     786                if ( ! is_multisite() ) {
     787                        return true;
     788                }
     789
     790                if ( get_site_option( 'upload_space_check_disabled' ) ) {
     791                        return true;
     792                }
     793
     794                $space_left = get_upload_space_available();
     795
     796                $file_size = filesize( $file['tmp_name'] );
     797                if ( $space_left < $file_size ) {
     798                        /* translators: %s: required disk space in kilobytes */
     799                        return new WP_Error( 'rest_upload_limited_space', sprintf( __( 'Not enough space to upload. %s KB needed.' ), number_format( ( $file_size - $space_left ) / KB_IN_BYTES ) ), array( 'status' => 400 ) );
     800                }
     801
     802                if ( $file_size > ( KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 ) ) ) {
     803                        /* translators: %s: maximum allowed file size in kilobytes */
     804                        return new WP_Error( 'rest_upload_file_too_big', sprintf( __( 'This file is too big. Files must be less than %s KB in size.' ), get_site_option( 'fileupload_maxk', 1500 ) ), array( 'status' => 400 ) );
     805                }
     806
     807                if ( upload_is_user_over_quota( false ) ) {
     808                        return new WP_Error( 'rest_upload_user_quota_exceeded', __( 'You have used your space quota. Please delete files before uploading.' ), array( 'status' => 400 ) );
     809                }
     810                return true;
     811        }
     812
    765813}
  • tests/phpunit/tests/rest-api/rest-attachments-controller.php

    diff --git a/tests/phpunit/tests/rest-api/rest-attachments-controller.php b/tests/phpunit/tests/rest-api/rest-attachments-controller.php
    index c42e40f194..4fa9b19183 100644
    a b class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control 
    13881388
    13891389        }
    13901390
     1391        /**
     1392         * @ticket 43751
     1393         * @group multisite
     1394         * @group ms-required
     1395         */
     1396        public function test_create_item_with_file_exceeds_multisite_max_filesize() {
     1397                wp_set_current_user( self::$author_id );
     1398                update_site_option( 'fileupload_maxk', 1 );
     1399                update_site_option( 'upload_space_check_disabled', false );
     1400
     1401                $request = new WP_REST_Request( 'POST', '/wp/v2/media' );
     1402                $request->set_file_params(
     1403                        array(
     1404                                'file' => array(
     1405                                        'error'    => '0',
     1406                                        'file'     => file_get_contents( $this->test_file ),
     1407                                        'name'     => 'canola.jpg',
     1408                                        'size'     => filesize( $this->test_file ),
     1409                                        'tmp_name' => $this->test_file,
     1410                                ),
     1411                        )
     1412                );
     1413                $request->set_param( 'title', 'My title is very cool' );
     1414                $request->set_param( 'caption', 'This is a better caption.' );
     1415                $request->set_header( 'Content-MD5', md5_file( $this->test_file ) );
     1416
     1417                $response = rest_get_server()->dispatch( $request );
     1418                $this->assertErrorResponse( 'rest_upload_file_too_big', $response, 400 );
     1419        }
     1420
     1421        /**
     1422         * @ticket 43751
     1423         * @group multisite
     1424         * @group ms-required
     1425         */
     1426        public function test_create_item_with_data_exceeds_multisite_max_filesize() {
     1427                wp_set_current_user( self::$author_id );
     1428                update_site_option( 'fileupload_maxk', 1 );
     1429                update_site_option( 'upload_space_check_disabled', false );
     1430
     1431                $request = new WP_REST_Request( 'POST', '/wp/v2/media' );
     1432                $request->set_header( 'Content-Type', 'image/jpeg' );
     1433                $request->set_header( 'Content-Disposition', 'attachment; filename=canola.jpg' );
     1434                $request->set_body( file_get_contents( $this->test_file ) );
     1435                $request->set_param( 'title', 'My title is very cool' );
     1436                $request->set_param( 'caption', 'This is a better caption.' );
     1437
     1438                $response = rest_get_server()->dispatch( $request );
     1439                $this->assertErrorResponse( 'rest_upload_file_too_big', $response, 400 );
     1440        }
     1441
     1442        /**
     1443         * @ticket 43751
     1444         * @group multisite
     1445         * @group ms-required
     1446         */
     1447        public function test_create_item_with_file_exceeds_multisite_site_upload_space() {
     1448                wp_set_current_user( self::$author_id );
     1449                add_filter( 'get_space_allowed', '__return_zero' );
     1450                update_site_option( 'upload_space_check_disabled', false );
     1451
     1452                $request = new WP_REST_Request( 'POST', '/wp/v2/media' );
     1453                $request->set_file_params(
     1454                        array(
     1455                                'file' => array(
     1456                                        'error'    => '0',
     1457                                        'file'     => file_get_contents( $this->test_file ),
     1458                                        'name'     => 'canola.jpg',
     1459                                        'size'     => filesize( $this->test_file ),
     1460                                        'tmp_name' => $this->test_file,
     1461                                ),
     1462                        )
     1463                );
     1464                $request->set_param( 'title', 'My title is very cool' );
     1465                $request->set_param( 'caption', 'This is a better caption.' );
     1466                $request->set_header( 'Content-MD5', md5_file( $this->test_file ) );
     1467
     1468                $response = rest_get_server()->dispatch( $request );
     1469                $this->assertErrorResponse( 'rest_upload_limited_space', $response, 400 );
     1470        }
     1471
     1472        /**
     1473         * @ticket 43751
     1474         * @group multisite
     1475         * @group ms-required
     1476         */
     1477        public function test_create_item_with_data_exceeds_multisite_site_upload_space() {
     1478                wp_set_current_user( self::$author_id );
     1479                add_filter( 'get_space_allowed', '__return_zero' );
     1480                update_site_option( 'upload_space_check_disabled', false );
     1481
     1482                $request = new WP_REST_Request( 'POST', '/wp/v2/media' );
     1483                $request->set_header( 'Content-Type', 'image/jpeg' );
     1484                $request->set_header( 'Content-Disposition', 'attachment; filename=canola.jpg' );
     1485                $request->set_body( file_get_contents( $this->test_file ) );
     1486                $request->set_param( 'title', 'My title is very cool' );
     1487                $request->set_param( 'caption', 'This is a better caption.' );
     1488
     1489                $response = rest_get_server()->dispatch( $request );
     1490                $this->assertErrorResponse( 'rest_upload_limited_space', $response, 400 );
     1491        }
     1492
    13911493}