From 23aab05bdaaaff8310cad64ff028bc7a53656f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Fri, 23 Dec 2016 12:12:38 +0100 Subject: [PATCH 1/7] Adding dav resource for avatars Signed-off-by: Morris Jobke --- apps/dav/lib/Avatars/AvatarHome.php | 107 +++++++++++++++++++++ apps/dav/lib/Avatars/AvatarNode.php | 93 ++++++++++++++++++ apps/dav/lib/Avatars/RootCollection.php | 28 ++++++ apps/dav/lib/Connector/Sabre/Principal.php | 2 +- apps/dav/lib/RootCollection.php | 4 + 5 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 apps/dav/lib/Avatars/AvatarHome.php create mode 100644 apps/dav/lib/Avatars/AvatarNode.php create mode 100644 apps/dav/lib/Avatars/RootCollection.php diff --git a/apps/dav/lib/Avatars/AvatarHome.php b/apps/dav/lib/Avatars/AvatarHome.php new file mode 100644 index 0000000000..d3fb2b95f3 --- /dev/null +++ b/apps/dav/lib/Avatars/AvatarHome.php @@ -0,0 +1,107 @@ + + * + * @copyright Copyright (c) 2016, ownCloud GmbH + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\DAV\Avatars; + + +use Sabre\DAV\Exception\Forbidden; +use Sabre\DAV\Exception\MethodNotAllowed; +use Sabre\DAV\Exception\NotFound; +use Sabre\DAV\ICollection; +use Sabre\HTTP\URLUtil; + +class AvatarHome implements ICollection { + private $principalInfo; + + /** + * AvatarHome constructor. + * + * @param array $principalInfo + */ + public function __construct($principalInfo) { + $this->principalInfo = $principalInfo; + } + + function createFile($name, $data = null) { + throw new Forbidden('Permission denied to create a file'); + } + + function createDirectory($name) { + throw new Forbidden('Permission denied to create a folder'); + } + + function getChild($name) { + $elements = pathinfo($name); + $ext = isset($elements['extension']) ? $elements['extension'] : ''; + $size = intval(isset($elements['filename']) ? $elements['filename'] : '64'); + if (!in_array($ext, ['jpeg', 'png'])) { + throw new MethodNotAllowed('File format not allowed'); + } + if ($size <= 0 || $size > 1024) { + throw new MethodNotAllowed('Invalid image size'); + } + $avatar = \OC::$server->getAvatarManager()->getAvatar($this->getName()); + if (!$avatar->exists()) { + throw new NotFound(); + } + return new AvatarNode($size, $ext, $avatar); + } + + function getChildren() { + try { + return [ + $this->getChild('96.jpeg') + ]; + } catch(NotFound $exception) { + return []; + } + } + + function childExists($name) { + $ret = $this->getChild($name); + return !is_null($ret); + } + + function delete() { + throw new Forbidden('Permission denied to delete this folder'); + } + + function getName() { + list(,$name) = URLUtil::splitPath($this->principalInfo['uri']); + return $name; + } + + function setName($name) { + throw new Forbidden('Permission denied to rename this folder'); + } + + /** + * Returns the last modification time, as a unix timestamp + * + * @return int + */ + function getLastModified() { + return null; + } + + +} diff --git a/apps/dav/lib/Avatars/AvatarNode.php b/apps/dav/lib/Avatars/AvatarNode.php new file mode 100644 index 0000000000..0f2bfe1da4 --- /dev/null +++ b/apps/dav/lib/Avatars/AvatarNode.php @@ -0,0 +1,93 @@ + + * + * @copyright Copyright (c) 2016, ownCloud GmbH + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\DAV\Avatars; + + +use OCA\DAV\IPublicNode; +use OCP\IAvatar; +use Sabre\DAV\File; + +class AvatarNode extends File { + private $ext; + private $size; + private $avatar; + + /** + * AvatarNode constructor. + * + * @param integer $size + * @param string $ext + * @param IAvatar $avatar + */ + public function __construct($size, $ext, $avatar) { + $this->size = $size; + $this->ext = $ext; + $this->avatar = $avatar; + } + + /** + * Returns the name of the node. + * + * This is used to generate the url. + * + * @return string + */ + function getName() { + return "$this->size.$this->ext"; + } + + function get() { + $image = $this->avatar->get($this->size); + $res = $image->resource(); + + ob_start(); + if ($this->ext === 'png') { + imagepng($res); + } + imagejpeg($res); + + return ob_get_clean(); + } + + /** + * Returns the mime-type for a file + * + * If null is returned, we'll assume application/octet-stream + * + * @return string|null + */ + function getContentType() { + if ($this->ext === 'png') { + return 'image/png'; + } + return 'image/jpeg'; + } + +// function getSize() { +// return $this->avatar->getFile($this->size)->getSize(); +// } + + function getETag() { + return $this->avatar->getFile($this->size)->getEtag(); + } +} diff --git a/apps/dav/lib/Avatars/RootCollection.php b/apps/dav/lib/Avatars/RootCollection.php new file mode 100644 index 0000000000..8cad3d3721 --- /dev/null +++ b/apps/dav/lib/Avatars/RootCollection.php @@ -0,0 +1,28 @@ +getEMailAddress(); if (!empty($email)) { $principal['{http://sabredav.org/ns}email-address'] = $email; - return $principal; } + return $principal; } diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php index 478f0929c2..a243ec6d00 100644 --- a/apps/dav/lib/RootCollection.php +++ b/apps/dav/lib/RootCollection.php @@ -99,6 +99,9 @@ class RootCollection extends SimpleCollection { $uploadCollection = new Upload\RootCollection($userPrincipalBackend, 'principals/users'); $uploadCollection->disableListing = $disableListing; + $avatarCollection = new Avatars\RootCollection($userPrincipalBackend, 'principals/users'); + $avatarCollection->disableListing = $disableListing; + $children = [ new SimpleCollection('principals', [ $userPrincipals, @@ -114,6 +117,7 @@ class RootCollection extends SimpleCollection { $systemTagRelationsCollection, $commentsCollection, $uploadCollection, + $avatarCollection ]; parent::__construct('root', $children); From 73007255ceac2364f8563c84d6b46e113ff44d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Fri, 23 Dec 2016 13:44:40 +0100 Subject: [PATCH 2/7] Return last modification time to allow proper listing in cadaver Signed-off-by: Morris Jobke --- apps/dav/lib/Avatars/AvatarNode.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/dav/lib/Avatars/AvatarNode.php b/apps/dav/lib/Avatars/AvatarNode.php index 0f2bfe1da4..7d606d55cb 100644 --- a/apps/dav/lib/Avatars/AvatarNode.php +++ b/apps/dav/lib/Avatars/AvatarNode.php @@ -83,11 +83,16 @@ class AvatarNode extends File { return 'image/jpeg'; } -// function getSize() { -// return $this->avatar->getFile($this->size)->getSize(); -// } - function getETag() { return $this->avatar->getFile($this->size)->getEtag(); } + + function getLastModified() { + $timestamp = $this->avatar->getFile($this->size)->getMTime(); + if (!empty($timestamp)) { + return (int)$timestamp; + } + return $timestamp; + + } } From 3e93f491f260b79987d90b5123f07d1a7d1298cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 21 Mar 2017 23:10:39 +0100 Subject: [PATCH 3/7] Adding AvatarHomeTest Signed-off-by: Morris Jobke --- apps/dav/lib/Avatars/AvatarHome.php | 22 ++- apps/dav/lib/Avatars/RootCollection.php | 5 +- .../dav/tests/unit/Avatars/AvatarHomeTest.php | 125 ++++++++++++++++++ apps/dav/tests/unit/phpunit.xml | 4 +- 4 files changed, 147 insertions(+), 9 deletions(-) create mode 100644 apps/dav/tests/unit/Avatars/AvatarHomeTest.php diff --git a/apps/dav/lib/Avatars/AvatarHome.php b/apps/dav/lib/Avatars/AvatarHome.php index d3fb2b95f3..9e00fe2e8f 100644 --- a/apps/dav/lib/Avatars/AvatarHome.php +++ b/apps/dav/lib/Avatars/AvatarHome.php @@ -23,6 +23,7 @@ namespace OCA\DAV\Avatars; +use OCP\IAvatarManager; use Sabre\DAV\Exception\Forbidden; use Sabre\DAV\Exception\MethodNotAllowed; use Sabre\DAV\Exception\NotFound; @@ -30,15 +31,20 @@ use Sabre\DAV\ICollection; use Sabre\HTTP\URLUtil; class AvatarHome implements ICollection { + + /** @var array */ private $principalInfo; + /** @var IAvatarManager */ + private $avatarManager; /** * AvatarHome constructor. * * @param array $principalInfo */ - public function __construct($principalInfo) { + public function __construct($principalInfo, IAvatarManager $avatarManager) { $this->principalInfo = $principalInfo; + $this->avatarManager = $avatarManager; } function createFile($name, $data = null) { @@ -59,8 +65,8 @@ class AvatarHome implements ICollection { if ($size <= 0 || $size > 1024) { throw new MethodNotAllowed('Invalid image size'); } - $avatar = \OC::$server->getAvatarManager()->getAvatar($this->getName()); - if (!$avatar->exists()) { + $avatar = $this->avatarManager->getAvatar($this->getName()); + if ($avatar === null || !$avatar->exists()) { throw new NotFound(); } return new AvatarNode($size, $ext, $avatar); @@ -77,8 +83,14 @@ class AvatarHome implements ICollection { } function childExists($name) { - $ret = $this->getChild($name); - return !is_null($ret); + try { + $ret = $this->getChild($name); + return !is_null($ret); + } catch (NotFound $ex) { + return false; + } catch (MethodNotAllowed $ex) { + return false; + } } function delete() { diff --git a/apps/dav/lib/Avatars/RootCollection.php b/apps/dav/lib/Avatars/RootCollection.php index 8cad3d3721..8614d5d22b 100644 --- a/apps/dav/lib/Avatars/RootCollection.php +++ b/apps/dav/lib/Avatars/RootCollection.php @@ -15,10 +15,11 @@ class RootCollection extends AbstractPrincipalCollection { * supplied by the authentication backend. * * @param array $principalInfo - * @return IPrincipal + * @return AvatarHome */ function getChildForPrincipal(array $principalInfo) { - return new AvatarHome($principalInfo); + $avatarManager = \OC::$server->getAvatarManager(); + return new AvatarHome($principalInfo, $avatarManager); } function getName() { diff --git a/apps/dav/tests/unit/Avatars/AvatarHomeTest.php b/apps/dav/tests/unit/Avatars/AvatarHomeTest.php new file mode 100644 index 0000000000..ca8306e79a --- /dev/null +++ b/apps/dav/tests/unit/Avatars/AvatarHomeTest.php @@ -0,0 +1,125 @@ + + * + * @copyright Copyright (c) 2017, ownCloud GmbH + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\DAV\Tests\Unit\Avatars; + + +use OCA\DAV\Avatars\AvatarHome; +use OCA\DAV\Avatars\AvatarNode; +use OCP\IAvatar; +use OCP\IAvatarManager; +use Sabre\DAV\Exception\MethodNotAllowed; +use Sabre\DAV\Exception\NotFound; +use Test\TestCase; + +class AvatarHomeTest extends TestCase { + + /** @var AvatarHome */ + private $home; + + /** @var IAvatarManager | \PHPUnit_Framework_MockObject_MockObject */ + private $avatarManager; + + public function setUp() { + $this->avatarManager = $this->createMock(IAvatarManager::class); + $this->home = new AvatarHome(['uri' => 'principals/users/admin'], $this->avatarManager); + } + + /** + * @expectedException \Sabre\DAV\Exception\Forbidden + * @dataProvider providesForbiddenMethods + */ + public function testForbiddenMethods($method) { + $this->home->$method(''); + } + + public function providesForbiddenMethods() { + return [ + ['createFile'], + ['createDirectory'], + ['delete'], + ['setName'] + ]; + } + + public function testGetName() { + $n = $this->home->getName(); + self::assertEquals('admin', $n); + } + + public function providesTestGetChild() { + return [ + [MethodNotAllowed::class, false, ''], + [MethodNotAllowed::class, false, 'bla.foo'], + [MethodNotAllowed::class, false, 'bla.png'], + [NotFound::class, false, '512.png'], + [null, true, '512.png'], + ]; + } + + /** + * @dataProvider providesTestGetChild + */ + public function testGetChild($expectedException, $hasAvatar, $path) { + if ($expectedException !== null) { + $this->expectException($expectedException); + } + $avatar = null; + if ($hasAvatar) { + $avatar = $this->createMock(IAvatar::class); + $avatar->expects($this->once())->method('exists')->willReturn(true); + } + $this->avatarManager->expects($this->any())->method('getAvatar')->with('admin')->willReturn($avatar); + $avatarNode = $this->home->getChild($path); + $this->assertInstanceOf(AvatarNode::class, $avatarNode); + } + + public function testGetChildren() { + $avatarNodes = $this->home->getChildren(); + self::assertEquals(0, count($avatarNodes)); + + $avatar = $this->createMock(IAvatar::class); + $avatar->expects($this->once())->method('exists')->willReturn(true); + $this->avatarManager->expects($this->any())->method('getAvatar')->with('admin')->willReturn($avatar); + $avatarNodes = $this->home->getChildren(); + self::assertEquals(1, count($avatarNodes)); + } + + /** + * @dataProvider providesTestGetChild + */ + public function testChildExists($expectedException, $hasAvatar, $path) { + $avatar = null; + if ($hasAvatar) { + $avatar = $this->createMock(IAvatar::class); + $avatar->expects($this->once())->method('exists')->willReturn(true); + } + $this->avatarManager->expects($this->any())->method('getAvatar')->with('admin')->willReturn($avatar); + $childExists = $this->home->childExists($path); + $this->assertEquals($hasAvatar, $childExists); + } + + public function testGetLastModified() { + self::assertNull($this->home->getLastModified()); + } + +} diff --git a/apps/dav/tests/unit/phpunit.xml b/apps/dav/tests/unit/phpunit.xml index e483515ca7..3f0a9107aa 100644 --- a/apps/dav/tests/unit/phpunit.xml +++ b/apps/dav/tests/unit/phpunit.xml @@ -11,9 +11,9 @@ - ../../dav + ../../../dav - ../../dav/tests + ../../../dav/tests From 836271e0fddb33271ffac5f6f84dee8c4ea7140e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 21 Mar 2017 23:34:37 +0100 Subject: [PATCH 4/7] Adding AvatarNodeTest Signed-off-by: Morris Jobke --- apps/dav/lib/Avatars/AvatarNode.php | 1 - .../dav/tests/unit/Avatars/AvatarNodeTest.php | 48 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 apps/dav/tests/unit/Avatars/AvatarNodeTest.php diff --git a/apps/dav/lib/Avatars/AvatarNode.php b/apps/dav/lib/Avatars/AvatarNode.php index 7d606d55cb..270f66d6db 100644 --- a/apps/dav/lib/Avatars/AvatarNode.php +++ b/apps/dav/lib/Avatars/AvatarNode.php @@ -23,7 +23,6 @@ namespace OCA\DAV\Avatars; -use OCA\DAV\IPublicNode; use OCP\IAvatar; use Sabre\DAV\File; diff --git a/apps/dav/tests/unit/Avatars/AvatarNodeTest.php b/apps/dav/tests/unit/Avatars/AvatarNodeTest.php new file mode 100644 index 0000000000..8e56ea6f6d --- /dev/null +++ b/apps/dav/tests/unit/Avatars/AvatarNodeTest.php @@ -0,0 +1,48 @@ + + * + * @copyright Copyright (c) 2017, ownCloud GmbH + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\DAV\Tests\Unit\Avatars; + + +use OCA\DAV\Avatars\AvatarNode; +use OCP\IAvatar; +use Test\TestCase; + +class AvatarNodeTest extends TestCase { + + public function testGetName() { + /** @var IAvatar | \PHPUnit_Framework_MockObject_MockObject $a */ + $a = $this->createMock(IAvatar::class); + $n = new AvatarNode(1024, 'png', $a); + $this->assertEquals('1024.png', $n->getName()); + } + + public function testGetContentType() { + /** @var IAvatar | \PHPUnit_Framework_MockObject_MockObject $a */ + $a = $this->createMock(IAvatar::class); + $n = new AvatarNode(1024, 'png', $a); + $this->assertEquals('image/png', $n->getContentType()); + + $n = new AvatarNode(1024, 'jpeg', $a); + $this->assertEquals('image/jpeg', $n->getContentType()); + } +} From f0850b266e25437bd1cfc2cbcfc27c2036f36b46 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Sun, 26 Mar 2017 11:32:29 +0200 Subject: [PATCH 5/7] Fix inspection results Signed-off-by: Roeland Jago Douma --- apps/dav/lib/Avatars/AvatarHome.php | 29 +++++++++++++------------ apps/dav/lib/Avatars/AvatarNode.php | 10 ++++----- apps/dav/lib/Avatars/RootCollection.php | 6 ++--- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/apps/dav/lib/Avatars/AvatarHome.php b/apps/dav/lib/Avatars/AvatarHome.php index 9e00fe2e8f..d72bfa3220 100644 --- a/apps/dav/lib/Avatars/AvatarHome.php +++ b/apps/dav/lib/Avatars/AvatarHome.php @@ -28,7 +28,7 @@ use Sabre\DAV\Exception\Forbidden; use Sabre\DAV\Exception\MethodNotAllowed; use Sabre\DAV\Exception\NotFound; use Sabre\DAV\ICollection; -use Sabre\HTTP\URLUtil; +use Sabre\Uri; class AvatarHome implements ICollection { @@ -41,25 +41,26 @@ class AvatarHome implements ICollection { * AvatarHome constructor. * * @param array $principalInfo + * @param IAvatarManager $avatarManager */ public function __construct($principalInfo, IAvatarManager $avatarManager) { $this->principalInfo = $principalInfo; $this->avatarManager = $avatarManager; } - function createFile($name, $data = null) { + public function createFile($name, $data = null) { throw new Forbidden('Permission denied to create a file'); } - function createDirectory($name) { + public function createDirectory($name) { throw new Forbidden('Permission denied to create a folder'); } - function getChild($name) { + public function getChild($name) { $elements = pathinfo($name); $ext = isset($elements['extension']) ? $elements['extension'] : ''; - $size = intval(isset($elements['filename']) ? $elements['filename'] : '64'); - if (!in_array($ext, ['jpeg', 'png'])) { + $size = (int)(isset($elements['filename']) ? $elements['filename'] : '64'); + if (!in_array($ext, ['jpeg', 'png'], true)) { throw new MethodNotAllowed('File format not allowed'); } if ($size <= 0 || $size > 1024) { @@ -72,7 +73,7 @@ class AvatarHome implements ICollection { return new AvatarNode($size, $ext, $avatar); } - function getChildren() { + public function getChildren() { try { return [ $this->getChild('96.jpeg') @@ -82,10 +83,10 @@ class AvatarHome implements ICollection { } } - function childExists($name) { + public function childExists($name) { try { $ret = $this->getChild($name); - return !is_null($ret); + return $ret !== null; } catch (NotFound $ex) { return false; } catch (MethodNotAllowed $ex) { @@ -93,16 +94,16 @@ class AvatarHome implements ICollection { } } - function delete() { + public function delete() { throw new Forbidden('Permission denied to delete this folder'); } - function getName() { - list(,$name) = URLUtil::splitPath($this->principalInfo['uri']); + public function getName() { + list(,$name) = Uri\split($this->principalInfo['uri']); return $name; } - function setName($name) { + public function setName($name) { throw new Forbidden('Permission denied to rename this folder'); } @@ -111,7 +112,7 @@ class AvatarHome implements ICollection { * * @return int */ - function getLastModified() { + public function getLastModified() { return null; } diff --git a/apps/dav/lib/Avatars/AvatarNode.php b/apps/dav/lib/Avatars/AvatarNode.php index 270f66d6db..17edf80d21 100644 --- a/apps/dav/lib/Avatars/AvatarNode.php +++ b/apps/dav/lib/Avatars/AvatarNode.php @@ -51,11 +51,11 @@ class AvatarNode extends File { * * @return string */ - function getName() { + public function getName() { return "$this->size.$this->ext"; } - function get() { + public function get() { $image = $this->avatar->get($this->size); $res = $image->resource(); @@ -75,18 +75,18 @@ class AvatarNode extends File { * * @return string|null */ - function getContentType() { + public function getContentType() { if ($this->ext === 'png') { return 'image/png'; } return 'image/jpeg'; } - function getETag() { + public function getETag() { return $this->avatar->getFile($this->size)->getEtag(); } - function getLastModified() { + public function getLastModified() { $timestamp = $this->avatar->getFile($this->size)->getMTime(); if (!empty($timestamp)) { return (int)$timestamp; diff --git a/apps/dav/lib/Avatars/RootCollection.php b/apps/dav/lib/Avatars/RootCollection.php index 8614d5d22b..d7c7ff4e9f 100644 --- a/apps/dav/lib/Avatars/RootCollection.php +++ b/apps/dav/lib/Avatars/RootCollection.php @@ -3,7 +3,7 @@ namespace OCA\DAV\Avatars; use Sabre\DAVACL\AbstractPrincipalCollection; -use Sabre\DAVACL\IPrincipal; + class RootCollection extends AbstractPrincipalCollection { @@ -17,12 +17,12 @@ class RootCollection extends AbstractPrincipalCollection { * @param array $principalInfo * @return AvatarHome */ - function getChildForPrincipal(array $principalInfo) { + public function getChildForPrincipal(array $principalInfo) { $avatarManager = \OC::$server->getAvatarManager(); return new AvatarHome($principalInfo, $avatarManager); } - function getName() { + public function getName() { return 'avatars'; } From 2a777278975b27836a965d9f53b082bbc0124743 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Sun, 26 Mar 2017 11:34:21 +0200 Subject: [PATCH 6/7] Fix PHPDoc Signed-off-by: Lukas Reschke --- apps/dav/lib/Avatars/AvatarHome.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dav/lib/Avatars/AvatarHome.php b/apps/dav/lib/Avatars/AvatarHome.php index d72bfa3220..17ac37dc8a 100644 --- a/apps/dav/lib/Avatars/AvatarHome.php +++ b/apps/dav/lib/Avatars/AvatarHome.php @@ -110,7 +110,7 @@ class AvatarHome implements ICollection { /** * Returns the last modification time, as a unix timestamp * - * @return int + * @return int|null */ public function getLastModified() { return null; From 7cc96c21216a8b00ebc96ee65e560ccc49b3fbe8 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Sun, 26 Mar 2017 11:54:29 +0200 Subject: [PATCH 7/7] Don't output jpeg if we request png Signed-off-by: Roeland Jago Douma --- apps/dav/lib/Avatars/AvatarNode.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/dav/lib/Avatars/AvatarNode.php b/apps/dav/lib/Avatars/AvatarNode.php index 17edf80d21..4030f48251 100644 --- a/apps/dav/lib/Avatars/AvatarNode.php +++ b/apps/dav/lib/Avatars/AvatarNode.php @@ -62,8 +62,9 @@ class AvatarNode extends File { ob_start(); if ($this->ext === 'png') { imagepng($res); + } else { + imagejpeg($res); } - imagejpeg($res); return ob_get_clean(); }