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.
Test Failed
Push — master ( 6a62c8...4de011 )
by Thomas
02:54
created

B2Client::uploadData()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 17

Duplication

Lines 8
Ratio 34.78 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 8
loc 23
ccs 0
cts 0
cp 0
rs 9.0856
cc 2
eloc 17
nc 2
nop 6
crap 6
1
<?php
2
3
namespace B2;
4
5
use B2\Files\Files;
6
use PartnerIT\Curl\Network\CurlRequest;
7
8
class B2Client
9
{
10
11
    /**
12
     * @var string
13
     */
14
    protected $accountId;
15
16
    /**
17
     * @var string
18
     */
19
    protected $applicationKey;
20
21
    /**
22
     * @var string
23
     */
24
    protected $apiUrl;
25
26
    /**
27
     * @var string
28
     */
29
    protected $authorizationToken;
30
31
    /**
32
     * @var string
33
     */
34
    protected $downloadUrl;
35
36
    /**
37
     * @var CurlRequest
38
     */
39
    protected $CurlRequest;
40
41
    /**
42
     * @var Files
43
     */
44
    public $Files;
45
46
47
    /**
48
     * B2Client constructor.
49
     * @param string $accountId
50
     * @param string $applicationKey
51
     */
52 2
    public function __construct($accountId, $applicationKey, CurlRequest $curlRequest = null)
53
    {
54
55 2
        if (!$curlRequest) {
56 1
            $this->CurlRequest = new CurlRequest();
57 1
        } else {
58 1
            $this->CurlRequest = $curlRequest;
59
        }
60
61 2
        $this->accountId      = $accountId;
62 2
        $this->applicationKey = $applicationKey;
63 2
        $this->Files          = new Files($this);
64
65 2
    }
66
67
    /**
68
     * @param array $result
69
     */
70 1
    public function setToken($result)
71 1
    {
72 1
        $this->authorizationToken = $result['authorizationToken'];
73 1
        $this->apiUrl             = $result['apiUrl'];
74
        $this->downloadUrl        = $result['downloadUrl'];
75
    }
76
77
    /**
78
     *
79
     */
80
    public function requestToken()
81
    {
82
83
        $results = $this->curl('https://api.backblaze.com/b2api/v1/b2_authorize_account', 'GET', [
84
            $this->buildBasicAuthHeader()
85
        ]);
86
87
        if ($results['statusCode'] === 200) {
88
            $this->setToken($results['responseBody']);
89
        } else {
90
            throw new \RuntimeException('Failed to get token: ' . $results['responseBody']['message']);
91
        }
92
93
    }
94
95
    /**
96
     * @param $endpoint
97
     * @param $method
98
     * @param array $data
99
     * @return mixed
100 1
     * @throws \Exception
101
     */
102
    public function call($endpoint, $method, $data = [])
103 1
    {
104
105
        if (empty($this->authorizationToken)) {
106
            throw new \Exception('You must set or generate a token');
107
        }
108 1
109 1
        $headers = [
110
            $this->buildTokenAuthHeader()
111 1
        ];
112
113 1
        $result = $this->curl($this->apiUrl . '/b2api/v1/' . $endpoint, $method, $headers, $data);
114 1
115
        if ($result['statusCode'] >= 200 && $result['statusCode'] < 300) {
116
            return $result['responseBody'];
117
        }
118
119
        if ($result['statusCode'] >= 400) {
120
            throw new \RuntimeException('Error ' . $result['statusCode'] . ' - ' . $result['responseBody']['message']);
121
        }
122
123
    }
124
125
    /**
126
     * @param $uri
127
     * @param string $method
128
     * @param array $headers
129
     * @param array $body
130
     * @return array
131
     * @throws \Exception
132
     */
133
    public function curl($uri, $method = 'GET', $headers = [], $body = [])
134
    {
135
136
        $this->CurlRequest->setOption(CURLOPT_URL, $uri);
137
        $this->CurlRequest->setOption(CURLOPT_CUSTOMREQUEST, $method);
138
        $this->CurlRequest->setOption(CURLOPT_RETURNTRANSFER, 1);
139
140
        $headers[] = 'Content-Type: application/json';
141
        $headers[] = "Accept: application/json";
142
143
        $this->CurlRequest->setOption(CURLOPT_POST, 1);
144
        $body = json_encode($body);
145
        $this->CurlRequest->setOption(CURLOPT_POSTFIELDS, $body);
146
        $this->CurlRequest->setOption(CURLOPT_HTTPHEADER, $headers);
147
148
        $resp = $this->CurlRequest->execute();
149 View Code Duplication
        if ($this->CurlRequest->getErrorNo() !== 0) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
150
            throw new \RuntimeException('curl error ' . $this->CurlRequest->getError() . '" - Code: ' . $this->CurlRequest->getErrorNo());
151
        } else {
152
            return [
153
                'statusCode'   => $this->CurlRequest->getInfo(CURLINFO_HTTP_CODE),
154
                'responseBody' => json_decode($resp, true)
155
            ];
156
        }
157
    }
