diff --git a/includes/StreamFile.php b/includes/StreamFile.php index 97a07ca78be..0d4290718ce 100644 --- a/includes/StreamFile.php +++ b/includes/StreamFile.php @@ -122,7 +122,7 @@ class StreamFile { // Use the extension only, rather than magic numbers, to avoid opening // up vulnerabilities due to uploads of files with allowed extensions // but disallowed types. - $type = $magic->guessTypesForExtension( $ext ); + $type = $magic->getMimeTypeFromExtensionOrNull( $ext ); /** * Double-check some security settings that were done on upload but might diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php index 17a9d73ba4e..283df80761e 100644 --- a/includes/api/ApiFormatBase.php +++ b/includes/api/ApiFormatBase.php @@ -75,9 +75,9 @@ abstract class ApiFormatBase extends ApiBase { } elseif ( $this->getIsHtml() ) { return 'api-result.html'; } else { - $exts = MediaWikiServices::getInstance()->getMimeAnalyzer() - ->getExtensionsForType( $this->getMimeType() ); - $ext = $exts ? strtok( $exts, ' ' ) : strtolower( $this->mFormat ); + $mimeAnalyzer = MediaWikiServices::getInstance()->getMimeAnalyzer(); + $ext = $mimeAnalyzer->getExtensionFromMimeTypeOrNull( $this->getMimeType() ) + ?? strtolower( $this->mFormat ); return "api-result.$ext"; } } diff --git a/includes/changes/ChannelFeed.php b/includes/changes/ChannelFeed.php index 28e87c2dcce..80d2db75bbd 100644 --- a/includes/changes/ChannelFeed.php +++ b/includes/changes/ChannelFeed.php @@ -91,9 +91,8 @@ abstract class ChannelFeed extends FeedItem { header( "Content-type: $mimetype; charset=UTF-8" ); // Set a sane filename - $exts = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer() - ->getExtensionsForType( $mimetype ); - $ext = $exts ? strtok( $exts, ' ' ) : 'xml'; + $mimeAnalyzer = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer(); + $ext = $mimeAnalyzer->getExtensionFromMimeTypeOrNull( $mimetype ) ?? 'xml'; header( "Content-Disposition: inline; filename=\"feed.{$ext}\"" ); if ( $wgVaryOnXFP ) { diff --git a/includes/filebackend/FileBackendGroup.php b/includes/filebackend/FileBackendGroup.php index ab49ea10079..92313b03488 100644 --- a/includes/filebackend/FileBackendGroup.php +++ b/includes/filebackend/FileBackendGroup.php @@ -291,7 +291,7 @@ class FileBackendGroup { public function guessMimeInternal( $storagePath, $content, $fsPath ) { // Trust the extension of the storage path (caller must validate) $ext = FileBackend::extensionFromPath( $storagePath ); - $type = $this->mimeAnalyzer->guessTypesForExtension( $ext ); + $type = $this->mimeAnalyzer->getMimeTypeFromExtensionOrNull( $ext ); // For files without a valid extension (or one at all), inspect the contents if ( !$type && $fsPath ) { $type = $this->mimeAnalyzer->guessMimeType( $fsPath, false ); diff --git a/includes/filerepo/file/ForeignAPIFile.php b/includes/filerepo/file/ForeignAPIFile.php index 056aeb519f3..c578b4c85ed 100644 --- a/includes/filerepo/file/ForeignAPIFile.php +++ b/includes/filerepo/file/ForeignAPIFile.php @@ -292,7 +292,7 @@ class ForeignAPIFile extends File { public function getMimeType() { if ( !isset( $this->mInfo['mime'] ) ) { $magic = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer(); - $this->mInfo['mime'] = $magic->guessTypesForExtension( $this->getExtension() ); + $this->mInfo['mime'] = $magic->getMimeTypeFromExtensionOrNull( $this->getExtension() ); } return $this->mInfo['mime']; diff --git a/includes/media/DjVuHandler.php b/includes/media/DjVuHandler.php index d937505fd22..4a024e23249 100644 --- a/includes/media/DjVuHandler.php +++ b/includes/media/DjVuHandler.php @@ -362,7 +362,7 @@ class DjVuHandler extends ImageHandler { static $mime; if ( !isset( $mime ) ) { $magic = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer(); - $mime = $magic->guessTypesForExtension( $wgDjvuOutputExtension ); + $mime = $magic->getMimeTypeFromExtensionOrNull( $wgDjvuOutputExtension ); } return [ $wgDjvuOutputExtension, $mime ]; diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php index 6239bf99d99..0e344724776 100644 --- a/includes/media/MediaHandler.php +++ b/includes/media/MediaHandler.php @@ -297,9 +297,9 @@ abstract class MediaHandler { if ( !$ext || $magic->isMatchingExtension( $ext, $mime ) === false ) { // The extension is not valid for this MIME type and we do // recognize the MIME type - $extensions = $magic->getExtensionsForType( $mime ); - if ( $extensions ) { - return [ strtok( $extensions, ' ' ), $mime ]; + $knownExt = $magic->getExtensionFromMimeTypeOrNull( $mime ); + if ( $knownExt !== null ) { + return [ $knownExt, $mime ]; } } diff --git a/includes/specials/SpecialMediaStatistics.php b/includes/specials/SpecialMediaStatistics.php index af8103c68ce..b03a6a7d70a 100644 --- a/includes/specials/SpecialMediaStatistics.php +++ b/includes/specials/SpecialMediaStatistics.php @@ -241,17 +241,15 @@ class SpecialMediaStatistics extends QueryPage { */ private function getExtensionList( $mime ) { $exts = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer() - ->getExtensionsForType( $mime ); - if ( $exts === null ) { + ->getExtensionsFromMimeType( $mime ); + if ( !$exts ) { return ''; } - $extArray = explode( ' ', $exts ); - $extArray = array_unique( $extArray ); - foreach ( $extArray as &$ext ) { + foreach ( $exts as &$ext ) { $ext = htmlspecialchars( '.' . $ext ); } - return $this->getLanguage()->commaList( $extArray ); + return $this->getLanguage()->commaList( $exts ); } /** diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php index 4cc96b62b20..d39a6310ed1 100644 --- a/includes/upload/UploadBase.php +++ b/includes/upload/UploadBase.php @@ -444,7 +444,7 @@ abstract class UploadBase { fclose( $fp ); $magic = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer(); - $extMime = $magic->guessTypesForExtension( $this->mFinalExtension ); + $extMime = $magic->getMimeTypeFromExtensionOrNull( $this->mFinalExtension ); $ieTypes = $magic->getIEMimeTypes( $this->mTempPath, $chunk, $extMime ); foreach ( $ieTypes as $ieType ) { if ( $this->checkFileExtension( $ieType, $wgMimeTypeBlacklist ) ) { @@ -1021,10 +1021,10 @@ abstract class UploadBase { $mime = $magic->guessMimeType( $this->mTempPath ); if ( $mime !== 'unknown/unknown' ) { # Get a space separated list of extensions - $extList = $magic->getExtensionsForType( $mime ); - if ( $extList ) { + $mimeExt = $magic->getExtensionFromMimeTypeOrNull( $mime ); + if ( $mimeExt !== null ) { # Set the extension to the canonical extension - $this->mFinalExtension = strtok( $extList, ' ' ); + $this->mFinalExtension = $mimeExt; # Fix up the other variables $this->mFilteredName .= ".{$this->mFinalExtension}"; diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php index a4d5c721333..833b1ce1bdd 100644 --- a/includes/upload/UploadStash.php +++ b/includes/upload/UploadStash.php @@ -485,10 +485,7 @@ class UploadStash { // If not, assume that it should be related to the MIME type of the original file. $magic = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer(); $mimeType = $magic->guessMimeType( $path ); - $extensions = $magic->getExtensionsForType( $mimeType ); - if ( $extensions !== null ) { - $extension = strtok( $extensions, ' ' ); - } + $extension = $magic->getExtensionFromMimeTypeOrNull( $mimeType ); } if ( $extension === null ) { diff --git a/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php b/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php index 5fe024b8b2f..74c484045e5 100644 --- a/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php +++ b/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php @@ -208,7 +208,7 @@ class MimeAnalyzerTest extends PHPUnit\Framework\TestCase { * The empty string is not a MIME type and should not be mapped to a file extension. */ public function testNoEmptyStringMimeType() { - $this->assertNull( $this->mimeAnalyzer->getExtensionsForType( '' ) ); + $this->assertSame( [], $this->mimeAnalyzer->getExtensionsFromMimeType( '' ) ); } /** @@ -227,7 +227,8 @@ class MimeAnalyzerTest extends PHPUnit\Framework\TestCase { }, ] ); $this->assertSame( MEDIATYPE_OFFICE, $mimeAnalyzer->findMediaType( '.fake_extension' ) ); - $this->assertSame( 'fake/mime', $mimeAnalyzer->getTypesForExtension( 'no_such_extension' ) ); + $this->assertSame( + 'fake/mime', $mimeAnalyzer->getMimeTypeFromExtensionOrNull( 'no_such_extension' ) ); } public function testGetMimeTypesFromExtension() { diff --git a/tests/phpunit/unit/includes/filebackend/FileBackendGroupTestTrait.php b/tests/phpunit/unit/includes/filebackend/FileBackendGroupTestTrait.php index 08190e7eeb0..3530acec88e 100644 --- a/tests/phpunit/unit/includes/filebackend/FileBackendGroupTestTrait.php +++ b/tests/phpunit/unit/includes/filebackend/FileBackendGroupTestTrait.php @@ -389,7 +389,7 @@ trait FileBackendGroupTestTrait { * @param string|null $content * @param string|null $fsPath * @param string|null $expectedExtensionType Expected return of - * MimeAnalyzer::guessTypesForExtension + * MimeAnalyzer::getMimeTypeFromExtensionOrNull * @param string|null $expectedGuessedMimeType Expected return value of * MimeAnalyzer::guessMimeType (null if expected not to be called) */ @@ -401,7 +401,7 @@ trait FileBackendGroupTestTrait { $expectedGuessedMimeType ) { $mimeAnalyzer = $this->createMock( MimeAnalyzer::class ); - $mimeAnalyzer->expects( $this->once() )->method( 'guessTypesForExtension' ) + $mimeAnalyzer->expects( $this->once() )->method( 'getMimeTypeFromExtensionOrNull' ) ->willReturn( $expectedExtensionType ); $tmpFileFactory = $this->createMock( TempFSFileFactory::class ); @@ -425,7 +425,7 @@ trait FileBackendGroupTestTrait { } $mimeAnalyzer->expects( $this->never() ) - ->method( $this->anythingBut( 'guessTypesForExtension', 'guessMimeType' ) ); + ->method( $this->anythingBut( 'getMimeTypeFromExtensionOrNull', 'guessMimeType' ) ); $tmpFileFactory->expects( $this->never() ) ->method( $this->anythingBut( 'newTempFSFile' ) );