If the file is text/plain, see if we accept the extension

This commit is contained in:
Mikael Nordfeldth 2016-07-06 09:34:09 +02:00
parent 4117118e23
commit 71afb5be75
2 changed files with 21 additions and 12 deletions

View File

@ -355,6 +355,7 @@ class MediaFile
$unclearTypes = array('application/octet-stream', $unclearTypes = array('application/octet-stream',
'application/vnd.ms-office', 'application/vnd.ms-office',
'application/zip', 'application/zip',
'text/plain',
'text/html', // Ironically, Wikimedia Commons' SVG_logo.svg is identified as text/html 'text/html', // Ironically, Wikimedia Commons' SVG_logo.svg is identified as text/html
// TODO: for XML we could do better content-based sniffing too // TODO: for XML we could do better content-based sniffing too
'text/xml'); 'text/xml');
@ -364,10 +365,12 @@ class MediaFile
// If we didn't match, or it is an unclear match // If we didn't match, or it is an unclear match
if ($originalFilename && (!$mimetype || in_array($mimetype, $unclearTypes))) { if ($originalFilename && (!$mimetype || in_array($mimetype, $unclearTypes))) {
try { try {
$type = common_supported_ext_to_mime($originalFilename); $type = common_supported_filename_to_mime($originalFilename);
return $type; return $type;
} catch (UnknownExtensionMimeException $e) {
// FIXME: I think we should keep the file extension here (supported should be === true here)
} catch (Exception $e) { } catch (Exception $e) {
// Extension not found, so $mimetype is our best guess // Extension parsed but no connected mimetype, so $mimetype is our best guess
} }
} }

View File

@ -1991,15 +1991,22 @@ function common_accept_to_prefs($accept, $def = '*/*')
} }
// Match by our supported file extensions // Match by our supported file extensions
function common_supported_ext_to_mime($fileext) function common_supported_filename_to_mime($filename)
{ {
// Accept a filename and take out the extension // Accept a filename and take out the extension
if (strpos($fileext, '.') !== false) { if (strpos($filename, '.') === false) {
$fileext = substr(strrchr($fileext, '.'), 1); throw new ServerException(sprintf('No extension on filename: %1$s', _ve($filename)));
} }
$fileext = substr(strrchr($filename, '.'), 1);
return common_supported_ext_to_mime($fileext);
}
function common_supported_ext_to_mime($fileext)
{
$supported = common_config('attachments', 'supported'); $supported = common_config('attachments', 'supported');
if ($supported === true) { if ($supported === true) {
// FIXME: Should we just accept the extension straight off when supported === true?
throw new UnknownExtensionMimeException($fileext); throw new UnknownExtensionMimeException($fileext);
} }
foreach($supported as $type => $ext) { foreach($supported as $type => $ext) {
@ -2015,16 +2022,15 @@ function common_supported_ext_to_mime($fileext)
function common_supported_mime_to_ext($mimetype) function common_supported_mime_to_ext($mimetype)
{ {
$supported = common_config('attachments', 'supported'); $supported = common_config('attachments', 'supported');
if ($supported === true) { if (is_array($supported)) {
throw new UnknownMimeExtensionException($mimetype); foreach($supported as $type => $ext) {
} if ($mimetype === $type) {
foreach($supported as $type => $ext) { return $ext;
if ($mimetype === $type) { }
return $ext;
} }
} }
throw new ServerException('Unsupported MIME type'); throw new UnknownMimeExtensionException($mimetype);
} }
// The MIME "media" is the part before the slash (video in video/webm) // The MIME "media" is the part before the slash (video in video/webm)