|
10 | 10 | use OCA\DAV\CalDAV\BirthdayService; |
11 | 11 | use OCA\DAV\CalDAV\CalDavBackend; |
12 | 12 | use OCA\DAV\CalDAV\Calendar; |
| 13 | +use OCA\DAV\Connector\Sabre\DavAclPlugin; |
13 | 14 | use OCP\IConfig; |
14 | 15 | use OCP\IL10N; |
15 | 16 | use PHPUnit\Framework\MockObject\MockObject; |
16 | 17 | use Psr\Log\LoggerInterface; |
17 | 18 | use Sabre\DAV\PropPatch; |
| 19 | +use Sabre\DAV\Server; |
| 20 | +use Sabre\DAV\SimpleCollection; |
18 | 21 | use Sabre\VObject\Reader; |
19 | 22 | use Test\TestCase; |
20 | 23 |
|
@@ -232,6 +235,11 @@ public function testAcl($expectsWrite, $readOnlyValue, $hasOwnerSet, $uri = 'def |
232 | 235 | 'principal' => ($hasOwnerSet ? 'user1' : 'user2') . '/calendar-proxy-write', |
233 | 236 | 'protected' => true |
234 | 237 | ]; |
| 238 | + $expectedAcl[] = [ |
| 239 | + 'privilege' => '{DAV:}write-acl', |
| 240 | + 'principal' => $hasOwnerSet ? 'user1' : 'user2', |
| 241 | + 'protected' => true |
| 242 | + ]; |
235 | 243 | } |
236 | 244 |
|
237 | 245 | $expectedAcl[] = [ |
@@ -276,6 +284,59 @@ public function providesReadOnlyInfo() { |
276 | 284 | ]; |
277 | 285 | } |
278 | 286 |
|
| 287 | + /** |
| 288 | + * @dataProvider providesSharingPrivileges |
| 289 | + */ |
| 290 | + public function testOnlyOwnerHoldsWriteAcl(string $principal, bool $readOnly, bool $expectsWrite, bool $expectsWriteAcl): void { |
| 291 | + /** @var CalDavBackend&MockObject $backend */ |
| 292 | + $backend = $this->createMock(CalDavBackend::class); |
| 293 | + $backend->method('applyShareAcl')->willReturnArgument(1); |
| 294 | + $calendarInfo = [ |
| 295 | + '{DAV:}displayname' => 'Test', |
| 296 | + '{http://owncloud.org/ns}owner-principal' => 'user1', |
| 297 | + '{http://owncloud.org/ns}read-only' => $readOnly, |
| 298 | + 'principaluri' => 'user2', |
| 299 | + 'id' => 666, |
| 300 | + 'uri' => 'cal', |
| 301 | + ]; |
| 302 | + $calendar = new Calendar($backend, $calendarInfo, $this->l10n, $this->config, $this->logger); |
| 303 | + |
| 304 | + $aclPlugin = new class($principal) extends DavAclPlugin { |
| 305 | + public function __construct( |
| 306 | + private string $principal, |
| 307 | + ) { |
| 308 | + parent::__construct(); |
| 309 | + } |
| 310 | + |
| 311 | + #[\Override] |
| 312 | + public function getCurrentUserPrincipal() { |
| 313 | + return $this->principal; |
| 314 | + } |
| 315 | + |
| 316 | + #[\Override] |
| 317 | + public function getPrincipalMembership($mainPrincipal) { |
| 318 | + return []; |
| 319 | + } |
| 320 | + }; |
| 321 | + $server = new Server(new SimpleCollection('root')); |
| 322 | + $server->addPlugin($aclPlugin); |
| 323 | + |
| 324 | + $privileges = $aclPlugin->getCurrentUserPrivilegeSet($calendar); |
| 325 | + |
| 326 | + $this->assertSame($expectsWrite, in_array('{DAV:}write', $privileges, true)); |
| 327 | + $this->assertSame($expectsWriteAcl, in_array('{DAV:}write-acl', $privileges, true)); |
| 328 | + } |
| 329 | + |
| 330 | + public static function providesSharingPrivileges(): array { |
| 331 | + return [ |
| 332 | + 'owner' => ['user1', false, true, true], |
| 333 | + 'owner of read-only share' => ['user1', true, true, true], |
| 334 | + 'owner write proxy' => ['user1/calendar-proxy-write', false, true, false], |
| 335 | + 'read-write sharee' => ['user2', false, true, false], |
| 336 | + 'read-only sharee' => ['user2', true, false, false], |
| 337 | + ]; |
| 338 | + } |
| 339 | + |
279 | 340 | /** |
280 | 341 | * @dataProvider providesConfidentialClassificationData |
281 | 342 | * @param int $expectedChildren |
|
0 commit comments