Completed
Pull Request — master (#338)
by Antonio
04:15 queued 01:38
created

AccessRuleFilter::allows()   B

Complexity

Conditions 7
Paths 3

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 10.5454

Importance

Changes 0
Metric Value
dl 0
loc 20
ccs 7
cts 12
cp 0.5833
rs 8.6666
c 0
b 0
f 0
cc 7
nc 3
nop 3
crap 10.5454
1
<?php
2
3
/*
4
 * This file is part of the 2amigos/yii2-usuario project.
5
 *
6
 * (c) 2amigOS! <http://2amigos.us/>
7
 *
8
 * For the full copyright and license information, please view
9
 * the LICENSE file that was distributed with this source code.
10
 */
11
12
namespace Da\User\Filter;
13
14
use Closure;
15
use Da\User\Model\User;
16
use Da\User\Traits\ModuleAwareTrait;
17
use Yii;
18
use yii\filters\AccessRule;
19
20
class AccessRuleFilter extends AccessRule
21
{
22
    use ModuleAwareTrait;
23 2
24
    /**
25 2
     * @inheritDoc
26
     */
27
    public function allows($action, $user, $request)
28
    {
29 2
        $consentAction = 'user/settings/consent';
30 2
        if (!$user->isGuest && $action->uniqueId !== $consentAction) {
31
            $module = $this->getModule();
32
            if ($module->gdprRequireConsentToAll) {
33
                $excludedUrls = $module->gdprConsentExcludedUrls;
34 2
                $excludedUrls[] = $module->gdprPrivacyPolicyUrl;
35
                foreach ($excludedUrls as $url) {
36
                    if (!fnmatch($url, $action->uniqueId)) {
37
                        $identity = $user->identity;
38 2
                        if (!$identity->gdpr_consent) {
39
                            Yii::$app->response->redirect([ "/$consentAction"])->send();
40 2
                        }
41
                    }
42 2
                }
43 2
            }
44
        }
45
        return parent::allows($action, $user, $request);
46
    }
47
48
    /**
49
     * {@inheritdoc}
50
     * */
51
    protected function matchRole($user)
52
    {
53
        if (empty($this->roles)) {
54
            return true;
55
        }
56
57
        foreach ($this->roles as $role) {
58
            if ($role === '?') {
59
                if ($user->getIsGuest()) {
60
                    return true;
61
                }
62
            } elseif ($role === '@') {
63
                if (!$user->getIsGuest()) {
64
                    return true;
65
                }
66
            } elseif ($role === 'admin') {
67
                /** @var User $identity */
68
                $identity = $user->getIdentity();
69
70
                if (!$user->getIsGuest() && $identity->getIsAdmin()) {
71
                    return true;
72
                }
73
            } else {
74
                $roleParams = $this->roleParams instanceof Closure
75
                    ? call_user_func($this->roleParams, $this)
76
                    : $this->roleParams;
77
78
                if ($user->can($role, $roleParams)) {
79
                    return true;
80
                }
81
            }
82
        }
83
84
        return false;
85
    }
86
}
87