Passed
Push — master ( 244792...f2153d )
by Andrii
02:04
created

CheckAccessTrait::getAllPermissions()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 6
nc 2
nop 0
dl 0
loc 12
rs 10
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-2019, 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 assertAccesses($userId, array $allowedPermissions)
23
    {
24
        $deniedPermissions = array_diff($this->getAllPermissions(), $allowedPermissions);
25
26
        $this->assertAccess($userId, true, $allowedPermissions);
27
        $this->assertAccess($userId, false, $deniedPermissions);
28
    }
29
30
    public function assertAccess($userId, $isAllowed, array $permissions)
31
    {
32
        foreach ($permissions as $permission) {
33
            $checked = $this->auth->checkAccess($userId, $permission);
34
            if ($checked !== $isAllowed) {
35
                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...
36
            }
37
            $this->assertSame($isAllowed, $checked);
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

37
            $this->/** @scrutinizer ignore-call */ 
38
                   assertSame($isAllowed, $checked);
Loading history...
38
        }
39
    }
40
41
    protected $allPermissions;
42
43
    protected function getAllPermissions()
44
    {
45
        if (empty($this->allPermissions)) {
46
            $this->allPermissions = array_keys($this->auth->getPermissions());
47
            foreach ($this->allPermissions as $key => $permission) {
48
                if (strncmp('deny:', $permission, 5) === 0) {
49
                    unset($this->allPermissions[$key]);
50
                }
51
            }
52
        }
53
54
        return $this->allPermissions;
55
    }
56
57
    public function testNobody()
58
    {
59
        $this->assertAccesses('role:nobody', [
60
            'nothing',
61
        ]);
62
    }
63
64
    public function testUnauthorized()
65
    {
66
        $this->assertAccesses('', [
67
            'restore-password', 'deposit',
68
        ]);
69
    }
70
71
    public function testClient()
72
    {
73
        $this->assertAccesses('role:client', [
74
            'restore-password', 'deposit', 'have-goods',
75
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close',
76
            'domain.read', 'domain.update', 'domain.pay', 'domain.push', 'domain.delete-agp', 'domain.set-nss',
77
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
78
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.pay', 'certificate.push',
79
            'document.read', 'document.create', 'document.invoice',
80
            'contact.read', 'contact.create', 'contact.update', 'contact.delete',
81
            'server.read', 'server.pay', 'server.control-power', 'server.control-system', 'server.set-note',
82
            'account.read', 'account.create', 'account.update', 'account.delete',
83
            'bill.read', 'plan.read', 'finance.read', 'price.read',
84
            'backup.read', 'backup.delete',
85
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
86
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
87
            'db.read', 'db.create', 'db.update', 'db.delete',
88
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete', 'hdomain.set-dns',
89
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
90
            'request.read', 'request.create', 'request.update', 'request.delete',
91
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
92
            'ip.read', 'service.read',
93
        ]);
94
    }
95
96
    public function testSupport()
97
    {
98
        $this->assertAccesses('role:support', [
99
            'access-subclients', 'support',
100
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
101
            'client.read', 'client.list',
102
            'domain.read', 'domain.update', 'domain.delete-agp', 'domain.set-nss',
103
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
104
            'certificate.read', 'certificate.create', 'certificate.update',
105
            'contact.read', 'contact.create', 'contact.update', 'contact.delete',
106
            'server.read', 'server.control-power', 'server.control-system', 'server.set-note',
107
            'account.read', 'account.create', 'account.update', 'account.delete',
108
            'backup.read', 'backup.delete',
109
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
110
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
111
            'db.read', 'db.create', 'db.update', 'db.delete',
112
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete', 'hdomain.set-dns',
113
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
114
            'request.read', 'request.create', 'request.update', 'request.delete',
115
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
116
            'ip.read', 'service.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', 'domain.delete-agp', 'domain.set-nss',
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
131
            'server.read', 'server.create', 'server.update', 'server.delete', 'server.control-power',
132
            'server.control-system', 'server.wizzard', 'server.set-label', 'server.set-note', 'server.manage-settings',
133
134
            'hub.read', 'hub.create', 'hub.update', 'hub.delete',
135
            'consumption.read',
136
            'stock.read',
137
            'part.read', 'part.create', 'part.update', 'part.delete',
138
            'move.read', 'move.create', 'move.update', 'move.delete',
139
            'model.read', 'model.create', 'model.update', 'model.delete',
140
            'account.read', 'account.create', 'account.update', 'account.delete',
141
            'backup.read', 'backup.delete',
142
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
143
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
144
            'db.read', 'db.create', 'db.update', 'db.delete',
145
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete', 'hdomain.set-dns',
146
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
147
            'request.read', 'request.create', 'request.update', 'request.delete',
148
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
149
            'ip.read', 'ip.create', 'ip.update', 'ip.delete',
150
            'service.read', 'service.create', 'service.update', 'service.delete',
151
        ]);
152
    }
