]> 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>
Tue, 2 Nov 2021 10:49:13 +0000 (11:49 +0100)
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 f47809425ed4022db600a8ad42c26dc9c1ddc8cc..8573adf5d87c0b03be39f326e637231eb6606375 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 7322e07ab3454c661a6558e52e17fd075198fe70..b57380844764684191dd0778bfd604493be9ab82 100644 (file)
@@ -61,7 +61,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 f9f85090a8008fb8fc82637054478df8390ce03d..43d1cf65ada6ee1a0d8700410bc89dacf2e198ca 100644 (file)
@@ -77,7 +77,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 6630dc2697876414c0aaeed3d3b1f6c34962e653..790dad5c26cd2d7a3e87017eef70da8693bd0b2c 100644 (file)
@@ -70,7 +70,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 ed173849c769c74ecb28d1e96900462477f10f73..f93bcfaaaf481342c210202060b20ffd6e7f8e75 100644 (file)
@@ -102,7 +102,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;
                }
 
@@ -309,7 +309,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) {
@@ -319,7 +319,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;
                }
@@ -327,7 +327,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;
@@ -537,7 +537,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);
@@ -551,7 +551,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
@@ -667,17 +667,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);
                }
@@ -693,7 +693,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)) {
@@ -723,7 +723,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'))) {
@@ -879,12 +879,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()) {
@@ -915,14 +915,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()) {
@@ -1024,7 +1024,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();
        }
 
        /**
@@ -1192,7 +1192,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 aa1cf344e5fc2354bab4040906f7da3fbbfe38ce..ea9f6e40190c02e699758cfd15c24f60800f15e0 100644 (file)
@@ -99,7 +99,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 d51dbb9dde686e7622456b7798fc2ce6a65ec0a2..bc21dbceffeac28664dbb930c15c7e4301b1d92e 100644 (file)
--- a/psalm.xml
+++ b/psalm.xml
@@ -80,6 +80,8 @@
                <UndefinedClass>
                        <errorLevel type="suppress">
                                <referencedClass name="OCA\GroupFolders\Mount\GroupFolderStorage"/>
+                               <!-- 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>