Completed
Push — master ( 83fb2b...0f847f )
by
unknown
42:12 queued 20:32
created

PermissionResolverTest::testCanUserWithTargetNo()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 48

Duplication

Lines 48
Ratio 100 %

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 0
dl 48
loc 48
rs 9.1344
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
5
 * @license For full copyright and license information view LICENSE file distributed with this source code.
6
 */
7
namespace eZ\Publish\API\Repository\Tests;
8
9
use eZ\Publish\API\Repository\Repository;
10
use eZ\Publish\API\Repository\Values\Content\ContentCreateStruct;
11
use eZ\Publish\API\Repository\Values\User\Limitation;
12
use eZ\Publish\API\Repository\Values\User\LookupLimitationResult;
13
use eZ\Publish\API\Repository\Values\User\LookupPolicyLimitations;
14
use eZ\Publish\API\Repository\Values\ValueObject;
15
use eZ\Publish\Core\Repository\Values\User\UserReference;
16
17
/**
18
 *  Test case for operations in the PermissionResolver.
19
 *
20
 * @see \eZ\Publish\API\Repository\PermissionResolver
21
 * @group integration
22
 * @group permission
23
 */
24
class PermissionResolverTest extends BaseTest
25
{
26
    /**
27
     * Test for the getCurrentUser() method.
28
     *
29
     * @see \eZ\Publish\API\Repository\PermissionResolver::getCurrentUserReference()
30
     */
31
    public function testGetCurrentUserReferenceReturnsAnonymousUserReference()
32
    {
33
        $repository = $this->getRepository();
34
        $anonymousUserId = $this->generateId('user', 10);
35
        $repository->getPermissionResolver()->setCurrentUserReference(
36
            new UserReference($anonymousUserId)
37
        );
38
39
        /* BEGIN: Use Case */
40
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
41
        // Publish demo installation.
42
        // Only a UserReference has previously been set to the $repository
43
44
        $permissionResolver = $repository->getPermissionResolver();
45
        $anonymousUserReference = $permissionResolver->getCurrentUserReference();
46
        /* END: Use Case */
47
48
        $this->assertInstanceOf(
49
            'eZ\Publish\API\Repository\Values\User\UserReference',
50
            $anonymousUserReference
51
        );
52
        $this->assertEquals(
53
            $anonymousUserReference->getUserId(),
54
            $repository->getUserService()->loadUser($anonymousUserId)->id
55
        );
56
    }
57
58
    /**
59
     * Test for the setCurrentUser() method.
60
     *
61
     * @see \eZ\Publish\API\Repository\PermissionResolver::setCurrentUserReference()
62
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
63
     */
64 View Code Duplication
    public function testSetCurrentUserReference()
65
    {
66
        $repository = $this->getRepository();
67
        $repository->getPermissionResolver()->setCurrentUserReference(
68
            new UserReference(
69
                $this->generateId('user', 10)
70
            )
71
        );
72
73
        $administratorUserId = $this->generateId('user', 14);
74
75
        /* BEGIN: Use Case */
76
        // $administratorUserId contains the ID of the administrator user
77
78
        $permissionResolver = $repository->getPermissionResolver();
79
80
        $userService = $repository->getUserService();
81
82
        // Load administrator user
83
        $administratorUser = $userService->loadUser($administratorUserId);
84
85
        // Set administrator user as current user reference
86
        $permissionResolver->setCurrentUserReference($administratorUser);
87
        /* END: Use Case */
88
89
        $this->assertEquals(
90
            $administratorUserId,
91
            $permissionResolver->getCurrentUserReference()->getUserId()
92
        );
93
94
        $this->assertSame(
95
            $administratorUser,
96
            $permissionResolver->getCurrentUserReference()
97
        );
98
    }
99
100
    /**
101
     * Test for the hasAccess() method.
102
     *
103
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
104
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
105
     */
106
    public function testHasAccessWithAnonymousUserNo()
107
    {
108
        $repository = $this->getRepository();
109
110
        $anonymousUserId = $this->generateId('user', 10);
111
112
        /* BEGIN: Use Case */
113
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
114
        // Publish demo installation.
115
116
        $userService = $repository->getUserService();
117
        $permissionResolver = $repository->getPermissionResolver();
118
119
        // Load anonymous user
120
        $anonymousUser = $userService->loadUser($anonymousUserId);
121
122
        // This call will return false because anonymous user does not have access
123
        // to content removal
124
        $hasAccess = $permissionResolver->hasAccess('content', 'remove', $anonymousUser);
125
        /* END: Use Case */
126
127
        $this->assertFalse($hasAccess);
128
    }
129
130
    /**
131
     * Test for the hasAccess() method.
132
     *
133
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
134
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
135
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessWithAnonymousUserNo
136
     */
137 View Code Duplication
    public function testHasAccessForCurrentUserNo()
138
    {
139
        $repository = $this->getRepository();
140
141
        $anonymousUserId = $this->generateId('user', 10);
142
143
        /* BEGIN: Use Case */
144
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
145
        // Publish demo installation.
146
147
        $userService = $repository->getUserService();
148
        $permissionResolver = $repository->getPermissionResolver();
149
150
        // Load anonymous user
151
        $anonymousUser = $userService->loadUser($anonymousUserId);
152
153
        // Set anonymous user as current user reference
154
        $permissionResolver->setCurrentUserReference($anonymousUser);
155
156
        // This call will return false because anonymous user does not have access
157
        // to content removal
158
        $hasAccess = $permissionResolver->hasAccess('content', 'remove');
159
        /* END: Use Case */
160
161
        $this->assertFalse($hasAccess);
162
    }
163
164
    /**
165
     * Test for the hasAccess() method.
166
     *
167
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
168
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
169
     */
170
    public function testHasAccessWithAdministratorUser()
171
    {
172
        $repository = $this->getRepository();
173
174
        $administratorUserId = $this->generateId('user', 14);
175
176
        /* BEGIN: Use Case */
177
        // $administratorUserId contains the ID of the administrator user
178
179
        $userService = $repository->getUserService();
180
        $permissionResolver = $repository->getPermissionResolver();
181
182
        // Load administrator user
183
        $administratorUser = $userService->loadUser($administratorUserId);
184
185
        // This call will return true
186
        $hasAccess = $permissionResolver->hasAccess('content', 'read', $administratorUser);
187
        /* END: Use Case */
188
189
        $this->assertTrue($hasAccess);
190
    }
191
192
    /**
193
     * Test for the hasAccess() method.
194
     *
195
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
196
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
197
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testSetCurrentUserReference
198
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessWithAdministratorUser
199
     */
200 View Code Duplication
    public function testHasAccessForCurrentUserYes()
201
    {
202
        $repository = $this->getRepository();
203
204
        $administratorUserId = $this->generateId('user', 14);
205
206
        /* BEGIN: Use Case */
207
        // $administratorUserId contains the ID of the administrator user
208
209
        $userService = $repository->getUserService();
210
        $permissionResolver = $repository->getPermissionResolver();
211
212
        // Load administrator user
213
        $administratorUser = $userService->loadUser($administratorUserId);
214
215
        // Set administrator user as current user reference
216
        $permissionResolver->setCurrentUserReference($administratorUser);
217
218
        // This call will return true
219
        $hasAccess = $permissionResolver->hasAccess('content', 'read');
220
        /* END: Use Case */
221
222
        $this->assertTrue($hasAccess);
223
    }
224
225
    /**
226
     * Test for the hasAccess() method.
227
     *
228
     * @see \eZ\Publish\API\Repository\PermissionResolver::hasAccess()
229
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
230
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testSetCurrentUserReference
231
     */
232 View Code Duplication
    public function testHasAccessLimited()
233
    {
234
        $repository = $this->getRepository();
235
236
        /* BEGIN: Use Case */
237
        $user = $this->createUserVersion1();
238
239
        $permissionResolver = $repository->getPermissionResolver();
240
241
        // Set created user as current user reference
242
        $permissionResolver->setCurrentUserReference($user);
243
244
        // This call will return an array of permission sets describing user's access
245
        // to reading content
246
        $permissionSets = $permissionResolver->hasAccess('content', 'read');
247
        /* END: Use Case */
248
249
        $this->assertInternalType(
0 ignored issues
show
Deprecated Code introduced by
The method PHPUnit\Framework\Assert::assertInternalType() has been deprecated with message: https://github.com/sebastianbergmann/phpunit/issues/3369

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
250
            'array',
251
            $permissionSets
252
        );
253
        $this->assertNotEmpty($permissionSets);
254
    }
255
256
    /**
257
     * Test for the canUser() method.
258
     *
259
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
260
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
261
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
262
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessForCurrentUserNo
263
     * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
264
     */
265
    public function testCanUserForAnonymousUserNo()
266
    {
267
        $repository = $this->getRepository();
268
269
        $homeId = $this->generateId('object', 57);
270
271
        $anonymousUserId = $this->generateId('user', 10);
272
        /* BEGIN: Use Case */
273
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
274
        // Publish demo installation.
275
        // $homeId contains the ID of the "Home" frontpage
276
277
        $contentService = $repository->getContentService();
278
        $userService = $repository->getUserService();
279
        $permissionResolver = $repository->getPermissionResolver();
280
281
        // Load anonymous user
282
        $anonymousUser = $userService->loadUser($anonymousUserId);
283
284
        // Set anonymous user as current user reference
285
        $permissionResolver->setCurrentUserReference($anonymousUser);
286
287
        // Load the ContentInfo for "Home" frontpage
288
        $contentInfo = $contentService->loadContentInfo($homeId);
289
290
        // This call will return false because anonymous user does not have access
291
        // to content removal and hence no permission to remove given content
292
        $canUser = $permissionResolver->canUser('content', 'remove', $contentInfo);
293
294
        // Performing an action without necessary permissions will fail with "UnauthorizedException"
295
        if (!$canUser) {
296
            $contentService->deleteContent($contentInfo);
297
        }
298
        /* END: Use Case */
299
    }
300
301
    /**
302
     * Test for the canUser() method.
303
     *
304
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
305
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
306
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
307
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessForCurrentUserYes
308
     * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
309
     */
310 View Code Duplication
    public function testCanUserForAdministratorUser()
311
    {
312
        $repository = $this->getRepository();
313
314
        $administratorUserId = $this->generateId('user', 14);
315
        $homeId = $this->generateId('object', 57);
316
317
        /* BEGIN: Use Case */
318
        // $administratorUserId contains the ID of the administrator user
319
        // $homeId contains the ID of the "Home" frontpage
320
321
        $contentService = $repository->getContentService();
322
        $userService = $repository->getUserService();
323
        $permissionResolver = $repository->getPermissionResolver();
324
325
        // Load administrator user
326
        $administratorUser = $userService->loadUser($administratorUserId);
327
328
        // Set administrator user as current user reference
329
        $permissionResolver->setCurrentUserReference($administratorUser);
330
331
        // Load the ContentInfo for "Home" frontpage
332
        $contentInfo = $contentService->loadContentInfo($homeId);
333
334
        // This call will return true
335
        $canUser = $permissionResolver->canUser('content', 'remove', $contentInfo);
336
337
        // Performing an action having necessary permissions will succeed
338
        $contentService->deleteContent($contentInfo);
339
        /* END: Use Case */
340
341
        $this->assertTrue($canUser);
342
        $contentService->loadContent($homeId);
343
    }
344
345
    /**
346
     * Test for the canUser() method.
347
     *
348
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
349
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
350
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
351
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
352
     */
353 View Code Duplication
    public function testCanUserWithLimitationYes()
354
    {
355
        $repository = $this->getRepository();
356
357
        $imagesFolderId = $this->generateId('object', 49);
358
359
        /* BEGIN: Use Case */
360
        // $imagesFolderId contains the ID of the "Images" folder
361
362
        $user = $this->createUserVersion1();
363
364
        $permissionResolver = $repository->getPermissionResolver();
365
366
        // Set created user as current user reference
367
        $permissionResolver->setCurrentUserReference($user);
368
369
        $contentService = $repository->getContentService();
370
371
        // Performing an action having necessary permissions will succeed
372
        $imagesFolder = $contentService->loadContent($imagesFolderId);
373
374
        // This call will return true
375
        $canUser = $permissionResolver->canUser('content', 'read', $imagesFolder);
376
        /* END: Use Case */
377
378
        $this->assertTrue($canUser);
379
    }
380
381
    /**
382
     * Test for the canUser() method.
383
     *
384
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
385
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
386
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
387
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
388
     * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
389
     */
390
    public function testCanUserWithLimitationNo()
391
    {
392
        $repository = $this->getRepository();
393
394
        $administratorUserId = $this->generateId('user', 14);
395
396
        /* BEGIN: Use Case */
397
        // $administratorUserId contains the ID of the administrator user
398
399
        $user = $this->createUserVersion1();
400
401
        $permissionResolver = $repository->getPermissionResolver();
402
403
        // Set created user as current user reference
404
        $permissionResolver->setCurrentUserReference($user);
405
406
        $userService = $repository->getUserService();
407
408
        // Load administrator user using UserService, this does not check for permissions
409
        $administratorUser = $userService->loadUser($administratorUserId);
410
411
        // This call will return false as user with Editor role does not have
412
        // permission to read "Users" subtree
413
        $canUser = $permissionResolver->canUser('content', 'read', $administratorUser);
414
415
        $contentService = $repository->getContentService();
416
417
        // Performing an action without necessary permissions will fail with "UnauthorizedException"
418
        if (!$canUser) {
419
            $content = $contentService->loadContent($administratorUserId);
0 ignored issues
show
Unused Code introduced by
$content is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
420
        }
421
        /* END: Use Case */
422
    }
423
424
    /**
425
     * Test for the canUser() method.
426
     *
427
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
428
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
429
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
430
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testSetCurrentUserReference
431
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
432
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
433
     */
434 View Code Duplication
    public function testCanUserThrowsInvalidArgumentException()
435
    {
436
        $repository = $this->getRepository();
437
438
        $userGroupContentTypeId = $this->generateId('type', 3);
439
440
        /* BEGIN: Use Case */
441
        // $userGroupContentTypeId contains the ID of the "UserGroup" ContentType
442
443
        $user = $this->createUserVersion1();
444
445
        $permissionResolver = $repository->getPermissionResolver();
446
447
        // Set created user as current user reference
448
        $permissionResolver->setCurrentUserReference($user);
449
450
        $contentTypeService = $repository->getContentTypeService();
451
452
        // Load the "UserGroup" ContentType
453
        $userGroupContentType = $contentTypeService->loadContentType($userGroupContentTypeId);
454
455
        // This call will throw "InvalidArgumentException" because $userGroupContentType
456
        // is an instance of \eZ\Publish\API\Repository\Values\ContentType\ContentType,
457
        // which can not be checked for user access
458
        $canUser = $permissionResolver->canUser('content', 'create', $userGroupContentType);
0 ignored issues
show
Unused Code introduced by
$canUser is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
459
        /* END: Use Case */
460
    }
461
462
    /**
463
     * Test for the canUser() method.
464
     *
465
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
466
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
467
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
468
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
469
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
470
     */
471 View Code Duplication
    public function testCanUserWithTargetYes()
472
    {
473
        $repository = $this->getRepository();
474
475
        $homeLocationId = $this->generateId('location', 2);
476
477
        /* BEGIN: Use Case */
478
        // $homeLocationId contains the ID of the "Home" location
479
480
        $user = $this->createUserVersion1();
481
482
        $permissionResolver = $repository->getPermissionResolver();
483
484
        // Set created user as current user reference
485
        $permissionResolver->setCurrentUserReference($user);
486
487
        $contentTypeService = $repository->getContentTypeService();
488
489
        $contentType = $contentTypeService->loadContentTypeByIdentifier('forums');
490
491
        $contentService = $repository->getContentService();
492
493
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
494
        $contentCreateStruct->setField('title', 'My awesome forums');
495
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
496
        $contentCreateStruct->alwaysAvailable = true;
497
498
        $locationService = $repository->getLocationService();
499
        $locationCreateStruct = $locationService->newLocationCreateStruct($homeLocationId);
500
501
        // This call will return true
502
        $canUser = $permissionResolver->canUser(
503
            'content',
504
            'create',
505
            $contentCreateStruct,
506
            [$locationCreateStruct]
507
        );
508
509
        // Performing an action having necessary permissions will succeed
510
        $contentDraft = $contentService->createContent(
511
            $contentCreateStruct,
512
            array($locationCreateStruct)
513
        );
514
        /* END: Use Case */
515
516
        $this->assertTrue($canUser);
517
        $this->assertEquals(
518
            'My awesome forums',
519
            $contentDraft->getFieldValue('title')->text
520
        );
521
    }
522
523
    /**
524
     * Test for the canUser() method.
525
     *
526
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
527
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
528
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
529
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
530
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
531
     * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
532
     */
533 View Code Duplication
    public function testCanUserWithTargetNo()
534
    {
535
        $repository = $this->getRepository();
536
537
        $homeLocationId = $this->generateId('location', 2);
538
539
        /* BEGIN: Use Case */
540
        // $homeLocationId contains the ID of the "Home" frontpage location
541
542
        $user = $this->createUserVersion1();
543
544
        $permissionResolver = $repository->getPermissionResolver();
545
546
        // Set created user as current user reference
547
        $permissionResolver->setCurrentUserReference($user);
548
549
        $contentTypeService = $repository->getContentTypeService();
550
551
        $contentType = $contentTypeService->loadContentTypeByIdentifier('forum');
552
553
        $contentService = $repository->getContentService();
554
555
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
556
        $contentCreateStruct->setField('name', 'My awesome forum');
557
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
558
        $contentCreateStruct->alwaysAvailable = true;
559
560
        $locationService = $repository->getLocationService();
561
        $locationCreateStruct = $locationService->newLocationCreateStruct($homeLocationId);
562
563
        // This call will return false because user with Editor role has permission to
564
        // create "forum" type content only under "folder" type content.
565
        $canUser = $permissionResolver->canUser(
566
            'content',
567
            'create',
568
            $contentCreateStruct,
569
            [$locationCreateStruct]
570
        );
571
572
        // Performing an action without necessary permissions will fail with "UnauthorizedException"
573
        if (!$canUser) {
574
            $contentDraft = $contentService->createContent(
0 ignored issues
show
Unused Code introduced by
$contentDraft is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
575
                $contentCreateStruct,
576
                array($locationCreateStruct)
577
            );
578
        }
579
        /* END: Use Case */
580
    }
581
582
    /**
583
     * Test for the canUser() method.
584
     *
585
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
586
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
587
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
588
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
589
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
590
     */
591 View Code Duplication
    public function testCanUserWithMultipleTargetsYes()
592
    {
593
        $repository = $this->getRepository();
594
595
        $imagesLocationId = $this->generateId('location', 51);
596
        $filesLocationId = $this->generateId('location', 52);
597
598
        /* BEGIN: Use Case */
599
        // $imagesLocationId contains the ID of the "Images" location
600
        // $filesLocationId contains the ID of the "Files" location
601
602
        $user = $this->createUserVersion1();
603
604
        $permissionResolver = $repository->getPermissionResolver();
605
606
        // Set created user as current user reference
607
        $permissionResolver->setCurrentUserReference($user);
608
609
        $contentTypeService = $repository->getContentTypeService();
610
611
        $contentType = $contentTypeService->loadContentTypeByIdentifier('folder');
612
613
        $contentService = $repository->getContentService();
614
615
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
616
        $contentCreateStruct->setField('name', 'My multipurpose folder');
617
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
618
        $contentCreateStruct->alwaysAvailable = true;
619
620
        $locationService = $repository->getLocationService();
621
        $locationCreateStruct1 = $locationService->newLocationCreateStruct($imagesLocationId);
622
        $locationCreateStruct2 = $locationService->newLocationCreateStruct($filesLocationId);
623
        $locationCreateStructs = array($locationCreateStruct1, $locationCreateStruct2);
624
625
        // This call will return true
626
        $canUser = $permissionResolver->canUser(
627
            'content',
628
            'create',
629
            $contentCreateStruct,
630
            $locationCreateStructs
631
        );
632
633
        // Performing an action having necessary permissions will succeed
634
        $contentDraft = $contentService->createContent($contentCreateStruct, $locationCreateStructs);
635
        /* END: Use Case */
636
637
        $this->assertTrue($canUser);
638
        $this->assertEquals(
639
            'My multipurpose folder',
640
            $contentDraft->getFieldValue('name')->text
641
        );
642
    }
643
644
    /**
645
     * Test for the canUser() method.
646
     *
647
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
648
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
649
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
650
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
651
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
652
     * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
653
     */
654 View Code Duplication
    public function testCanUserWithMultipleTargetsNo()
655
    {
656
        $repository = $this->getRepository();
657
658
        $homeLocationId = $this->generateId('location', 2);
659
        $administratorUsersLocationId = $this->generateId('location', 13);
660
661
        /* BEGIN: Use Case */
662
        // $homeLocationId contains the ID of the "Home" location
663
        // $administratorUsersLocationId contains the ID of the "Administrator users" location
664
665
        $user = $this->createUserVersion1();
666
667
        $permissionResolver = $repository->getPermissionResolver();
668
669
        // Set created user as current user reference
670
        $permissionResolver->setCurrentUserReference($user);
671
672
        $contentTypeService = $repository->getContentTypeService();
673
674
        $contentType = $contentTypeService->loadContentTypeByIdentifier('forums');
675
676
        $contentService = $repository->getContentService();
677
678
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
679
        $contentCreateStruct->setField('name', 'My awesome forums');
680
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
681
        $contentCreateStruct->alwaysAvailable = true;
682
683
        $locationService = $repository->getLocationService();
684
        $locationCreateStruct1 = $locationService->newLocationCreateStruct($homeLocationId);
685
        $locationCreateStruct2 = $locationService->newLocationCreateStruct($administratorUsersLocationId);
686
        $locationCreateStructs = array($locationCreateStruct1, $locationCreateStruct2);
687
688
        // This call will return false because user with Editor role does not have permission to
689
        // create content in the "Administrator users" location subtree
690
        $canUser = $permissionResolver->canUser(
691
            'content',
692
            'create',
693
            $contentCreateStruct,
694
            $locationCreateStructs
695
        );
696
697
        // Performing an action without necessary permissions will fail with "UnauthorizedException"
698
        if (!$canUser) {
699
            $contentDraft = $contentService->createContent($contentCreateStruct, $locationCreateStructs);
0 ignored issues
show
Unused Code introduced by
$contentDraft is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
700
        }
701
        /* END: Use Case */
702
    }
703
704
    /**
705
     * Test for the canUser() method.
706
     *
707
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
708
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
709
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
710
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService
711
     * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetURLAliasService
712
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testSetCurrentUserReference
713
     * @depends eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessLimited
714
     * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
715
     */
716 View Code Duplication
    public function testCanUserWithTargetThrowsInvalidArgumentException()
717
    {
718
        $repository = $this->getRepository();
719
720
        /* BEGIN: Use Case */
721
        $user = $this->createUserVersion1();
722
723
        $permissionResolver = $repository->getPermissionResolver();
724
725
        // Set created user as current user reference
726
        $permissionResolver->setCurrentUserReference($user);
727
728
        $contentTypeService = $repository->getContentTypeService();
729
730
        $contentType = $contentTypeService->loadContentTypeByIdentifier('forum');
731
732
        $contentService = $repository->getContentService();
733
734
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
735
        $contentCreateStruct->setField('name', 'My awesome forum');
736
        $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789';
737
        $contentCreateStruct->alwaysAvailable = true;
738
739
        $urlAliasService = $repository->getURLAliasService();
740
        $rootUrlAlias = $urlAliasService->lookup('/');
741
742
        // This call will throw "InvalidArgumentException" because $rootAlias is not a valid target object
743
        $canUser = $permissionResolver->canUser(
0 ignored issues
show
Unused Code introduced by
$canUser is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
744
            'content',
745
            'create',
746
            $contentCreateStruct,
747
            [$rootUrlAlias]
748
        );
749
        /* END: Use Case */
750
    }
751
752
    /**
753
     * Test for the canUser() method.
754
     *
755
     * @see \eZ\Publish\API\Repository\PermissionResolver::canUser()
756
     * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException
757
     */
758
    public function testCanUserThrowsBadStateException()
759
    {
760
        $this->markTestIncomplete(
761
            'Cannot be tested on current fixture since policy with unsupported limitation value is not available.'
762
        );
763
    }
764
765
    /**
766
     * Test PermissionResolver::canUser for Users with different Limitations.
767
     *
768
     * @covers       \eZ\Publish\API\Repository\PermissionResolver::canUser
769
     *
770
     * @dataProvider getDataForTestCanUserWithLimitations
771
     *
772
     * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitation
773
     * @param string $module
774
     * @param string $function
775
     * @param \eZ\Publish\API\Repository\Values\ValueObject $object
776
     * @param array $targets
777
     * @param bool $expectedResult expected result of canUser check
778
     *
779
     * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException
780
     * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
781
     */
782
    public function testCanUserWithLimitations(
783
        Limitation $limitation,
784
        $module,
785
        $function,
786
        ValueObject $object,
787
        array $targets,
788
        $expectedResult
789
    ) {
790
        $repository = $this->getRepository();
791
        $userService = $repository->getUserService();
792
        $roleService = $repository->getRoleService();
793
        $permissionResolver = $repository->getPermissionResolver();
794
795
        $role = $this->createRoleWithPolicies(
796
            'role_' . __FUNCTION__,
797
            [
798
                ['module' => $module, 'function' => $function, 'limitations' => [$limitation]],
799
            ]
800
        );
801
        // create user in root user group to avoid overlapping of existing policies and limitations
802
        $user = $this->createUser('user', 'John', 'Doe', $userService->loadUserGroup(4));
803
        $roleLimitation = $limitation instanceof Limitation\RoleLimitation ? $limitation : null;
804
        $roleService->assignRoleToUser($role, $user, $roleLimitation);
805
806
        $permissionResolver->setCurrentUserReference($user);
807
808
        self::assertEquals(
809
            $expectedResult,
810
            $permissionResolver->canUser($module, $function, $object, $targets)
811
        );
812
    }
813
814
    /**
815
     * Data provider for testCanUserWithLimitations.
816
     * @see testCanUserWithLimitations
817
     *
818
     * @return array
819
     *
820
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException
821
     */
822
    public function getDataForTestCanUserWithLimitations()
823
    {
824
        $repository = $this->getRepository();
825
        $contentService = $repository->getContentService();
826
        $contentTypeService = $repository->getContentTypeService();
827
828
        $contentType = $contentTypeService->loadContentTypeByIdentifier('folder');
829
830
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, 'eng-US');
831
        $contentCreateStruct->sectionId = 2;
832
833
        // return data sets, numbered for readability and debugging
834
        return [
835
            0 => [
836
                new Limitation\SubtreeLimitation(['limitationValues' => ['/1/2/']]),
837
                'content',
838
                'create',
839
                $contentCreateStruct,
840
                [],
841
                false,
842
            ],
843
            1 => [
844
                new Limitation\SectionLimitation(['limitationValues' => [2]]),
845
                'content',
846
                'create',
847
                $contentCreateStruct,
848
                [],
849
                true,
850
            ],
851
            2 => [
852
                new Limitation\ParentContentTypeLimitation(['limitationValues' => [1]]),
853
                'content',
854
                'create',
855
                $contentCreateStruct,
856
                [],
857
                false,
858
            ],
859
            3 => [
860
                new Limitation\ParentContentTypeLimitation(['limitationValues' => [3]]), // parent type has to be the UserGroup
861
                'content',
862
                'create',
863
                $contentService->loadContentInfo(14), // content type user (Administrator)
864
                [],
865
                true,
866
            ],
867
        ];
868
    }
