Browse Source

Fix ACLs on shared calendars

tags/v9.0beta1
Thomas Müller 8 years ago
parent
commit
4b14ca672f

+ 0
- 2
apps/dav/lib/caldav/caldavbackend.php View File

$fields[] = 'a.components'; $fields[] = 'a.components';
$fields[] = 'a.principaluri'; $fields[] = 'a.principaluri';
$fields[] = 'a.transparent'; $fields[] = 'a.transparent';
$fields[] = 's.access';
$query = $this->db->getQueryBuilder(); $query = $this->db->getQueryBuilder();
$result = $query->select($fields) $result = $query->select($fields)
->from('dav_shares', 's') ->from('dav_shares', 's')
'{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet($components), '{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet($components),
'{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' => new ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'), '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' => new ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'),
'{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'], '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
'{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => $row['access'] === Backend::ACCESS_READ,
]; ];


foreach($this->propertyMap as $xmlName=>$dbName) { foreach($this->propertyMap as $xmlName=>$dbName) {

+ 0
- 17
apps/dav/lib/caldav/calendar.php View File

function getACL() { function getACL() {
$acl = parent::getACL(); $acl = parent::getACL();


// add the current user
if (isset($this->calendarInfo['{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal'])) {
$owner = $this->calendarInfo['{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal'];
$acl[] = [
'privilege' => '{DAV:}read',
'principal' => $owner,
'protected' => true,
];
if ($this->calendarInfo['{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only']) {
$acl[] = [
'privilege' => '{DAV:}write',
'principal' => $owner,
'protected' => true,
];
}
}

/** @var CalDavBackend $caldavBackend */ /** @var CalDavBackend $caldavBackend */
$caldavBackend = $this->caldavBackend; $caldavBackend = $this->caldavBackend;
return $caldavBackend->applyShareAcl($this->getResourceId(), $acl); return $caldavBackend->applyShareAcl($this->getResourceId(), $acl);

+ 1
- 1
apps/dav/lib/dav/sharing/backend.php View File

'href' => "principal:${row['principaluri']}", 'href' => "principal:${row['principaluri']}",
// 'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '', // 'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '',
'status' => 1, 'status' => 1,
'readOnly' => ($row['access'] === self::ACCESS_READ),
'readOnly' => ($row['access'] == self::ACCESS_READ),
'{'.\OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD.'}principal' => $row['principaluri'] '{'.\OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD.'}principal' => $row['principaluri']
]; ];
} }

+ 97
- 10
apps/dav/tests/unit/caldav/caldavbackendtest.php View File

use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet; use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
use Sabre\DAV\PropPatch; use Sabre\DAV\PropPatch;
use Sabre\DAV\Xml\Property\Href; use Sabre\DAV\Xml\Property\Href;
use Sabre\DAVACL\IACL;
use Test\TestCase; use Test\TestCase;


/** /**
$this->assertEquals(0, count($books)); $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); $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
$this->assertEquals(1, count($books)); $this->assertEquals(1, count($books));
$calendar = new Calendar($this->backend, $books[0]); $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); $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER1);
$this->assertEquals(1, count($books)); $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 // delete the address book
$this->backend->deleteCalendar($books[0]['id']); $this->backend->deleteCalendar($books[0]['id']);
$sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER); $sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER);
$this->assertEquals(0, count($sos)); $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);
}
}
} }

Loading…
Cancel
Save