Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 24
CheckPermissions
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
156
0.00% covered (danger)
0.00%
0 / 24
 handle
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 12
 retrieveUserId
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 6
 check
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 isSystemCall
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
1<?php
2
3namespace Qmp\Laravel\Acls\Middleware;
4
5use Illuminate\Http\Response;
6use Illuminate\Support\Facades\Log;
7use Illuminate\Support\Facades\Request;
8use Qmp\Laravel\Acls\Client\Client as AclsClient;
9use Qmp\Laravel\Acls\Exceptions\RolePermissionException;
10use Qmp\Laravel\Acls\Facades\Permission;
11use Closure;
12use Qmp\Laravel\MicroService\Client\Client as ServiceClient;
13use \Qmp\Laravel\MicroService\Client\Tools\Request as ClientRequest;
14
15class CheckPermissions
16{
17    const ACLS_CONTAINER = 'service_acls';
18
19    const SERVICE_NAME_ACLS = 'service-acls-laravel';
20
21    const SERVICE_NAME_API_GATEWAY = 'service-api-gateway-laravel';
22
23    /**
24     * @param $request
25     * @param Closure $next
26     * @param $permissions
27     * @param bool $all
28     * @return $this|mixed
29     */
30    public function handle($request, Closure $next, $permissions, $all = false)
31    {
32        try {
33            if (!$this->isSystemCall($request)) {
34                if ($all !== false && $all === 'true') {
35                    $all = true;
36                }
37
38                $container = config('micro-services.name');
39                $userId = $this->retrieveUserId($request, $container);
40                $this->check($container, $userId, $permissions, $all);
41            }
42        } catch(RolePermissionException $e) {
43            Log::debug('check permision refused:' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
44            if (Request::is('api*')) {
45                return response()->json(['status' => 'ko', 'route' => $permissions])->setStatusCode(424);
46            }
47
48            return response(view('errors.403'), 403);
49        }
50
51        return $next($request);
52    }
53
54    private function retrieveUserId($request, $container)
55    {
56        $userId = $container === self::SERVICE_NAME_API_GATEWAY
57            ? $request->auth_user_id
58            : $request->header(ServiceClient::KEYWORD_HEADER_REQUEST);
59        if (!isset($userId)) {
60            throw new RolePermissionException('User is not setted !');
61        }
62
63        return $userId;
64    }
65
66    private function check($container, $userId, $permissions, $all)
67    {
68        if ($container === self::SERVICE_NAME_ACLS) {
69            Permission::needed($userId, explode('|', $permissions), $all);
70        } else {
71            AclsClient::perm($userId, explode('|', $permissions), $all);
72        }
73    }
74
75    private function isSystemCall($request)
76    {
77        $token = $request->header(ServiceClient::KEYWORD_HEADER_REQUEST_SYSTEM_CALL);
78
79        return $token === env('TOKEN_SYSTEM_CALL', '');
80    }
81}