summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-03-23 14:12:50 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2016-03-23 14:12:50 +0100
commitc8d6a9594ab7c0525cc9485b394547ae960d8f34 (patch)
tree9db365d2643e01d2253afd431d3cfaf60bdea188 /apps
parente979b9c73561cb28f2be4c783477d8bdc34489b2 (diff)
downloadnextcloud-server-c8d6a9594ab7c0525cc9485b394547ae960d8f34.tar.gz
nextcloud-server-c8d6a9594ab7c0525cc9485b394547ae960d8f34.zip
Propagate birthday to group shares as well
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/appinfo/application.php13
-rw-r--r--apps/dav/lib/caldav/birthdayservice.php47
-rw-r--r--apps/dav/lib/dav/groupprincipalbackend.php43
-rw-r--r--apps/dav/tests/unit/carddav/birthdayservicetest.php49
4 files changed, 121 insertions, 31 deletions
diff --git a/apps/dav/appinfo/application.php b/apps/dav/appinfo/application.php
index 4ddd23d86b1..593cd770be5 100644
--- a/apps/dav/appinfo/application.php
+++ b/apps/dav/appinfo/application.php
@@ -27,6 +27,8 @@ use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\CardDAV\ContactsManager;
use OCA\DAV\CardDAV\SyncJob;
use OCA\DAV\CardDAV\SyncService;
+use OCA\DAV\Connector\Sabre\Principal;
+use OCA\DAV\DAV\GroupPrincipalBackend;
use OCA\DAV\HookManager;
use OCA\Dav\Migration\AddressBookAdapter;
use OCA\Dav\Migration\CalendarAdapter;
@@ -79,7 +81,7 @@ class Application extends App {
/** @var IAppContainer $c */
$db = $c->getServer()->getDatabaseConnection();
$dispatcher = $c->getServer()->getEventDispatcher();
- $principal = new \OCA\DAV\Connector\Sabre\Principal(
+ $principal = new Principal(
$c->getServer()->getUserManager(),
$c->getServer()->getGroupManager()
);
@@ -89,7 +91,7 @@ class Application extends App {
$container->registerService('CalDavBackend', function($c) {
/** @var IAppContainer $c */
$db = $c->getServer()->getDatabaseConnection();
- $principal = new \OCA\DAV\Connector\Sabre\Principal(
+ $principal = new Principal(
$c->getServer()->getUserManager(),
$c->getServer()->getGroupManager()
);
@@ -122,11 +124,14 @@ class Application extends App {
$container->registerService('BirthdayService', function($c) {
/** @var IAppContainer $c */
+ $g = new GroupPrincipalBackend(
+ $c->getServer()->getGroupManager()
+ );
return new BirthdayService(
$c->query('CalDavBackend'),
- $c->query('CardDavBackend')
+ $c->query('CardDavBackend'),
+ $g
);
-
});
}
diff --git a/apps/dav/lib/caldav/birthdayservice.php b/apps/dav/lib/caldav/birthdayservice.php
index 7fca4dc8c64..31897130ca7 100644
--- a/apps/dav/lib/caldav/birthdayservice.php
+++ b/apps/dav/lib/caldav/birthdayservice.php
@@ -23,6 +23,7 @@ namespace OCA\DAV\CalDAV;
use Exception;
use OCA\DAV\CardDAV\CardDavBackend;
+use OCA\DAV\DAV\GroupPrincipalBackend;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Reader;
@@ -30,15 +31,20 @@ class BirthdayService {
const BIRTHDAY_CALENDAR_URI = 'contact_birthdays';
+ /** @var GroupPrincipalBackend */
+ private $principalBackend;
+
/**
* BirthdayService constructor.
*
* @param CalDavBackend $calDavBackEnd
* @param CardDavBackend $cardDavBackEnd
+ * @param GroupPrincipalBackend $principalBackend
*/
- public function __construct($calDavBackEnd, $cardDavBackEnd) {
+ public function __construct($calDavBackEnd, $cardDavBackEnd, $principalBackend) {
$this->calDavBackEnd = $calDavBackEnd;
$this->cardDavBackEnd = $cardDavBackEnd;
+ $this->principalBackend = $principalBackend;
}
/**
@@ -48,14 +54,7 @@ class BirthdayService {
*/
public function onCardChanged($addressBookId, $cardUri, $cardData) {
- $shares = $this->cardDavBackEnd->getShares($addressBookId);
- // TODO: resolve group shares
- $shares = array_filter($shares, function($share) {
- return !$share['{http://owncloud.org/ns}group-share'];
- });
- $targetPrincipals = array_map(function($share) {
- return $share['{http://owncloud.org/ns}principal'];
- }, $shares);
+ $targetPrincipals = $this->getAllAffectedPrincipals($addressBookId);
$book = $this->cardDavBackEnd->getAddressBookById($addressBookId);
$targetPrincipals[] = $book['principaluri'];
@@ -85,15 +84,7 @@ class BirthdayService {
* @param string $cardUri
*/
public function onCardDeleted($addressBookId, $cardUri) {
- $shares = $this->cardDavBackEnd->getShares($addressBookId);
- // TODO: resolve group shares
- $shares = array_filter($shares, function($share) {
- return !$share['{http://owncloud.org/ns}group-share'];
- });
- $targetPrincipals = array_map(function($share) {
- return $share['href'];
- }, $shares);
-
+ $targetPrincipals = $this->getAllAffectedPrincipals($addressBookId);
$book = $this->cardDavBackEnd->getAddressBookById($addressBookId);
$targetPrincipals[] = $book['principaluri'];
foreach ($targetPrincipals as $principalUri) {
@@ -207,4 +198,24 @@ class BirthdayService {
return false;
}
+ /**
+ * @param $addressBookId
+ * @return mixed
+ */
+ protected function getAllAffectedPrincipals($addressBookId) {
+ $targetPrincipals = [];
+ $shares = $this->cardDavBackEnd->getShares($addressBookId);
+ foreach ($shares as $share) {
+ if ($share['{http://owncloud.org/ns}group-share']) {
+ $users = $this->principalBackend->getGroupMemberSet($share['{http://owncloud.org/ns}principal']);
+ foreach ($users as $user) {
+ $targetPrincipals[] = $user['uri'];
+ }
+ } else {
+ $targetPrincipals[] = $share['{http://owncloud.org/ns}principal'];
+ }
+ }
+ return array_values(array_unique($targetPrincipals, SORT_STRING));
+ }
+
}
diff --git a/apps/dav/lib/dav/groupprincipalbackend.php b/apps/dav/lib/dav/groupprincipalbackend.php
index 34c00b7927e..e0568639784 100644
--- a/apps/dav/lib/dav/groupprincipalbackend.php
+++ b/apps/dav/lib/dav/groupprincipalbackend.php
@@ -22,6 +22,7 @@ namespace OCA\DAV\DAV;
use OCP\IGroup;
use OCP\IGroupManager;
+use OCP\IUser;
use Sabre\DAV\Exception;
use \Sabre\DAV\PropPatch;
use Sabre\DAVACL\PrincipalBackend\BackendInterface;
@@ -82,10 +83,10 @@ class GroupPrincipalBackend implements BackendInterface {
return null;
}
$name = $elements[2];
- $user = $this->groupManager->get($name);
+ $group = $this->groupManager->get($name);
- if (!is_null($user)) {
- return $this->groupToPrincipal($user);
+ if (!is_null($group)) {
+ return $this->groupToPrincipal($group);
}
return null;
@@ -99,8 +100,23 @@ class GroupPrincipalBackend implements BackendInterface {
* @throws Exception
*/
public function getGroupMemberSet($principal) {
- // TODO: implement if we want that
- return [];
+ $elements = explode('/', $principal);
+ if ($elements[0] !== 'principals') {
+ return [];
+ }
+ if ($elements[1] !== 'groups') {
+ return [];
+ }
+ $name = $elements[2];
+ $group = $this->groupManager->get($name);
+
+ if (is_null($group)) {
+ return [];
+ }
+
+ return array_map(function($user) {
+ return $this->userToPrincipal($user);
+ }, $group->getUsers());
}
/**
@@ -162,8 +178,21 @@ class GroupPrincipalBackend implements BackendInterface {
protected function groupToPrincipal($group) {
$groupId = $group->getGID();
$principal = [
- 'uri' => "principals/groups/$groupId",
- '{DAV:}displayname' => $groupId,
+ 'uri' => "principals/groups/$groupId",
+ '{DAV:}displayname' => $groupId,
+ ];
+
+ return $principal;
+ }
+
+ /**
+ * @param IUser $user
+ * @return array
+ */
+ protected function userToPrincipal($user) {
+ $principal = [
+ 'uri' => 'principals/users/' . $user->getUID(),
+ '{DAV:}displayname' => $user->getDisplayName(),
];
return $principal;
diff --git a/apps/dav/tests/unit/carddav/birthdayservicetest.php b/apps/dav/tests/unit/carddav/birthdayservicetest.php
index 2efb3c09aea..e15edd16c62 100644
--- a/apps/dav/tests/unit/carddav/birthdayservicetest.php
+++ b/apps/dav/tests/unit/carddav/birthdayservicetest.php
@@ -24,6 +24,7 @@ namespace OCA\DAV\Tests\Unit\CardDAV;
use OCA\DAV\CalDAV\BirthdayService;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CardDAV\CardDavBackend;
+use OCA\DAV\DAV\GroupPrincipalBackend;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Reader;
use Test\TestCase;
@@ -36,14 +37,17 @@ class BirthdayServiceTest extends TestCase {
private $calDav;
/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject */
private $cardDav;
+ /** @var GroupPrincipalBackend | \PHPUnit_Framework_MockObject_MockObject */
+ private $groupPrincialBackend;
public function setUp() {
parent::setUp();
$this->calDav = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock();
$this->cardDav = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')->disableOriginalConstructor()->getMock();
+ $this->groupPrincialBackend = $this->getMockBuilder('OCA\DAV\DAV\GroupPrincipalBackend')->disableOriginalConstructor()->getMock();
- $this->service = new BirthdayService($this->calDav, $this->cardDav);
+ $this->service = new BirthdayService($this->calDav, $this->cardDav, $this->groupPrincialBackend);
}
/**
@@ -77,6 +81,7 @@ class BirthdayServiceTest extends TestCase {
'id' => 1234
]);
$this->calDav->expects($this->once())->method('deleteCalendarObject')->with(1234, 'default-gump.vcf.ics');
+ $this->cardDav->expects($this->once())->method('getShares')->willReturn([]);
$this->service->onCardDeleted(666, 'gump.vcf');
}
@@ -96,10 +101,11 @@ class BirthdayServiceTest extends TestCase {
->willReturn([
'id' => 1234
]);
+ $this->cardDav->expects($this->once())->method('getShares')->willReturn([]);
/** @var BirthdayService | \PHPUnit_Framework_MockObject_MockObject $service */
$service = $this->getMock('\OCA\DAV\CalDAV\BirthdayService',
- ['buildBirthdayFromContact', 'birthdayEvenChanged'], [$this->calDav, $this->cardDav]);
+ ['buildBirthdayFromContact', 'birthdayEvenChanged'], [$this->calDav, $this->cardDav, $this->groupPrincialBackend]);
if ($expectedOp === 'delete') {
$this->calDav->expects($this->once())->method('getCalendarObject')->willReturn('');
@@ -132,6 +138,45 @@ class BirthdayServiceTest extends TestCase {
$this->assertEquals($expected, $this->service->birthdayEvenChanged($old, $new));
}
+ public function testGetAllAffectedPrincipals() {
+ $this->cardDav->expects($this->once())->method('getShares')->willReturn([
+ [
+ '{http://owncloud.org/ns}group-share' => false,
+ '{http://owncloud.org/ns}principal' => 'principals/users/user01'
+ ],
+ [
+ '{http://owncloud.org/ns}group-share' => false,
+ '{http://owncloud.org/ns}principal' => 'principals/users/user01'
+ ],
+ [
+ '{http://owncloud.org/ns}group-share' => false,
+ '{http://owncloud.org/ns}principal' => 'principals/users/user02'
+ ],
+ [
+ '{http://owncloud.org/ns}group-share' => true,
+ '{http://owncloud.org/ns}principal' => 'principals/groups/users'
+ ],
+ ]);
+ $this->groupPrincialBackend->expects($this->once())->method('getGroupMemberSet')
+ ->willReturn([
+ [
+ 'uri' => 'principals/users/user01',
+ ],
+ [
+ 'uri' => 'principals/users/user02',
+ ],
+ [
+ 'uri' => 'principals/users/user03',
+ ],
+ ]);
+ $users = $this->invokePrivate($this->service, 'getAllAffectedPrincipals', [6666]);
+ $this->assertEquals([
+ 'principals/users/user01',
+ 'principals/users/user02',
+ 'principals/users/user03'
+ ], $users);
+ }
+
public function providesBirthday() {
return [
[true,