]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
[Embed] Resize thumbnails fetched by Embed to avoid keeping original images when...
authorMiguel Dantas <biodantasgs@gmail.com>
Tue, 23 Jul 2019 10:07:47 +0000 (11:07 +0100)
committerDiogo Cordeiro <diogo@fc.up.pt>
Sat, 3 Aug 2019 16:49:36 +0000 (17:49 +0100)
classes/File.php
lib/imagefile.php
lib/mediafile.php
plugins/Embed/EmbedPlugin.php

index 06884235ccaa66ff824caa2056b94a116745ddfb..739a00aa50546c884101e831809fe2c9adf50eac 100644 (file)
@@ -342,7 +342,6 @@ class File extends Managed_DataObject
     public static function getSafeExtension(string $filename) {
         if (preg_match('/^.+?\.([A-Za-z0-9]+)$/', $filename, $matches) === 1) {
             // we matched on a file extension, so let's see if it means something.
-            common_debug("MATCHES EXT: " . print_r($matches, true));
             $ext = mb_strtolower($matches[1]);
             $blacklist = common_config('attachments', 'extblacklist');
             // If we got an extension from $filename we want to check if it's in a blacklist
index 2d7e85e28c0f60fb23eed50cc49e7d225c38fb57..abf43561b49b2d2a6f964e6c2911207a33a2cf7d 100644 (file)
@@ -372,6 +372,10 @@ class ImageFile extends MediaFile
             $box['h']
         );
 
+        if ($this->filepath === $outpath) {
+            @unlink($outpath);
+        }
+
         $type = $this->preferredType();
 
         switch ($type) {
index fa5b653908d6250176564a7988c849bb7a139087..981bf651132daf0cd3c24efbba7e2a61ae06e79b 100644 (file)
@@ -256,8 +256,6 @@ class MediaFile
             throw new ClientException(_('Blacklisted file extension.'));
         }
 
-        common_debug("EXT: " . print_r($ext, true));
-
         if (!empty($ext)) {
             // Remove dots if we have them (make sure they're not repeated)
             $ext = preg_replace('/^\.+/', '', $ext);
index 84cb54d9d1397c0530f03131e5d6dfa6e3907c3e..3f9ed9f6f9ce949cd606558833655b60e7c4d876 100644 (file)
@@ -53,6 +53,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;
+
     protected $imgData = [];
 
     /**
@@ -295,7 +299,7 @@ class EmbedPlugin extends Plugin
         $out->elementStart('article', ['class'=>'h-entry embed']);
         $out->elementStart('header');
         try {
-            $thumb = $file->getThumbnail(128, 128);
+            $thumb = $file->getThumbnail($this->thumbnail_width, $this->thumbnail_height);
             $out->element('img', $thumb->getHtmlAttrs(['class'=>'u-photo embed']));
             unset($thumb);
         } catch (FileNotFoundException $e) {
@@ -398,8 +402,8 @@ class EmbedPlugin extends Plugin
         }
 
         try {
-            // If we have proper Embed data, there should be an entry in the File_embed
-            // and File_thumbnail tables respectively. If not, we're not going to do anything.
+            // If we have proper Embed data, there should be an entry in the File_thumbnail table.
+            // If not, we're not going to do anything.
             $thumbnail = File_thumbnail::byFile($file);
         } catch (NoResultException $e) {
             // Not Embed data, or at least nothing we either can or want to use.
@@ -466,7 +470,7 @@ class EmbedPlugin extends Plugin
                 $headers = $head->getHeader();
                 $headers = array_change_key_case($headers, CASE_LOWER);
             }
-            return $headers['content-length'] ?: false;
+            return isset($headers['content-length']) ? $headers['content-length'] : false;
         } catch (Exception $err) {
             common_log(LOG_ERR, __CLASS__.': getRemoteFileSize on URL : '._ve($url).
                        ' threw exception: '.$err->getMessage());
@@ -541,6 +545,8 @@ class EmbedPlugin extends Plugin
         ));
         $imgData = HTTPClient::quickGet($url);
         $info = @getimagesizefromstring($imgData);
+        // array indexes documented on php.net:
+        // https://php.net/manual/en/function.getimagesize.php
         if ($info === false) {
             throw new UnsupportedMediaException(_('Remote file format was not identified as an image.'), $url);
         } elseif (!$info[0] || !$info[1]) {
@@ -548,6 +554,8 @@ class EmbedPlugin extends Plugin
         }
 
         $filehash = hash(File::FILEHASH_ALG, $imgData);
+        $width = min($info[0], $this->thumbnail_width);
+        $height = min($info[1], $this->thumbnail_height);
 
         try {
             $original_name = HTTPClient::get_filename($url, $headers);
@@ -566,6 +574,18 @@ class EmbedPlugin extends Plugin
                         $url
                     );
                 }
+
+                // If the image is not of the desired size, resize it
+                if ($info[0] !== $this->thumbnail_width || $info[1] !== $this->thumbnail_height) {
+                    // Temporary object, not stored in DB
+                    $img = new ImageFile(-1, $fullpath);
+                    $box = $img->scaleToFit($width, $height, $this->thumbnail_crop);
+                    $outpath = $img->resizeTo($fullpath, $box);
+                    $filename = basename($outpath);
+                    if ($fullpath !== $outpath) {
+                        @unlink($fullpath);
+                    }
+                }
             } else {
                 throw new AlreadyFulfilledException('A thumbnail seems to already exist for remote file with id==' .
                                                     $thumbnail->file_id . ' at path ' . $fullpath);
@@ -581,14 +601,14 @@ class EmbedPlugin extends Plugin
         }
 
         try {
-            // Updated our database for the file record
+            // Update our database for the file record
             $orig = clone($thumbnail);
             $thumbnail->filename = $filename;
-            $thumbnail->width = $info[0];    // array indexes documented on php.net:
-            $thumbnail->height = $info[1];   // https://php.net/manual/en/function.getimagesize.php
+            $thumbnail->width = $width;
+            $thumbnail->height = $height;
             // Throws exception on failure.
             $thumbnail->updateWithKeys($orig);
-        } catch (exception $err) {
+        } catch (Exception $err) {
             common_log(LOG_ERR, "Went to write a thumbnail entry to the database in " .
                        "EmbedPlugin::storeRemoteThumbnail but encountered error: ".$err);
             return $err;