MailgunRequest::verifySignature()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 4
nc 1
nop 0
dl 0
loc 9
rs 10
c 1
b 0
f 0
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