153
154
    public function testAccounter()
155
    {
156
        $this->assertAccesses('role:accounter', [
157
            'access-subclients', 'support', 'manage', 'access-reseller',
158
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
159
            'client.read', 'client.create', 'client.update', 'client.delete', 'client.list',
160
            'client.set-tmp-pwd', 'contact.set-verified', 'client.block', 'client.unblock',
161
            'client.get-note', 'client.set-note', 'client.set-description',
162
            'bill.read',
163
            'sale.read', 'sale.delete',
164
            'plan.read', 'plan.create', 'plan.update', 'plan.delete', 'plan.force-read',
165
            'price.read', 'price.create', 'price.update', 'price.delete',
166
            'domain.read', 'domain.update', 'domain.delete',
167
            'domain.pay', 'domain.push', 'domain.delete-agp', 'domain.set-nss',
168
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
169
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.delete', 'certificate.pay', 'certificate.push',
170
            'contact.read', 'contact.create', 'contact.update', 'contact.delete', 'contact.force-verify',
171
            'server.read', 'server.pay', 'server.sell', 'server.control-power', 'server.control-system', 'server.enable-block', 'server.disable-block', 'server.set-label', 'server.set-note',
172
            'consumption.read', 'consumption.delete',
173
            'document.read', 'document.create', 'document.update', 'document.delete',
174
            'document.generate', 'document.acceptance', 'document.invoice',
175
            'mailing.prepare', 'mailing.send',
176
            'stock.read',
177
            'hub.read', 'hub.sell',
178
            'part.read', 'part.create', 'part.update', 'part.delete',
179
            'move.read', 'move.create', 'move.update', 'move.delete',
180
            'model.read', 'model.create', 'model.update', 'model.delete',
181
            'account.read', 'account.create', 'account.update', 'account.delete',
182
            'bill.read', 'plan.read', 'finance.read',
183
            'backup.read', 'backup.delete',
184
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
185
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
186
            'db.read', 'db.create', 'db.update', 'db.delete',
187
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete', 'hdomain.set-dns',
188
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
189
            'request.read', 'request.create', 'request.update', 'request.delete',
190
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
191
            'ip.read', 'service.read',
192
        ]);
193
    }
194
195
    public function testManager()