869
870
    /**
871
     * Test for the lookupLimitations() method.
872
     *
873
     * @see \eZ\Publish\API\Repository\PermissionResolver::lookupLimitations()
874
     * @depends \eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
875
     * @depends \eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
876
     * @depends \eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessForCurrentUserNo
877
     */
878 View Code Duplication
    public function testLookupLimitationsForAnonymousUserHasNoAccess(): void
879
    {
880
        $repository = $this->getRepository();
881
882
        $homeId = $this->generateId('object', 57);
883
884
        $anonymousUserId = $this->generateId('user', 10);
885
        /* BEGIN: Use Case */
886
        // $anonymousUserId is the ID of the "Anonymous" user in a eZ
887
        // Publish demo installation.
888
        // $homeId contains the ID of the "Home" frontpage
889
890
        $contentService = $repository->getContentService();
891
        $userService = $repository->getUserService();
892
        $permissionResolver = $repository->getPermissionResolver();
893
894
        // Load anonymous user
895
        $anonymousUser = $userService->loadUser($anonymousUserId);
896
897
        // Set anonymous user as current user reference
898
        $permissionResolver->setCurrentUserReference($anonymousUser);
899
900
        // Load the ContentInfo for "Home" frontpage
901
        $contentInfo = $contentService->loadContentInfo($homeId);
902
903
        // `$lookupLimitations->hasAccess` will return false because anonymous user does not have access
904
        // to content removal and hence no permission to remove given content. `$lookupLimitations->lookupPolicyLimitations`
905
        // will be empty array
906
        $lookupLimitations = $permissionResolver->lookupLimitations('content', 'remove', $contentInfo);
907
        /* END: Use Case */
908
909
        $this->assertFalse($lookupLimitations->hasAccess);
910
        $this->assertEquals($lookupLimitations->roleLimitations, []);
911
        $this->assertEquals($lookupLimitations->lookupPolicyLimitations, []);
912
    }
