Passed
Push — master ( b0fca4...7540c5 )
by Michael
06:08 queued 02:59
created

VersionChecks::checkVerPhp()   A

Complexity

Conditions 5
Paths 6

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 14
c 0
b 0
f 0
nc 6
nop 1
dl 0
loc 24
rs 9.4888
1
<?php
2
3
declare(strict_types=1);
4
5
namespace XoopsModules\Rssfit\Common;
6
7
/*
8
 You may not change or alter any portion of this comment or credits
9
 of supporting developers from this source code or any supporting source code
10
 which is considered copyrighted (c) material of the original comment or credit authors.
11
12
 This program is distributed in the hope that it will be useful,
13
 but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
 */
16
17
use Xmf\Module\Helper;
18
19
/**
20
 * @copyright   XOOPS Project (https://xoops.org)
21
 * @license     http://www.fsf.org/copyleft/gpl.html GNU public license
22
 * @author      mamba <[email protected]>
23
 */
24
trait VersionChecks
25
{
26
    /**
27
     * Verifies XOOPS version meets minimum requirements for this module
28
     * @static
29
     *
30
     */
31
    public static function checkVerXoops(?\XoopsModule $module = null, ?string $requiredVer = null): bool
32
    {
33
        $moduleDirName      = \basename(\dirname(__DIR__, 2));
34
        $moduleDirNameUpper = mb_strtoupper($moduleDirName);
35
        if (null === $module) {
36
            $module = \XoopsModule::getByDirname($moduleDirName);
37
        }
38
        \xoops_loadLanguage('admin', $moduleDirName);
39
        \xoops_loadLanguage('common', $moduleDirName);
40
41
        //check for minimum XOOPS version
42
        $currentVer = mb_substr(\XOOPS_VERSION, 6); // get the numeric part of string
43
        if (null === $requiredVer) {
44
            $requiredVer = (string)$module->getInfo('min_xoops'); //making sure it's a string
45
        }
46
        $success = true;
47
48
        if (\version_compare($currentVer, $requiredVer, '<')) {
49
            $success = false;
50
            $module->setErrors(\sprintf(\constant('CO_' . $moduleDirNameUpper . '_ERROR_BAD_XOOPS'), $requiredVer, $currentVer));
51
        }
52
53
        return $success;
54
    }
55
56
    /**
57
     * Verifies PHP version meets minimum requirements for this module
58
     * @static
59
     *
60
     * @return bool true if meets requirements, false if not
61
     */
62
    public static function checkVerPhp(?\XoopsModule $module = null): bool
63
    {
64
        $moduleDirName      = \basename(\dirname(__DIR__, 2));
65
        $moduleDirNameUpper = mb_strtoupper($moduleDirName);
66
        if (null === $module) {
67
            $module = \XoopsModule::getByDirname($moduleDirName);
68
        }
69
        \xoops_loadLanguage('admin', $moduleDirName);
70
        \xoops_loadLanguage('common', $moduleDirName);
71
72
        // check for minimum PHP version
73
        $success = true;
74
75
        $verNum = \PHP_VERSION;
76
        $reqVer = &$module->getInfo('min_php');
77
78
        if (false !== $reqVer && '' !== $reqVer) {
79
            if (\version_compare($verNum, $reqVer, '<')) {
0 ignored issues
show
Bug introduced by
It seems like $reqVer can also be of type array; however, parameter $version2 of version_compare() does only seem to accept string, 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

79
            if (\version_compare($verNum, /** @scrutinizer ignore-type */ $reqVer, '<')) {
Loading history...
80
                $module->setErrors(\sprintf(\constant('CO_' . $moduleDirNameUpper . '_ERROR_BAD_PHP'), $reqVer, $verNum));
0 ignored issues
show
Bug introduced by
It seems like $reqVer can also be of type array; however, parameter $values of sprintf() does only seem to accept double|integer|string, 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

80
                $module->setErrors(\sprintf(\constant('CO_' . $moduleDirNameUpper . '_ERROR_BAD_PHP'), /** @scrutinizer ignore-type */ $reqVer, $verNum));
Loading history...
81
                $success = false;
82
            }
83
        }
84
85
        return $success;
86
    }
87
88
    /**
89
     *
90
     * compares current module version with the latest GitHub release
91
     * @static
92
     *
93
     */
94
95
    public static function checkVerModule(Helper $helper, ?string $source = 'github', ?string $default = 'master'): ?array
96
    {
97
        $moduleDirName      = \basename(\dirname(__DIR__, 2));
98
        $moduleDirNameUpper = mb_strtoupper($moduleDirName);
99
        $update             = '';
100
        $repository         = 'XoopsModules25x/' . $moduleDirName;
101
        //        $repository         = 'XoopsModules25x/publisher'; //for testing only
102
        $ret             = null;
103
        $infoReleasesUrl = "https://api.github.com/repos/$repository/releases";
104
        if ('github' === $source) {
105
            if (\function_exists('curl_init') && false !== ($curlHandle = \curl_init())) {
106
                \curl_setopt($curlHandle, \CURLOPT_URL, $infoReleasesUrl);
107
                \curl_setopt($curlHandle, \CURLOPT_RETURNTRANSFER, true);
108
                \curl_setopt($curlHandle, \CURLOPT_SSL_VERIFYPEER, true); //TODO: how to avoid an error when 'Peer's Certificate issuer is not recognized'
109
                \curl_setopt($curlHandle, \CURLOPT_HTTPHEADER, ["User-Agent:Publisher\r\n"]);
110
                $curlReturn = \curl_exec($curlHandle);
111
                if (false === $curlReturn) {
112
                    \trigger_error(\curl_error($curlHandle));
113
                } elseif (\is_string($curlReturn) && false !== \strpos($curlReturn, 'Not Found')) {
114
                    \trigger_error('Repository Not Found: ' . $infoReleasesUrl);
115
                } elseif (\is_string($curlReturn)) {
116
                    $file              = json_decode($curlReturn, false);
117
                    $latestVersionLink = \sprintf("https://github.com/$repository/archive/%s.zip", $file ? \reset($file)->tag_name : $default);
118
                    $latestVersion     = $file[0]->tag_name;
119
                    $prerelease        = $file[0]->prerelease;
120
                    if ('master' !== $latestVersionLink) {
121
                        $update = \constant('CO_' . $moduleDirNameUpper . '_' . 'NEW_VERSION') . $latestVersion;
122
                    }
123
                    //"PHP-standardized" version
124
                    $latestVersion = mb_strtolower($latestVersion);
125
                    if (false !== mb_strpos($latestVersion, 'final')) {
126
                        $latestVersion = \str_replace('_', '', mb_strtolower($latestVersion));
127
                        $latestVersion = \str_replace('final', '', mb_strtolower($latestVersion));
128
                    }
129
                    $moduleVersion = ($helper->getModule()->getInfo('version') . '_' . $helper->getModule()->getInfo('module_status'));
0 ignored issues
show
Bug introduced by
Are you sure $helper->getModule()->getInfo('version') of type array|string can be used in concatenation? ( Ignorable by Annotation )

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

129
                    $moduleVersion = (/** @scrutinizer ignore-type */ $helper->getModule()->getInfo('version') . '_' . $helper->getModule()->getInfo('module_status'));
Loading history...
Bug introduced by
Are you sure $helper->getModule()->getInfo('module_status') of type array|string can be used in concatenation? ( Ignorable by Annotation )

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

129
                    $moduleVersion = ($helper->getModule()->getInfo('version') . '_' . /** @scrutinizer ignore-type */ $helper->getModule()->getInfo('module_status'));
Loading history...
130
                    //"PHP-standardized" version
131
                    $moduleVersion = \str_replace(' ', '', mb_strtolower($moduleVersion));
132
                    //                    $moduleVersion = '1.0'; //for testing only
133
                    //                    $moduleDirName = 'publisher'; //for testing only
134
                    if (!$prerelease && \version_compare($moduleVersion, $latestVersion, '<')) {
135
                        $ret   = [];
136
                        $ret[] = $update;
137
                        $ret[] = $latestVersionLink;
138
                    }
139
                }
140
                \curl_close($curlHandle);
141
            }
142
        }
143
        return $ret;
144
    }
145
}
146