* This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. */ namespace Test; use OC; use OCP\IConfig; class ImageTest extends \Test\TestCase { public static function tearDownAfterClass(): void { @unlink(OC::$SERVERROOT.'/tests/data/testimage2.png'); @unlink(OC::$SERVERROOT.'/tests/data/testimage2.jpg'); parent::tearDownAfterClass(); } public function testConstructDestruct() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $this->assertInstanceOf('\OC_Image', $img); $this->assertInstanceOf('\OCP\IImage', $img); unset($img); $imgcreate = imagecreatefromjpeg(OC::$SERVERROOT.'/tests/data/testimage.jpg'); $img = new \OC_Image(); $img->setResource($imgcreate); $this->assertInstanceOf('\OC_Image', $img); $this->assertInstanceOf('\OCP\IImage', $img); unset($img); $base64 = base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif')); $img = new \OC_Image(); $img->loadFromBase64($base64); $this->assertInstanceOf('\OC_Image', $img); $this->assertInstanceOf('\OCP\IImage', $img); unset($img); $img = new \OC_Image(); $this->assertInstanceOf('\OC_Image', $img); $this->assertInstanceOf('\OCP\IImage', $img); unset($img); } public function testValid() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $this->assertTrue($img->valid()); $text = base64_encode("Lorem ipsum dolor sir amet …"); $img = new \OC_Image(); $img->loadFromBase64($text); $this->assertFalse($img->valid()); $img = new \OC_Image(); $this->assertFalse($img->valid()); } public function testMimeType() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $this->assertEquals('image/png', $img->mimeType()); $img = new \OC_Image(); $this->assertEquals('', $img->mimeType()); $img = new \OC_Image(); $img->loadFromData(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); $this->assertEquals('image/jpeg', $img->mimeType()); $img = new \OC_Image(); $img->loadFromBase64(base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'))); $this->assertEquals('image/gif', $img->mimeType()); } public function testWidth() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $this->assertEquals(128, $img->width()); $img = new \OC_Image(); $img->loadFromData(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); $this->assertEquals(1680, $img->width()); $img = new \OC_Image(); $img->loadFromBase64(base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'))); $this->assertEquals(64, $img->width()); $img = new \OC_Image(); $this->assertEquals(-1, $img->width()); } public function testHeight() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $this->assertEquals(128, $img->height()); $img = new \OC_Image(); $img->loadFromData(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); $this->assertEquals(1050, $img->height()); $img = new \OC_Image(); $img->loadFromBase64(base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'))); $this->assertEquals(64, $img->height()); $img = new \OC_Image(); $this->assertEquals(-1, $img->height()); } public function testSave() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $img->resize(16); $img->save(OC::$SERVERROOT.'/tests/data/testimage2.png'); $this->assertEquals(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage2.png'), $img->data()); $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.jpg'); $img->resize(128); $img->save(OC::$SERVERROOT.'/tests/data/testimage2.jpg'); $this->assertEquals(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage2.jpg'), $img->data()); } public function testData() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $raw = imagecreatefromstring(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.png')); // Preserve transparency imagealphablending($raw, true); imagesavealpha($raw, true); ob_start(); imagepng($raw); $expected = ob_get_clean(); $this->assertEquals($expected, $img->data()); $config = $this->createMock(IConfig::class); $config->expects($this->once()) ->method('getAppValue') ->with('preview', 'jpeg_quality', 90) ->willReturn(null); $config->expects($this->once()) ->method('getSystemValueInt') ->with('preview_max_memory', 128) ->willReturn(128); $img = new \OC_Image(null, null, $config); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.jpg'); $raw = imagecreatefromstring(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); ob_start(); imagejpeg($raw); $expected = ob_get_clean(); $this->assertEquals($expected, $img->data()); $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.gif'); $raw = imagecreatefromstring(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif')); ob_start(); imagegif($raw); $expected = ob_get_clean(); $this->assertEquals($expected, $img->data()); } public function testDataNoResource() { $img = new \OC_Image(); $this->assertNull($img->data()); } /** * @depends testData */ public function testToString() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $expected = base64_encode($img->data()); $this->assertEquals($expected, (string)$img); $img = new \OC_Image(); $img->loadFromData(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); $expected = base64_encode($img->data()); $this->assertEquals($expected, (string)$img); $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.gif'); $expected = base64_encode($img->data()); $this->assertEquals($expected, (string)$img); } public function testResize() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $this->assertTrue($img->resize(32)); $this->assertEquals(32, $img->width()); $this->assertEquals(32, $img->height()); $img = new \OC_Image(); $img->loadFromData(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); $this->assertTrue($img->resize(840)); $this->assertEquals(840, $img->width()); $this->assertEquals(525, $img->height()); $img = new \OC_Image(); $img->loadFromBase64(base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'))); $this->assertTrue($img->resize(100)); $this->assertEquals(100, $img->width()); $this->assertEquals(100, $img->height()); } public function testPreciseResize() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $this->assertTrue($img->preciseResize(128, 512)); $this->assertEquals(128, $img->width()); $this->assertEquals(512, $img->height()); $img = new \OC_Image(); $img->loadFromData(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); $this->assertTrue($img->preciseResize(64, 840)); $this->assertEquals(64, $img->width()); $this->assertEquals(840, $img->height()); $img = new \OC_Image(); $img->loadFromBase64(base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'))); $this->assertTrue($img->preciseResize(1000, 1337)); $this->assertEquals(1000, $img->width()); $this->assertEquals(1337, $img->height()); } public function testCenterCrop() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $img->centerCrop(); $this->assertEquals(128, $img->width()); $this->assertEquals(128, $img->height()); $img = new \OC_Image(); $img->loadFromData(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); $img->centerCrop(); $this->assertEquals(1050, $img->width()); $this->assertEquals(1050, $img->height()); $img = new \OC_Image(); $img->loadFromBase64(base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'))); $img->centerCrop(512); $this->assertEquals(512, $img->width()); $this->assertEquals(512, $img->height()); } public function testCrop() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $this->assertTrue($img->crop(0, 0, 50, 20)); $this->assertEquals(50, $img->width()); $this->assertEquals(20, $img->height()); $img = new \OC_Image(); $img->loadFromData(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg')); $this->assertTrue($img->crop(500, 700, 550, 300)); $this->assertEquals(550, $img->width()); $this->assertEquals(300, $img->height()); $img = new \OC_Image(); $img->loadFromBase64(base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif'))); $this->assertTrue($img->crop(10, 10, 15, 15)); $this->assertEquals(15, $img->width()); $this->assertEquals(15, $img->height()); } public static function sampleProvider() { return [ ['testimage.png', [200, 100], [100, 100]], ['testimage.jpg', [840, 840], [840, 525]], ['testimage.gif', [200, 250], [200, 200]] ]; } /** * @dataProvider sampleProvider * * @param string $filename * @param int[] $asked * @param int[] $expected */ public function testFitIn($filename, $asked, $expected) { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT . '/tests/data/' . $filename); $this->assertTrue($img->fitIn($asked[0], $asked[1])); $this->assertEquals($expected[0], $img->width()); $this->assertEquals($expected[1], $img->height()); } public static function sampleFilenamesProvider() { return [ ['testimage.png'], ['testimage.jpg'], ['testimage.gif'] ]; } /** * Image should not be resized if it's already smaller than what is required * * @dataProvider sampleFilenamesProvider * * @param string $filename */ public function testScaleDownToFitWhenSmallerAlready($filename) { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/' . $filename); $currentWidth = $img->width(); $currentHeight = $img->height(); // We pick something larger than the image we want to scale down $this->assertFalse($img->scaleDownToFit(4000, 4000)); // The dimensions of the image should not have changed since it's smaller already $resizedWidth = $img->width(); $resizedHeight = $img->height(); $this->assertEquals( $currentWidth, $img->width(), "currentWidth $currentWidth resizedWidth $resizedWidth \n" ); $this->assertEquals( $currentHeight, $img->height(), "currentHeight $currentHeight resizedHeight $resizedHeight \n" ); } public static function largeSampleProvider() { return [ ['testimage.png', [200, 100], [100, 100]], ['testimage.jpg', [840, 840], [840, 525]], ]; } /** * @dataProvider largeSampleProvider * * @param string $filename * @param int[] $asked * @param int[] $expected */ public function testScaleDownWhenBigger($filename, $asked, $expected) { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/' . $filename); //$this->assertTrue($img->scaleDownToFit($asked[0], $asked[1])); $img->scaleDownToFit($asked[0], $asked[1]); $this->assertEquals($expected[0], $img->width()); $this->assertEquals($expected[1], $img->height()); } public function convertDataProvider() { return [ [ 'image/gif'], [ 'image/jpeg'], [ 'image/png'], ]; } /** * @dataProvider convertDataProvider */ public function testConvert($mimeType) { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage.png'); $tempFile = tempnam(sys_get_temp_dir(), 'img-test'); $img->save($tempFile, $mimeType); $this->assertEquals($mimeType, image_type_to_mime_type(exif_imagetype($tempFile))); } public function testMemoryLimitFromFile() { $img = new \OC_Image(); $img->loadFromFile(OC::$SERVERROOT.'/tests/data/testimage-badheader.jpg'); $this->assertFalse($img->valid()); } public function testMemoryLimitFromData() { $data = file_get_contents(OC::$SERVERROOT.'/tests/data/testimage-badheader.jpg'); $img = new \OC_Image(); $img->loadFromData($data); $this->assertFalse($img->valid()); } } ted/noid/stable23-update-code-signing-crl Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/AppFramework/Middleware/AdditionalScriptsMiddleware.php
blob: 605422ffefe71424762e72c3fe80ce804b8a7af0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php

