MailgunRequest   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 40
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 16
dl 0
loc 40
rs 10
c 1
b 0
f 0
wmc 5

4 Methods

Rating   Name   Duplication   Size   Complexity  
A verifySignature() 0 9 2
A email() 0 6 1
A isFresh() 0 3 1
A validator() 0 14 1
1
<?php
2
3
namespace BeyondCode\Mailbox\Http\Requests;
4
5
use BeyondCode\Mailbox\InboundEmail;
6
use Carbon\Carbon;
7
use Illuminate\Foundation\Http\FormRequest;
8
use Illuminate\Support\Facades\Validator;
9
10
class MailgunRequest extends FormRequest
11
{
12
    public function validator()
13
    {
14
        $validator = Validator::make($this->all(), [
15
            'body-mime' => 'required',
16
            'timestamp' => 'required',
17
            'token' => 'required',
18
            'signature' => 'required',
19
        ]);
20
21
        $validator->after(function () {
22
            $this->verifySignature();
23
        });
24
25
        return $validator;
26
    }
27
28
    public function email()
29
    {
30
        /** @var InboundEmail $modelClass */
31
        $modelClass = config('mailbox.model');
32
33
        return $modelClass::fromMessage($this->get('body-mime'));
34
    }
35
36
    protected function verifySignature()
37
    {
38
        $data = $this->timestamp.$this->token;
39
40
        $signature = hash_hmac('sha256', $data, config('mailbox.services.mailgun.key'));
41
42
        $signed = hash_equals($this->signature, $signature);
43
44
        abort_unless($signed && $this->isFresh($this->timestamp), 401, 'Invalid Mailgun signature or timestamp.');
45
    }
46
47
    protected function isFresh($timestamp): bool
48
    {
49
        return now()->subMinutes(2)->lte(Carbon::createFromTimestamp($timestamp));
50
    }
51
}
52