913
914
    /**
915
     * Test for the lookupLimitations() method.
916
     *
917
     * @see \eZ\Publish\API\Repository\PermissionResolver::lookupLimitations()
918
     * @depends \eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
919
     * @depends \eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
920
     * @depends \eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessForCurrentUserYes
921
     */
922 View Code Duplication
    public function testLookupLimitationsForAdministratorUser(): void
923
    {
924
        $repository = $this->getRepository();
925
926
        $administratorUserId = $this->generateId('user', 14);
927
        $homeId = $this->generateId('object', 57);
928
929
        /* BEGIN: Use Case */
930
        // $administratorUserId contains the ID of the administrator user
931
        // $homeId contains the ID of the "Home" frontpage
932
933
        $contentService = $repository->getContentService();
934
        $userService = $repository->getUserService();
935
        $permissionResolver = $repository->getPermissionResolver();
936
937
        // Load administrator user
938
        $administratorUser = $userService->loadUser($administratorUserId);
939
940
        // Set administrator user as current user reference
941
        $permissionResolver->setCurrentUserReference($administratorUser);
942
943
        // Load the ContentInfo for "Home" frontpage
944
        $contentInfo = $contentService->loadContentInfo($homeId);
945
946
        // This call will return true
947
        $lookupLimitations = $permissionResolver->lookupLimitations('content', 'remove', $contentInfo);
948
        /* END: Use Case */
949
950
        $this->assertTrue($lookupLimitations->hasAccess);
951
        $this->assertEquals($lookupLimitations->roleLimitations, []);
952
        $this->assertEquals($lookupLimitations->lookupPolicyLimitations, []);
953
    }
