diff --git a/lib/mediafile.php b/lib/mediafile.php index 54d00b4acf..803cbe0a4c 100644 --- a/lib/mediafile.php +++ b/lib/mediafile.php @@ -355,6 +355,7 @@ class MediaFile $unclearTypes = array('application/octet-stream', 'application/vnd.ms-office', 'application/zip', + 'text/plain', 'text/html', // Ironically, Wikimedia Commons' SVG_logo.svg is identified as text/html // TODO: for XML we could do better content-based sniffing too 'text/xml'); @@ -364,10 +365,12 @@ class MediaFile // If we didn't match, or it is an unclear match if ($originalFilename && (!$mimetype || in_array($mimetype, $unclearTypes))) { try { - $type = common_supported_ext_to_mime($originalFilename); + $type = common_supported_filename_to_mime($originalFilename); return $type; + } catch (UnknownExtensionMimeException $e) { + // FIXME: I think we should keep the file extension here (supported should be === true here) } catch (Exception $e) { - // Extension not found, so $mimetype is our best guess + // Extension parsed but no connected mimetype, so $mimetype is our best guess } } diff --git a/lib/util.php b/lib/util.php index 846605bc7f..985b3773df 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1991,15 +1991,22 @@ function common_accept_to_prefs($accept, $def = '*/*') } // 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 - if (strpos($fileext, '.') !== false) { - $fileext = substr(strrchr($fileext, '.'), 1); + if (strpos($filename, '.') === false) { + 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'); if ($supported === true) { + // FIXME: Should we just accept the extension straight off when supported === true? throw new UnknownExtensionMimeException($fileext); } foreach($supported as $type => $ext) { @@ -2015,16 +2022,15 @@ function common_supported_ext_to_mime($fileext) function common_supported_mime_to_ext($mimetype) { $supported = common_config('attachments', 'supported'); - if ($supported === true) { - throw new UnknownMimeExtensionException($mimetype); - } - foreach($supported as $type => $ext) { - if ($mimetype === $type) { - return $ext; + if (is_array($supported)) { + foreach($supported as $type => $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)