Passed
Push — master ( e57ee0...4f4deb )
by Andrii
04:14 queued 01:19
created

CheckAccessTrait::testAccounter()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 36
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 34
nc 1
nop 0
dl 0
loc 36
rs 9.376
c 0
b 0
f 0
1
<?php
2
/**
3
 * RBAC implementation for HiPanel
4
 *
5
 * @link      https://github.com/hiqdev/hipanel-rbac
6
 * @package   hipanel-rbac
7
 * @license   BSD-3-Clause
8
 * @copyright Copyright (c) 2016-2018, HiQDev (http://hiqdev.com/)
9
 */
10
11
namespace hipanel\rbac\tests\unit;
12
13
trait CheckAccessTrait
14
{
15
    public function setAssignments()
16
    {
17
        foreach ($this->auth->getAllItems() as $item) {
18
            $this->auth->setAssignment($item->name, $item->name);
19
        }
20
    }
21
22
    public function testPermission()
23
    {
24
        foreach ($this->auth->getPermissions() as $user) {
25
            foreach ($this->auth->getPermissions() as $perm) {
26
                $this->assertSame($user->name === $perm->name, $this->auth->checkAccess($user->name, $perm->name));
0 ignored issues
show
Bug introduced by
It seems like assertSame() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

26
                $this->/** @scrutinizer ignore-call */ 
27
                       assertSame($user->name === $perm->name, $this->auth->checkAccess($user->name, $perm->name));
Loading history...
27
            }
28
        }
29
    }
30
31
    public function assertAccesses($userId, array $allowedPermissions)
32
    {
33
        $allPermissions = array_keys($this->auth->getPermissions());
34
        foreach ($allPermissions as $key => $permission) {
35
            if (strncmp('deny:', $permission, 5) === 0) {
36
                unset($allPermissions[$key]);
37
            }
38
        }
39
        $deniedPermissions = array_diff($allPermissions, $allowedPermissions);
40
41
        $this->assertAccess($userId, true, $allowedPermissions);
42
        $this->assertAccess($userId, false, $deniedPermissions);
43
    }
44
45
    public function assertAccess($userId, $isAllowed, array $permissions)
46
    {
47
        foreach ($permissions as $permission) {
48
            $checked = $this->auth->checkAccess($userId, $permission);
49
            if ($checked !== $isAllowed) {
50
                var_dump(compact('userId', 'isAllowed', 'permission'));
0 ignored issues
show
Security Debugging Code introduced by
var_dump(compact('userId...llowed', 'permission')) looks like debug code. Are you sure you do not want to remove it?
Loading history...
51
            }
52
            $this->assertSame($isAllowed, $checked);
53
        }
54
    }
55
56
    public function testNobody()
57
    {
58
        $this->assertAccesses('role:nobody', [
59
            'nothing',
60
        ]);
61
    }
62
63
    public function testUnauthorized()
64
    {
65
        $this->assertAccesses('', [
66
            'restore-password', 'deposit',
67
        ]);
68
    }
69
70
    public function testClient()
71
    {
72
        $this->assertAccesses('role:client', [
73
            'restore-password', 'deposit', 'have-goods',
74
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close',
75
            'domain.read', 'domain.update', 'domain.pay', 'domain.push',
76
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
77
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.pay', 'certificate.push',
78
            'document.read', 'document.create', 'document.invoice',
79
            'contact.read', 'contact.create', 'contact.update', 'contact.delete',
80
            'server.read', 'server.pay', 'server.control-power', 'server.control-system', 'server.set-note',
81
            'account.read', 'account.create', 'account.update', 'account.delete',
82
            'bill.read', 'plan.read', 'finance.read', 'price.read',
83
            'backup.read', 'backup.delete',
84
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
85
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
86
            'db.read', 'db.create', 'db.update', 'db.delete',
87
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete',
88
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
89
            'request.read', 'request.create', 'request.update', 'request.delete',
90
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
91
            'ip.read', 'service.read',
92
        ]);
93
    }
94
95
    public function testSupport()
96
    {
97
        $this->assertAccesses('role:support', [
98
            'access-subclients', 'support',
99
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
100
            'client.read', 'client.list',
101
            'domain.read', 'domain.update',
102
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
103
            'certificate.read', 'certificate.create', 'certificate.update',
104
            'contact.read', 'contact.create', 'contact.update', 'contact.delete',
105
            'server.read', 'server.control-power', 'server.control-system', 'server.set-note',
106
            'account.read', 'account.create', 'account.update', 'account.delete',
107
            'backup.read', 'backup.delete',
108
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
109
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
110
            'db.read', 'db.create', 'db.update', 'db.delete',
111
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete',
112
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
113
            'request.read', 'request.create', 'request.update', 'request.delete',
114
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
115
            'ip.read', 'service.read',
116
            'plan.read', 'finance.read', 'price.read',
117
        ]);
118
    }
119
120
    public function testAdmin()
121
    {
122
        $this->assertAccesses('role:admin', [
123
            'access-subclients', 'support', 'admin',
124
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
125
            'client.read', 'client.list',
126
            'domain.read', 'domain.update',
127
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
128
            'certificate.read', 'certificate.create', 'certificate.update',
129
            'contact.read', 'contact.create', 'contact.update', 'contact.delete',
130
            'server.read', 'server.create', 'server.update', 'server.delete', 'server.control-power', 'server.control-system', 'server.wizzard', 'server.set-label', 'server.set-note',
131
            'hub.read', 'hub.create', 'hub.update', 'hub.delete',
132
            'consumption.read',
133
            'stock.read',
134
            'part.read', 'part.create', 'part.update', 'part.delete',
135
            'move.read', 'move.create', 'move.update', 'move.delete',
136
            'model.read', 'model.create', 'model.update', 'model.delete',
137
            'account.read', 'account.create', 'account.update', 'account.delete',
138
            'backup.read', 'backup.delete',
139
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
140
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
141
            'db.read', 'db.create', 'db.update', 'db.delete',
142
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete',
143
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
144
            'request.read', 'request.create', 'request.update', 'request.delete',
145
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
146
            'ip.read', 'ip.create', 'ip.update', 'ip.delete',
147
            'service.read', 'service.create', 'service.update', 'service.delete',
148
            'plan.read', 'finance.read', 'price.read',
149
        ]);
150
    }
151
152
    public function testAccounter()
153
    {
154
        $this->assertAccesses('role:accounter', [
155
            'access-subclients', 'support', 'manage',
156
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
157
            'client.read', 'client.create', 'client.update', 'client.delete', 'client.list',
158
            'bill.read',
159
            'sale.read', 'sale.delete',
160
            'plan.read', 'plan.create', 'plan.update', 'plan.delete', 'plan.force-read',
161
            'price.read', 'price.create', 'price.update', 'price.delete',
162
            'domain.read', 'domain.update', 'domain.delete',
163
            'domain.pay', 'domain.push',
164
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
165
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.delete', 'certificate.pay', 'certificate.push',
166
            'contact.read', 'contact.create', 'contact.update', 'contact.delete', 'contact.force-verify',
167
            'server.read', 'server.pay', 'server.sell', 'server.control-power', 'server.control-system', 'server.enable-block', 'server.disable-block', 'server.set-label', 'server.set-note',
168
            'consumption.read', 'consumption.delete',
169
            'document.read', 'document.create', 'document.update', 'document.delete',
170
            'document.generate', 'document.acceptance', 'document.invoice',
171
            'mailing.prepare', 'mailing.send',
172
            'stock.read',
173
            'hub.read', 'hub.sell',
174
            'part.read', 'part.create', 'part.update', 'part.delete',
175
            'move.read', 'move.create', 'move.update', 'move.delete',
176
            'model.read', 'model.create', 'model.update', 'model.delete',
177
            'account.read', 'account.create', 'account.update', 'account.delete',
178
            'bill.read', 'plan.read', 'finance.read',
179
            'backup.read', 'backup.delete',
180
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
181
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
182
            'db.read', 'db.create', 'db.update', 'db.delete',
183
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete',
184
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
185
            'request.read', 'request.create', 'request.update', 'request.delete',
186
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
187
            'ip.read', 'service.read',
188
        ]);
189
    }
190
191
    public function testManager()
192
    {
193
        $this->assertAccesses('role:manager', [
194
            'access-subclients', 'support', 'manage',
195
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
196
            'client.read', 'client.create', 'client.update', 'client.delete', 'client.list',
197
            'bill.read',
198
            'sale.read', 'sale.delete',
199
            'plan.read', 'plan.create', 'plan.update', 'plan.delete', 'plan.force-read',
200
            'price.read', 'price.create', 'price.update', 'price.delete',
201
            'domain.read', 'domain.update', 'domain.delete',
202
            'domain.pay', 'domain.push',
203
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
204
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.delete', 'certificate.pay', 'certificate.push',
205
            'contact.read', 'contact.create', 'contact.update', 'contact.delete', 'contact.force-verify',
206
            'server.read', 'server.pay', 'server.sell', 'server.control-power', 'server.control-system', 'server.enable-block', 'server.disable-block', 'server.set-label', 'server.set-note',
207
            'consumption.read', 'consumption.delete',
208
            'document.read', 'document.create', 'document.update', 'document.delete',
209
            'document.generate', 'document.acceptance', 'document.invoice',
210
            'mailing.prepare', 'mailing.send',
211
            'stock.read',
212
            'part.read', 'part.create', 'part.update', 'part.delete',
213
            'move.read', 'move.create', 'move.update', 'move.delete',
214
            'model.read', 'model.create', 'model.update', 'model.delete',
215
            'account.read', 'account.create', 'account.update', 'account.delete',
216
            'bill.read', 'plan.read', 'finance.read',
217
            'backup.read', 'backup.delete',
218
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
219
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
220
            'db.read', 'db.create', 'db.update', 'db.delete',
221
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete',
222
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
223
            'request.read', 'request.create', 'request.update', 'request.delete',
224
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
225
            'ip.read', 'service.read',
226
        ]);
227
    }
228
229
    public function testReseller()
230
    {
231
        $this->assertAccesses('role:reseller', [
232
            'deposit', 'have-goods',
233
            'access-subclients', 'support', 'manage', 'resell',
234
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
235
            'client.read', 'client.create', 'client.update', 'client.delete', 'client.list',
236
            'bill.read', 'bill.create', 'bill.update', 'bill.delete',
237
            'plan.read', 'plan.create', 'plan.update', 'plan.delete', 'plan.force-read',
238
            'price.read', 'price.create', 'price.update', 'price.delete',
239
            'sale.read', 'sale.delete',
240
            'domain.read', 'domain.update', 'domain.delete', 'domain.pay', 'domain.push',
241
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
242
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.delete', 'certificate.pay', 'certificate.push',
243
            'server.read', 'server.pay', 'server.sell', 'server.control-power', 'server.control-system', 'server.enable-block', 'server.disable-block', 'server.set-label', 'server.set-note',
244
            'consumption.read', 'consumption.delete',
245
            'document.read', 'document.create', 'document.update', 'document.delete',
246
            'document.generate', 'document.acceptance', 'document.invoice',
247
            'contact.read', 'contact.create', 'contact.update', 'contact.delete', 'contact.force-verify',
248
            'mailing.prepare', 'mailing.send',
249
            'stock.read',
250
            'part.read', 'part.create', 'part.update', 'part.delete',
251
            'move.read', 'move.create', 'move.update', 'move.delete',
252
            'model.read', 'model.create', 'model.update', 'model.delete',
253
            'account.read', 'account.create', 'account.update', 'account.delete',
254
            'bill.read', 'plan.read', 'finance.read',
255
            'backup.read', 'backup.delete',
256
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
257
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
258
            'db.read', 'db.create', 'db.update', 'db.delete',
259
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete',
260
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
261
            'request.read', 'request.create', 'request.update', 'request.delete',
262
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
263
            'ip.read', 'service.read',
264
        ]);
265
    }
266
267
    public function testEmployee()
268
    {
269
        $this->assertAccesses('role:employee', [
270
            'restore-password', 'deposit',
271
            'contact.read', 'contact.create', 'contact.update', 'contact.delete',
272
            'document.read', 'document.create', 'document.acceptance',
273
            'bill.read', 'employee.read', 'finance.read',
274
        ]);
275
    }
276
277
    public function testMighty()
278
    {
279
        $this->auth->setAssignments('role:admin,role:manager,role:document.master,role:finance.master,role:stock.master,domain.freeze,domain.force-push,domain.delete,employee.read,domain.force-send-foa,deny:deposit', 'user:mighty');
280
281
        $this->assertAccesses('user:mighty', [
282
            'access-subclients', 'support', 'manage', 'admin',
283
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
284
            'client.read', 'client.create', 'client.update', 'client.delete', 'client.list',
285
            'bill.read', 'bill.create', 'bill.update', 'bill.delete',
286
            'plan.read', 'plan.create', 'plan.update', 'plan.delete', 'plan.force-read',
287
            'price.read', 'price.create', 'price.update', 'price.delete',
288
            'sale.read', 'sale.delete',
289
            'domain.freeze',
290
            'domain.read', 'domain.update', 'domain.delete',
291
            'domain.pay', 'domain.push', 'domain.force-push', 'domain.force-send-foa',
292
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
293
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.delete', 'certificate.pay', 'certificate.push',
294
            'server.read', 'server.create', 'server.update', 'server.delete', 'server.pay', 'server.sell', 'server.control-power', 'server.control-system', 'server.wizzard',
295
            'server.enable-block', 'server.disable-block', 'server.set-label', 'server.set-note',
296
            'hub.read', 'hub.create', 'hub.update', 'hub.delete',
297
            'consumption.read', 'consumption.delete',
298
            'document.read', 'document.create', 'document.update', 'document.delete',
299
            'document.generate', 'document.generate-all',
300
            'document.acceptance', 'document.invoice',
301
            'contact.read', 'contact.create', 'contact.update', 'contact.delete', 'contact.force-verify',
302
            'mailing.prepare', 'mailing.send',
303
            'stock.read',
304
            'part.read', 'part.create', 'part.update', 'part.delete',
305
            'move.read', 'move.create', 'move.update', 'move.delete', 'move.read-all',
306
            'model.read', 'model.create', 'model.update', 'model.delete',
307
            'employee.read',
308
            'account.read', 'account.create', 'account.update', 'account.delete',
309
            'bill.read', 'plan.read', 'finance.read',
310
            'backup.read', 'backup.delete',
311
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
312
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
313
            'db.read', 'db.create', 'db.update', 'db.delete',
314
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete',
315
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
316
            'request.read', 'request.create', 'request.update', 'request.delete',
317
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
318
            'ip.read', 'ip.create', 'ip.update', 'ip.delete',
319
            'service.read', 'service.create', 'service.update', 'service.delete',
320
        ]);
321
    }
322
323
    public function testLimited()
324
    {
325
        $this->auth->setAssignments('role:client,deny:deposit,deny:domain.push,deny:server.pay,deny:server.read,deny:server.control-power,deny:server.control-system,deny:server.set-note,deny:ip.read,deny:service.read', 'user:limited');
326
327
        $this->assertAccesses('user:limited', [
328
            'have-goods',
329
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close',
330
            'domain.read', 'domain.update', 'domain.pay',
331
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
332
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.pay', 'certificate.push',
333
            'document.read', 'document.create', 'document.invoice',
334
            'contact.read', 'contact.create', 'contact.update', 'contact.delete',
335
            'account.read', 'account.create', 'account.update', 'account.delete',
336
            'restore-password', 'bill.read', 'plan.read', 'finance.read', 'price.read',
337
            'backup.read', 'backup.delete',
338
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
339
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
340
            'db.read', 'db.create', 'db.update', 'db.delete',
341
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete',
342
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
343
            'request.read', 'request.create', 'request.update', 'request.delete',
344
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
345
        ]);
346
    }
347
348
    public function testJuniorManager()
349
    {
350
        $this->assertAccesses('role:junior-manager', [
351
            'access-subclients', 'access-reseller',
352
            'client.read', 'server.read', 'consumption.read',
353
            'plan.force-read', 'plan.read', 'document.read', 'finance.read',
354
            'stock.read', 'part.read', 'move.read', 'model.read',
355
            'hub.read',
356
        ]);
357
358
    }
359
360
    public function testBetaTester()
361
    {
362
        $this->auth->setAssignments('role:beta-tester', 'user:beta-tester');
363
364
        $this->assertAccesses('user:beta-tester', [
365
            'test.beta',
366
        ]);
367
    }
368
369
    public function testAlphaTester()
370
    {
371
        $this->auth->setAssignments('role:alpha-tester', 'user:alpha-tester');
372
373
        $this->assertAccesses('user:alpha-tester', [
374
            'test.alpha', 'test.beta',
375
        ]);
376
    }
377
}
378