diff --git a/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php b/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php index 3e85615638b5c..5896f4f37256f 100644 --- a/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php @@ -46,6 +46,7 @@ class FilesReportPlugin extends ServerPlugin { const NS_OWNCLOUD = 'http://owncloud.org/ns'; const REPORT_NAME = '{http://owncloud.org/ns}filter-files'; const SYSTEMTAG_PROPERTYNAME = '{http://owncloud.org/ns}systemtag'; + const CIRCLE_PROPERTYNAME = '{http://owncloud.org/ns}circle'; /** * Reference to main server object @@ -256,14 +257,19 @@ protected function processFilterRules($filterRules) { $ns = '{' . $this::NS_OWNCLOUD . '}'; $resultFileIds = null; $systemTagIds = []; + $circlesIds = []; $favoriteFilter = null; foreach ($filterRules as $filterRule) { if ($filterRule['name'] === $ns . 'systemtag') { $systemTagIds[] = $filterRule['value']; } + if ($filterRule['name'] === self::CIRCLE_PROPERTYNAME) { + $circlesIds[] = $filterRule['value']; + } if ($filterRule['name'] === $ns . 'favorite') { $favoriteFilter = true; } + } if ($favoriteFilter !== null) { @@ -282,6 +288,15 @@ protected function processFilterRules($filterRules) { } } + if (!empty($circlesIds)) { + $fileIds = $this->getCirclesFileIds($circlesIds); + if (empty($resultFileIds)) { + $resultFileIds = $fileIds; + } else { + $resultFileIds = array_intersect($fileIds, $resultFileIds); + } + } + return $resultFileIds; } @@ -328,6 +343,18 @@ private function getSystemTagFileIds($systemTagIds) { return $resultFileIds; } + /** + * @param array $circlesIds + * @return array + */ + private function getCirclesFileIds(array $circlesIds) { + if (!\OC::$server->getAppManager()->isEnabledForUser('circles') || !class_exists('\OCA\Circles\ShareByCircleProvider')) { + return array(); + } + return \OCA\Circles\Api\v1\Circles::getFilesForCircles($circlesIds); + } + + /** * Prepare propfind response for the given nodes * diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php index a441e1c81225c..81d628d9a2d05 100644 --- a/apps/dav/lib/Connector/Sabre/Principal.php +++ b/apps/dav/lib/Connector/Sabre/Principal.php @@ -45,7 +45,7 @@ use OCP\IUserSession; use OCP\Share\IManager as IShareManager; use Sabre\DAV\Exception; -use \Sabre\DAV\PropPatch; +use Sabre\DAV\PropPatch; use Sabre\DAVACL\PrincipalBackend\BackendInterface; class Principal implements BackendInterface { @@ -145,7 +145,11 @@ public function getPrincipalByPath($path) { return $this->userToPrincipal($user); } } else if ($prefix === 'principals/circles') { - return $this->circleToPrincipal($name); + try { + return $this->circleToPrincipal($name); + } catch (QueryException $e) { + return null; + } } return null; } @@ -406,6 +410,7 @@ public function getPrincipalPrefix() { /** * @param string $circleUniqueId * @return array|null + * @throws \OCP\AppFramework\QueryException * @suppress PhanUndeclaredClassMethod * @suppress PhanUndeclaredClassCatch */ @@ -438,9 +443,9 @@ protected function circleToPrincipal($circleUniqueId) { * Returns the list of circles a principal is a member of * * @param string $principal - * @param bool $needGroups * @return array * @throws Exception + * @throws \OCP\AppFramework\QueryException * @suppress PhanUndeclaredClassMethod */ public function getCircleMembership($principal):array { @@ -456,15 +461,14 @@ public function getCircleMembership($principal):array { } $circles = \OCA\Circles\Api\v1\Circles::joinedCircles($name, true); - $circles = array_map(function($circle) { - /** @var \OCA\Circles\Model\Circle $group */ + /** @var \OCA\Circles\Model\Circle $circle */ return 'principals/circles/' . urlencode($circle->getUniqueId()); }, $circles); return $circles; - } + return []; } diff --git a/apps/dav/tests/unit/CalDAV/PublicCalendarRootTest.php b/apps/dav/tests/unit/CalDAV/PublicCalendarRootTest.php index c10b333e28d85..874d4d84ffa77 100644 --- a/apps/dav/tests/unit/CalDAV/PublicCalendarRootTest.php +++ b/apps/dav/tests/unit/CalDAV/PublicCalendarRootTest.php @@ -86,6 +86,10 @@ public function setUp() { ->withAnyParameters() ->willReturn([]); + $this->principal->expects($this->any())->method('getCircleMembership') + ->withAnyParameters() + ->willReturn([]); + $this->backend = new CalDavBackend( $db, $this->principal, @@ -112,6 +116,11 @@ public function tearDown() { $this->principal->expects($this->any())->method('getGroupMembership') ->withAnyParameters() ->willReturn([]); + + $this->principal->expects($this->any())->method('getCircleMembership') + ->withAnyParameters() + ->willReturn([]); + $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); foreach ($books as $book) { $this->backend->deleteCalendar($book['id']); diff --git a/core/js/files/client.js b/core/js/files/client.js index 2017becf87c66..98874d165bf35 100644 --- a/core/js/files/client.js +++ b/core/js/files/client.js @@ -503,7 +503,7 @@ /** * Fetches a flat list of files filtered by a given filter criteria. - * (currently only system tags is supported) + * (currently system tags and circles are supported) * * @param {Object} filter filter criteria * @param {Object} [filter.systemTagIds] list of system tag ids to filter by @@ -525,7 +525,8 @@ properties = options.properties; } - if (!filter || (!filter.systemTagIds && _.isUndefined(filter.favorite))) { + if (!filter || + (!filter.systemTagIds && _.isUndefined(filter.favorite) && !filter.circlesIds) ) { throw 'Missing filter argument'; } @@ -551,6 +552,9 @@ _.each(filter.systemTagIds, function(systemTagIds) { body += ' ' + escapeHTML(systemTagIds) + '\n'; }); + _.each(filter.circlesIds, function(circlesIds) { + body += ' ' + escapeHTML(circlesIds) + '\n'; + }); if (filter.favorite) { body += ' ' + (filter.favorite ? '1': '0') + '\n'; }