Issues (64)

Security Analysis    no request data  

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

src/Api/Server.php (17 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/*
3
 *   This file is part of the Vultr PHP library.
4
 *
5
 *   (c) Albert Leitato <[email protected]>
6
 *
7
 *   For the full copyright and license information, please view the LICENSE
8
 *   file that was distributed with this source code.
9
 */
10
namespace Vultr\Api;
11
12
use Vultr\Entity\Action as ActionEntity;
13
use Vultr\Entity\Droplet as DropletEntity;
14
use Vultr\Entity\Image as ImageEntity;
15
use Vultr\Entity\Kernel as KernelEntity;
16
use Vultr\Entity\Upgrade as UpgradeEntity;
17
use Vultr\Exception\HttpException;
18
19
/**
20
 * @author Yassir Hannoun <[email protected]>
21
 * @author Graham Campbell <[email protected]>
22
 */
23
class Server extends AbstractApi
24
{
25
    /**
26
     * @param int         $per_page
27
     * @param int         $page
28
     * @param string|null $tag
29
     *
30
     * @return DropletEntity[]
31
     */
32
    public function list($per_page = 200, $page = 1, $tag = null)
33
    {
34
        $url = \sprintf('%s/droplets?per_page=%d&page=%d', $this->endpoint, $per_page, $page);
35
36
        if (null !== $tag) {
37
            $url .= '&tag_name=' . $tag;
38
        }
39
40
        $droplets = \json_decode($this->adapter->get($url));
41
42
        $this->extractMeta($droplets);
0 ignored issues
show
The method extractMeta() does not seem to exist on object<Vultr\Api\Server>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
43
44
        return \array_map(function ($droplet) {
45
            return new DropletEntity($droplet);
46
        }, $droplets->droplets);
47
    }
48
49
    /**
50
     * @param int $id
51
     *
52
     * @return DropletEntity[]
53
     */
54
    public function getNeighborsById($id)
55
    {
56
        $droplets = $this->adapter->get(\sprintf('%s/droplets/%d/neighbors', $this->endpoint, $id));
57
58
        $droplets = \json_decode($droplets);
59
60
        return \array_map(function ($droplet) {
61
            return new DropletEntity($droplet);
62
        }, $droplets->droplets);
63
    }
64
65
    /**
66
     * @return DropletEntity[]
67
     */
68
    public function getAllNeighbors()
69
    {
70
        $neighbors = $this->adapter->get(\sprintf('%s/reports/droplet_neighbors', $this->endpoint));
71
72
        $neighbors = \json_decode($neighbors);
73
74
        return \array_map(function ($neighbor) {
75
            return new DropletEntity($neighbor);
76
        }, $neighbors->neighbors);
77
    }
78
79
    /**
80
     * @return UpgradeEntity[]
81
     */
82 View Code Duplication
    public function getUpgrades()
0 ignored issues
show
This method seems to be duplicated in 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...
83
    {
84
        $upgrades = $this->adapter->get(\sprintf('%s/droplet_upgrades', $this->endpoint));
85
86
        $upgrades = \json_decode($upgrades);
87
88
        return \array_map(function ($upgrade) {
89
            return new UpgradeEntity($upgrade);
90
        }, $upgrades);
91
    }
92
93
    /**
94
     * @param int $id
95
     *
96
     * @throws HttpException
97
     *
98
     * @return DropletEntity
99
     */
100 View Code Duplication
    public function getById($id)
0 ignored issues
show
This method seems to be duplicated in 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...
101
    {
102
        $droplet = $this->adapter->get(\sprintf('%s/droplets/%d', $this->endpoint, $id));
103
104
        $droplet = \json_decode($droplet);
105
106
        return new DropletEntity($droplet->droplet);
107
    }
108
109
    /**
110
     * @param int    $dcId
111
     * @param string $vpsPlanId
112
     * @param string $osId
113
     * @param array  $options
114
     *
115
     * @throws HttpException
116
     *
117
     * @return DropletEntity|null
118
     */
119
    public function create($dcId, $vpsPlanId, $osId, array $options)
120
    {
121
        $content = [
0 ignored issues
show
$content is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
122
           'DCID'        => $dcId,
123
           'vps_plan_id' => $vpsPlanId,
124
           'OSID'        => $osId,
125
       ];
126
        $optional = [
127
            'ipxe_chain_url',
128
            'ISOID',
129
            'SCRIPTID' ,
130
            'SNAPSHOTID' ,
131
            'enable_ipv6',
132
            'enable_private_network',
133
            'label',
134
            'SSHKEYID',
135
            'auto_backups',
136
            'APPID',
137
            'userdata',
138
            'notify_activate',
139
            'ddos_protection',
140
            'reserved_ip_v4',
141
            'hostname',
142
            'tag',
143
            'FIREWALLGROUPID',
144
        ];
145
        foreach ($optional as $key => $option) {
146
            if (\array_key_exists($option, $options)) {
0 ignored issues
show
This if statement is empty and can be removed.

This check looks for the bodies of if statements that have no statements or where all statements have been commented out. This may be the result of changes for debugging or the code may simply be obsolete.

These if bodies can be removed. If you have an empty if but statements in the else branch, consider inverting the condition.

if (rand(1, 6) > 3) {
//print "Check failed";
} else {
    print "Check succeeded";
}

could be turned into

if (rand(1, 6) <= 3) {
    print "Check succeeded";
}

This is much more concise to read.

Loading history...
147
            }
148
        }
149
150
        $droplet = $this->adapter->post(\sprintf('%s/droplets', $this->endpoint), $data);
0 ignored issues
show
The variable $data does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
151
152
        $droplet = \json_decode($droplet);
153
154
        if (\is_array($names)) {
0 ignored issues
show
The variable $names does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
155
            return \array_map(function ($droplet) {
156
                return new DropletEntity($droplet);
157
            }, $droplet->droplets);
158
        }
159
160
        return new DropletEntity($droplet->droplet);
161
    }
162
163
    /**
164
     * @param int $id
165
     *
166
     * @throws HttpException
167
     */
168
    public function delete($id)
169
    {
170
        $this->adapter->delete(\sprintf('%s/droplets/%d', $this->endpoint, $id));
171
    }
172
173
    /**
174
     * @param int $id
175
     *
176
     * @throws HttpException
177
     *
178
     * @return KernelEntity[]
179
     */
180 View Code Duplication
    public function getAvailableKernels($id)
0 ignored issues
show
This method seems to be duplicated in 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...
181
    {
182
        $kernels = $this->adapter->get(\sprintf('%s/droplets/%d/kernels', $this->endpoint, $id));
183
184
        $kernels = \json_decode($kernels);
185
186
        $this->meta = $this->extractMeta($kernels);
0 ignored issues
show
The method extractMeta() does not seem to exist on object<Vultr\Api\Server>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
187
188
        return \array_map(function ($kernel) {
189
            return new KernelEntity($kernel);
190
        }, $kernels->kernels);
191
    }
192
193
    /**
194
     * @param int $id
195
     *
196
     * @return ImageEntity[]
197
     */
198 View Code Duplication
    public function getSnapshots($id)
0 ignored issues
show
This method seems to be duplicated in 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...
199
    {
200
        $snapshots = $this->adapter->get(\sprintf('%s/droplets/%d/snapshots?per_page=%d', $this->endpoint, $id, 200));
201
202
        $snapshots = \json_decode($snapshots);
203
204
        $this->meta = $this->extractMeta($snapshots);
0 ignored issues
show
The method extractMeta() does not seem to exist on object<Vultr\Api\Server>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
205
206
        return \array_map(function ($snapshot) {
207
            $snapshot = new ImageEntity($snapshot);
208
209
            return $snapshot;
210
        }, $snapshots->snapshots);
211
    }
212
213
    /**
214
     * @param int $id
215
     *
216
     * @return ImageEntity[]
217
     */
218 View Code Duplication
    public function getBackups($id)
0 ignored issues
show
This method seems to be duplicated in 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...
219
    {
220
        $backups = $this->adapter->get(\sprintf('%s/droplets/%d/backups?per_page=%d', $this->endpoint, $id, 200));
221
222
        $backups = \json_decode($backups);
223
224
        $this->meta = $this->extractMeta($backups);
0 ignored issues
show
The method extractMeta() does not seem to exist on object<Vultr\Api\Server>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
225
226
        return \array_map(function ($backup) {
227
            return new ImageEntity($backup);
228
        }, $backups->backups);
229
    }
230
231
    /**
232
     * @param int $id
233
     *
234
     * @return ActionEntity[]
235
     */
236 View Code Duplication
    public function getActions($id)
0 ignored issues
show
This method seems to be duplicated in 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...
237
    {
238
        $actions = $this->adapter->get(\sprintf('%s/droplets/%d/actions?per_page=%d', $this->endpoint, $id, 200));
239
240
        $actions = \json_decode($actions);
241
242
        $this->meta = $this->extractMeta($actions);
0 ignored issues
show
The method extractMeta() does not seem to exist on object<Vultr\Api\Server>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
243
244
        return \array_map(function ($action) {
245
            return new ActionEntity($action);
246
        }, $actions->actions);
247
    }
248
249
    /**
250
     * @param int $id
251
     * @param int $actionId
252
     *
253
     * @return ActionEntity
254
     */
255 View Code Duplication
    public function getActionById($id, $actionId)
0 ignored issues
show
This method seems to be duplicated in 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...
256
    {
257
        $action = $this->adapter->get(\sprintf('%s/droplets/%d/actions/%d', $this->endpoint, $id, $actionId));
258
259
        $action = \json_decode($action);
260
261
        return new ActionEntity($action->action);
262
    }
263
264
    /**
265
     * @param int $id
266
     *
267
     * @throws HttpException
268
     *
269
     * @return ActionEntity
270
     */
271
    public function reboot($id)
272
    {
273
        return $this->executeAction($id, ['type' => 'reboot']);
274
    }
275
276
    /**
277
     * @param int $id
278
     *
279
     * @throws HttpException
280
     *
281
     * @return ActionEntity
282
     */
283
    public function powerCycle($id)
284
    {
285
        return $this->executeAction($id, ['type' => 'power_cycle']);
286
    }
287
288
    /**
289
     * @param int $id
290
     *
291
     * @throws HttpException
292
     *
293
     * @return ActionEntity
294
     */
295
    public function shutdown($id)
296
    {
297
        return $this->executeAction($id, ['type' => 'shutdown']);
298
    }
299
300
    /**
301
     * @param int $id
302
     *
303
     * @throws HttpException
304
     *
305
     * @return ActionEntity
306
     */
307
    public function powerOff($id)
308
    {
309
        return $this->executeAction($id, ['type' => 'power_off']);
310
    }
311
312
    /**
313
     * @param int $id
314
     *
315
     * @throws HttpException
316
     *
317
     * @return ActionEntity
318
     */
319
    public function powerOn($id)
320
    {
321
        return $this->executeAction($id, ['type' => 'power_on']);
322
    }
323
324
    /**
325
     * @param int $id
326
     *
327
     * @throws HttpException
328
     *
329
     * @return ActionEntity
330
     */
331
    public function passwordReset($id)
332
    {
333
        return $this->executeAction($id, ['type' => 'password_reset']);
334
    }
335
336
    /**
337
     * @param int    $id
338
     * @param string $size
339
     * @param bool   $disk
340
     *
341
     * @throws HttpException
342
     *
343
     * @return ActionEntity
344
     */
345
    public function resize($id, $size, $disk = true)
346
    {
347
        return $this->executeAction($id, ['type' => 'resize', 'size' => $size, 'disk' => $disk ? 'true' : 'false']);
348
    }
349
350
    /**
351
     * @param int $id
352
     * @param int $image
353
     *
354
     * @throws HttpException
355
     *
356
     * @return ActionEntity
357
     */
358
    public function restore($id, $image)
359
    {
360
        return $this->executeAction($id, ['type' => 'restore', 'image' => $image]);
361
    }
362
363
    /**
364
     * @param int        $id
365
     * @param int|string $image
366
     *
367
     * @throws HttpException
368
     *
369
     * @return ActionEntity
370
     */
371
    public function rebuild($id, $image)
372
    {
373
        return $this->executeAction($id, ['type' => 'rebuild', 'image' => $image]);
374
    }
375
376
    /**
377
     * @param int    $id
378
     * @param string $name
379
     *
380
     * @throws HttpException
381
     *
382
     * @return ActionEntity
383
     */
384
    public function rename($id, $name)
385
    {
386
        return $this->executeAction($id, ['type' => 'rename', 'name' => $name]);
387
    }
388
389
    /**
390
     * @param int $id
391
     * @param int $kernel
392
     *
393
     * @throws HttpException
394
     *
395
     * @return ActionEntity
396
     */
397
    public function changeKernel($id, $kernel)
398
    {
399
        return $this->executeAction($id, ['type' => 'change_kernel', 'kernel' => $kernel]);
400
    }
401
402
    /**
403
     * @param int $id
404
     *
405
     * @throws HttpException
406
     *
407
     * @return ActionEntity
408
     */
409
    public function enableIpv6($id)
410
    {
411
        return $this->executeAction($id, ['type' => 'enable_ipv6']);
412
    }
413
414
    /**
415
     * @param int $id
416
     *
417
     * @throws HttpException
418
     *
419
     * @return ActionEntity
420
     */
421
    public function enableBackups($id)
422
    {
423
        return $this->executeAction($id, ['type' => 'enable_backups']);
424
    }
425
426
    /**
427
     * @param int $id
428
     *
429
     * @throws HttpException
430
     *
431
     * @return ActionEntity
432
     */
433
    public function disableBackups($id)
434
    {
435
        return $this->executeAction($id, ['type' => 'disable_backups']);
436
    }
437
438
    /**
439
     * @param int $id
440
     *
441
     * @throws HttpException
442
     *
443
     * @return ActionEntity
444
     */
445
    public function enablePrivateNetworking($id)
446
    {
447
        return $this->executeAction($id, ['type' => 'enable_private_networking']);
448
    }
449
450
    /**
451
     * @param int    $id
452
     * @param string $name
453
     *
454
     * @throws HttpException
455
     *
456
     * @return ActionEntity
457
     */
458
    public function snapshot($id, $name)
459
    {
460
        return $this->executeAction($id, ['type' => 'snapshot', 'name' => $name]);
461
    }
462
463
    /**
464
     * @param int   $id
465
     * @param array $options
466
     *
467
     * @throws HttpException
468
     *
469
     * @return ActionEntity
470
     */
471 View Code Duplication
    private function executeAction($id, array $options)
0 ignored issues
show
This method seems to be duplicated in 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...
472
    {
473
        $action = $this->adapter->post(\sprintf('%s/droplets/%d/actions', $this->endpoint, $id), $options);
474
475
        $action = \json_decode($action);
476
477
        return new ActionEntity($action->action);
478
    }
479
}
480