]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix resource usages in OC_Image
authorCôme Chilliet <come.chilliet@nextcloud.com>
Mon, 25 Oct 2021 14:13:50 +0000 (16:13 +0200)
committerCôme Chilliet <come.chilliet@nextcloud.com>
Thu, 28 Oct 2021 15:48:43 +0000 (17:48 +0200)
This makes sure using resource or GdImage (PHP>=8) behaves the same.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
lib/private/Avatar/UserAvatar.php
lib/private/Preview/Bitmap.php
lib/private/Preview/HEIC.php
lib/private/Preview/SVG.php
lib/private/legacy/OC_Image.php
lib/public/IImage.php
psalm.xml

index 027c83172c2f1fc528ac54cd1ae4e30991339317..b46e4816fa29b39554614e12b5c53f337b6117f3 100644 (file)
@@ -122,7 +122,7 @@ class UserAvatar extends Avatar {
        /**
         * Returns an image from several sources.
         *
-        * @param IImage|resource|string $data An image object, imagedata or path to the avatar
+        * @param IImage|resource|string|\GdImage $data An image object, imagedata or path to the avatar
         * @return IImage
         */
        private function getAvatarImage($data) {
@@ -131,7 +131,10 @@ class UserAvatar extends Avatar {
                }
 
                $img = new OC_Image();
-               if (is_resource($data) && get_resource_type($data) === 'gd') {
+               if (
+                       (is_resource($data) && get_resource_type($data) === 'gd') ||
+                       (is_object($data) && get_class($data) === \GdImage::class)
+                       ) {
                        $img->setResource($data);
                } elseif (is_resource($data)) {
                        $img->loadFromFileHandle($data);
index 969fb948d942f185cbe7843ec0790d3ee02c87d5..57451da572518121a000e4ace4efd28ac7ed198d 100644 (file)
@@ -60,7 +60,7 @@ abstract class Bitmap extends ProviderV2 {
 
                //new bitmap image object
                $image = new \OC_Image();
-               $image->loadFromData($bp);
+               $image->loadFromData((string) $bp);
                //check if image object is valid
                return $image->valid() ? $image : null;
        }
index f2d43564c99ae1050a3901368dfb1b14e34cb704..6601de238a9757ac99abb95c963ab08750ce6648 100644 (file)
@@ -81,7 +81,7 @@ class HEIC extends ProviderV2 {
 
                //new bitmap image object
                $image = new \OC_Image();
-               $image->loadFromData($bp);
+               $image->loadFromData((string) $bp);
                //check if image object is valid
                return $image->valid() ? $image : null;
        }
index cee0f341716c6a3ef9ee6d8823a7a5cf4eb5c1d6..690a6b50ffe74670afc8572f8fef8ec6ad5a8565 100644 (file)
@@ -69,7 +69,7 @@ class SVG extends ProviderV2 {
 
                //new image object
                $image = new \OC_Image();
-               $image->loadFromData($svg);
+               $image->loadFromData((string) $svg);
                //check if image object is valid
                if ($image->valid()) {
                        $image->scaleDownToFit($maxX, $maxY);
index 1e00b606ea062117115a2edeb325304b54e235db..c30ceae9916c873d6278f1b82fb98937dd0fa483 100644 (file)
@@ -101,7 +101,7 @@ class OC_Image implements \OCP\IImage {
                if (is_resource($this->resource)) {
                        return true;
                }
-               if (is_object($this->resource) && get_class($this->resource) === 'GdImage') {
+               if (is_object($this->resource) && get_class($this->resource) === \GdImage::class) {
                        return true;
                }
 
@@ -308,7 +308,7 @@ class OC_Image implements \OCP\IImage {
        }
 
        /**
-        * @param resource Returns the image resource in any.
+        * @param resource|\GdImage $resource
         * @throws \InvalidArgumentException in case the supplied resource does not have the type "gd"
         */
        public function setResource($resource) {
@@ -318,7 +318,7 @@ class OC_Image implements \OCP\IImage {
                        return;
                }
                // PHP 8 has real objects for GD stuff
-               if (is_object($resource) && get_class($resource) === 'GdImage') {
+               if (is_object($resource) && get_class($resource) === \GdImage::class) {
                        $this->resource = $resource;
                        return;
                }
@@ -326,7 +326,7 @@ class OC_Image implements \OCP\IImage {
        }
 
        /**
-        * @return resource Returns the image resource in any.
+        * @return resource|\GdImage Returns the image resource in any.
         */
        public function resource() {
                return $this->resource;
@@ -536,7 +536,7 @@ class OC_Image implements \OCP\IImage {
         * It is the responsibility of the caller to position the pointer at the correct place and to close the handle again.
         *
         * @param resource $handle
-        * @return resource|false An image resource or false on error
+        * @return resource|\GdImage|false An image resource or false on error
         */
        public function loadFromFileHandle($handle) {
                $contents = stream_get_contents($handle);
@@ -550,7 +550,7 @@ class OC_Image implements \OCP\IImage {
         * Loads an image from a local file.
         *
         * @param bool|string $imagePath The path to a local file.
-        * @return bool|resource An image resource or false on error
+        * @return bool|resource|\GdImage An image resource or false on error
         */
        public function loadFromFile($imagePath = false) {
                // exif_imagetype throws "read error!" if file is less than 12 byte
@@ -666,17 +666,17 @@ class OC_Image implements \OCP\IImage {
         * Loads an image from a string of data.
         *
         * @param string $str A string of image data as read from a file.
-        * @return bool|resource An image resource or false on error
+        * @return bool|resource|\GdImage An image resource or false on error
         */
        public function loadFromData($str) {
-               if (is_resource($str)) {
+               if (!is_string($str)) {
                        return false;
                }
                $this->resource = @imagecreatefromstring($str);
                if ($this->fileInfo) {
                        $this->mimeType = $this->fileInfo->buffer($str);
                }
-               if (is_resource($this->resource)) {
+               if ($this->valid()) {
                        imagealphablending($this->resource, false);
                        imagesavealpha($this->resource, true);
                }
@@ -692,7 +692,7 @@ class OC_Image implements \OCP\IImage {
         * Loads an image from a base64 encoded string.
         *
         * @param string $str A string base64 encoded string of image data.
-        * @return bool|resource An image resource or false on error
+        * @return bool|resource|\GdImage An image resource or false on error
         */
        public function loadFromBase64($str) {
                if (!is_string($str)) {
@@ -722,7 +722,7 @@ class OC_Image implements \OCP\IImage {
         * @param string $fileName <p>
         * Path to the BMP image.
         * </p>
-        * @return bool|resource an image resource identifier on success, <b>FALSE</b> on errors.
+        * @return bool|resource|\GdImage an image resource identifier on success, <b>FALSE</b> on errors.
         */
        private function imagecreatefrombmp($fileName) {
                if (!($fh = fopen($fileName, 'rb'))) {
@@ -878,12 +878,12 @@ class OC_Image implements \OCP\IImage {
                $result = $this->resizeNew($maxSize);
                imagedestroy($this->resource);
                $this->resource = $result;
-               return is_resource($result);
+               return $this->valid();
        }
 
        /**
         * @param $maxSize
-        * @return resource | bool
+        * @return resource|bool|\GdImage
         */
        private function resizeNew($maxSize) {
                if (!$this->valid()) {
@@ -914,14 +914,14 @@ class OC_Image implements \OCP\IImage {
                $result = $this->preciseResizeNew($width, $height);
                imagedestroy($this->resource);
                $this->resource = $result;
-               return is_resource($result);
+               return $this->valid();
        }
 
 
        /**
         * @param int $width
         * @param int $height
-        * @return resource | bool
+        * @return resource|bool|\GdImage
         */
        public function preciseResizeNew(int $width, int $height) {
                if (!$this->valid()) {
@@ -1023,7 +1023,7 @@ class OC_Image implements \OCP\IImage {
                $result = $this->cropNew($x, $y, $w, $h);
                imagedestroy($this->resource);
                $this->resource = $result;
-               return is_resource($result);
+               return $this->valid();
        }
 
        /**
@@ -1181,7 +1181,7 @@ if (!function_exists('imagebmp')) {
         * @link http://www.programmierer-forum.de/imagebmp-gute-funktion-gefunden-t143716.htm
         * @author mgutt <marc@gutt.it>
         * @version 1.00
-        * @param resource $im
+        * @param resource|\GdImage $im
         * @param string $fileName [optional] <p>The path to save the file to.</p>
         * @param int $bit [optional] <p>Bit depth, (default is 24).</p>
         * @param int $compression [optional]
index 459553de799b009c612e4b7e7baaac980703cd4f..9d2b31e0e2868d145320f3c1335b403f205c6eb9 100644 (file)
@@ -98,7 +98,7 @@ interface IImage {
        public function save($filePath = null, $mimeType = null);
 
        /**
-        * @return resource Returns the image resource in any.
+        * @return resource|\GdImage Returns the image resource in any.
         * @since 8.1.0
         */
        public function resource();
index a075ceb24a786683e4296eb657ce0c9f7c85427b..4f75af61dde9fa9365dd56967aef489e89cdd1fe 100644 (file)
--- a/psalm.xml
+++ b/psalm.xml
@@ -81,6 +81,8 @@
                        <errorLevel type="suppress">
                                <referencedClass name="OCA\GroupFolders\Mount\GroupFolderStorage"/>
                                <referencedClass name="OCA\TwoFactorNextcloudNotification\Controller\APIController"/>
+                               <!-- Classes from PHP>=8 (needed to be able to use \GdImage::class) -->
+                               <referencedClass name="GdImage" />
                        </errorLevel>
                </UndefinedClass>
                <UndefinedFunction>
                                <!-- Helper classes for sharing API integration from other apps -->
                                <referencedClass name="OCA\Deck\Sharing\ShareAPIHelper" />
                                <referencedClass name="OCA\Talk\Share\Helper\DeletedShareAPIController" />
+                               <!-- Classes from PHP>=8 -->
+                               <referencedClass name="GdImage" />
                        </errorLevel>
                </UndefinedDocblockClass>
        </issueHandlers>