Passed
Push — master ( 41c09c...5f5681 )
by Iman
06:15
created

CBAuthAPIMiddleware::handle()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 24
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 13
nc 2
nop 2
dl 0
loc 24
rs 8.9713
c 0
b 0
f 0
1
<?php
2
3
namespace crocodicstudio\crudbooster\Modules\ApiGeneratorModule;
4
5
use Closure;
6
use Config;
7
use crocodicstudio\crudbooster\Modules\SettingModule\SettingRepo;
8
use DB;
9
use Illuminate\Support\Facades\Cache;
10
use Illuminate\Support\Facades\Request;
11
use Illuminate\Support\Facades\Validator;
12
use Schema;
13
use Session;
14
15
class CBAuthAPIMiddleware
16
{
17
    /**
18
     * @var \crocodicstudio\crudbooster\Modules\ApiGeneratorModule\ApiKeysRepository
19
     */
20
    private $apiKeysRepository;
21
22
    /**
23
     * CBAuthAPI constructor.
24
     */
25
    public function __construct(ApiKeysRepository $apiKeysRepository)
26
    {
27
        $this->apiKeysRepository = $apiKeysRepository;
28
    }
29
30
    /**
31
     * Handle an incoming request.
32
     *
33
     * @param  \Illuminate\Http\Request $request
34
     * @param  \Closure $next
35
     * @return mixed
36
     */
37
    public function handle($request, Closure $next)
38
    {
39
        if (SettingRepo::getSetting('api_debug_mode') !== 'false') {
40
            return;
41
        }
42
43
        $this->validateRequest();
44
45
        list($userAgent, $serverToken, $server_token_Secret) = $this->getTokens();
46
47
        $senderToken = Request::header('X-Authorization-Token');
48
49
        $this->tokenMissMatchResponse($senderToken, $serverToken);
50
51
        $this->tokenMissMatchDevice($senderToken, $userAgent, $serverToken);
52
53
        $id = array_search($senderToken, $serverToken);
54
        $serverSecret = $server_token_Secret[$id];
55
        $this->apiKeysRepository->incrementHit($serverSecret);
56
57
        $expiredToken = date('Y-m-d H:i:s', strtotime('+5 seconds'));
58
        Cache::put($senderToken, $userAgent, $expiredToken);
59
60
        return $next($request);
61
    }
62
63
    /**
64
     * @return null
65
     */
66
    private function validateRequest()
67
    {
68
        $validator = Validator::make([
69
            'X-Authorization-Token' => Request::header('X-Authorization-Token'),
70
            'X-Authorization-Time' => Request::header('X-Authorization-Time'),
71
            'useragent' => Request::header('User-Agent'),
72
        ], [
73
            'X-Authorization-Token' => 'required',
74
            'X-Authorization-Time' => 'required',
75
            'useragent' => 'required',
76
        ]);
77
        if (!$validator->fails()) {
78
            return;
79
        }
80
        $result = [
81
            'api_status' => 0,
82
            'api_message' => implode(', ', $validator->errors()->all()),
83
        ];
84
        sendAndTerminate(response()->json($result, 200));
0 ignored issues
show
Bug introduced by
The method json() does not exist on Symfony\Component\HttpFoundation\Response. It seems like you code against a sub-type of Symfony\Component\HttpFoundation\Response such as Illuminate\Http\Response or Illuminate\Http\JsonResponse or Illuminate\Http\RedirectResponse. ( Ignorable by Annotation )

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

84
        sendAndTerminate(response()->/** @scrutinizer ignore-call */ json($result, 200));
Loading history...
85
    }
86
87
    /**
88
     * @return array
89
     */
90
    private function getTokens()
91
    {
92
        $userAgent = Request::header('User-Agent');
93
        $time = Request::header('X-Authorization-Time');
94
95
        $keys = $this->apiKeysRepository->getSecretKeys();
96
        $serverToken = [];
97
        $serverTokenSecret = [];
98
        foreach ($keys as $key) {
99
            $serverToken[] = md5($key.$time.$userAgent);
100
            $serverTokenSecret[] = $key;
101
        }
102
103
        return [$userAgent, $serverToken, $serverTokenSecret];
104
    }
105
106
    /**
107
     * @param $sender_token
108
     * @param $server_token
109
     * @return mixed
110
     */
111
    private function tokenMissMatchResponse($sender_token, $server_token)
112
    {
113
        if (Cache::has($sender_token) || in_array($sender_token, $server_token)) {
114
            return;
115
        }
116
        $result = [
117
            'api_status' => false,
118
            'api_message' => "THE TOKEN IS NOT MATCH WITH SERVER TOKEN",
119
            'sender_token' => $sender_token,
120
            'server_token' => $server_token,
121
        ];
122
        sendAndTerminate(response()->json($result, 200));
123
    }
124
125
    /**
126
     * @param $senderToken
127
     * @param $userAgent
128
     * @param $serverToken
129
     */
130
    private function tokenMissMatchDevice($senderToken, $userAgent, $serverToken)
131
    {
132
        if (! Cache::has($senderToken) || Cache::get($senderToken) == $userAgent) {
133
            return;
134
        }
135
        $result = [
136
            'api_status' => false,
137
            'api_message' => "THE TOKEN IS ALREADY BUT NOT MATCH WITH YOUR DEVICE",
138
            'sender_token' => $senderToken,
139
            'server_token' => $serverToken,
140
        ];
141
        sendAndTerminate(response()->json($result, 200));
142
    }
143
}
144