1 | <?php |
||
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 | 26 | public function __construct(Client $objguzzle, Command $objcommand) |
|
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 | 24 | public function getSensiolabVulnerabilties($fileLock) |
|
44 | { |
||
45 | 24 | $this->addVerboseLog('Send request to sensiolab: <info>' . $fileLock . '</info>'); |
|
46 | |||
47 | 24 | $debug = false;//set to true to log into console output |
|
48 | $headers = [ |
||
49 | //OPTIONS |
||
50 | 'allow_redirects' => [ |
||
51 | 'max' => 3, // allow at most 10 redirects. |
||
52 | 'strict' => true, // use "strict" RFC compliant redirects. |
||
53 | 'referer' => true, // add a Referer header |
||
54 | 'protocols' => ['http', 'https'], // only allow http and https URLs |
||
55 | 'track_redirects' => false |
||
56 | 24 | ], |
|
57 | 24 | 'connect_timeout' => 20,//Use 0 to wait connection indefinitely |
|
58 | 24 | 'timeout' => 30, //Use 0 to wait response indefinitely |
|
59 | 24 | 'debug' => $debug, |
|
60 | //HEADERS |
||
61 | 'headers' => [ |
||
62 | 'Accept' => 'application/json' |
||
63 | ], |
||
64 | //UPLOAD FORM FILE |
||
65 | 'multipart' => [ |
||
66 | [ |
||
67 | 24 | 'name' => 'lock', |
|
68 | 24 | 'contents' => fopen($fileLock, 'r') |
|
69 | ] |
||
70 | ] |
||
71 | ]; |
||
72 | 24 | $response = null; |
|
73 | |||
74 | try { |
||
75 | 24 | $iResponse = $this->guzzle->request('POST', 'https://security.sensiolabs.org/check_lock', $headers); |
|
76 | 18 | $responseBody = $iResponse->getBody()->getContents(); |
|
77 | 18 | $response = json_decode($responseBody, true); |
|
78 | 6 | } 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 | 4 | } 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 | } |
||
92 | } |
||
93 | 24 | return $response; |
|
94 | } |
||
95 | |||
96 | /** |
||
97 | * @param $name |
||
98 | * @param $vulnerability |
||
99 | * @return array |
||
100 | */ |
||
101 | 12 | public function parseVulnerability($name, $vulnerability) |
|
102 | { |
||
103 | $data = [ |
||
104 | 12 | 'name' => $name, |
|
105 | 12 | 'version' => $vulnerability['version'], |
|
106 | 12 | 'advisories' => array_values($vulnerability['advisories']) |
|
107 | ]; |
||
108 | 12 | unset($this->tableVulnerabilities); |
|
109 | 12 | foreach ($data['advisories'] as $key2 => $advisory) { |
|
110 | $data2 = [ |
||
111 | 12 | 'title' => $advisory['title'], |
|
112 | 12 | 'link' => $advisory['link'], |
|
113 | 12 | 'cve' => $advisory['cve'] |
|
114 | ]; |
||
115 | |||
116 | $dataTable = [ |
||
117 | 12 | 'name' => $data['name'], |
|
118 | 12 | 'version' => $data['version'], |
|
119 | 12 | 'advisories' => $data2["title"] |
|
120 | ]; |
||
121 | |||
122 | 12 | $this->addVerboseLog($data['name'] . " " . $data['version'] . " " . $data2["title"], true); |
|
123 | 12 | $this->tableVulnerabilities[] = $dataTable; |
|
124 | } |
||
125 | |||
126 | 12 | return $this->tableVulnerabilities; |
|
127 | } |
||
128 | |||
129 | /** |
||
130 | * @param $key |
||
131 | * @param $vulnerability |
||
132 | * @param $tuttoOk |
||
133 | * @return array |
||
134 | */ |
||
135 | 10 | public function checkResponse($key, $vulnerability, $tuttoOk) |
|
136 | { |
||
137 | 10 | $tableVulnerabilities = array(); |
|
138 | |||
139 | 10 | foreach ($this->parseVulnerability($key, $vulnerability) as $vul) { |
|
140 | 10 | $tableVulnerabilities[] = array_merge($vul, array('isOk' => $tuttoOk)); |
|
141 | } |
||
142 | |||
143 | 10 | return $tableVulnerabilities; |
|
144 | } |
||
145 | |||
146 | /** |
||
147 | * @param $msg |
||
148 | * @param bool|false $error |
||
149 | */ |
||
150 | 26 | private function addVerboseLog($msg, $error = false) |
|
151 | { |
||
152 | 26 | $verbose = $this->command->option('verbose'); |
|
153 | 26 | if ($verbose) { |
|
154 | 10 | if ($error) { |
|
155 | 2 | $this->command->error($msg); |
|
156 | } else { |
||
157 | 8 | $this->command->line($msg); |
|
158 | } |
||
159 | } |
||
160 | 26 | } |
|
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 | } |
||
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 | } |
||
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 | } |
||
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) |
|
207 | } |
||
208 |