mirror of
https://github.com/nextcloud/server.git
synced 2026-06-08 08:16:43 -04:00
Merge pull request #29520 from nextcloud/backport/29479/stable21
[stable21] Fix images on php 8.0
This commit is contained in:
commit
5041b727b1
10 changed files with 38 additions and 111 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -16,4 +16,12 @@
|
|||
<extraFiles>
|
||||
<directory name="3rdparty"/>
|
||||
</extraFiles>
|
||||
<issueHandlers>
|
||||
<UndefinedDocblockClass>
|
||||
<errorLevel type="suppress">
|
||||
<!-- Classes from PHP>=8 -->
|
||||
<referencedClass name="GdImage" />
|
||||
</errorLevel>
|
||||
</UndefinedDocblockClass>
|
||||
</issueHandlers>
|
||||
</psalm>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -124,6 +126,8 @@
|
|||
<!-- 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>
|
||||
|
|
|
|||
|
|
@ -52,10 +52,6 @@ class UserAvatarTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testGetNoAvatar() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$file = $this->createMock(ISimpleFile::class);
|
||||
$this->folder->method('newFile')
|
||||
->willReturn($file);
|
||||
|
|
@ -91,10 +87,6 @@ class UserAvatarTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testGetAvatarSizeMatch() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$this->folder->method('fileExists')
|
||||
->willReturnMap([
|
||||
['avatar.jpg', true],
|
||||
|
|
@ -112,10 +104,6 @@ class UserAvatarTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testGetAvatarSizeMinusOne() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$this->folder->method('fileExists')
|
||||
->willReturnMap([
|
||||
['avatar.jpg', true],
|
||||
|
|
@ -132,10 +120,6 @@ class UserAvatarTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testGetAvatarNoSizeMatch() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$this->folder->method('fileExists')
|
||||
->willReturnMap([
|
||||
['avatar.png', true],
|
||||
|
|
@ -200,10 +184,6 @@ class UserAvatarTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testSetAvatar() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$avatarFileJPG = $this->createMock(File::class);
|
||||
$avatarFileJPG->method('getName')
|
||||
->willReturn('avatar.jpg');
|
||||
|
|
|
|||
|
|
@ -20,10 +20,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testConstructDestruct() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$this->assertInstanceOf('\OC_Image', $img);
|
||||
|
|
@ -51,10 +47,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testValid() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$this->assertTrue($img->valid());
|
||||
|
|
@ -69,10 +61,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testMimeType() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$this->assertEquals('image/png', $img->mimeType());
|
||||
|
|
@ -90,10 +78,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testWidth() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$this->assertEquals(128, $img->width());
|
||||
|
|
@ -111,10 +95,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testHeight() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$this->assertEquals(128, $img->height());
|
||||
|
|
@ -132,10 +112,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testSave() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$img->resize(16);
|
||||
|
|
@ -150,10 +126,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testData() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$raw = imagecreatefromstring(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.png'));
|
||||
|
|
@ -188,10 +160,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testDataNoResource() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$this->assertNull($img->data());
|
||||
}
|
||||
|
|
@ -200,10 +168,6 @@ class ImageTest extends \Test\TestCase {
|
|||
* @depends testData
|
||||
*/
|
||||
public function testToString() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$expected = base64_encode($img->data());
|
||||
|
|
@ -221,10 +185,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testResize() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$this->assertTrue($img->resize(32));
|
||||
|
|
@ -245,10 +205,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testPreciseResize() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$this->assertTrue($img->preciseResize(128, 512));
|
||||
|
|
@ -269,10 +225,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testCenterCrop() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$img->centerCrop();
|
||||
|
|
@ -293,10 +245,6 @@ class ImageTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testCrop() {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$this->assertTrue($img->crop(0, 0, 50, 20));
|
||||
|
|
@ -332,10 +280,6 @@ class ImageTest extends \Test\TestCase {
|
|||
* @param int[] $expected
|
||||
*/
|
||||
public function testFitIn($filename, $asked, $expected) {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT . '/tests/data/' . $filename);
|
||||
$this->assertTrue($img->fitIn($asked[0], $asked[1]));
|
||||
|
|
@ -359,10 +303,6 @@ class ImageTest extends \Test\TestCase {
|
|||
* @param string $filename
|
||||
*/
|
||||
public function testScaleDownToFitWhenSmallerAlready($filename) {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/' . $filename);
|
||||
$currentWidth = $img->width();
|
||||
|
|
@ -396,10 +336,6 @@ class ImageTest extends \Test\TestCase {
|
|||
* @param int[] $expected
|
||||
*/
|
||||
public function testScaleDownWhenBigger($filename, $asked, $expected) {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/' . $filename);
|
||||
//$this->assertTrue($img->scaleDownToFit($asked[0], $asked[1]));
|
||||
|
|
@ -420,10 +356,6 @@ class ImageTest extends \Test\TestCase {
|
|||
* @dataProvider convertDataProvider
|
||||
*/
|
||||
public function testConvert($mimeType) {
|
||||
if (PHP_MAJOR_VERSION > 7) {
|
||||
$this->markTestSkipped('Only run on php7');
|
||||
}
|
||||
|
||||
$img = new \OC_Image();
|
||||
$img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$tempFile = tempnam(sys_get_temp_dir(), 'img-test');
|
||||
|
|
|
|||
Loading…
Reference in a new issue