WordPress.org

Make WordPress Core

Changeset 40130


Ignore:
Timestamp:
02/27/2017 03:38:30 PM (3 years ago)
Author:
joemcgill
Message:

Media: Keep PDF previews from overwriting files.

Since support for PDF previews were added in [38949], it's possible
that the generated image file could overwrite an existing image file
with the same name. This uses wp_unique_filename() to avoid this
issue and adds a '-pdf' identifier on the end of filenames.

Props gitlost, derosj, mikeschroder, joemcgill.
Fixes #39875. See #31050.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/image.php

    r39617 r40130  
    252252
    253253            if ( ! is_wp_error( $editor ) ) { // No support for this type of file
    254                 $uploaded = $editor->save( $file, 'image/jpeg' );
     254                /*
     255                 * PDFs may have the same file filename as JPEGs.
     256                 * Ensure the PDF preview image does not overwrite any JPEG images that already exist.
     257                 */
     258                $dirname = dirname( $file ) . '/';
     259                $ext = '.' . pathinfo( $file, PATHINFO_EXTENSION );
     260                $preview_file = $dirname . wp_unique_filename( $dirname, wp_basename( $file, $ext ) . '-pdf.jpg' );
     261
     262                $uploaded = $editor->save( $preview_file, 'image/jpeg' );
    255263                unset( $editor );
    256264
  • trunk/tests/phpunit/tests/image/functions.php

    r39617 r40130  
    1919
    2020        include_once( DIR_TESTDATA . '/../includes/mock-image-editor.php' );
     21
     22        // Ensure no legacy / failed tests detritus.
     23        $folder = '/tmp/wordpress-gsoc-flyer*.{jpg,pdf}';
     24
     25        foreach ( glob( $folder, GLOB_BRACE ) as $file ) {
     26            unlink( $file );
     27        }
    2128    }
    2229
     
    374381            'sizes' => array(
    375382                'thumbnail' => array(
    376                     'file'      => "wordpress-gsoc-flyer-116x150.jpg",
     383                    'file'      => "wordpress-gsoc-flyer-pdf-116x150.jpg",
    377384                    'width'     => 116,
    378385                    'height'    => 150,
     
    380387                ),
    381388                'medium'    => array(
    382                     'file'      => "wordpress-gsoc-flyer-232x300.jpg",
     389                    'file'      => "wordpress-gsoc-flyer-pdf-232x300.jpg",
    383390                    'width'     => 232,
    384391                    'height'    => 300,
     
    386393                ),
    387394                'large'     => array(
    388                     'file'      => "wordpress-gsoc-flyer-791x1024.jpg",
     395                    'file'      => "wordpress-gsoc-flyer-pdf-791x1024.jpg",
    389396                    'width'     => 791,
    390397                    'height'    => 1024,
     
    392399                ),
    393400                'full'      => array(
    394                     'file'      => "wordpress-gsoc-flyer.jpg",
     401                    'file'      => "wordpress-gsoc-flyer-pdf.jpg",
    395402                    'width'     => 1088,
    396403                    'height'    => 1408,
     
    404411
    405412        unlink( $test_file );
     413        foreach ( $metadata['sizes'] as $size ) {
     414            unlink ( '/tmp/' . $size['file'] );
     415        }
    406416    }
    407417
     
    428438
    429439        $expected = array(
    430             'file'      => 'wordpress-gsoc-flyer-77x100.jpg',
     440            'file'      => 'wordpress-gsoc-flyer-pdf-77x100.jpg',
    431441            'width'     => 77,
    432442            'height'    => 100,
     
    442452
    443453        unlink( $test_file );
     454        foreach ( $metadata['sizes'] as $size ) {
     455            unlink ( '/tmp/' . $size['file'] );
     456        }
    444457    }
    445458
     
    450463        return $fallback_sizes;
    451464    }
     465
     466    /**
     467     * Test PDF preview doesn't overwrite existing JPEG.
     468     * @ticket 39875
     469     */
     470    public function test_pdf_preview_doesnt_overwrite_existing_jpeg() {
     471        // Dummy JPEGs.
     472        $jpg1_path = '/tmp/test.jpg'; // Straight.
     473        file_put_contents( $jpg1_path, 'asdf' );
     474        $jpg2_path = '/tmp/test-pdf.jpg'; // With PDF marker.
     475        file_put_contents( $jpg2_path, 'fdsa' );
     476
     477        // PDF with same name as JPEG.
     478        $pdf_path = '/tmp/test.pdf';
     479        copy( DIR_TESTDATA . '/images/wordpress-gsoc-flyer.pdf', $pdf_path );
     480
     481        $attachment_id = $this->factory->attachment->create_object( $pdf_path, 0, array(
     482            'post_mime_type' => 'application/pdf',
     483        ) );
     484
     485        $metadata = wp_generate_attachment_metadata( $attachment_id, $pdf_path );
     486        $preview_path = '/tmp/' . $metadata['sizes']['full']['file'];
     487
     488        // PDF preview didn't overwrite PDF.
     489        $this->assertNotEquals( $pdf_path, $preview_path );
     490        // PDF preview didn't overwrite JPG with same name.
     491        $this->assertNotEquals( $jpg1_path, $preview_path );
     492        $this->assertSame( 'asdf', file_get_contents( $jpg1_path ) );
     493        // PDF preview didn't overwrite PDF preview with same name.
     494        $this->assertNotEquals( $jpg2_path, $preview_path );
     495        $this->assertSame( 'fdsa', file_get_contents( $jpg2_path ) );
     496
     497        // Cleanup.
     498        unlink( $jpg1_path );
     499        unlink( $jpg2_path );
     500        unlink( $pdf_path );
     501        foreach ( $metadata['sizes'] as $size ) {
     502            unlink( '/tmp/' . $size['file'] );
     503        }
     504    }
    452505}
Note: See TracChangeset for help on using the changeset viewer.