158
159
    /**
160
     * @return string
161
     */
162
    public function buildBasicAuthHeader()
163
    {
164
        return 'Authorization: Basic ' . base64_encode($this->accountId . ':' . $this->applicationKey);
165
    }
166
167
    /**
168 1
     * @return string
169
     */
170 1
    public function buildTokenAuthHeader()
171
    {
172
        return 'Authorization: ' . $this->authorizationToken;
173
    }
174
175
    /**
176
     * @param $data
177
     * @param $sha1
178
     * @param $fileName
179
     * @param $url
180
     * @param $token
181
     */
182
    public function uploadData($fileData, $fileDataSha1, $fileName, $contentType, $uploadUrl, $uploadToken)
183
    {
184
        $headers   = [];
185
        $headers[] = "Authorization: " . $uploadToken;
186
        $headers[] = "X-Bz-File-Name: " . $fileName;
187
        $headers[] = "Content-Type: " . $contentType;
188
        $headers[] = "X-Bz-Content-Sha1: " . $fileDataSha1;
189
190
        $this->CurlRequest->setOption(CURLOPT_URL, $uploadUrl);
191
        $this->CurlRequest->setOption(CURLOPT_POST, true);
192
        $this->CurlRequest->setOption(CURLOPT_POSTFIELDS, $fileData);
193
        $this->CurlRequest->setOption(CURLOPT_HTTPHEADER, $headers);
194
195
        $resp = $this->CurlRequest->execute();
196 View Code Duplication
        if ($this->CurlRequest->getErrorNo() !== 0) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
197
            throw new \RuntimeException('curl error ' . $this->CurlRequest->getError() . '" - Code: ' . $this->CurlRequest->getErrorNo());
198
        } else {
199
            return [
200
                'statusCode'   => $this->CurlRequest->getInfo(CURLINFO_HTTP_CODE),
201
                'responseBody' => json_decode($resp, true)
202
            ];
203
        }
204
    }
205
206
    /**
207
     * @param $url
208
     */
209
    public function downloadFileByName($uri) {
210
211
        $uri = $this->downloadUrl . "/file/" . $uri;
212
        $this->CurlRequest->setOption(CURLOPT_URL, $uri);
213
        $this->CurlRequest->setOption(CURLOPT_CUSTOMREQUEST, 'GET');
214
        $this->CurlRequest->setOption(CURLOPT_RETURNTRANSFER, 1);
215
216
        $headers = [
217
            $this->buildTokenAuthHeader()
218
        ];
219
220
        $this->CurlRequest->setOption(CURLOPT_HTTPHEADER, $headers);
221
222
        $resp = $this->CurlRequest->execute();
223
        if ($this->CurlRequest->getErrorNo() !== 0) {
224
            throw new \RuntimeException('curl error ' . $this->CurlRequest->getError() . '" - Code: ' . $this->CurlRequest->getErrorNo());
225
        } else {
226
            return $resp;
227
        }
228
    }
229
230
}
231