diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/dav/lib/carddav/converter.php | 17 | ||||
-rw-r--r-- | apps/dav/lib/comments/commentsplugin.php | 4 | ||||
-rw-r--r-- | apps/dav/lib/connector/sabre/commentpropertiesplugin.php | 130 | ||||
-rw-r--r-- | apps/dav/lib/connector/sabre/serverfactory.php | 1 | ||||
-rw-r--r-- | apps/dav/tests/unit/connector/sabre/commentpropertiesplugin.php | 148 | ||||
-rw-r--r-- | apps/federation/api/ocsauthapi.php | 8 | ||||
-rw-r--r-- | apps/federation/backgroundjob/getsharedsecret.php | 3 | ||||
-rw-r--r-- | apps/federation/backgroundjob/requestsharedsecret.php | 3 | ||||
-rw-r--r-- | apps/files/css/files.css | 2 | ||||
-rw-r--r-- | apps/files_external/controller/storagescontroller.php | 2 | ||||
-rw-r--r-- | apps/files_external/lib/auth/password/logincredentials.php | 2 | ||||
-rw-r--r-- | apps/files_external/lib/auth/password/sessioncredentials.php | 2 | ||||
-rw-r--r-- | apps/files_external/lib/auth/password/userprovided.php | 2 |
13 files changed, 311 insertions, 13 deletions
diff --git a/apps/dav/lib/carddav/converter.php b/apps/dav/lib/carddav/converter.php index 06d3cb4f18e..c8d9b94c267 100644 --- a/apps/dav/lib/carddav/converter.php +++ b/apps/dav/lib/carddav/converter.php @@ -39,7 +39,7 @@ class Converter { $displayName = empty($displayName ) ? $uid : $displayName; $emailAddress = $user->getEMailAddress(); $cloudId = $user->getCloudId(); - $image = $user->getAvatarImage(-1); + $image = $this->getAvatarImage($user); $vCard = new VCard(); $vCard->add(new Text($vCard, 'UID', $uid)); @@ -72,7 +72,7 @@ class Converter { $displayName = empty($displayName ) ? $uid : $displayName; $emailAddress = $user->getEMailAddress(); $cloudId = $user->getCloudId(); - $image = $user->getAvatarImage(-1); + $image = $this->getAvatarImage($user); $updated = false; if($this->propertyNeedsUpdate($vCard, 'FN', $displayName)) { @@ -155,4 +155,17 @@ class Converter { return $result; } + /** + * @param IUser $user + * @return null|IImage + */ + private function getAvatarImage(IUser $user) { + try { + $image = $user->getAvatarImage(-1); + return $image; + } catch (\Exception $ex) { + return null; + } + } + } diff --git a/apps/dav/lib/comments/commentsplugin.php b/apps/dav/lib/comments/commentsplugin.php index 7e227fd2914..282c14df1e8 100644 --- a/apps/dav/lib/comments/commentsplugin.php +++ b/apps/dav/lib/comments/commentsplugin.php @@ -2,7 +2,7 @@ /** * @author Arthur Schiwon <blizzz@owncloud.com> * - * @copyright Copyright (c) 2015, ownCloud, Inc. + * @copyright Copyright (c) 2016, ownCloud, Inc. * @license AGPL-3.0 * * This code is free software: you can redistribute it and/or modify @@ -88,7 +88,7 @@ class CommentsPlugin extends ServerPlugin { $this->server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc'; $this->server->xml->classMap['DateTime'] = function(Writer $writer, \DateTime $value) { - $writer->write($value->format('Y-m-d H:m:i')); + $writer->write(\Sabre\HTTP\toDate($value)); }; $this->server->on('report', [$this, 'onReport']); diff --git a/apps/dav/lib/connector/sabre/commentpropertiesplugin.php b/apps/dav/lib/connector/sabre/commentpropertiesplugin.php new file mode 100644 index 00000000000..a8d5f771122 --- /dev/null +++ b/apps/dav/lib/connector/sabre/commentpropertiesplugin.php @@ -0,0 +1,130 @@ +<?php +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @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 <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\DAV\Connector\Sabre; + +use OCP\Comments\ICommentsManager; +use OCP\IUserSession; +use Sabre\DAV\PropFind; +use Sabre\DAV\ServerPlugin; + +class CommentPropertiesPlugin extends ServerPlugin { + + const PROPERTY_NAME_HREF = '{http://owncloud.org/ns}comments-href'; + const PROPERTY_NAME_COUNT = '{http://owncloud.org/ns}comments-count'; + const PROPERTY_NAME_UNREAD = '{http://owncloud.org/ns}comments-unread'; + + /** @var \Sabre\DAV\Server */ + protected $server; + + /** @var ICommentsManager */ + private $commentsManager; + + /** @var IUserSession */ + private $userSession; + + public function __construct(ICommentsManager $commentsManager, IUserSession $userSession) { + $this->commentsManager = $commentsManager; + $this->userSession = $userSession; + } + + /** + * This initializes the plugin. + * + * This function is called by Sabre\DAV\Server, after + * addPlugin is called. + * + * This method should set up the required event subscriptions. + * + * @param \Sabre\DAV\Server $server + * @return void + */ + function initialize(\Sabre\DAV\Server $server) { + $this->server = $server; + $this->server->on('propFind', array($this, 'handleGetProperties')); + } + + /** + * Adds tags and favorites properties to the response, + * if requested. + * + * @param PropFind $propFind + * @param \Sabre\DAV\INode $node + * @return void + */ + public function handleGetProperties( + PropFind $propFind, + \Sabre\DAV\INode $node + ) { + if (!($node instanceof File) && !($node instanceof Directory)) { + return; + } + + $propFind->handle(self::PROPERTY_NAME_COUNT, function() use ($node) { + return $this->commentsManager->getNumberOfCommentsForObject('files', strval($node->getId())); + }); + + $propFind->handle(self::PROPERTY_NAME_HREF, function() use ($node) { + return $this->getCommentsLink($node); + }); + + $propFind->handle(self::PROPERTY_NAME_UNREAD, function() use ($node) { + return $this->getUnreadCount($node); + }); + } + + /** + * returns a reference to the comments node + * + * @param Node $node + * @return mixed|string + */ + public function getCommentsLink(Node $node) { + $href = $this->server->getBaseUri(); + $entryPoint = strrpos($href, '/webdav/'); + if($entryPoint === false) { + // in case we end up somewhere else, unexpectedly. + return null; + } + $href = substr_replace($href, '/dav/', $entryPoint); + $href .= 'comments/files/' . rawurldecode($node->getId()); + return $href; + } + + /** + * returns the number of unread comments for the currently logged in user + * on the given file or directory node + * + * @param Node $node + * @return Int|null + */ + public function getUnreadCount(Node $node) { + $user = $this->userSession->getUser(); + if(is_null($user)) { + return null; + } + + $lastRead = $this->commentsManager->getReadMark('files', strval($node->getId()), $user); + + return $this->commentsManager->getNumberOfCommentsForObject('files', strval($node->getId()), $lastRead); + } + +} diff --git a/apps/dav/lib/connector/sabre/serverfactory.php b/apps/dav/lib/connector/sabre/serverfactory.php index ee782f79a81..fa4fda46870 100644 --- a/apps/dav/lib/connector/sabre/serverfactory.php +++ b/apps/dav/lib/connector/sabre/serverfactory.php @@ -134,6 +134,7 @@ class ServerFactory { if($this->userSession->isLoggedIn()) { $server->addPlugin(new \OCA\DAV\Connector\Sabre\TagsPlugin($objectTree, $this->tagManager)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\CommentPropertiesPlugin(\OC::$server->getCommentsManager(), $this->userSession)); // custom properties plugin must be the last one $server->addPlugin( new \Sabre\DAV\PropertyStorage\Plugin( diff --git a/apps/dav/tests/unit/connector/sabre/commentpropertiesplugin.php b/apps/dav/tests/unit/connector/sabre/commentpropertiesplugin.php new file mode 100644 index 00000000000..f915c83c4a7 --- /dev/null +++ b/apps/dav/tests/unit/connector/sabre/commentpropertiesplugin.php @@ -0,0 +1,148 @@ +<?php +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @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 <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\DAV\Tests\Unit\Connector\Sabre; + +use \OCA\DAV\Connector\Sabre\CommentPropertiesPlugin as CommentPropertiesPluginImplementation; + +class CommentsPropertiesPlugin extends \Test\TestCase { + + /** @var CommentPropertiesPluginImplementation */ + protected $plugin; + protected $commentsManager; + protected $userSession; + protected $server; + + public function setUp() { + parent::setUp(); + + $this->commentsManager = $this->getMock('\OCP\Comments\ICommentsManager'); + $this->userSession = $this->getMock('\OCP\IUserSession'); + + $this->server = $this->getMockBuilder('\Sabre\DAV\Server') + ->disableOriginalConstructor() + ->getMock(); + + $this->plugin = new CommentPropertiesPluginImplementation($this->commentsManager, $this->userSession); + $this->plugin->initialize($this->server); + } + + public function nodeProvider() { + $mocks = []; + foreach(['\OCA\DAV\Connector\Sabre\File', '\OCA\DAV\Connector\Sabre\Directory', '\Sabre\DAV\INode'] as $class) { + $mocks[] = $this->getMockBuilder($class) + ->disableOriginalConstructor() + ->getMock(); + } + + return [ + [$mocks[0], true], + [$mocks[1], true], + [$mocks[2], false] + ]; + } + + /** + * @dataProvider nodeProvider + * @param $node + * @param $expectedSuccessful + */ + public function testHandleGetProperties($node, $expectedSuccessful) { + $propFind = $this->getMockBuilder('\Sabre\DAV\PropFind') + ->disableOriginalConstructor() + ->getMock(); + + if($expectedSuccessful) { + $propFind->expects($this->exactly(3)) + ->method('handle'); + } else { + $propFind->expects($this->never()) + ->method('handle'); + } + + $this->plugin->handleGetProperties($propFind, $node); + } + + public function baseUriProvider() { + return [ + ['owncloud/remote.php/webdav/', '4567', 'owncloud/remote.php/dav/comments/files/4567'], + ['owncloud/remote.php/wicked/', '4567', null] + ]; + } + + /** + * @dataProvider baseUriProvider + * @param $baseUri + * @param $fid + * @param $expectedHref + */ + public function testGetCommentsLink($baseUri, $fid, $expectedHref) { + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File') + ->disableOriginalConstructor() + ->getMock(); + $node->expects($this->any()) + ->method('getId') + ->will($this->returnValue($fid)); + + $this->server->expects($this->once()) + ->method('getBaseUri') + ->will($this->returnValue($baseUri)); + + $href = $this->plugin->getCommentsLink($node); + $this->assertSame($expectedHref, $href); + } + + public function userProvider() { + return [ + [$this->getMock('\OCP\IUser')], + [null] + ]; + } + + /** + * @dataProvider userProvider + * @param $user + */ + public function testGetUnreadCount($user) { + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File') + ->disableOriginalConstructor() + ->getMock(); + $node->expects($this->any()) + ->method('getId') + ->will($this->returnValue('4567')); + + $this->userSession->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + + $this->commentsManager->expects($this->any()) + ->method('getNumberOfCommentsForObject') + ->will($this->returnValue(42)); + + $unread = $this->plugin->getUnreadCount($node); + if(is_null($user)) { + $this->assertNull($unread); + } else { + $this->assertSame($unread, 42); + } + } + +} diff --git a/apps/federation/api/ocsauthapi.php b/apps/federation/api/ocsauthapi.php index 083be1b7ecd..058a5966374 100644 --- a/apps/federation/api/ocsauthapi.php +++ b/apps/federation/api/ocsauthapi.php @@ -99,7 +99,7 @@ class OCSAuthAPI { $token = $this->request->getParam('token'); if ($this->trustedServers->isTrustedServer($url) === false) { - $this->logger->log(\OCP\Util::ERROR, 'remote server not trusted (' . $url . ') while requesting shared secret'); + $this->logger->log(\OCP\Util::ERROR, 'remote server not trusted (' . $url . ') while requesting shared secret', ['app' => 'federation']); return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN); } @@ -107,7 +107,7 @@ class OCSAuthAPI { // token wins $localToken = $this->dbHandler->getToken($url); if (strcmp($localToken, $token) > 0) { - $this->logger->log(\OCP\Util::ERROR, 'remote server (' . $url . ') presented lower token'); + $this->logger->log(\OCP\Util::ERROR, 'remote server (' . $url . ') presented lower token', ['app' => 'federation']); return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN); } @@ -134,12 +134,12 @@ class OCSAuthAPI { $token = $this->request->getParam('token'); if ($this->trustedServers->isTrustedServer($url) === false) { - $this->logger->log(\OCP\Util::ERROR, 'remote server not trusted (' . $url . ') while getting shared secret'); + $this->logger->log(\OCP\Util::ERROR, 'remote server not trusted (' . $url . ') while getting shared secret', ['app' => 'federation']); return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN); } if ($this->isValidToken($url, $token) === false) { - $this->logger->log(\OCP\Util::ERROR, 'remote server (' . $url . ') didn\'t send a valid token (got ' . $token . ') while getting shared secret'); + $this->logger->log(\OCP\Util::ERROR, 'remote server (' . $url . ') didn\'t send a valid token (got ' . $token . ') while getting shared secret', ['app' => 'federation']); return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN); } diff --git a/apps/federation/backgroundjob/getsharedsecret.php b/apps/federation/backgroundjob/getsharedsecret.php index cae446f915c..a98a17e323b 100644 --- a/apps/federation/backgroundjob/getsharedsecret.php +++ b/apps/federation/backgroundjob/getsharedsecret.php @@ -151,6 +151,9 @@ class GetSharedSecret extends QueuedJob{ } catch (ClientException $e) { $status = $e->getCode(); $this->logger->logException($e); + } catch (\Exception $e) { + $status = HTTP::STATUS_INTERNAL_SERVER_ERROR; + $this->logger->logException($e); } // if we received a unexpected response we try again later diff --git a/apps/federation/backgroundjob/requestsharedsecret.php b/apps/federation/backgroundjob/requestsharedsecret.php index 92305b7e8ea..2db5d09545a 100644 --- a/apps/federation/backgroundjob/requestsharedsecret.php +++ b/apps/federation/backgroundjob/requestsharedsecret.php @@ -149,6 +149,9 @@ class RequestSharedSecret extends QueuedJob { } catch (ClientException $e) { $status = $e->getCode(); $this->logger->logException($e); + } catch (\Exception $e) { + $status = HTTP::STATUS_INTERNAL_SERVER_ERROR; + $this->logger->logException($e); } // if we received a unexpected response we try again later diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 61148428f79..4929039f837 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -59,7 +59,7 @@ /* fit app list view heights */ .app-files #app-content>.viewcontainer { - min-height: 100%; + min-height: 0%; } .app-files #app-content { diff --git a/apps/files_external/controller/storagescontroller.php b/apps/files_external/controller/storagescontroller.php index d71c4ff5ef7..db1cdeb23b9 100644 --- a/apps/files_external/controller/storagescontroller.php +++ b/apps/files_external/controller/storagescontroller.php @@ -279,7 +279,7 @@ abstract class StoragesController extends Controller { * @return DataResponse */ public function index() { - $storages = $this->service->getAllStorages(); + $storages = $this->service->getStorages(); return new DataResponse( $storages, diff --git a/apps/files_external/lib/auth/password/logincredentials.php b/apps/files_external/lib/auth/password/logincredentials.php index 99cac3f4202..25bd66fb41a 100644 --- a/apps/files_external/lib/auth/password/logincredentials.php +++ b/apps/files_external/lib/auth/password/logincredentials.php @@ -52,7 +52,7 @@ class LoginCredentials extends AuthMechanism { $this ->setIdentifier('password::logincredentials') ->setScheme(self::SCHEME_PASSWORD) - ->setText($l->t('Login credentials')) + ->setText($l->t('Log-in credentials, save in database')) ->addParameters([ ]) ; diff --git a/apps/files_external/lib/auth/password/sessioncredentials.php b/apps/files_external/lib/auth/password/sessioncredentials.php index 3fb8b8526cc..d8e8443418a 100644 --- a/apps/files_external/lib/auth/password/sessioncredentials.php +++ b/apps/files_external/lib/auth/password/sessioncredentials.php @@ -50,7 +50,7 @@ class SessionCredentials extends AuthMechanism { $this ->setIdentifier('password::sessioncredentials') ->setScheme(self::SCHEME_PASSWORD) - ->setText($l->t('Session credentials')) + ->setText($l->t('Log-in credentials, save in session')) ->addParameters([ ]) ; diff --git a/apps/files_external/lib/auth/password/userprovided.php b/apps/files_external/lib/auth/password/userprovided.php index e1c1352022f..2f277163184 100644 --- a/apps/files_external/lib/auth/password/userprovided.php +++ b/apps/files_external/lib/auth/password/userprovided.php @@ -49,7 +49,7 @@ class UserProvided extends AuthMechanism implements IUserProvided { ->setIdentifier('password::userprovided') ->setVisibility(BackendService::VISIBILITY_ADMIN) ->setScheme(self::SCHEME_PASSWORD) - ->setText($l->t('User provided')) + ->setText($l->t('User entered, store in database')) ->addParameters([ (new DefinitionParameter('user', $l->t('Username'))) ->setFlag(DefinitionParameter::FLAG_USER_PROVIDED), |