From fe08b5e9d902c9dc2891c59cf7e8d3bcb2700150 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Mon, 22 Feb 2016 09:55:29 +0100 Subject: [PATCH] We should check for exceptions when trying to get the avatar Fixes #22550 * Updated phpdoc of avatatmanager * Add unit test --- lib/private/avatarmanager.php | 2 ++ lib/public/iavatarmanager.php | 2 ++ settings/controller/userscontroller.php | 6 ++++- .../controller/userscontrollertest.php | 26 +++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/lib/private/avatarmanager.php b/lib/private/avatarmanager.php index 21f88b1fd3f..b2d3e6eb3dd 100644 --- a/lib/private/avatarmanager.php +++ b/lib/private/avatarmanager.php @@ -27,6 +27,7 @@ namespace OC; use OCP\Files\Folder; +use OCP\Files\NotFoundException; use OCP\IAvatarManager; use OCP\IUserManager; use OCP\Files\IRootFolder; @@ -68,6 +69,7 @@ class AvatarManager implements IAvatarManager { * @param string $userId the ownCloud user id * @return \OCP\IAvatar * @throws \Exception In case the username is potentially dangerous + * @throws NotFoundException In case there is no user folder yet */ public function getAvatar($userId) { $user = $this->userManager->get($userId); diff --git a/lib/public/iavatarmanager.php b/lib/public/iavatarmanager.php index 264c4fcf051..cb63ccaf6fd 100644 --- a/lib/public/iavatarmanager.php +++ b/lib/public/iavatarmanager.php @@ -36,6 +36,8 @@ interface IAvatarManager { * @see \OCP\IAvatar * @param string $user the ownCloud user id * @return \OCP\IAvatar + * @throws \Exception In case the username is potentially dangerous + * @throws \OCP\Files\NotFoundException In case there is no user folder yet * @since 6.0.0 */ public function getAvatar($user); diff --git a/settings/controller/userscontroller.php b/settings/controller/userscontroller.php index 3e5455751ab..0abcabed11c 100644 --- a/settings/controller/userscontroller.php +++ b/settings/controller/userscontroller.php @@ -176,7 +176,11 @@ class UsersController extends Controller { $avatarAvailable = false; if ($this->config->getSystemValue('enable_avatars', true) === true) { - $avatarAvailable = $this->avatarManager->getAvatar($user->getUID())->exists(); + try { + $avatarAvailable = $this->avatarManager->getAvatar($user->getUID())->exists(); + } catch (\Exception $e) { + //No avatar yet + } } return [ diff --git a/tests/settings/controller/userscontrollertest.php b/tests/settings/controller/userscontrollertest.php index 947540fa67b..6f07f34ba8d 100644 --- a/tests/settings/controller/userscontrollertest.php +++ b/tests/settings/controller/userscontrollertest.php @@ -1696,6 +1696,32 @@ class UsersControllerTest extends \Test\TestCase { $this->assertEquals($expectedResult, $result); } + public function testNoAvatar() { + $this->container['IsAdmin'] = true; + + list($user, $expectedResult) = $this->mockUser(); + + $subadmin = $this->getMockBuilder('\OC\SubAdmin') + ->disableOriginalConstructor() + ->getMock(); + $subadmin->expects($this->once()) + ->method('getSubAdminsGroups') + ->with($user) + ->will($this->returnValue([])); + $this->container['GroupManager'] + ->expects($this->any()) + ->method('getSubAdmin') + ->will($this->returnValue($subadmin)); + + $this->container['OCP\\IAvatarManager'] + ->method('getAvatar') + ->will($this->throwException(new \OCP\Files\NotFoundException())); + $expectedResult['isAvatarAvailable'] = false; + + $result = self::invokePrivate($this->container['UsersController'], 'formatUserForIndex', [$user]); + $this->assertEquals($expectedResult, $result); + } + /** * @return array */ -- 2.39.5