Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
25.00% covered (danger)
25.00%
2 / 8
CRAP
74.70% covered (success)
74.70%
62 / 83
BlacklistController
0.00% covered (danger)
0.00%
0 / 1
25.00% covered (danger)
25.00%
2 / 8
28.14
74.70% covered (success)
74.70%
62 / 83
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 index
0.00% covered (danger)
0.00%
0 / 1
3.47
62.50% covered (warning)
62.50%
5 / 8
 store
0.00% covered (danger)
0.00%
0 / 1
6.12
85.00% covered (success)
85.00%
17 / 20
 show
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 update
0.00% covered (danger)
0.00%
0 / 1
3.14
75.00% covered (success)
75.00%
12 / 16
 destroy
0.00% covered (danger)
0.00%
0 / 1
2.86
40.00% covered (warning)
40.00%
2 / 5
 getListActive
0.00% covered (danger)
0.00%
0 / 1
3.20
72.00% covered (success)
72.00%
18 / 25
 validateData
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
6 / 6
1<?php
2
3namespace Qmp\Laravel\ConsumerBlacklist\Controllers;
4
5use DateTime;
6use Illuminate\Http\Response;
7use Illuminate\Http\Request;
8use Illuminate\Support\Facades\Crypt;
9use Illuminate\Support\Facades\Log;
10use Illuminate\Support\Facades\Validator;
11use Qmp\Laravel\Acls\Exceptions\RolePermissionException;
12use Qmp\Laravel\MicroService\Controllers\AbstractMicroServiceController;
13use Illuminate\Validation\Rule;
14use MongoDB\BSON\UTCDateTime;
15use Qmp\Laravel\ConsumerBlacklist\Models\Blacklist;
16use Qmp\Laravel\Acls\Client\Client as AclsClient;
17
18class BlacklistController extends AbstractMicroServiceController
19{
20    public function __construct(Request $request)
21    {
22        parent::__construct($request);
23    }
24
25    /**
26     * Display a listing of the resource.
27     *
28     * @return \Illuminate\Http\Response
29     */
30    public function index(Request $request)
31    {
32        $request->validate([
33            'type' => 'nullable|in:email,ip'
34        ]);
35
36        if ($request->type) {
37            try {
38                AclsClient::role($this->userId, ['super_admin']);
39            } catch(RolePermissionException $e) {
40                return [];
41            }
42
43            return Blacklist::where($request->type, 'exists', true)->get([$request->type, 'id', 'entity', 'expiration_time']);
44        }
45
46        return Blacklist::all();
47    }
48
49    /**
50     * Store a newly created resource in storage.
51     *
52     * @param  \Illuminate\Http\Request  $request
53     * @return \Illuminate\Http\Response
54     */
55    public function store(Request $request)
56    {
57        $this->validateData($request);
58        $types = collect($request->all())->only(['email', 'ip'])->toArray();
59
60        try {
61            foreach ($types as $key => $entries) {
62                foreach ($entries as $entry) {
63                    $entry = strtolower(trim($entry));
64                    if (!empty($entry)) {
65                        $expiration = $request->expiration_time === -1
66                            ? $request->expiration_time
67                            : new UTCDateTime(DateTime::createFromFormat('Y-m-d', $request->expiration_time));
68
69                        $datas = [
70                            $key => Crypt::encryptString($entry),
71                            'md5' => md5($entry),
72                            'sha1' => sha1($entry),
73                            'sha256' => hash('sha256', $entry),
74                            'expiration_time' => $expiration,
75                            'entity' => $request->entity
76                        ];
77
78                        Blacklist::where(collect($datas)->only('md5', 'sha1', 'sha256')->toArray())->update($datas, ['upsert' => true]);
79                    }
80                }
81            }
82            return response()->json(['status' => 'ok'], Response::HTTP_OK);
83        } catch (\Exception $e) {
84            Log::debug('Unable to store blacklist :' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
85            return response()->json(['status' => 'ko', 'errors' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
86        }
87    }
88
89    /**
90     * Display the specified resource.
91     *
92     * @return \Illuminate\Http\Response
93     */
94    public function show($configId)
95    {
96        return Blacklist::findOrFail($configId);
97    }
98
99    /**
100     * Update the specified resource in storage.
101     *
102     * @param  \Illuminate\Http\Request  $request
103     * @return \Illuminate\Http\Response
104     */
105    public function update(Request $request, $id)
106    {
107        $this->validateData($request, $id);
108        try {
109            $model = Blacklist::findOrFail($id);
110
111            $key = collect($request->all())->except('expiration_time', 'id', '_method')->keys()->first();
112
113            $datas = [
114                $key => Crypt::encryptString($request->$key),
115                'md5' => md5($request->$key),
116                'sha1' => sha1($request->$key),
117                'sha256' => hash('sha256', $request->$key),
118                'expiration_time' => $request->expiration_time,
119                'entity' => $request->entity
120            ];
121
122            $result = $model->update($datas);
123
124            if (!$result) {
125                throw new \Exception('Unable to update : ' . $id);
126            }
127
128            return response()->json(['status' => 'ok'], Response::HTTP_OK);
129        } catch (\Exception $e) {
130            Log::debug('Unable to update blacklist :' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
131            return response()->json(['status' => 'ko', 'errors' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
132        }
133    }
134
135    /**
136     * Remove the specified resource from storage.
137     *
138     * @return \Illuminate\Http\Response
139     */
140    public function destroy($id)
141    {
142        try {
143            Blacklist::findOrFail($id)->delete();
144            return response()->json(['status' => 'ok'], Response::HTTP_OK);
145        } catch (\Exception $e) {
146            Log::debug('Unable to delete blacklist :' . var_export(['message' => $e->getMessage(), 'line' => $e->getLine(), 'file' => $e->getFile()], true));
147            return response()->json(['status' => 'ko', 'errors' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
148        }
149    }
150
151    public function getListActive(Request $request, $type, $hashType = null, $entities = null)
152    {
153        Validator::make([
154            'type' => $type,
155            'hash_type' => $hashType,
156            'entities' => $entities
157        ],
158        [
159            'type' => 'required|in:email,ip',
160            'hash_type' => 'nullable|in:sha1,md5,sha256',
161            'entities' => 'nullable|string'
162        ])->validate();
163
164        $blacklist = Blacklist::where($type, 'exists', true)
165            ->where(function($query) {
166                $query->where('expiration_time', -1)
167                    ->orWhere('expiration_time', '>=', new \DateTime());
168            });
169
170        if ($entities) {
171            $entities = explode(',', $entities);
172            $blacklist->where(function($query) use ($entities) {
173                $query->where('entity', 'exists', false)
174                    ->orWhere('entity', '')
175                    ->orWhereNull('entity')
176                    ->orWhereIn('entity', $entities);
177            });
178        }
179
180        return $hashType !== null
181            ? $blacklist->get([ $hashType ])
182            ->map(function($item) use ($hashType) {
183                return $item->$hashType;
184            })
185            : $blacklist->get();
186    }
187
188    protected function validateData(Request $request, $id = null)
189    {
190        $rules = [
191            'expiration_time' => 'required'
192        ];
193
194        if ($id != null) {
195            $rules['id'] = [
196                'required',
197                Rule::in([$id])
198            ];
199        }
200
201        return $request->validate($rules);
202    }
203}