[Media] Document recently added settings and add some more

Fix some buggy ones, especially Embed crop
This commit is contained in:
2021-02-19 12:10:37 +00:00
parent 5e3fa2bba1
commit ee872b5e44
6 changed files with 93 additions and 46 deletions

View File

@@ -55,9 +55,10 @@ class EmbedPlugin extends Plugin
public $append_whitelist = []; // fill this array as domain_whitelist to add more trusted sources
public $check_whitelist = false; // security/abuse precaution
public $thumbnail_width = 128;
public $thumbnail_height = 128;
public $thumbnail_crop = true;
public $thumbnail_width = null;
public $thumbnail_height = null;
public $crop = true;
public $max_size = null;
protected $imgData = [];
@@ -71,6 +72,11 @@ class EmbedPlugin extends Plugin
parent::initialize();
$this->domain_whitelist = array_merge($this->domain_whitelist, $this->append_whitelist);
// Load global configuration if specific not provided
$this->thumbnail_width = $this->thumbnail_width ?? common_config('thumbnail', 'width');
$this->thumbnail_height = $this->thumbnail_height ?? common_config('thumbnail', 'height');
$this->max_size = $this->max_size ?? common_config('attachments', 'file_quota');
}
/**
@@ -563,15 +569,21 @@ class EmbedPlugin extends Plugin
}
// If the image is not of the desired size, resize it
if ($info[0] > $this->thumbnail_width || $info[1] > $this->thumbnail_height) {
if ($this->crop && ($info[0] > $this->thumbnail_width || $info[1] > $this->thumbnail_height)) {
// Temporary object, not stored in DB
$img = new ImageFile(-1, $fullpath);
$box = $img->scaleToFit($this->thumbnail_width, $this->thumbnail_height, $this->thumbnail_crop);
$outpath = $img->resizeTo($fullpath, $box);
$filename = basename($outpath);
if ($fullpath !== $outpath) {
@unlink($fullpath);
}
list($width, $height, $x, $y, $w, $h) = $img->scaleToFit($this->thumbnail_width, $this->thumbnail_height, $this->crop);
// The boundary box for our resizing
$box = [
'width' => $width, 'height' => $height,
'x' => $x, 'y' => $y,
'w' => $w, 'h' => $h,
];
$width = $box['width'];
$height = $box['height'];
$img->resizeTo($fullpath, $box);
}
} else {
throw new AlreadyFulfilledException('A thumbnail seems to already exist for remote file' .
@@ -622,11 +634,10 @@ class EmbedPlugin extends Plugin
try {
$is_image = $this->isRemoteImage($url, $headers);
if ($is_image == true) {
$max_size = common_get_preferred_php_upload_limit();
$file_size = $this->getRemoteFileSize($url, $headers);
if (($file_size!=false) && ($file_size > $max_size)) {
if (($file_size!=false) && ($file_size > $this->max_size)) {
common_debug("Went to store remote thumbnail of size " . $file_size .
" but the upload limit is " . $max_size . " so we aborted.");
" but the upload limit is " . $this->max_size . " so we aborted.");
return false;
}
} else {

View File

@@ -8,11 +8,17 @@ This plugin is enabled by default.
Settings
========
width: Maximum width of the thumbnail in pixels.
height: Maximum height of the thumbnail in pixels.
show_html: Whether to show HTML oEmbed data.
domain_whitelist: Array of regular expressions. Always escape your dots and end your strings.
check_whitelist: Whether to check the domain_whitelist.
* `domain_whitelist`: Array of regular expressions. Always escape your dots and end your strings.
* `check_whitelist`: Whether to check the domain_whitelist.
* `thumbnail_width`: Maximum width of the thumbnail in pixels. Defaults to global `[thumbnail][width]`.
* `thumbnail_height`: Maximum height of the thumbnail in pixels. Defaults to global `[thumbnail][height]`.
* `crop`: Crop to the thumbnail size and don't preserve the original file. Defaults to true.
* `max_size`: Max media size. Anything bigger than this is rejected. Defaults to global `[attachments][file_quota]`.
Relevant GNU social global settings
===================================
* `[attachments][show_html]`: Whether to show HTML oEmbed data.
Example
=======

View File

@@ -9,13 +9,16 @@ to the bottom of your config.php
Settings
========
domain_whitelist: Array of regular expressions. Always escape your dots and end your strings.
check_whitelist: Whether to check the domain_whitelist.
max_size: Max media size. Anything bigger than this is rejected. 10MiB by default.
* `domain_whitelist`: Array of regular expressions. Always escape your dots and end your strings.
* `check_whitelist`: Whether to check the domain_whitelist.
When check_whitelist is set, only images from URLs matching a regex in the
domain_whitelist array are accepted for local storage.
domain_whitelist array are accepted for local storage.
* `thumbnail_width`: Maximum width of the thumbnail in pixels. Defaults to global `[thumbnail][width]`.
* `thumbnail_height`: Maximum height of the thumbnail in pixels. Defaults to global `[thumbnail][height]`.
* `crop`: Crop to the thumbnail size and don't preserve the original file. Defaults to false.
* `max_size`: Max media size. Anything bigger than this is rejected. Defaults to global `[attachments][file_quota]`.
Example
=======

View File

@@ -41,10 +41,11 @@ class StoreRemoteMediaPlugin extends Plugin
public $append_whitelist = []; // fill this array as domain_whitelist to add more trusted sources
public $check_whitelist = false; // security/abuse precaution
public $thumbnail_width = null;
public $thumbnail_height = 128;
public $thumbnail_crop = true;
public $max_size = 10 * 1024 * 1024; // 10MiB max image size by default
public $store_original = true; // Whether to maintain a copy of the original media or only a thumbnail of it
public $thumbnail_width = null;
public $thumbnail_height = null;
public $crop = false;
public $max_size = null;
protected $imgData = [];
@@ -57,12 +58,10 @@ class StoreRemoteMediaPlugin extends Plugin
{
parent::initialize();
if (is_null($this->thumbnail_width)) {
$this->thumbnail_width = common_config('thumbnail', 'width');
$this->thumbnail_height = common_config('thumbnail', 'height');
$this->thumbnail_crop = common_config('thumbnail', 'crop');
$this->max_size = common_get_preferred_php_upload_limit();
}
// Load global configuration if specific not provided
$this->thumbnail_width = $this->thumbnail_width ?? common_config('thumbnail', 'width');
$this->thumbnail_height = $this->thumbnail_height ?? common_config('thumbnail', 'height');
$this->max_size = $this->max_size ?? common_config('attachments', 'file_quota');
$this->domain_whitelist = array_merge($this->domain_whitelist, $this->append_whitelist);
}
@@ -275,14 +274,10 @@ class StoreRemoteMediaPlugin extends Plugin
}
// If the image is not of the desired size, resize it
if ($info[0] > $this->thumbnail_width || $info[1] > $this->thumbnail_height) {
if ($this->crop && ($info[0] > $this->thumbnail_width || $info[1] > $this->thumbnail_height)) {
// Temporary object, not stored in DB
$img = new ImageFile(-1, $filepath);
// Get proper aspect ratio width and height before lookup
// We have to do it through an ImageFile object because of orientation etc.
// Only other solution would've been to rotate + rewrite uploaded files
// which we don't want to do because we like original, untouched data!
list($width, $height, $x, $y, $w, $h) = $img->scaleToFit($this->thumbnail_width, $this->thumbnail_height, $this->thumbnail_crop);
list($width, $height, $x, $y, $w, $h) = $img->scaleToFit($this->thumbnail_width, $this->thumbnail_height, $this->crop);
// The boundary box for our resizing
$box = [