|
|
@@ -28,6 +28,7 @@ use OCA\DAV\Connector\Sabre\Principal; |
|
|
|
use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet; |
|
|
|
use Sabre\DAV\PropPatch; |
|
|
|
use Sabre\DAV\Xml\Property\Href; |
|
|
|
use Sabre\DAVACL\IACL; |
|
|
|
use Test\TestCase; |
|
|
|
|
|
|
|
/** |
|
|
@@ -108,22 +109,80 @@ class CalDavBackendTest extends TestCase { |
|
|
|
$this->assertEquals(0, count($books)); |
|
|
|
} |
|
|
|
|
|
|
|
public function testCalendarSharing() { |
|
|
|
public function providesSharingData() { |
|
|
|
return [ |
|
|
|
[true, true, true, false, [ |
|
|
|
[ |
|
|
|
'href' => 'principal:' . self::UNIT_TEST_USER1, |
|
|
|
'readOnly' => false |
|
|
|
], |
|
|
|
[ |
|
|
|
'href' => 'principal:' . self::UNIT_TEST_GROUP, |
|
|
|
'readOnly' => true |
|
|
|
] |
|
|
|
]], |
|
|
|
[true, false, false, false, [ |
|
|
|
[ |
|
|
|
'href' => 'principal:' . self::UNIT_TEST_USER1, |
|
|
|
'readOnly' => true |
|
|
|
], |
|
|
|
]], |
|
|
|
|
|
|
|
]; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @dataProvider providesSharingData |
|
|
|
*/ |
|
|
|
public function testCalendarSharing($userCanRead, $userCanWrite, $groupCanRead, $groupCanWrite, $add) { |
|
|
|
|
|
|
|
$this->createTestCalendar(); |
|
|
|
$calendarId = $this->createTestCalendar(); |
|
|
|
$books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); |
|
|
|
$this->assertEquals(1, count($books)); |
|
|
|
$calendar = new Calendar($this->backend, $books[0]); |
|
|
|
$this->backend->updateShares($calendar, [ |
|
|
|
[ |
|
|
|
'href' => 'principal:' . self::UNIT_TEST_USER1, |
|
|
|
], |
|
|
|
[ |
|
|
|
'href' => 'principal:' . self::UNIT_TEST_GROUP, |
|
|
|
] |
|
|
|
], []); |
|
|
|
$this->backend->updateShares($calendar, $add, []); |
|
|
|
$books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER1); |
|
|
|
$this->assertEquals(1, count($books)); |
|
|
|
$calendar = new Calendar($this->backend, $books[0]); |
|
|
|
$acl = $calendar->getACL(); |
|
|
|
$this->assertAcl(self::UNIT_TEST_USER, '{DAV:}read', $acl); |
|
|
|
$this->assertAcl(self::UNIT_TEST_USER, '{DAV:}write', $acl); |
|
|
|
$this->assertAccess($userCanRead, self::UNIT_TEST_USER1, '{DAV:}read', $acl); |
|
|
|
$this->assertAccess($userCanWrite, self::UNIT_TEST_USER1, '{DAV:}write', $acl); |
|
|
|
$this->assertAccess($groupCanRead, self::UNIT_TEST_GROUP, '{DAV:}read', $acl); |
|
|
|
$this->assertAccess($groupCanWrite, self::UNIT_TEST_GROUP, '{DAV:}write', $acl); |
|
|
|
$this->assertEquals(self::UNIT_TEST_USER, $calendar->getOwner()); |
|
|
|
|
|
|
|
// test acls on the child |
|
|
|
$uri = $this->getUniqueID('calobj'); |
|
|
|
$calData = <<<'EOD' |
|
|
|
BEGIN:VCALENDAR |
|
|
|
VERSION:2.0 |
|
|
|
PRODID:ownCloud Calendar |
|
|
|
BEGIN:VEVENT |
|
|
|
CREATED;VALUE=DATE-TIME:20130910T125139Z |
|
|
|
UID:47d15e3ec8 |
|
|
|
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z |
|
|
|
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z |
|
|
|
SUMMARY:Test Event |
|
|
|
DTSTART;VALUE=DATE-TIME:20130912T130000Z |
|
|
|
DTEND;VALUE=DATE-TIME:20130912T140000Z |
|
|
|
CLASS:PUBLIC |
|
|
|
END:VEVENT |
|
|
|
END:VCALENDAR |
|
|
|
EOD; |
|
|
|
|
|
|
|
$this->backend->createCalendarObject($calendarId, $uri, $calData); |
|
|
|
|
|
|
|
/** @var IACL $child */ |
|
|
|
$child = $calendar->getChild($uri); |
|
|
|
$acl = $child->getACL(); |
|
|
|
$this->assertAcl(self::UNIT_TEST_USER, '{DAV:}read', $acl); |
|
|
|
$this->assertAcl(self::UNIT_TEST_USER, '{DAV:}write', $acl); |
|
|
|
$this->assertAccess($userCanRead, self::UNIT_TEST_USER1, '{DAV:}read', $acl); |
|
|
|
$this->assertAccess($userCanWrite, self::UNIT_TEST_USER1, '{DAV:}write', $acl); |
|
|
|
$this->assertAccess($groupCanRead, self::UNIT_TEST_GROUP, '{DAV:}read', $acl); |
|
|
|
$this->assertAccess($groupCanWrite, self::UNIT_TEST_GROUP, '{DAV:}write', $acl); |
|
|
|
|
|
|
|
// delete the address book |
|
|
|
$this->backend->deleteCalendar($books[0]['id']); |
|
|
@@ -386,4 +445,32 @@ EOD; |
|
|
|
$sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER); |
|
|
|
$this->assertEquals(0, count($sos)); |
|
|
|
} |
|
|
|
|
|
|
|
private function assertAcl($principal, $privilege, $acl) { |
|
|
|
foreach($acl as $a) { |
|
|
|
if ($a['principal'] === $principal && $a['privilege'] === $privilege) { |
|
|
|
$this->assertTrue(true); |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
$this->fail("ACL does not contain $principal / $privilege"); |
|
|
|
} |
|
|
|
|
|
|
|
private function assertNotAcl($principal, $privilege, $acl) { |
|
|
|
foreach($acl as $a) { |
|
|
|
if ($a['principal'] === $principal && $a['privilege'] === $privilege) { |
|
|
|
$this->fail("ACL contains $principal / $privilege"); |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
$this->assertTrue(true); |
|
|
|
} |
|
|
|
|
|
|
|
private function assertAccess($shouldHaveAcl, $principal, $privilege, $acl) { |
|
|
|
if ($shouldHaveAcl) { |
|
|
|
$this->assertAcl($principal, $privilege, $acl); |
|
|
|
} else { |
|
|
|
$this->assertNotAcl($principal, $privilege, $acl); |
|
|
|
} |
|
|
|
} |
|
|
|
} |