diff --git a/core/imageboard/misc.php b/core/imageboard/misc.php index c1b9e242..8374242a 100644 --- a/core/imageboard/misc.php +++ b/core/imageboard/misc.php @@ -53,21 +53,34 @@ function add_image(string $tmpname, string $filename, string $tags): void assert(file_exists($tmpname)); $pathinfo = pathinfo($filename); - if (!array_key_exists('extension', $pathinfo)) { - throw new UploadException("File has no extension"); - } $metadata = []; $metadata['filename'] = $pathinfo['basename']; - $metadata['extension'] = $pathinfo['extension']; + if (array_key_exists('extension', $pathinfo)) { + $metadata['extension'] = $pathinfo['extension']; + } + $metadata['tags'] = Tag::explode($tags); $metadata['source'] = null; $event = new DataUploadEvent($tmpname, $metadata); send_event($event); - if ($event->image_id == -1) { - throw new UploadException("File type not recognised"); - } } + +function get_extension_from_mime(String $file_path): ?String +{ + global $config; + $mime = mime_content_type($file_path); + if(!empty($mime)) { + $ext = get_extension($mime); + if(!empty($ext)) { + return $ext; + } + throw new UploadException("Could not determine extension for mimetype ".$mime); + } + throw new UploadException("Could not determine file mime type: ".$file_path); +} + + /** * Given a full size pair of dimensions, return a pair scaled down to fit * into the configured thumbnail square, with ratio intact @@ -410,4 +423,4 @@ function image_resize_gd(String $image_filename, array $info, int $new_width, in throw new ImageResizeException("Failed to save the new image, function returned false when saving type: $output_type"); } imagedestroy($image_resized); -} \ No newline at end of file +} diff --git a/core/polyfills.php b/core/polyfills.php index ffbf31f4..e82dae7b 100644 --- a/core/polyfills.php +++ b/core/polyfills.php @@ -310,7 +310,7 @@ function getMimeType(string $file, string $ext=""): string return 'application/octet-stream'; } -function getExtension(?string $mime_type): ?string +function get_extension(?string $mime_type): ?string { if (empty($mime_type)) { return null; diff --git a/ext/bulk_add_csv/main.php b/ext/bulk_add_csv/main.php index 1cb06cec..dd15acb5 100644 --- a/ext/bulk_add_csv/main.php +++ b/ext/bulk_add_csv/main.php @@ -69,7 +69,9 @@ class BulkAddCSV extends Extension } $metadata = []; $metadata['filename'] = $pathinfo['basename']; - $metadata['extension'] = $pathinfo['extension']; + if (array_key_exists('extension', $pathinfo)) { + $metadata['extension'] = $pathinfo['extension']; + } $metadata['tags'] = Tag::explode($tags); $metadata['source'] = $source; $event = new DataUploadEvent($tmpname, $metadata); diff --git a/ext/cron_uploader/main.php b/ext/cron_uploader/main.php index dbcf549c..e33b1dba 100644 --- a/ext/cron_uploader/main.php +++ b/ext/cron_uploader/main.php @@ -325,9 +325,6 @@ class CronUploader extends Extension assert(file_exists($tmpname)); $pathinfo = pathinfo($filename); - if (! array_key_exists('extension', $pathinfo)) { - throw new UploadException("File has no extension"); - } $metadata = []; $metadata ['filename'] = $pathinfo ['basename']; $metadata ['extension'] = $pathinfo ['extension']; diff --git a/ext/danbooru_api/main.php b/ext/danbooru_api/main.php index 7ee0579c..a831f366 100644 --- a/ext/danbooru_api/main.php +++ b/ext/danbooru_api/main.php @@ -366,7 +366,9 @@ class DanbooruApi extends Extension $fileinfo = pathinfo($filename); $metadata = []; $metadata['filename'] = $fileinfo['basename']; - $metadata['extension'] = $fileinfo['extension']; + if (array_key_exists('extension', $fileinfo)) { + $metadata['extension'] = $fileinfo['extension']; + } $metadata['tags'] = $posttags; $metadata['source'] = $source; //log_debug("danbooru_api","========== NEW($filename) ========="); diff --git a/ext/upload/main.php b/ext/upload/main.php index 84279727..2e8ef107 100644 --- a/ext/upload/main.php +++ b/ext/upload/main.php @@ -18,9 +18,15 @@ class DataUploadEvent extends Event /** @var string */ public $hash; /** @var string */ - public $type; + public $type = ""; /** @var int */ public $image_id = -1; + /** @var bool */ + public $handled = false; + /** @var bool */ + public $merged = false; + + /** * Some data is being uploaded. @@ -29,9 +35,10 @@ class DataUploadEvent extends Event */ public function __construct(string $tmpname, array $metadata) { + global $config; + assert(file_exists($tmpname)); assert(is_string($metadata["filename"])); - assert(is_string($metadata["extension"])); assert(is_array($metadata["tags"])); assert(is_string($metadata["source"]) || is_null($metadata["source"])); @@ -43,7 +50,17 @@ class DataUploadEvent extends Event // useful for most file handlers, so pull directly into fields $this->hash = $this->metadata['hash']; - $this->type = strtolower($metadata['extension']); + + if($config->get_bool("upload_use_mime")) { + $this->type = strtolower(get_extension_from_mime($tmpname)); + $this->metadata["extension"] = $this->type; + } else { + if(array_key_exists('extension',$metadata)&&!empty($metadata['extension'])) { + $this->type = strtolower($metadata['extension']); + } else { + throw new UploadException("Could not determine extension for file ".$metadata["filename"]); + } + } } } @@ -76,6 +93,7 @@ class Upload extends Extension $config->set_default_int('upload_size', parse_shorthand_int('1MB')); $config->set_default_int('upload_min_free_space', parse_shorthand_int('100MB')); $config->set_default_bool('upload_tlsource', true); + $config->set_default_bool('upload_use_mime', false); $this->is_full = false; @@ -108,6 +126,7 @@ class Upload extends Extension $sb->add_label("PHP Limit = ".ini_get('upload_max_filesize').""); $sb->add_choice_option("transload_engine", $tes, "
Transload: "); $sb->add_bool_option("upload_tlsource", "
Use transloaded URL as source if none is provided: "); + $sb->add_bool_option("upload_use_mime", "
Use mime type to determine file types: "); $event->panel->add_block($sb); } @@ -307,7 +326,9 @@ class Upload extends Extension $pathinfo = pathinfo($file['name']); $metadata = []; $metadata['filename'] = $pathinfo['basename']; - $metadata['extension'] = $pathinfo['extension']; + if (array_key_exists('extension', $pathinfo)) { + $metadata['extension'] = $pathinfo['extension']; + } $metadata['tags'] = $tags; $metadata['source'] = $source; @@ -318,9 +339,6 @@ class Upload extends Extension $event = new DataUploadEvent($file['tmp_name'], $metadata); send_event($event); - if ($event->image_id == -1) { - throw new UploadException("File type not recognised"); - } $page->add_http_header("X-Shimmie-Image-ID: ".int_escape($event->image_id)); } catch (UploadException $ex) { $this->theme->display_upload_error( @@ -389,7 +407,7 @@ class Upload extends Extension $ext = false; if (is_array($headers)) { - $ext = getExtension(findHeader($headers, 'Content-Type')); + $ext = get_extension(findHeader($headers, 'Content-Type')); } if ($ext === false) { $ext = $pathinfo['extension']; @@ -411,8 +429,8 @@ class Upload extends Extension $metadata['replace'] = $replace; } - $event = new DataUploadEvent($tmp_filename, $metadata); try { + $event = new DataUploadEvent($tmp_filename, $metadata); send_event($event); } catch (UploadException $ex) { $this->theme->display_upload_error(