Upload: Correct duplicate MIME type for .xlsx files generated by Google Docs.

This expands the code block previously added for `.docx` files to include `.xlsx` files as well, which are known to have the same issue with `finfo_file()`.

Includes a unit test case for `wp_check_filetype_and_ext()`.

Reference: [https://bugs.php.net/bug.php?id=77784 PHP Bug #77784: mime_content_type() result gets doubled for .xlsx].

Follow-up to [56497].

See #57898.

git-svn-id: https://develop.svn.wordpress.org/trunk@56510 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Sergey Biryukov 2023-09-03 12:49:51 +00:00
parent 9a87bc5d4e
commit d0deb5bc66
3 changed files with 26 additions and 3 deletions

View File

@ -3150,9 +3150,22 @@ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {
$real_mime = finfo_file( $finfo, $file );
finfo_close( $finfo );
// finfo_file() returns redudant mime type for Google docs, see #57898.
if ( 'application/vnd.openxmlformats-officedocument.wordprocessingml.documentapplication/vnd.openxmlformats-officedocument.wordprocessingml.document' === $real_mime ) {
$real_mime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
$google_docs_types = array(
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
);
foreach ( $google_docs_types as $google_docs_type ) {
/*
* finfo_file() can return duplicate mime type for Google docs,
* this conditional reduces it to a single instance.
*
* @see https://bugs.php.net/bug.php?id=77784
* @see https://core.trac.wordpress.org/ticket/57898
*/
if ( 2 === substr_count( $real_mime, $google_docs_type ) ) {
$real_mime = $google_docs_type;
}
}
// fileinfo often misidentifies obscure files as one of these types.

Binary file not shown.

View File

@ -1643,6 +1643,16 @@ class Tests_Functions extends WP_UnitTestCase {
'proper_filename' => false,
),
),
// Google Docs file for which finfo_file() returns a duplicate mime type.
array(
DIR_TESTDATA . '/uploads/double-mime-type.docx',
'double-mime-type.docx',
array(
'ext' => 'docx',
'type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'proper_filename' => false,
),
),
// Non-image file with wrong sub-type.
array(
DIR_TESTDATA . '/uploads/pages-to-word.docx',