From 74b2998f97c14e5adcf705ba30cd4b4f73aa8065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Fri, 12 Jan 2018 09:21:01 +0100 Subject: [PATCH] Prevent double output of avatar image data --- apps/dav/appinfo/v1/caldav.php | 2 +- apps/dav/appinfo/v1/carddav.php | 2 +- apps/dav/lib/Avatars/AvatarNode.php | 3 ++- apps/dav/lib/Server.php | 9 ++++--- .../dav/tests/unit/Avatars/AvatarNodeTest.php | 26 +++++++++++++++++++ 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/apps/dav/appinfo/v1/caldav.php b/apps/dav/appinfo/v1/caldav.php index 304f57acc7f3..84730decd9a2 100644 --- a/apps/dav/appinfo/v1/caldav.php +++ b/apps/dav/appinfo/v1/caldav.php @@ -71,7 +71,7 @@ // Add plugins $server->addPlugin(new MaintenancePlugin()); -$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'ownCloud')); +$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend)); $server->addPlugin(new \Sabre\CalDAV\Plugin()); $server->addPlugin(new LegacyDAVACL()); diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php index 06fc3376319d..80acde2215b8 100644 --- a/apps/dav/appinfo/v1/carddav.php +++ b/apps/dav/appinfo/v1/carddav.php @@ -68,7 +68,7 @@ $server->setBaseUri($baseuri); // Add plugins $server->addPlugin(new MaintenancePlugin()); -$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'ownCloud')); +$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend)); $server->addPlugin(new Plugin()); $server->addPlugin(new LegacyDAVACL()); diff --git a/apps/dav/lib/Avatars/AvatarNode.php b/apps/dav/lib/Avatars/AvatarNode.php index c94f1adb9a56..d8fe125913dc 100644 --- a/apps/dav/lib/Avatars/AvatarNode.php +++ b/apps/dav/lib/Avatars/AvatarNode.php @@ -62,8 +62,9 @@ function get() { ob_start(); if ($this->ext === 'png') { imagepng($res); + } else { + imagejpeg($res); } - imagejpeg($res); return ob_get_clean(); } diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 9d6a9cf73a82..2f9f243cfacd 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -125,7 +125,7 @@ public function __construct(IRequest $request, $baseUri) { // with performance and locking issues because it will query // every parent node which might trigger an implicit rescan in the // case of external storages with update detection - if (!$this->requestIsForSubtree('files')) { + if (!$this->isRequestForSubtree('files')) { // acl $acl = new DavAclPlugin(); $acl->principalCollectionSet = [ @@ -136,7 +136,7 @@ public function __construct(IRequest $request, $baseUri) { } // calendar plugins - if ($this->requestIsForSubtree('calendars')) { + if ($this->isRequestForSubtree('calendars')) { $mailer = \OC::$server->getMailer(); $this->server->addPlugin(new \OCA\DAV\CalDAV\Plugin()); $this->server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin()); @@ -152,7 +152,8 @@ public function __construct(IRequest $request, $baseUri) { } // addressbook plugins - if ($this->requestIsForSubtree('addressbooks')) { + if ($this->isRequestForSubtree('addressbooks')) { + $this->server->addPlugin(new DAV\Sharing\Plugin($authBackend, \OC::$server->getRequest())); $this->server->addPlugin(new \OCA\DAV\CardDAV\Plugin()); $this->server->addPlugin(new VCFExportPlugin()); $this->server->addPlugin(new ImageExportPlugin(\OC::$server->getLogger())); @@ -280,7 +281,7 @@ public function exec() { * @param string $subTree * @return bool */ - private function requestIsForSubtree($subTree) { + private function isRequestForSubtree($subTree) { $subTree = trim($subTree, " /"); return strpos($this->server->getRequestUri(), "$subTree/") === 0; } diff --git a/apps/dav/tests/unit/Avatars/AvatarNodeTest.php b/apps/dav/tests/unit/Avatars/AvatarNodeTest.php index b666539e799a..aab564d3490c 100644 --- a/apps/dav/tests/unit/Avatars/AvatarNodeTest.php +++ b/apps/dav/tests/unit/Avatars/AvatarNodeTest.php @@ -25,6 +25,7 @@ use OCA\DAV\Avatars\AvatarNode; use OCP\IAvatar; +use OCP\IImage; use Test\TestCase; class AvatarNodeTest extends TestCase { @@ -45,4 +46,29 @@ public function testGetContentType() { $n = new AvatarNode(1024, 'jpeg', $a); $this->assertEquals('image/jpeg', $n->getContentType()); } + + /** + * @dataProvider providesFormats + */ + public function testGetOperation($realImage, $mime, $imageFunction) { + $image = $this->createMock(IImage::class); + $image->expects($this->once())->method('resource')->willReturn($realImage); + /** @var IAvatar | \PHPUnit_Framework_MockObject_MockObject $a */ + $a = $this->createMock(IAvatar::class); + $a->expects($this->once())->method('get')->with(1024)->willReturn($image); + $n = new AvatarNode(1024, $mime, $a); + + ob_start(); + $imageFunction($realImage); + + $expected = ob_get_clean(); + $this->assertEquals($expected, $n->get()); + } + + public function providesFormats() { + return [ + 'jpeg' => [imagecreatefromjpeg(\OC::$SERVERROOT . '/tests/data/testimage.jpg'), 'jpeg', 'imagejpeg'], + 'png' => [imagecreatefrompng(\OC::$SERVERROOT . '/tests/data/testimage.png'), 'png', 'imagepng'] + ]; + } }