Added option to detect file type based on header bytes

This commit is contained in:
Matthew Barbour 2019-06-12 17:35:11 -05:00
parent 8f73b35fbb
commit 97abeb5254
6 changed files with 55 additions and 23 deletions

View File

@ -53,21 +53,34 @@ function add_image(string $tmpname, string $filename, string $tags): void
assert(file_exists($tmpname)); assert(file_exists($tmpname));
$pathinfo = pathinfo($filename); $pathinfo = pathinfo($filename);
if (!array_key_exists('extension', $pathinfo)) {
throw new UploadException("File has no extension");
}
$metadata = []; $metadata = [];
$metadata['filename'] = $pathinfo['basename']; $metadata['filename'] = $pathinfo['basename'];
$metadata['extension'] = $pathinfo['extension']; if (array_key_exists('extension', $pathinfo)) {
$metadata['extension'] = $pathinfo['extension'];
}
$metadata['tags'] = Tag::explode($tags); $metadata['tags'] = Tag::explode($tags);
$metadata['source'] = null; $metadata['source'] = null;
$event = new DataUploadEvent($tmpname, $metadata); $event = new DataUploadEvent($tmpname, $metadata);
send_event($event); 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 * Given a full size pair of dimensions, return a pair scaled down to fit
* into the configured thumbnail square, with ratio intact * 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"); throw new ImageResizeException("Failed to save the new image, function returned false when saving type: $output_type");
} }
imagedestroy($image_resized); imagedestroy($image_resized);
} }

View File