954
955
    /**
956
     * When one of policy pass then all limitation should be returned.
957
     *
958
     * @see \eZ\Publish\API\Repository\PermissionResolver::lookupLimitations()
959
     * @depends \eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
960
     * @depends \eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
961
     * @depends \eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessForCurrentUserYes
962
     *
963
     * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException
964
     * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
965
     * @throws \eZ\Publish\API\Repository\Exceptions\LimitationValidationException
966
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException
967
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
968
     */
969
    public function testLookupLimitationsWithLimitations(): void
970
    {
971
        $repository = $this->getRepository();
972
        $userService = $repository->getUserService();
973
        $permissionResolver = $repository->getPermissionResolver();
974
        $roleService = $repository->getRoleService();
975
976
        $module = 'content';
977
        $function = 'create';
978
979
        $role = $this->createRoleWithPolicies(
980
            'role_' . __FUNCTION__,
981
            [
982
                ['module' => $module, 'function' => $function, 'limitations' => [new Limitation\SubtreeLimitation(['limitationValues' => ['/1/2/']])]],
983
                ['module' => $module, 'function' => $function, 'limitations' => [
984
                    new Limitation\SectionLimitation(['limitationValues' => [2]]),
985
                    new Limitation\LanguageLimitation(['limitationValues' => ['eng-US']]),
986
                ]],
987
                ['module' => 'content', 'function' => 'edit', 'limitations' => [new Limitation\SectionLimitation(['limitationValues' => [2]])]],
988
            ]
989
        );
990
        // create user in root user group to avoid overlapping of existing policies and limitations
991
        $user = $this->createUser('user', 'John', 'Doe', $userService->loadUserGroup(4));
992
        // Here we have no RoleLimitation
993
        $roleService->assignRoleToUser($role, $user);
994
        $permissionResolver->setCurrentUserReference($user);
995
996
        $expected = new LookupLimitationResult(
997
            true,
998
            [],
999
            [
1000
                new LookupPolicyLimitations(
1001
                    $role->getPolicies()[1],
1002
                    [
1003
                        new Limitation\SectionLimitation(['limitationValues' => [2]]),
1004
                        new Limitation\LanguageLimitation(['limitationValues' => ['eng-US']]),
1005
                    ]
1006
                ),
1007
            ]
1008
        );
1009
1010
        self::assertEquals(
1011
            $expected,
1012
            $permissionResolver->lookupLimitations($module, $function, $this->getContentCreateStruct($repository), [])
1013
        );
1014
    }
