mirror of
https://github.com/nextcloud/server.git
synced 2026-06-13 18:50:47 -04:00
Merge pull request #50660 from nextcloud/fix/mime-int
fix: make sure we process mime extensions as string
This commit is contained in:
commit
93c72f5675
7 changed files with 70 additions and 10 deletions
|
|
@ -1235,12 +1235,6 @@
|
|||
<code><![CDATA[$this->timeFactory->getTime()]]></code>
|
||||
</InvalidScalarArgument>
|
||||
</file>
|
||||
<file src="core/Command/Maintenance/Mimetype/UpdateDB.php">
|
||||
<UndefinedInterfaceMethod>
|
||||
<code><![CDATA[getAllMappings]]></code>
|
||||
<code><![CDATA[updateFilecache]]></code>
|
||||
</UndefinedInterfaceMethod>
|
||||
</file>
|
||||
<file src="core/Command/Preview/Repair.php">
|
||||
<UndefinedInterfaceMethod>
|
||||
<code><![CDATA[section]]></code>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,10 @@ class GenerateMimetypeFileBuilder {
|
|||
public function generateFile(array $aliases): string {
|
||||
// Remove comments
|
||||
$aliases = array_filter($aliases, static function ($key) {
|
||||
// Single digit extensions will be treated as integers
|
||||
// Let's make sure they are strings
|
||||
// https://github.com/nextcloud/server/issues/42902
|
||||
$key = (string)$key;
|
||||
return !($key === '' || $key[0] === '_');
|
||||
}, ARRAY_FILTER_USE_KEY);
|
||||
|
||||
|
|
|
|||
|
|
@ -45,6 +45,10 @@ class UpdateDB extends Command {
|
|||
$totalNewMimetypes = 0;
|
||||
|
||||
foreach ($mappings as $ext => $mimetypes) {
|
||||
// Single digit extensions will be treated as integers
|
||||
// Let's make sure they are strings
|
||||
// https://github.com/nextcloud/server/issues/42902
|
||||
$ext = (string)$ext;
|
||||
if ($ext[0] === '_') {
|
||||
// comment
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ class Detection implements IMimeTypeDetector {
|
|||
private const CUSTOM_MIMETYPEMAPPING = 'mimetypemapping.json';
|
||||
private const CUSTOM_MIMETYPEALIASES = 'mimetypealiases.json';
|
||||
|
||||
/** @var array<string, list{string, string|null}> */
|
||||
protected array $mimetypes = [];
|
||||
protected array $secureMimeTypes = [];
|
||||
|
||||
|
|
@ -52,6 +53,8 @@ class Detection implements IMimeTypeDetector {
|
|||
public function registerType(string $extension,
|
||||
string $mimetype,
|
||||
?string $secureMimeType = null): void {
|
||||
// Make sure the extension is a string
|
||||
// https://github.com/nextcloud/server/issues/42902
|
||||
$this->mimetypes[$extension] = [$mimetype, $secureMimeType];
|
||||
$this->secureMimeTypes[$mimetype] = $secureMimeType ?: $mimetype;
|
||||
}
|
||||
|
|
@ -66,13 +69,17 @@ class Detection implements IMimeTypeDetector {
|
|||
* @param array $types
|
||||
*/
|
||||
public function registerTypeArray(array $types): void {
|
||||
$this->mimetypes = array_merge($this->mimetypes, $types);
|
||||
// Register the types,
|
||||
foreach ($types as $extension => $mimeType) {
|
||||
$this->registerType((string)$extension, $mimeType[0], $mimeType[1] ?? null);
|
||||
}
|
||||
|
||||
// Update the alternative mimetypes to avoid having to look them up each time.
|
||||
foreach ($this->mimetypes as $extension => $mimeType) {
|
||||
if (str_starts_with($extension, '_comment')) {
|
||||
if (str_starts_with((string)$extension, '_comment')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->secureMimeTypes[$mimeType[0]] = $mimeType[1] ?? $mimeType[0];
|
||||
if (isset($mimeType[1])) {
|
||||
$this->secureMimeTypes[$mimeType[1]] = $mimeType[1];
|
||||
|
|
@ -133,7 +140,7 @@ class Detection implements IMimeTypeDetector {
|
|||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @return array<string, list{string, string|null}>
|
||||
*/
|
||||
public function getAllMappings(): array {
|
||||
$this->loadMappings();
|
||||
|
|
@ -163,7 +170,7 @@ class Detection implements IMimeTypeDetector {
|
|||
$extension = strrchr($fileName, '.');
|
||||
if ($extension !== false) {
|
||||
$extension = strtolower($extension);
|
||||
$extension = substr($extension, 1); //remove leading .
|
||||
$extension = substr($extension, 1); // remove leading .
|
||||
return $this->mimetypes[$extension][0] ?? 'application/octet-stream';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,4 +73,10 @@ interface IMimeTypeDetector {
|
|||
* @since 28.0.0
|
||||
*/
|
||||
public function getAllAliases(): array;
|
||||
|
||||
/**
|
||||
* @return array<string, list{string, string|null}>
|
||||
* @since 32.0.0
|
||||
*/
|
||||
public function getAllMappings(): array;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,4 +47,14 @@ interface IMimeTypeLoader {
|
|||
* @since 8.2.0
|
||||
*/
|
||||
public function reset(): void;
|
||||
|
||||
/**
|
||||
* Update filecache mimetype based on file extension
|
||||
*
|
||||
* @param string $ext
|
||||
* @param int $mimeTypeId
|
||||
* @return int
|
||||
* @since 32.0.0
|
||||
*/
|
||||
public function updateFilecache(string $ext, int $mimeTypeId): int;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,6 +100,41 @@ class DetectionTest extends \Test\TestCase {
|
|||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
|
||||
public function dataMimeTypeCustom(): array {
|
||||
return [
|
||||
['123', 'foobar/123'],
|
||||
['a123', 'foobar/123'],
|
||||
['bar', 'foobar/bar'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataMimeTypeCustom
|
||||
*
|
||||
* @param string $ext
|
||||
* @param string $mime
|
||||
*/
|
||||
public function testDetectMimeTypeCustom(string $ext, string $mime): void {
|
||||
$confDir = sys_get_temp_dir();
|
||||
file_put_contents($confDir . '/mimetypemapping.dist.json', json_encode([]));
|
||||
|
||||
/** @var IURLGenerator $urlGenerator */
|
||||
$urlGenerator = $this->getMockBuilder(IURLGenerator::class)
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
/** @var LoggerInterface $logger */
|
||||
$logger = $this->createMock(LoggerInterface::class);
|
||||
|
||||
// Create new mapping file
|
||||
file_put_contents($confDir . '/mimetypemapping.dist.json', json_encode([$ext => [$mime]]));
|
||||
|
||||
$detection = new Detection($urlGenerator, $logger, $confDir, $confDir);
|
||||
$mappings = $detection->getAllMappings();
|
||||
$this->assertArrayHasKey($ext, $mappings);
|
||||
$this->assertEquals($mime, $detection->detectPath('foo.' . $ext));
|
||||
}
|
||||
|
||||
public function dataGetSecureMimeType(): array {
|
||||
return [
|
||||
['image/svg+xml', 'text/plain'],
|
||||
|
|
|
|||
Loading…
Reference in a new issue