Issues (29)

lib/Phile/Core/Utility.php (1 issue)

1
<?php
2
/**
3
 * The Phile Utility class
4
 */
5
namespace Phile\Core;
6
7
use Phile\Core\Container;
8
9
/**
10
 * Utility class
11
 *
12
 * @author  PhileCMS
13
 * @link    https://philecms.github.io
14
 * @license http://opensource.org/licenses/MIT
15
 * @package Phile
16
 */
17
class Utility
18
{
19
20
    /**
21
     * method to get the current http protocol
22
     *
23
     * @return     string the current protocol
24
     * @deprecated since 1.5 will be removed
25
     */
26
    public static function getProtocol()
27
    {
28
        return Container::getInstance()->get('Phile_Router')->getProtocol();
29
    }
30
31
    /**
32
     * detect base url
33
     *
34
     * @return     string
35
     * @deprecated since 1.5 will be removed
36
     */
37
    public static function getBaseUrl()
38
    {
39
        $container = Container::getInstance();
40
        if ($container->has('Phile_Router')) {
41
            $router = $container->get('Phile_Router');
42
        } else {
43
            // BC: some old 1.x plugins may call this before the core is initialized
44
            $router = new Router;
45
        }
46
        return $router->getBaseUrl();
47
    }
48
49
    /**
50
     * detect install path
51
     *
52
     * @return     string
53
     * @deprecated since 1.5 will be removed
54
     */
55
    public static function getInstallPath()
56
    {
57
        $path = self::getBaseUrl();
58
        $path = substr($path, strpos($path, '://') + 3);
59
        $path = substr($path, strpos($path, '/') + 1);
60
61
        return $path;
62
    }
63
64
    /**
65
     * resolve a file path by replace the mod: prefix
66
     *
67
     * @param string $path
68
     *
69
     * @return string|null the full filepath or null if file does not exists
70
     */
71
    public static function resolveFilePath($path)
72
    {
73
        // resolve MOD: prefix
74
        if (strtoupper(substr($path, 0, 3)) === 'MOD') {
75
            $path = str_ireplace('mod:', PLUGINS_DIR, $path);
76
        }
77
        // check if file exists
78
        if (file_exists($path)) {
79
            return $path;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $path also could return the type array which is incompatible with the documented return type null|string.
Loading history...
80
        }
81
82
        return null;
83
    }
84
85
    /**
86
     * load files e.g. config files
87
     *
88
     * @param string $file
89
     *
90
     * @return mixed|null
91
     */
92 40
    public static function load($file)
93
    {
94 40
        if (file_exists($file)) {
95 40
            return include $file;
96
        }
97
98 34
        return null;
99
    }
100
101
    /**
102
     * check if a plugin is loaded
103
     *
104
     * @param      string $plugin
105
     * @return     bool
106
     * @deprecated since 1.5 will be removed. Use 'plugins_loaded' event!
107
     */
108
    public static function isPluginLoaded($plugin)
109
    {
110
        $config = Container::getInstance()->get('Phile_Config');
111
        if ($config->get('plugins')) {
112
            return false;
113
        }
114
        $plugins = $config->get('plugins');
115
        return (isset($plugins[$plugin]['active']) && $plugins[$plugin]['active'] === true);
116
    }
117
118
    /**
119
     * static method to get files by directory and file filter
120
     *
121
     * @param string $directory
122
     * @param string $filter
123
     *
124
     * @return array
125
     */
126 10
    public static function getFiles($directory, $filter = '\Phile\FilterIterator\GeneralFileFilterIterator')
127
    {
128 10
        $files = new $filter(
129 10
            new \RecursiveIteratorIterator(
130 10
                new \RecursiveDirectoryIterator(
131
                    $directory,
132
                    \RecursiveDirectoryIterator::FOLLOW_SYMLINKS
133
                )
134
            )
135
        );
136 10
        $result = array();
137 10
        foreach ($files as $file) {
138
            /**
139
             * @var \SplFileInfo $file
140
             */
141 10
            $result[] = $file->getPathname();
142
        }
143
144 10
        return $result;
145
    }
146
147
    /**
148
     * redirect to an url
149
     *
150
     * @param      string $url        the url to redirect to
151
     * @param      int                               $statusCode the http status code
152
     * @deprecated since 1.5 will be removed
153
     */
154
    public static function redirect($url, $statusCode = 302)
155
    {
156
        (new Response)->redirect($url, $statusCode);
157
    }
158
159
    /**
160
     * generate secure md5 hash
161
     *
162
     * @param string $value
163
     *
164
     * @return string
165
     */
166
    public static function getSecureMD5Hash($value)
167
    {
168
        $config = Container::getInstance()->get('Phile_Config');
169
170
        return md5($config->get('encryptionKey') . $value);
171
    }
172
173
    /**
174
     * method to generate a secure token
175
     * code from http://stackoverflow.com/a/13733588/1372085
176
     * modified by Frank Nägler
177
     *
178
     * @param int  $length
179
     * @param bool $widthSpecialChars
180
     * @param null|string $additionalChars
181
     *
182
     * @return string
183
     */
184 1
    public static function generateSecureToken($length = 32, $widthSpecialChars = true, $additionalChars = null)
185
    {
186 1
        $token        = "";
187 1
        $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
188 1
        $codeAlphabet .= "abcdefghijklmnopqrstuvwxyz";
189 1
        $codeAlphabet .= "0123456789";
190 1
        if ($widthSpecialChars) {
191 1
            $codeAlphabet .= "!/()=?[]|{}";
192
        }
193 1
        if ($additionalChars !== null) {
194
            $codeAlphabet .= $additionalChars;
195
        }
196 1
        for ($i = 0; $i < $length; $i++) {
197 1
            $token .= $codeAlphabet[Utility::crypto_rand_secure(0, strlen($codeAlphabet))];
198
        }
199
200 1
        return $token;
201
    }
202
203
    /**
204
     * method to get a more secure random value
205
     * code from http://stackoverflow.com/a/13733588/1372085
206
     *
207
     * @param int $min
208
     * @param int $max
209
     *
210
     * @return mixed
211
     */
212
    // @codingStandardsIgnoreStart
213 1
    public static function crypto_rand_secure(int $min, int $max)
214
    {
215
        // @codingStandardsIgnoreEnd
216 1
        $range = $max - $min;
217 1
        if ($range < 0) {
218
            return $min;
219
        } // not so random...
220 1
        $log    = log($range, 2);
221 1
        $bytes  = (int)($log / 8) + 1; // length in bytes
222 1
        $bits   = (int)$log + 1; // length in bits
223 1
        $filter = (int)(1 << $bits) - 1; // set all lower bits to 1
224
        do {
225 1
            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
226 1
            $rnd = $rnd & $filter; // discard irrelevant bits
227 1
        } while ($rnd >= $range);
228
229 1
        return $min + $rnd;
230
    }
231
}
232