diff --git a/ext/resize/main.php b/ext/resize/main.php index ab33272c..2b2fd700 100644 --- a/ext/resize/main.php +++ b/ext/resize/main.php @@ -7,6 +7,7 @@ abstract class ResizeConfig const ENGINE = 'resize_engine'; const DEFAULT_WIDTH = 'resize_default_width'; const DEFAULT_HEIGHT = 'resize_default_height'; + const GET_ENABLED = 'resize_get_enabled'; } /** @@ -30,6 +31,7 @@ class ResizeImage extends Extension { global $config; $config->set_default_bool(ResizeConfig::ENABLED, true); + $config->set_default_bool(ResizeConfig::GET_ENABLED, false); $config->set_default_bool(ResizeConfig::UPLOAD, false); $config->set_default_string(ResizeConfig::ENGINE, MediaEngine::GD); $config->set_default_int(ResizeConfig::DEFAULT_WIDTH, 0); @@ -52,6 +54,7 @@ class ResizeImage extends Extension $sb->start_table(); $sb->add_choice_option(ResizeConfig::ENGINE, MediaEngine::IMAGE_ENGINES, "Engine", true); $sb->add_bool_option(ResizeConfig::ENABLED, "Allow resizing images", true); + $sb->add_bool_option(ResizeConfig::GET_ENABLED, "Allow GET args", true); $sb->add_bool_option(ResizeConfig::UPLOAD, "Resize on upload", true); $sb->end_table(); $sb->start_table(); @@ -161,6 +164,60 @@ class ResizeImage extends Extension } } + public function onImageDownloading(ImageDownloadingEvent $event) + { + global $config, $user; + + if ($config->get_bool(ResizeConfig::GET_ENABLED) && + $user->can(Permissions::EDIT_FILES) && + $this->can_resize_mime($event->image->get_mime())) { + $new_width = $event->image->width; + $new_height = $event->image->height; + + $max_height = 0; + $max_width = 0; + + if (isset($_GET['max_height'])) { + $max_height = int_escape($_GET['max_height']); + } else { + $max_height = $event->image->height; + } + + if (isset($_GET['max_width'])) { + $max_width = int_escape($_GET['max_width']); + } else { + $max_width = $event->image->width; + } + + [$new_width, $new_height] = get_scaled_by_aspect_ratio($event->image->width, $event->image->height, $max_width, $max_height); + + if ($new_width!==$event->image->width || $new_height !==$event->image->height) { + $tmp_filename = tempnam(sys_get_temp_dir(), 'shimmie_resize'); + if (empty($tmp_filename)) { + throw new ImageResizeException("Unable to save temporary image file."); + } + + $mre = new MediaResizeEvent( + $config->get_string(ResizeConfig::ENGINE), + $event->path, + $event->mime, + $tmp_filename, + $new_width, + $new_height + ); + send_event($mre); + + if ($event->file_modified===true&&$event->path!=$event->image->get_image_filename()) { + // This means that we're dealing with a temp file that will need cleaned up + unlink($event->path); + } + + $event->path = $tmp_filename; + $event->file_modified = true; + } + } + } + private function can_resize_mime($mime): bool { global $config; diff --git a/ext/transcode/main.php b/ext/transcode/main.php index 7289f264..6171e943 100644 --- a/ext/transcode/main.php +++ b/ext/transcode/main.php @@ -48,6 +48,7 @@ class TranscodeImage extends Extension { global $config; $config->set_default_bool(TranscodeConfig::ENABLED, true); + $config->set_default_bool(TranscodeConfig::GET_ENABLED, false); $config->set_default_bool(TranscodeConfig::UPLOAD, false); $config->set_default_string(TranscodeConfig::ENGINE, MediaEngine::GD); $config->set_default_int(TranscodeConfig::QUALITY, 80); @@ -144,6 +145,7 @@ class TranscodeImage extends Extension $sb = new SetupBlock("Image Transcode"); $sb->start_table(); $sb->add_bool_option(TranscodeConfig::ENABLED, "Allow transcoding images", true); + $sb->add_bool_option(TranscodeConfig::GET_ENABLED, "Enable GET args", true); $sb->add_bool_option(TranscodeConfig::UPLOAD, "Transcode on upload", true); $sb->add_choice_option(TranscodeConfig::ENGINE, MediaEngine::IMAGE_ENGINES, "Engine", true); foreach (self::INPUT_MIMES as $display=> $mime) { @@ -217,6 +219,41 @@ class TranscodeImage extends Extension } } + public function onImageDownloading(ImageDownloadingEvent $event) + { + global $config, $user; + + if ($config->get_bool(TranscodeConfig::GET_ENABLED) && + isset($_GET['transcode']) && + $user->can(Permissions::EDIT_FILES) && + $this->can_convert_mime($config->get_string(TranscodeConfig::ENGINE), $event->image->get_mime())) { + $target_mime = $_GET['transcode']; + + if (!MimeType::is_mime($target_mime)) { + $target_mime = MimeType::get_for_extension($target_mime); + } + if (empty($target_mime)) { + throw new ImageTranscodeException("Unable to determine output MIME for ".$_GET['transcode']); + } + + MediaEngine::is_output_supported($config->get_string(TranscodeConfig::ENGINE), $target_mime); + + $source_mime = $event->image->get_mime(); + + if ($source_mime!=$target_mime) { + $tmp_filename = $this->transcode_image($event->path, $source_mime, $target_mime); + + if ($event->file_modified===true&&$event->path!=$event->image->get_image_filename()) { + // This means that we're dealing with a temp file that will need cleaned up + unlink($event->path); + } + + $event->path = $tmp_filename; + $event->mime = $target_mime; + $event->file_modified = true; + } + } + } public function onBulkActionBlockBuilding(BulkActionBlockBuildingEvent $event) {