1015
1016
    /**
1017
     * When one of policy pass then only filtered limitation should be returned.
1018
     *
1019
     * @see \eZ\Publish\API\Repository\PermissionResolver::lookupLimitations()
1020
     * @depends \eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService
1021
     * @depends \eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService
1022
     * @depends \eZ\Publish\API\Repository\Tests\PermissionResolverTest::testHasAccessForCurrentUserYes
1023
     *
1024
     * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException
1025
     * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1026
     * @throws \eZ\Publish\API\Repository\Exceptions\LimitationValidationException
1027
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException
1028
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
1029
     */
1030
    public function testLookupLimitationsWithFilteredLimitations(): void
1031
    {
1032
        $repository = $this->getRepository();
1033
        $userService = $repository->getUserService();
1034
        $permissionResolver = $repository->getPermissionResolver();
1035
        $roleService = $repository->getRoleService();
1036
1037
        $module = 'content';
1038
        $function = 'create';
1039
1040
        $role = $this->createRoleWithPolicies(
1041
            'role_' . __FUNCTION__,
1042
            [
1043
                ['module' => $module, 'function' => $function, 'limitations' => [new Limitation\SubtreeLimitation(['limitationValues' => ['/1/2/']])]],
1044
                ['module' => $module, 'function' => $function, 'limitations' => [
1045
                    new Limitation\SectionLimitation(['limitationValues' => [2]]),
1046
                    new Limitation\LanguageLimitation(['limitationValues' => ['eng-US']]),
1047
                ]],
1048
                ['module' => 'content', 'function' => 'edit', 'limitations' => [new Limitation\SectionLimitation(['limitationValues' => [2]])]],
1049
            ]
1050
        );
1051
        // create user in root user group to avoid overlapping of existing policies and limitations
1052
        $user = $this->createUser('user', 'John', 'Doe', $userService->loadUserGroup(4));
1053
        // Here we have no RoleLimitation
1054
        $roleService->assignRoleToUser($role, $user);
1055
        $permissionResolver->setCurrentUserReference($user);
1056
1057
        $expected = new LookupLimitationResult(
1058
            true,
1059
            [],
1060
            [
1061
                new LookupPolicyLimitations(
1062
                    $role->getPolicies()[1],
1063
                    [
1064
                        new Limitation\SectionLimitation(['limitationValues' => [2]]),
1065
                    ]
1066
                ),
1067
            ]
1068
        );
1069
1070
        self::assertEquals(
1071
            $expected,
1072
            $permissionResolver->lookupLimitations($module, $function, $this->getContentCreateStruct($repository), [], [Limitation::SECTION])
1073
        );
1074
    }