declare(strict_types=1);

/**
 * @copyright Copyright (c) 2019, Roeland Jago Douma <roeland@famdouma.nl>
 *
 * @author Robin Appelman <robin@icewind.nl>
 * @author Roeland Jago Douma <roeland@famdouma.nl>
 *
 * @license GNU AGPL version 3 or any later version
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 */

namespace OC\AppFramework\Middleware;

use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\StandaloneTemplateResponse;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Middleware;
use OCP\AppFramework\PublicShareController;
use OCP\EventDispatcher\GenericEvent;
use OCP\IUserSession;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

class AdditionalScriptsMiddleware extends Middleware {
	/** @var EventDispatcherInterface */
	private $dispatcher;
	/** @var IUserSession */
	private $userSession;

	public function __construct(EventDispatcherInterface $dispatcher, IUserSession $userSession) {
		$this->dispatcher = $dispatcher;
		$this->userSession = $userSession;
	}

	public function afterController($controller, $methodName, Response $response): Response {
		/*
		 * There is no need to emit these signals on a public share page
		 * There is a separate event for that already
		 */
		if ($controller instanceof PublicShareController) {
			return $response;
		}

		if ($response instanceof TemplateResponse) {
			$this->dispatcher->dispatch(TemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS, new GenericEvent());

			if (!($response instanceof StandaloneTemplateResponse) && $this->userSession->isLoggedIn()) {
				$this->dispatcher->dispatch(TemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS_LOGGEDIN, new GenericEvent());
			}
		}

		return $response;
	}

}