@ -310,7 +310,7 @@ function getMimeType(string $file, string $ext=""): string
return 'application/octet-stream'; return 'application/octet-stream';
} }
function getExtension(?string $mime_type): ?string function get_extension(?string $mime_type): ?string
{ {
if (empty($mime_type)) { if (empty($mime_type)) {
return null; return null;

View File

@ -69,7 +69,9 @@ class BulkAddCSV extends Extension
} }
$metadata = []; $metadata = [];
$metadata['filename'] = $pathinfo['basename']; $metadata['filename'] = $pathinfo['basename'];
$metadata['extension'] = $pathinfo['extension']; if (array_key_exists('extension', $pathinfo)) {
$metadata['extension'] = $pathinfo['extension'];
}
$metadata['tags'] = Tag::explode($tags); $metadata['tags'] = Tag::explode($tags);
$metadata['source'] = $source; $metadata['source'] = $source;
$event = new DataUploadEvent($tmpname, $metadata); $event = new DataUploadEvent($tmpname, $metadata);

View File

@ -325,9 +325,6 @@ class CronUploader extends Extension
assert(file_exists($tmpname)); assert(file_exists($tmpname));
$pathinfo = pathinfo($filename); $pathinfo = pathinfo($filename);
if (! array_key_exists('extension', $pathinfo)) {
throw new UploadException("File has no extension");
}
$metadata = []; $metadata = [];
$metadata ['filename'] = $pathinfo ['basename']; $metadata ['filename'] = $pathinfo ['basename'];
$metadata ['extension'] = $pathinfo ['extension']; $metadata ['extension'] = $pathinfo ['extension'];

View File

@ -366,7 +366,9 @@ class DanbooruApi extends Extension
$fileinfo = pathinfo($filename); $fileinfo = pathinfo($filename);
$metadata = []; $metadata = [];
$metadata['filename'] = $fileinfo['basename']; $metadata['filename'] = $fileinfo['basename'];
$metadata['extension'] = $fileinfo['extension']; if (array_key_exists('extension', $fileinfo)) {
$metadata['extension'] = $fileinfo['extension'];
}
$metadata['tags'] = $posttags; $metadata['tags'] = $posttags;
$metadata['source'] = $source; $metadata['source'] = $source;
//log_debug("danbooru_api","========== NEW($filename) ========="); //log_debug("danbooru_api","========== NEW($filename) =========");

View File

@ -18,9 +18,15 @@ class DataUploadEvent extends Event
/** @var string */ /** @var string */
public $hash; public $hash;
/** @var string */ /** @var string */
public $type; public $type = "";
/** @var int */ /** @var int */
public $image_id = -1; public $image_id = -1;
/** @var bool */
public $handled = false;
/** @var bool */
public $merged = false;
/** /**
* Some data is being uploaded. * Some data is being uploaded.
@ -29,9 +35,10 @@ class DataUploadEvent extends Event
*/ */
public function __construct(string $tmpname, array $metadata) public function __construct(string $tmpname, array $metadata)
{ {
global $config;
assert(file_exists($tmpname)); assert(file_exists($tmpname));
assert(is_string($metadata["filename"])); assert(is_string($metadata["filename"]));
assert(is_string($metadata["extension"]));
assert(is_array($metadata["tags"])); assert(is_array($metadata["tags"]));
assert(is_string($metadata["source"]) || is_null($metadata["source"])); 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 // useful for most file handlers, so pull directly into fields
$this->hash = $this->metadata['hash']; $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_size', parse_shorthand_int('1MB'));
$config->set_default_int('upload_min_free_space', parse_shorthand_int('100MB')); $config->set_default_int('upload_min_free_space', parse_shorthand_int('100MB'));
$config->set_default_bool('upload_tlsource', true); $config->set_default_bool('upload_tlsource', true);
$config->set_default_bool('upload_use_mime', false);
$this->is_full = false; $this->is_full = false;
@ -108,6 +126,7 @@ class Upload extends Extension
$sb->add_label("<i>PHP Limit = ".ini_get('upload_max_filesize')."</i>"); $sb->add_label("<i>PHP Limit = ".ini_get('upload_max_filesize')."</i>");
$sb->add_choice_option("transload_engine", $tes, "<br/>Transload: "); $sb->add_choice_option("transload_engine", $tes, "<br/>Transload: ");
$sb->add_bool_option("upload_tlsource", "<br/>Use transloaded URL as source if none is provided: "); $sb->add_bool_option("upload_tlsource", "<br/>Use transloaded URL as source if none is provided: ");
$sb->add_bool_option("upload_use_mime", "<br/>Use mime type to determine file types: ");
$event->panel->add_block($sb); $event->panel->add_block($sb);
} }
@ -307,7 +326,9 @@ class Upload extends Extension
$pathinfo = pathinfo($file['name']); $pathinfo = pathinfo($file['name']);
$metadata = []; $metadata = [];
$metadata['filename'] = $pathinfo['basename']; $metadata['filename'] = $pathinfo['basename'];
$metadata['extension'] = $pathinfo['extension']; if (array_key_exists('extension', $pathinfo)) {
$metadata['extension'] = $pathinfo['extension'];
}
$metadata['tags'] = $tags; $metadata['tags'] = $tags;
$metadata['source'] = $source; $metadata['source'] = $source;
@ -318,9 +339,6 @@ class Upload extends Extension
$event = new DataUploadEvent($file['tmp_name'], $metadata); $event = new DataUploadEvent($file['tmp_name'], $metadata);
send_event($event); 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)); $page->add_http_header("X-Shimmie-Image-ID: ".int_escape($event->image_id));
} catch (UploadException $ex) { } catch (UploadException $ex) {
$this->theme->display_upload_error( $this->theme->display_upload_error(
@ -389,7 +407,7 @@ class Upload extends Extension
$ext = false; $ext = false;
if (is_array($headers)) { if (is_array($headers)) {
$ext = getExtension(findHeader($headers, 'Content-Type')); $ext = get_extension(findHeader($headers, 'Content-Type'));
} }
if ($ext === false) { if ($ext === false) {
$ext = $pathinfo['extension']; $ext = $pathinfo['extension'];
@ -411,8 +429,8 @@ class Upload extends Extension
$metadata['replace'] = $replace; $metadata['replace'] = $replace;
} }
$event = new DataUploadEvent($tmp_filename, $metadata);
try { try {
$event = new DataUploadEvent($tmp_filename, $metadata);
send_event($event); send_event($event);
} catch (UploadException $ex) { } catch (UploadException $ex) {
$this->theme->display_upload_error( $this->theme->display_upload_error(