1075
1076
    /**
1077
     * If the role limitation is set it should be taken into account. In this case, role limitation
1078
     * will pass and ContentTypeLimitation should be returned.
1079
     *
1080
     * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException
1081
     * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1082
     * @throws \eZ\Publish\API\Repository\Exceptions\LimitationValidationException
1083
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException
1084
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
1085
     */
1086
    public function testLookupLimitationsWithRoleLimitationsHasAccess(): void
1087
    {
1088
        $repository = $this->getRepository();
1089
        $userService = $repository->getUserService();
1090
        $permissionResolver = $repository->getPermissionResolver();
1091
        $roleService = $repository->getRoleService();
1092
1093
        $module = 'content';
1094
        $function = 'create';
1095
1096
        /* BEGIN: Use Case */
1097
        $role = $this->createRoleWithPolicies(
1098
            'role_' . __FUNCTION__,
1099
            [
1100
                ['module' => $module, 'function' => $function, 'limitations' => [new Limitation\SubtreeLimitation(['limitationValues' => ['/1/2/']])]],
1101
                ['module' => $module, 'function' => $function, 'limitations' => [new Limitation\LanguageLimitation(['limitationValues' => ['eng-US']])]],
1102
                ['module' => 'content', 'function' => 'edit', 'limitations' => [new Limitation\SectionLimitation(['limitationValues' => [2]])]],
1103
            ]
1104
        );
1105
        // create user in root user group to avoid overlapping of existing policies and limitations
1106
        $user = $this->createUser('user', 'John', 'Doe', $userService->loadUserGroup(4));
1107
        // SectionLimitation as RoleLimitation will pass
1108
        $roleLimitation = new Limitation\SectionLimitation(['limitationValues' => [2]]);
1109
        $roleService->assignRoleToUser($role, $user, $roleLimitation);
1110
        $permissionResolver->setCurrentUserReference($user);
1111
        /* END: Use Case */
1112
1113
        $expected = new LookupLimitationResult(
1114
            true,
1115
            [$roleLimitation],
1116
            [
1117
                new LookupPolicyLimitations(
1118
                    $role->getPolicies()[1],
1119
                    [new Limitation\LanguageLimitation(['limitationValues' => ['eng-US']])]
1120
                ),
1121
            ]
1122
        );
1123
1124
        self::assertEquals(
1125
            $expected,
1126
            $permissionResolver->lookupLimitations($module, $function, $this->getContentCreateStruct($repository), [])
1127
        );
1128
    }
