Passed
Push — master ( ce1ae9...e9c52d )
by Mr
08:10
created

Downloader   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 25
c 2
b 0
f 0
dl 0
loc 89
ccs 0
cts 27
cp 0
rs 10
wmc 7

5 Methods

Rating   Name   Duplication   Size   Complexity  
A curlExec() 0 19 3
A downloadLatestVersion() 0 10 1
A getEasyRSA() 0 4 1
A getLatestVersion() 0 6 1
A extractArchive() 0 7 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace EasyRSA;
6
7
use EasyRSA\Interfaces\DownloaderInterface;
8
use splitbrain\PHPArchive\Tar;
9
10
class Downloader extends Worker implements DownloaderInterface
11
{
12
    /**
13
     * Url via which possible to get the latest release of EasyRSA.
14
     */
15
    public const URL_LATEST_RELEASE = 'https://api.github.com/repos/OpenVPN/easy-rsa/releases/latest';
16
17
    /**
18
     * Exec some operation by cURL.
19
     *
20
     * @param string      $url
21
     * @param string|null $filename
22
     *
23
     * @return string|null
24
     */
25
    private function curlExec(string $url, string $filename = null): ?string
26
    {
27
        $curl = curl_init();
28
29
        curl_setopt($curl, CURLOPT_USERAGENT, 'useragent');
0 ignored issues
show
Bug introduced by
It seems like $curl can also be of type false; however, parameter $ch of curl_setopt() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

29
        curl_setopt(/** @scrutinizer ignore-type */ $curl, CURLOPT_USERAGENT, 'useragent');
Loading history...
30
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
31
        curl_setopt($curl, CURLOPT_URL, $url);
32
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
33
34
        // If filename is not set
35
        if (null !== $filename) {
36
            $fp = fopen($filename, 'wb+');
37
            curl_setopt($curl, CURLOPT_FILE, $fp);
38
        }
39
40
        $result = curl_exec($curl);
0 ignored issues
show
Bug introduced by
It seems like $curl can also be of type false; however, parameter $ch of curl_exec() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

40
        $result = curl_exec(/** @scrutinizer ignore-type */ $curl);
Loading history...
41
        curl_close($curl);
0 ignored issues
show
Bug introduced by
It seems like $curl can also be of type false; however, parameter $ch of curl_close() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

41
        curl_close(/** @scrutinizer ignore-type */ $curl);
Loading history...
42
43
        return is_bool($result) ? null : $result;
44
    }
45
46
    /**
47
     * {@inheritdoc}
48
     */
49
    public function getLatestVersion(): string
50
    {
51
        $json = $this->curlExec(self::URL_LATEST_RELEASE);
52
        $json = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
53
54
        return $json['tarball_url'];
55
    }
56
57
    /**
58
     * {@inheritdoc}
59
     */
60
    public function downloadLatestVersion(): ?string
61
    {
62
        // Get full path to archive file
63
        $filename = $this->config->getArchive();
0 ignored issues
show
Bug introduced by
The method getArchive() does not exist on EasyRSA\Interfaces\ConfigInterface. Since it exists in all sub-types, consider adding an abstract or default implementation to EasyRSA\Interfaces\ConfigInterface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

63
        /** @scrutinizer ignore-call */ 
64
        $filename = $this->config->getArchive();
Loading history...
64
65
        // Get url with latest release
66
        $latest = $this->getLatestVersion();
67
68
        // Download and return status
69
        return $this->curlExec($latest, $filename);
70
    }
71
72
    /**
73
     * {@inheritdoc}
74
     *
75
     * @throws \splitbrain\PHPArchive\ArchiveIllegalCompressionException If archive is broken
76
     * @throws \splitbrain\PHPArchive\ArchiveIOException If not possible to read archive
77
     * @throws \splitbrain\PHPArchive\ArchiveCorruptedException If archive corrupted
78
     */
79
    public function extractArchive(): array
80
    {
81
        $tar = new Tar();
82
        $tar->open($this->config->get('archive'));
83
        $tar->extract($this->config->get('scripts'), 1);
84
85
        return $tar->contents();
86
    }
87
88
    /**
89
     * {@inheritdoc}
90
     *
91
     * @throws \splitbrain\PHPArchive\ArchiveIllegalCompressionException If archive is broken
92
     * @throws \splitbrain\PHPArchive\ArchiveIOException If not possible to read archive
93
     * @throws \splitbrain\PHPArchive\ArchiveCorruptedException If archive corrupted
94
     */
95
    public function getEasyRSA(): void
96
    {
97
        $this->downloadLatestVersion();
98
        $this->extractArchive();
99
    }
100
}
101