Completed
Push — master ( f7e888...be8232 )
by Alessandro
11:15 queued 14s
created

SensiolabHelper::getSensiolabVulnerabilties()   B

Complexity

Conditions 4
Paths 10

Size

Total Lines 52
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 36
CRAP Score 4

Importance

Changes 2
Bugs 2 Features 1
Metric Value
c 2
b 2
f 1
dl 0
loc 52
ccs 36
cts 36
cp 1
rs 8.9408
cc 4
eloc 37
nc 10
nop 1
crap 4

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: Alessandro
5
 * Date: 02/12/2015
6
 * Time: 13:47
7
 */
8
9
namespace Padosoft\LaravelComposerSecurity;
10
11
use Illuminate\Console\Command;
12
use GuzzleHttp\Client;
13
14
class SensiolabHelper
15
{
16
17
    protected $guzzle;
18
19
    protected $command;
20
21
    protected $tableVulnerabilities = [];
22
23
    /**
24
     * SensiolabHelper constructor.
25
     * @param Client $objguzzle
26
     * @param Command $objcommand
27
     */
28 18
    public function __construct(Client $objguzzle, Command $objcommand)
29
    {
30 18
        $this->guzzle = $objguzzle;
31 18
        $this->command = $objcommand;
32 18
    }
33
34
    /**
35
     *
36
     * Send Request to sensiolab and return array of sensiolab vulnerabilities.
37
     * Empty array if here is no vulnerabilities.
38
     *
39
     * @param $fileLock path to composer.lock file.
40
     *
41
     * @return array
42
     */
43 16
    public function getSensiolabVulnerabilties($fileLock)
44
    {
45 16
        $this->addVerboseLog('Send request to sensiolab: <info>' . $fileLock . '</info>');
46
47 16
        $debug = false;//set to true to log into console output
48
        $headers = [
49
            //OPTIONS
50
            'allow_redirects' => [
51 16
                'max' => 3,        // allow at most 10 redirects.
52 16
                'strict' => true,      // use "strict" RFC compliant redirects.
53 16
                'referer' => true,      // add a Referer header
54 16
                'protocols' => ['http', 'https'], // only allow http and https URLs
55
                'track_redirects' => false
56 16
            ],
57 16
            'connect_timeout' => 20,//Use 0 to wait connection indefinitely
58 16
            'timeout' => 30, //Use 0 to wait response indefinitely
59 16
            'debug' => $debug,
60
            //HEADERS
61
            'headers' => [
62
                'Accept' => 'application/json'
63 16
            ],
64
            //UPLOAD FORM FILE
65
            'multipart' => [
66
                [
67 16
                    'name' => 'lock',
68 16
                    'contents' => fopen($fileLock, 'r')
69 16
                ]
70 16
            ]
71 16
        ];
72 16
        $response = null;
73
74
        try {
75 16
            $iResponse = $this->guzzle->request('POST', 'https://security.sensiolabs.org/check_lock', $headers);
76 10
            $responseBody = $iResponse->getBody()->getContents();
77 10
            $response = json_decode($responseBody, true);
78 16
        } catch (\GuzzleHttp\Exception\ClientException $e) {
79 4
            $this->command->error("ClientException!\nMessage: " . $e->getMessage());
80 4
            $colorTag = $this->getColorTagForStatusCode($e->getResponse()->getStatusCode());
81 4
            $this->command->line("HTTP StatusCode: <{$colorTag}>" . $e->getResponse()->getStatusCode() . "<{$colorTag}>");
82 4
            $this->printMessage($e->getResponse());
83 4
            $this->printMessage($e->getRequest());
84 6
        } catch (\GuzzleHttp\Exception\RequestException $e) {
85 4
            $this->command->error("RequestException!\nMessage: " . $e->getMessage());
86 4
            $this->printMessage($e->getRequest());
87 4
            if ($e->hasResponse()) {
88 2
                $colorTag = $this->getColorTagForStatusCode($e->getResponse()->getStatusCode());
89 2
                $this->command->line("HTTP StatusCode: <{$colorTag}>" . $e->getResponse()->getStatusCode() . "<{$colorTag}>");
90 2
                $this->printMessage($e->getResponse());
91 2
            }
92
        }
93 16
        return $response;
94
    }
95
96
    /**
97
     * @param $name
98
     * @param $vulnerability
99
     * @return array
100
     */
101 8
    public function parseVulnerability($name, $vulnerability)
102
    {
103
        $data = [
104 8
            'name' => $name,
105 8
            'version' => $vulnerability['version'],
106 8
            'advisories' => array_values($vulnerability['advisories'])
107 8
        ];
108 8
        unset($this->tableVulnerabilities);
109 8
        foreach ($data['advisories'] as $key2 => $advisory) {
110
            $data2 = [
111 8
                'title' => $advisory['title'],
112 8
                'link' => $advisory['link'],
113 8
                'cve' => $advisory['cve']
114 8
            ];
115
116
            $dataTable = [
117 8
                'name' => $data['name'],
118 8
                'version' => $data['version'],
119 8
                'advisories' => $data2["title"]
120 8
            ];
121
122 8
            $this->addVerboseLog($data['name'] . " " . $data['version'] . " " . $data2["title"], true);
123 8
            $this->tableVulnerabilities[] = $dataTable;
124 8
        }
125
126 8
        return $this->tableVulnerabilities;
127
    }
128
129
    /**
130
     * @param $key
131
     * @param $vulnerability
132
     * @param $tuttoOk
133
     * @return array
134
     */
135 6
    public function checkResponse($key, $vulnerability, $tuttoOk)
136
    {
137 6
        $tableVulnerabilities = array();
138
139 6
        foreach ($this->parseVulnerability($key, $vulnerability) as $vul) {
140 6
            $tableVulnerabilities[] = array_merge($vul, array('isOk' => $tuttoOk));
141 6
        }
142
143 6
        return $tableVulnerabilities;
144
    }
145
146
    /**
147
     * @param            $msg
148
     * @param bool|false $error
149
     */
150 18
    private function addVerboseLog($msg, $error = false)
151
    {
152 18
        $verbose = $this->command->option('verbose');
153 18
        if ($verbose) {
154 10
            if ($error) {
155 2
                $this->command->error($msg);
156 2
            } else {
157 8
                $this->command->line($msg);
158
            }
159 10
        }
160 18
    }
161
162
    /**
163
     * @param \Psr\Http\Message\MessageInterface $message
164
     *
165
     */
166 6
    private function printMessage(\Psr\Http\Message\MessageInterface $message)
167
    {
168 6
        $type = '';
169 6
        if (is_a($message, '\Psr\Http\Message\RequestInterface')) {
170 6
            $type = 'REQUEST';
171 6
        } else if (is_a($message, '\Psr\Http\Message\ResponseInterface')) {
172 6
            $type = 'RESPONSE';
173 6
        }
174 6
        $this->command->info("$type:");
175 6
        $headers = '';
176 6
        foreach ($message->getHeaders() as $name => $values) {
177
            $headers .= $name . ': ' . implode(', ', $values) . "\r\n";
178 6
        }
179 6
        $this->command->comment($headers);
180 6
        if ($type == 'REQUEST') {
181 6
            $this->command->comment($message->getBody());
182 6
        } else if ($type == 'RESPONSE') {
183 6
            $this->command->comment($message->getBody()->getContents());
184 6
        }
185 6
    }
186
187
188
    /**
189
     * Get the color tag for the given status code.
190
     *
191
     * @param string $code
192
     *
193
     * @return string
194
     *
195
     * @see https://github.com/spatie/http-status-check/blob/master/src/CrawlLogger.php#L96
196
     */
197 6
    protected function getColorTagForStatusCode($code)
198
    {
199 6
        if (starts_with($code, '2')) {
200 2
            return 'info';
201
        }
202 4
        if (starts_with($code, '3')) {
203
            return 'comment';
204
        }
205 4
        return 'error';
206
    }
207
}
208