1129
1130
    /**
1131
     * If the role limitation is set it should be taken into account. In this case, role limitation
1132
     * will not pass and ContentTypeLimitation should not be returned.
1133
     *
1134
     * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException
1135
     * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException
1136
     * @throws \eZ\Publish\API\Repository\Exceptions\LimitationValidationException
1137
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException
1138
     * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException
1139
     */
1140
    public function testLookupLimitationsWithRoleLimitationsHasNoAccess(): void
1141
    {
1142
        $repository = $this->getRepository();
1143
        $userService = $repository->getUserService();
1144
        $permissionResolver = $repository->getPermissionResolver();
1145
        $roleService = $repository->getRoleService();
1146
1147
        $module = 'content';
1148
        $function = 'create';
1149
1150
        /* BEGIN: Use Case */
1151
        $role = $this->createRoleWithPolicies(
1152
            'role_' . __FUNCTION__,
1153
            [
1154
                ['module' => $module, 'function' => $function, 'limitations' => [new Limitation\SubtreeLimitation(['limitationValues' => ['/1/2/']])]],
1155
                ['module' => $module, 'function' => $function, 'limitations' => [new Limitation\LanguageLimitation(['limitationValues' => ['eng-US']])]],
1156
                ['module' => 'content', 'function' => 'edit', 'limitations' => [new Limitation\SectionLimitation(['limitationValues' => [2]])]],
1157
            ]
1158
        );
1159
        // create user in root user group to avoid overlapping of existing policies and limitations
1160
        $user = $this->createUser('user', 'John', 'Doe', $userService->loadUserGroup(4));
1161
        // SectionLimitation as RoleLimitation will not pass
1162
        $roleLimitation = new Limitation\SectionLimitation(['limitationValues' => [3]]);
1163
        $roleService->assignRoleToUser($role, $user, $roleLimitation);
1164
        $permissionResolver->setCurrentUserReference($user);
1165
        /* END: Use Case */
1166
1167
        $expected = new LookupLimitationResult(
1168
            false,
1169
            [],
1170
            []
1171
        );
1172
1173
        self::assertEquals(
1174
            $expected,
1175
            $permissionResolver->lookupLimitations($module, $function, $this->getContentCreateStruct($repository), [])
1176
        );
1177
    }
1178
1179
    /**
1180
     * @param \eZ\Publish\API\Repository\Repository $repository
1181
     * @param string $contentTypeIdentifier
1182
     * @param string $mainLanguageCode
1183
     * @param int $sectionId
1184
     *
1185
     * @return \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct
1186
     *
1187
     * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException
1188
     */
1189
    private function getContentCreateStruct(
1190
        Repository $repository,
1191
        string $contentTypeIdentifier = 'folder',
1192
        string $mainLanguageCode = 'eng-US',
1193
        int $sectionId = 2
1194
    ): ContentCreateStruct {
1195
        $contentService = $repository->getContentService();
1196
        $contentTypeService = $repository->getContentTypeService();
1197
        $contentType = $contentTypeService->loadContentTypeByIdentifier($contentTypeIdentifier);
1198
        $contentCreateStruct = $contentService->newContentCreateStruct($contentType, $mainLanguageCode);
1199
        $contentCreateStruct->sectionId = $sectionId;
1200
1201
        return $contentCreateStruct;
1202
    }
1203
}
1204