Passed
Push — issue#767 ( b3675b...a787f5 )
by Guilherme
05:11
created

SecurityHelper::getRoleLevel()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 2
nop 1
dl 0
loc 7
ccs 5
cts 5
cp 1
crap 2
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace LoginCidadao\CoreBundle\Helper;
4
5
use Symfony\Component\HttpFoundation\Request;
6
use Symfony\Component\HttpFoundation\Response;
7
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
8
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
9
use Symfony\Component\Routing\RouterInterface;
10
use LoginCidadao\APIBundle\Entity\ActionLogRepository;
11
use LoginCidadao\CoreBundle\Model\PersonInterface;
12
use Symfony\Component\Security\Core\Role\RoleInterface;
13
14
class SecurityHelper
15
{
16
    /** @var AuthorizationCheckerInterface */
17
    private $authChecker;
18
19
    /** @var TokenStorageInterface */
20
    private $tokenStorage;
21
22
    /** @var ActionLogRepository */
23
    private $actionLogRepo;
24
25
    /** @var ExtremeNotificationsHelper */
26
    private $extremeNotificationsHelper;
27
28
    /** @var RouterInterface */
29
    private $router;
30
31
    /** @var string */
32
    private $cookieRememberMeName;
33
34 12
    public function __construct(
35
        AuthorizationCheckerInterface $authChecker,
36
        TokenStorageInterface $tokenStorage,
37
        ActionLogRepository $actionLogRepo,
38
        ExtremeNotificationsHelper $extremeNotificationsHelper,
39
        RouterInterface $router,
40
        $cookieRememberMeName
41
    ) {
42 12
        $this->authChecker = $authChecker;
43 12
        $this->tokenStorage = $tokenStorage;
44 12
        $this->actionLogRepo = $actionLogRepo;
45 12
        $this->extremeNotificationsHelper = $extremeNotificationsHelper;
46 12
        $this->router = $router;
47 12
        $this->cookieRememberMeName = $cookieRememberMeName;
48 12
    }
49
50 2
    public function getLoggedInUserLevel()
51
    {
52 2
        foreach ($this->getRoleMapping() as $role => $lvl) {
53 2
            if ($this->authChecker->isGranted($role)) {
54 2
                return $lvl;
55
            }
56
        }
57
58 1
        return 0;
59
    }
60
61 1
    public function getTargetPersonLevel(PersonInterface $person)
62
    {
63 1
        $roles = $person->getRoles();
64 1
        foreach ($this->getRoleMapping() as $role => $lvl) {
65 1
            if (in_array($role, $roles)) {
66 1
                return $lvl;
67
            }
68
        }
69
70 1
        return 0;
71
    }
72
73 1
    public function getRoleLevel($role)
74
    {
75 1
        $map = $this->getRoleMapping();
76 1
        if (array_key_exists($role, $map)) {
77 1
            return $map[$role];
78
        } else {
79 1
            return max(array_values($map));
80
        }
81
    }
82
83 4
    private function getRoleMapping()
84
    {
85
        $map = [
86 4
            'ROLE_SUPER_ADMIN' => 4,
87
            'ROLE_ADMIN' => 3,
88
            'ROLE_SUPER_USER' => 2,
89
            'ROLE_DEV' => 1,
90
            'ROLE_USER' => 0,
91
        ];
92 4
        arsort($map);
93
94 4
        return $map;
95
    }
96
97 2
    public function checkPendingImpersonateReport(PersonInterface $impersonator)
98
    {
99 2
        $count = $this->actionLogRepo->countImpersonatonsWithoutReports($impersonator);
100
101 2
        if ($count <= 0) {
102 1
            return;
103
        }
104
105 1
        $url = $this->router->generate('lc_admin_impersonation_report_index');
106
107 1
        $parameters = ['%url%' => $url, '%count%' => $count];
108 1
        $message = 'admin.impersonation_report.pending.notification';
109 1
        $this->extremeNotificationsHelper
110 1
            ->addTransChoice($message, $count, $parameters);
111 1
    }
112
113
    /**
114
     * @param Request $request
115
     * @param Response $response
116
     * @return Response
117
     */
118 1
    public function logout(Request $request, Response $response)
119
    {
120 1
        $this->tokenStorage->setToken(null);
121 1
        $request->getSession()->invalidate();
122
123 1
        $cookieNames = [$this->cookieRememberMeName];
124 1
        foreach ($cookieNames as $cookieName) {
125 1
            $response->headers->clearCookie($cookieName);
126
        }
127
128 1
        return $response;
129
    }
130
131
    /**
132
     * Checks if the attributes are granted against the current authentication token and optionally supplied object.
133
     *
134
     * @param mixed $attributes
135
     * @param mixed $object
136
     *
137
     * @return bool
138
     */
139 1
    public function isGranted($attributes, $object = null)
140
    {
141 1
        return $this->authChecker->isGranted($attributes, $object);
142
    }
143
144
    /**
145
     * @return PersonInterface|null
146
     */
147 3
    public function getUser()
148
    {
149
        try {
150
            /** @var PersonInterface $user */
151 3
            $user = $this->tokenStorage->getToken()->getUser();
152
153 2
            if (!$user instanceof PersonInterface) {
0 ignored issues
show
introduced by
$user is always a sub-type of LoginCidadao\CoreBundle\Model\PersonInterface.
Loading history...
154 2
                $user = null;
155
            }
156 1
        } catch (\Exception $e) {
157 1
            $user = null;
158
        }
159
160 3
        return $user;
161
    }
162
163
    /**
164
     * @return RoleInterface[]
165
     */
166 1
    public function getTokenRoles()
167
    {
168 1
        return $this->tokenStorage->getToken()->getRoles();
169
    }
170
}
171