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(