196
    {
197
        $this->assertAccesses('role:manager', [
198
            'access-subclients', 'support', 'manage', 'access-reseller',
199
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
200
            'client.read', 'client.create', 'client.update', 'client.delete', 'client.list',
201
            'client.set-tmp-pwd', 'contact.set-verified', 'client.block', 'client.unblock',
202
            'client.get-note', 'client.set-note', 'client.set-description',
203
            'bill.read',
204
            'sale.read', 'sale.delete',
205
            'plan.read', 'plan.create', 'plan.update', 'plan.delete', 'plan.force-read',
206
            'price.read', 'price.create', 'price.update', 'price.delete',
207
            'domain.read', 'domain.update', 'domain.delete', 'domain.delete-agp', 'domain.set-nss',
208
            'domain.pay', 'domain.push',
209
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
210
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.delete', 'certificate.pay', 'certificate.push',
211
            'contact.read', 'contact.create', 'contact.update', 'contact.delete', 'contact.force-verify',
212
            'server.read', 'server.pay', 'server.sell', 'server.control-power', 'server.control-system', 'server.enable-block', 'server.disable-block', 'server.set-label', 'server.set-note',
213
            'consumption.read', 'consumption.delete',
214
            'document.read', 'document.create', 'document.update', 'document.delete',
215
            'document.generate', 'document.acceptance', 'document.invoice',
216
            'mailing.prepare', 'mailing.send',
217
            'account.read', 'account.create', 'account.update', 'account.delete',
218
            'bill.read', 'plan.read', 'finance.read',
219
            'backup.read', 'backup.delete',
220
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
221
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
222
            'db.read', 'db.create', 'db.update', 'db.delete',
223
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete', 'hdomain.set-dns',
224
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
225
            'request.read', 'request.create', 'request.update', 'request.delete',
226
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
227
            'ip.read', 'service.read',
228
        ]);
229
    }
230
231
    public function testReseller()
232
    {
233
        $this->assertAccesses('role:reseller', [
234
            'deposit', 'have-goods',
235
            'access-subclients', 'support', 'manage', 'resell',
236
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
237
            'client.read', 'client.create', 'client.update', 'client.delete', 'client.list',
238
            'client.set-tmp-pwd', 'contact.set-verified', 'client.block', 'client.unblock',
239
            'client.get-note', 'client.set-note', 'client.set-description',
240
            'bill.read', 'bill.create', 'bill.update', 'bill.delete',
241
            'plan.read', 'plan.create', 'plan.update', 'plan.delete', 'plan.force-read',
242
            'price.read', 'price.create', 'price.update', 'price.delete',
243
            'sale.read', 'sale.delete',
244
            'domain.read', 'domain.update', 'domain.delete', 'domain.pay', 'domain.push', 'domain.delete-agp', 'domain.set-nss',
245
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
246
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.delete', 'certificate.pay', 'certificate.push',
247
            'server.read', 'server.pay', 'server.sell', 'server.control-power', 'server.control-system', 'server.enable-block', 'server.disable-block', 'server.set-label', 'server.set-note',
248
            'consumption.read', 'consumption.delete',
249
            'document.read', 'document.create', 'document.update', 'document.delete',
250
            'document.generate', 'document.acceptance', 'document.invoice',
251
            'contact.read', 'contact.create', 'contact.update', 'contact.delete', 'contact.force-verify',
252
            'mailing.prepare', 'mailing.send',
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', 'hdomain.set-dns',
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', 'access-reseller',
283
            'support', 'manage', 'admin',
284
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close', 'ticket.update', 'ticket.delete',
285
            'client.read', 'client.create', 'client.update', 'client.delete', 'client.list',
286
            'client.set-tmp-pwd', 'contact.set-verified', 'client.block', 'client.unblock',
287
            'client.get-note', 'client.set-note', 'client.set-description',
288
            'bill.read', 'bill.create', 'bill.update', 'bill.delete',
289
            'plan.read', 'plan.create', 'plan.update', 'plan.delete', 'plan.force-read',
290
            'price.read', 'price.create', 'price.update', 'price.delete',
291
            'sale.read', 'sale.delete',
292
            'domain.freeze',
293
            'domain.read', 'domain.update', 'domain.delete', 'domain.delete-agp', 'domain.set-nss',
294
            'domain.pay', 'domain.push', 'domain.force-push', 'domain.force-send-foa',
295
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
296
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.delete', 'certificate.pay', 'certificate.push',
297
298
            'server.read', 'server.create', 'server.update', 'server.delete', 'server.pay', 'server.sell',
299
            'server.control-power', 'server.control-system', 'server.wizzard', 'server.manage-settings',
300
301
            'server.enable-block', 'server.disable-block', 'server.set-label', 'server.set-note',
302
            'hub.read', 'hub.create', 'hub.update', 'hub.delete',
303
            'consumption.read', 'consumption.delete',
304
            'document.read', 'document.create', 'document.update', 'document.delete',
305
            'document.generate', 'document.generate-all',
306
            'document.acceptance', 'document.invoice',
307
            'contact.read', 'contact.create', 'contact.update', 'contact.delete', 'contact.force-verify',
308
            'mailing.prepare', 'mailing.send',
309
            'stock.read',
310
            'part.read', 'part.create', 'part.update', 'part.delete',
311
            'move.read', 'move.create', 'move.update', 'move.delete', 'move.read-all',
312
            'model.read', 'model.create', 'model.update', 'model.delete',
313
            'employee.read',
314
            'account.read', 'account.create', 'account.update', 'account.delete',
315
            'bill.read', 'plan.read', 'finance.read',
316
            'backup.read', 'backup.delete',
317
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
318
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
319
            'db.read', 'db.create', 'db.update', 'db.delete',
320
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete', 'hdomain.set-dns',
321
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
322
            'request.read', 'request.create', 'request.update', 'request.delete',
323
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
324
            'ip.read', 'ip.create', 'ip.update', 'ip.delete',
325
            'service.read', 'service.create', 'service.update', 'service.delete',
326
        ]);
327
    }
