[Core][GSFile] Improve the way EncoderPlugins participate in the file sanitization process

This commit is contained in:
Diogo Peralta Cordeiro 2021-08-18 22:11:44 +01:00
parent 24b3e22f73
commit aebc5358b5
Signed by: diogo
GPG Key ID: 18D2D35001FBFAB0

View File

@ -71,10 +71,22 @@ class GSFile
// Attachment Exists // Attachment Exists
$attachment->livesIncrementAndGet(); $attachment->livesIncrementAndGet();
if (is_null($attachment->getFilename())) { if (is_null($attachment->getFilename())) {
$mimetype = mb_substr($attachment->getMimetype(), 0, 64); $mimetype = $attachment->getMimetype();
$width = $attachment->getWidth(); $width = $attachment->getWidth();
$height = $attachment->getHeight(); $height = $attachment->getHeight();
Event::handle('AttachmentSanitization', [&$file, &$mimetype, &$width, &$height]); if (Common::config('attachments', 'sanitize')) {
$event_map[$mimetype] = [];
$major_mime = self::mimetypeMajor($mimetype);
$event_map[$major_mime] = [];
Event::handle('FileSanitizerAvailable', [&$event_map, $mimetype]);
// Always prefer specific encoders
$encoders = array_merge($event_map[$mimetype], $event_map[$major_mime]);
foreach ($encoders as $encoder) {
if ($encoder($file, $mimetype, $width, $height)) {
break; // One successful sanitizer is enough
}
}
}
$attachment->setFilename($hash); $attachment->setFilename($hash);
$attachment->setMimetype($mimetype); $attachment->setMimetype($mimetype);
$attachment->setWidth($width); $attachment->setWidth($width);
@ -88,7 +100,19 @@ class GSFile
// available methods, so should be safe // available methods, so should be safe
$mimetype = mb_substr($file->getMimeType(), 0, 64); $mimetype = mb_substr($file->getMimeType(), 0, 64);
$width = $height = null; $width = $height = null;
Event::handle('AttachmentSanitization', [&$file, &$mimetype, &$width, &$height]); if (Common::config('attachments', 'sanitize')) {
$event_map[$mimetype] = [];
$major_mime = self::mimetypeMajor($mimetype);
$event_map[$major_mime] = [];
Event::handle('FileSanitizerAvailable', [&$event_map, $mimetype]);
// Always prefer specific encoders
$encoders = array_merge($event_map[$mimetype], $event_map[$major_mime]);
foreach ($encoders as $encoder) {
if ($encoder($file, $mimetype, $width, $height)) {
break; // One successful sanitizer is enough
}
}
}
$attachment = Attachment::create([ $attachment = Attachment::create([
'filehash' => $hash, 'filehash' => $hash,
'mimetype' => $mimetype, 'mimetype' => $mimetype,