Passed
Push — master ( 655177...3296ef )
by Anthony
11:29
created

AccessRights::__construct()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 1 Features 1
Metric Value
cc 4
eloc 10
c 5
b 1
f 1
nc 2
nop 8
dl 0
loc 12
rs 9.9332

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace PiouPiou\RibsAdminBundle\Service;
4
5
use PiouPiou\RibsAdminBundle\Entity\User;
6
use Symfony\Component\DependencyInjection\ContainerInterface;
7
use Symfony\Component\HttpFoundation\RedirectResponse;
8
use Symfony\Component\HttpFoundation\RequestStack;
9
use Symfony\Component\HttpFoundation\Session\SessionInterface;
10
use Symfony\Component\Routing\RouterInterface;
11
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
12
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
13
14
class AccessRights
15
{
16
	/**
17
	 * @var ContainerInterface
18
	 */
19
	private $container;
20
	
21
	/**
22
	 * @var RouterInterface
23
	 */
24
	private $router;
25
	
26
	/**
27
	 * @var SessionInterface
28
	 */
29
	private $session;
30
	
31
	/**
32
	 * @var RequestStack
33
	 */
34
	private $request;
35
	
36
	/**
37
	 * @var Globals
38
	 */
39
	private $globals;
40
	
41
	/**
42
	 * @var ModuleService
43
	 */
44
	private $module;
45
46
    /**
47
     * @var Api
48
     */
49
    private $api;
50
	
51
	/**
52
	 * @var User
53
	 */
54
	private $user;
55
56
	/** @var TokenStorageInterface */
57
	private $token_storage;
58
59
    /**
60
     * AccessRights constructor.
61
     * @param ContainerInterface $container
62
     * @param RouterInterface $router
63
     * @param SessionInterface $session
64
     * @param RequestStack $request
65
     * @param TokenStorageInterface $tokenStorage
66
     * @param Globals $globals
67
     * @param ModuleService $module
68
     * @param Api $api
69
     */
70
	public function __construct(ContainerInterface $container, RouterInterface $router, SessionInterface $session, RequestStack $request, TokenStorageInterface $tokenStorage, Globals $globals, ModuleService $module, Api $api)
71
	{
72
		$this->container = $container;
73
		$this->router = $router;
74
		$this->session = $session;
75
		$this->request = $request;
76
		$this->globals = $globals;
77
		$this->module = $module;
78
		$this->api = $api;
79
		$this->token_storage = $tokenStorage;
80
		if ($this->token_storage->getToken() && is_object($this->token_storage->getToken()->getUser()) && $this->token_storage->getToken()->getUser()->getUser()) {
0 ignored issues
show
Bug introduced by
The method getUser() does not exist on Stringable. ( Ignorable by Annotation )

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

80
		if ($this->token_storage->getToken() && is_object($this->token_storage->getToken()->getUser()) && $this->token_storage->getToken()->getUser()->/** @scrutinizer ignore-call */ getUser()) {

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
Bug introduced by
The method getUser() does not exist on Symfony\Component\Security\Core\User\UserInterface. Did you maybe mean getUsername()? ( Ignorable by Annotation )

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

80
		if ($this->token_storage->getToken() && is_object($this->token_storage->getToken()->getUser()) && $this->token_storage->getToken()->getUser()->/** @scrutinizer ignore-call */ getUser()) {

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
81
            $this->user = $this->token_storage->getToken()->getUser()->getUser();
82
        }
83
	}
84
	
85
	public function onKernelController()
86
	{
87
		$route = $this->request->getCurrentRequest()->get("_route");
88
		$route_array = explode("_", $route);
89
		$admin_page = $route_array[0];
90
		$api = in_array("api", $route_array);
91
		
92
		//to show admin panel
93
		if (in_array($route, ["_profiler", "_profiler_search_bar", "_wdt"])) {
94
			return;
95
		}
96
		
97
		$ribs_admin_rights = json_decode(file_get_contents($this->globals->getBaseBundlePath() . "/Resources/json/ribsadmin_rights.json"));
98
		$modules_rights = $this->module->getModuleRights();
99
		$ribs_admin_rights = (object)array_merge((array)$ribs_admin_rights, (array)$modules_rights);
100
101
		if ($admin_page == "ribsadmin" && !$api && strpos($route, "login") === false && strpos($route, "register") === false) {
102
			//redirection if user not connected
103
			if ($this->container->get("security.token_storage")->getToken() === null || !$this->container->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
104
				return new RedirectResponse($this->router->generate("ribs_admin_logout"));
105
			}
106
			
107
			$this->user = $this->token_storage->getToken()->getUser()->getUser();
108
109
			if ($this->testIsOpenUrl($route)) {
110
			    return;
111
            }
112
			
113
			$route_right = $this->in_array_recursive($route, $ribs_admin_rights);
114
			
115
			if ($route_right === false) {
116
				throw new AccessDeniedException("No access");
117
			}
118
			
119
			if ($this->testRouteRight($route_right) === true) {
120
				return;
121
			} else if ($this->user->getAdmin() === true && in_array("ribsadmin@index", $route_right)) {
122
				return;
123
			}
124
			
125
			throw new AccessDeniedException("No access");
126
		} else if ($api && strpos($route, "login") === false && strpos($route, "register") === false) {
127
            if ($this->api->userIslogged($this->request->getCurrentRequest()->get("infos"), $this->request->getCurrentRequest()->get("token")) === false) {
0 ignored issues
show
Bug introduced by
It seems like $this->request->getCurrentRequest()->get('infos') can also be of type null; however, parameter $infos_jwt of PiouPiou\RibsAdminBundle...ice\Api::userIslogged() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

127
            if ($this->api->userIslogged(/** @scrutinizer ignore-type */ $this->request->getCurrentRequest()->get("infos"), $this->request->getCurrentRequest()->get("token")) === false) {
Loading history...
Bug introduced by
It seems like $this->request->getCurrentRequest()->get('token') can also be of type null; however, parameter $token of PiouPiou\RibsAdminBundle...ice\Api::userIslogged() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

127
            if ($this->api->userIslogged($this->request->getCurrentRequest()->get("infos"), /** @scrutinizer ignore-type */ $this->request->getCurrentRequest()->get("token")) === false) {
Loading history...
128
                throw new AccessDeniedException("User is not connected");
129
            }
130
        }
131
	}
132
133
	private function testIsOpenUrl($route)
134
    {
135
        $open_urls = json_decode(file_get_contents($this->globals->getBaseBundlePath() . "/Resources/json/ribsadmin_open_url.json"), true);
136
137
        if ($open_urls && $open_urls["items"] && in_array($route, $open_urls["items"])) {
138
            return true;
139
        }
140
141
        return false;
142
    }
143
	
144
	/**
145
     * function that allow to test a right directly in the view
146
	 * @param string $right
147
	 * @return bool
148
	 */
149
	public function testRight(string $right): bool
150
	{
151
		$user_rights = $this->getUserRights();
152
		$list_rights = $this->getRightsListOfUser();
153
		
154
		$all_rights = array_merge($user_rights, $list_rights);
155
156
        if (in_array("*", $all_rights)) {
157
            return true;
158
        }
159
160
		if (in_array($right, $all_rights)) {
161
			return true;
162
		}
163
		
164
		return false;
165
	}
166
	
167
	/**
168
     * test if route_right is found in users rights
169
	 * @param array $route_right
170
	 * @return bool
171
	 */
172
	private function testRouteRight(array $route_right): bool
173
	{
174
		$user_rights = $this->getUserRights();
175
		$list_rights = $this->getRightsListOfUser();
176
		
177
		$all_rights = array_merge($user_rights, $list_rights);
178
179
		if (in_array("*", $all_rights)) {
180
		    return true;
181
        }
182
183
		foreach ($all_rights as $right) {
184
			if (in_array($right, $route_right)) {
185
				return true;
186
			}
187
		}
188
		
189
		return false;
190
	}
191
	
192
	/**
193
     * function that search if the right contain an url or more
194
	 * @param $needle
195
	 * @param $haystack
196
	 * @return bool|mixed
197
	 */
198
	private function in_array_recursive($needle, $haystack)
199
	{
200
		$rights = [];
201
		$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($haystack));
202
		
203
		foreach ($it AS $element => $value) {
204
			if ($value == $needle) {
205
				$rights[] = $it->getInnerIterator()["right"];
206
			}
207
		}
208
		
209
		if (count($rights) === 0) {
210
			return false;
211
		}
212
		
213
		return $rights;
214
	}
215
	
216
	/**
217
     * function that retun a array that contain all user rights or empty array if no right found
218
	 * @return array
219
	 */
220
	private function getUserRights(): array
221
	{
222
		$user_rights = $this->user->getAccessRights();
223
		
224
		if ($user_rights) {
225
			return explode(",", $user_rights);
226
		}
227
		
228
		return [""];
229
	}
230
	
231
	/**
232
     * function that retun a array that contain all rights of rattached list right of the current user
233
	 * @return array
234
	 */
235
	private function getRightsListOfUser(): array
236
	{
237
		if ($this->user->getAccessRightList()) {
238
			$user_rights = $this->user->getAccessRightList()->getAccessRights();
239
			
240
			if ($user_rights) {
241
				return explode(",", $user_rights);
242
			}
243
		}
244
		
245
		return [""];
246
	}
247
}
248