GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 912221...961991 )
by Gallice
05:44 queued 02:40
created

WebhookRequestHandler::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 4
cts 4
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 3
nc 2
nop 2
crap 2
1
<?php
2
3
namespace Tgallice\FBMessenger;
4
5
use GuzzleHttp\Psr7\ServerRequest;
6
use Psr\Http\Message\RequestInterface;
7
use Tgallice\FBMessenger\Callback\CallbackEvent;
8
use Tgallice\FBMessenger\Model\Callback\Entry;
9
10
class WebhookRequestHandler
11
{
12
    /**
13
     * @var RequestInterface
14
     */
15
    private $request;
16
17
    /**
18
     * App secret used to verify the request sha1
19
     *
20
     * @var string
21
     */
22
    private $secret;
23
24
    /**
25
     * @var array
26
     */
27
    private $decodedBody;
28
29
    /**
30
     * @var Entry[]
31
     */
32
    private $hydratedEntries;
33
34
    /**
35
     * @param string $secret
36
     * @param RequestInterface|null $request
37
     */
38 8
    public function __construct($secret, RequestInterface $request = null)
39
    {
40 8
        $this->secret = $secret;
41 8
        $this->request = null === $request ? ServerRequest::fromGlobals() : $request;
42 8
    }
43
44
    /**
45
     * Check if the request is a valid webhook request
46
     *
47
     * @return bool
48
     */
49 3
    public function isValid()
50
    {
51 3
        if (!$this->isValidHeader()) {
52 2
            return false;
53
        }
54
55 1
        $decoded = $this->getDecodedBody();
56
57 1
        $object = isset($decoded['object']) ? $decoded['object'] : null;
58 1
        $entry = isset($decoded['entry']) ? $decoded['entry'] : null;
59
60 1
        return $object === 'page' && null !== $entry;
61
    }
62
63
    /**
64
     * @return CallbackEvent[]
65
     */
66 1
    public function getAllCallbackEvents()
67
    {
68 1
        $events = [];
69
70 1
        foreach ($this->getHydratedEntries() as $hydratedEntry) {
71 1
            $events = array_merge($events, $hydratedEntry->getCallbackEvents());
72 1
        }
73
74 1
        return $events;
75
    }
76
77
    /**
78
     * @return Entry[]
79
     */
80 1
    public function getEntries()
81
    {
82 1
        return $this->getHydratedEntries();
83
    }
84
85
    /**
86
     * @return RequestInterface
87
     */
88 1
    public function getRequest()
89
    {
90 1
        return $this->request;
91
    }
92
93
    /**
94
     * @return array
95
     */
96 4
    public function getDecodedBody()
97
    {
98 4
        if (isset($this->decodedBody)) {
99
            return $this->decodedBody;
100
        }
101
102 4
        $body = (string) $this->request->getBody();
103 4
        $decoded = @json_decode($body, true);
104
105 4
        return $this->decodedBody = null === $decoded ? [] : $decoded;
106
    }
107
108
    /**
109
     * @return Entry[]
110
     */
111 2
    private function getHydratedEntries()
112
    {
113 2
        if (isset($this->hydratedEntries)) {
114
            return $this->hydratedEntries;
115
        }
116
117 2
        $decodedBody = $this->getDecodedBody();
118 2
        $entries = $decodedBody['entry'];
119
120 2
        $hydrated = [];
121
122 2
        foreach ($entries as $entry) {
123 2
            $hydrated[] = Entry::create($entry);
124 2
        }
125
126 2
        return $this->hydratedEntries = $hydrated;
127
    }
128
129
    /**
130
     * @return bool
131
     */
132 3
    private function isValidHeader()
133
    {
134 3
        $payload = (string) $this->request->getBody();
135 3
        $headers = $this->request->getHeader('X-Hub-Signature');
136
137 3
        if (empty($headers)) {
138
            return false;
139
        }
140
141 3
        $signature = XHubSignature::parseHeader($headers[0]);
142
143 3
        return XHubSignature::validate($payload, $this->secret, $signature);
144
    }
145
}
146