328
329
    public function testLimited()
330
    {
331
        $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,deny:domain.delete-agp,deny:domain.set-nss', 'user:limited');
332
333
        $this->assertAccesses('user:limited', [
334
            'have-goods',
335
            'ticket.read', 'ticket.create', 'ticket.answer', 'ticket.close',
336
            'domain.read', 'domain.update', 'domain.pay',
337
            'dns.create', 'dns.read', 'dns.update', 'dns.delete',
338
            'certificate.read', 'certificate.create', 'certificate.update', 'certificate.pay', 'certificate.push',
339
            'document.read', 'document.create', 'document.invoice',
340
            'contact.read', 'contact.create', 'contact.update', 'contact.delete',
341
            'account.read', 'account.create', 'account.update', 'account.delete',
342
            'restore-password', 'bill.read', 'plan.read', 'finance.read', 'price.read',
343
            'backup.read', 'backup.delete',
344
            'backuping.read', 'backuping.create', 'backuping.update', 'backuping.delete',
345
            'crontab.read', 'crontab.create', 'crontab.update', 'crontab.delete',
346
            'db.read', 'db.create', 'db.update', 'db.delete',
347
            'hdomain.read', 'hdomain.create', 'hdomain.update', 'hdomain.delete', 'hdomain.set-dns',
348
            'mail.read', 'mail.create', 'mail.update', 'mail.delete',
349
            'request.read', 'request.create', 'request.update', 'request.delete',
350
            'vhost.read', 'vhost.create', 'vhost.update', 'vhost.delete',
351
        ]);
352
    }
353
354
    public function testJuniorManager()
355
    {
356
        $this->assertAccesses('role:junior-manager', [
357
            'access-subclients', 'access-reseller',
358
            'client.read', 'server.read', 'consumption.read',
359
            'plan.force-read', 'plan.read', 'document.read', 'finance.read',
360
            'stock.read', 'part.read', 'move.read', 'model.read',
361
            'hub.read',
362
        ]);
363
    }
364
365
    public function testBetaTester()
366
    {
367
        $this->auth->setAssignments('role:beta-tester', 'user:beta-tester');
368
369
        $this->assertAccesses('user:beta-tester', [
370
            'test.beta',
371
        ]);
372
    }
373
374
    public function testAlphaTester()
375
    {
376
        $this->auth->setAssignments('role:alpha-tester', 'user:alpha-tester');
377
378
        $this->assertAccesses('user:alpha-tester', [
379
            'test.alpha', 'test.beta',
380
        ]);
381
    }
382
383
    public function testSuperPowers()
384
    {
385
        $this->assertAccesses('role:superpowers', [
386
            'see-no-mans', 'part.sell', 'client.set-others-allowed-ips',
387
        ]);
388
    }
389
}
390