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( |
|
|
|
|
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); |
|
|
|
|
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); |
|
|
|
|
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( |
|
|
|
|
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); |
|
|
|
|
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( |
|
|
|
|
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
|
|
|
|
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.