Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
version_helper.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb;
015
016 use phpbb\exception\version_check_exception;
017
018 /**
019 * Class to handle version checking and comparison
020 */
021 class version_helper
022 {
023 /**
024 * @var string Host
025 */
026 protected $host = 'version.phpbb.com';
027
028 /**
029 * @var string Path to file
030 */
031 protected $path = '/phpbb';
032
033 /**
034 * @var string File name
035 */
036 protected $file = 'versions.json';
037
038 /**
039 * @var bool Use SSL or not
040 */
041 protected $use_ssl = false;
042
043 /**
044 * @var string Current version installed
045 */
046 protected $current_version;
047
048 /**
049 * @var null|string Null to not force stability, 'unstable' or 'stable' to
050 * force the corresponding stability
051 */
052 protected $force_stability;
053
054 /** @var \phpbb\cache\service */
055 protected $cache;
056
057 /** @var \phpbb\config\config */
058 protected $config;
059
060 /** @var \phpbb\file_downloader */
061 protected $file_downloader;
062
063 /**
064 * Constructor
065 *
066 * @param \phpbb\cache\service $cache
067 * @param \phpbb\config\config $config
068 * @param \phpbb\file_downloader $file_downloader
069 */
070 public function __construct(\phpbb\cache\service $cache, \phpbb\config\config $config, \phpbb\file_downloader $file_downloader)
071 {
072 $this->cache = $cache;
073 $this->config = $config;
074 $this->file_downloader = $file_downloader;
075
076 if (defined('PHPBB_QA'))
077 {
078 $this->force_stability = 'unstable';
079 }
080
081 $this->current_version = $this->config['version'];
082 }
083
084 /**
085 * Set location to the file
086 *
087 * @param string $host Host (e.g. version.phpbb.com)
088 * @param string $path Path to file (e.g. /phpbb)
089 * @param string $file File name (Default: versions.json)
090 * @param bool $use_ssl Use SSL or not (Default: false)
091 * @return version_helper
092 */
093 public function set_file_location($host, $path, $file = 'versions.json', $use_ssl = false)
094 {
095 $this->host = $host;
096 $this->path = $path;
097 $this->file = $file;
098 $this->use_ssl = $use_ssl;
099
100 return $this;
101 }
102
103 /**
104 * Set current version
105 *
106 * @param string $version The current version
107 * @return version_helper
108 */
109 public function set_current_version($version)
110 {
111 $this->current_version = $version;
112
113 return $this;
114 }
115
116 /**
117 * Over-ride the stability to force check to include unstable versions
118 *
119 * @param null|string Null to not force stability, 'unstable' or 'stable' to
120 * force the corresponding stability
121 * @return version_helper
122 */
123 public function force_stability($stability)
124 {
125 $this->force_stability = $stability;
126
127 return $this;
128 }
129
130 /**
131 * Wrapper for version_compare() that allows using uppercase A and B
132 * for alpha and beta releases.
133 *
134 * See http://www.php.net/manual/en/function.version-compare.php
135 *
136 * @param string $version1 First version number
137 * @param string $version2 Second version number
138 * @param string $operator Comparison operator (optional)
139 *
140 * @return mixed Boolean (true, false) if comparison operator is specified.
141 * Integer (-1, 0, 1) otherwise.
142 */
143 public function compare($version1, $version2, $operator = null)
144 {
145 return phpbb_version_compare($version1, $version2, $operator);
146 }
147
148 /**
149 * Check whether or not a version is "stable"
150 *
151 * Stable means only numbers OR a pl release
152 *
153 * @param string $version
154 * @return bool Bool true or false
155 */
156 public function is_stable($version)
157 {
158 $matches = false;
159 preg_match('/^[\d\.]+/', $version, $matches);
160
161 if (empty($matches[0]))
162 {
163 return false;
164 }
165
166 return $this->compare($version, $matches[0], '>=');
167 }
168
169 /**
170 * Gets the latest version for the current branch the user is on
171 *
172 * @param bool $force_update Ignores cached data. Defaults to false.
173 * @param bool $force_cache Force the use of the cache. Override $force_update.
174 * @return string
175 * @throws version_check_exception
176 */
177 public function get_latest_on_current_branch($force_update = false, $force_cache = false)
178 {
179 $versions = $this->get_versions_matching_stability($force_update, $force_cache);
180
181 $self = $this;
182 $current_version = $this->current_version;
183
184 // Filter out any versions less than to the current version
185 $versions = array_filter($versions, function($data) use ($self, $current_version) {
186 return $self->compare($data['current'], $current_version, '>=');
187 });
188
189 // Get the lowest version from the previous list.
190 return array_reduce($versions, function($value, $data) use ($self) {
191 if ($value === null || $self->compare($data['current'], $value, '<'))
192 {
193 return $data['current'];
194 }
195
196 return $value;
197 });
198 }
199
200 /**
201 * Obtains the latest version information
202 *
203 * @param bool $force_update Ignores cached data. Defaults to false.
204 * @param bool $force_cache Force the use of the cache. Override $force_update.
205 * @return string
206 * @throws version_check_exception
207 */
208 public function get_suggested_updates($force_update = false, $force_cache = false)
209 {
210 $versions = $this->get_versions_matching_stability($force_update, $force_cache);
211
212 $self = $this;
213 $current_version = $this->current_version;
214
215 // Filter out any versions less than or equal to the current version
216 return array_filter($versions, function($data) use ($self, $current_version) {
217 return $self->compare($data['current'], $current_version, '>');
218 });
219 }
220
221 /**
222 * Obtains the latest version information matching the stability of the current install
223 *
224 * @param bool $force_update Ignores cached data. Defaults to false.
225 * @param bool $force_cache Force the use of the cache. Override $force_update.
226 * @return string Version info
227 * @throws version_check_exception
228 */
229 public function get_versions_matching_stability($force_update = false, $force_cache = false)
230 {
231 $info = $this->get_versions($force_update, $force_cache);
232
233 if ($this->force_stability !== null)
234 {
235 return ($this->force_stability === 'unstable') ? $info['unstable'] : $info['stable'];
236 }
237
238 return ($this->is_stable($this->current_version)) ? $info['stable'] : $info['unstable'];
239 }
240
241 /**
242 * Obtains the latest version information
243 *
244 * @param bool $force_update Ignores cached data. Defaults to false.
245 * @param bool $force_cache Force the use of the cache. Override $force_update.
246 * @return string Version info, includes stable and unstable data
247 * @throws version_check_exception
248 */
249 public function get_versions($force_update = false, $force_cache = false)
250 {
251 $cache_file = '_versioncheck_' . $this->host . $this->path . $this->file . $this->use_ssl;
252
253 $info = $this->cache->get($cache_file);
254
255 if ($info === false && $force_cache)
256 {
257 throw new version_check_exception('VERSIONCHECK_FAIL');
258 }
259 else if ($info === false || $force_update)
260 {
261 $info = $this->file_downloader->get($this->host, $this->path, $this->file, $this->use_ssl ? 443 : 80);
262 $error_string = $this->file_downloader->get_error_string();
263
264 if (!empty($error_string))
265 {
266 throw new version_check_exception($error_string);
267 }
268
269 $info = json_decode($info, true);
270
271 // Sanitize any data we retrieve from a server
272 if (!empty($info))
273 {
274 $json_sanitizer = function (&$value, $key) {
275 $type_cast_helper = new \phpbb\request\type_cast_helper();
276 $type_cast_helper->set_var($value, $value, gettype($value), true);
277 };
278 array_walk_recursive($info, $json_sanitizer);
279 }
280
281 if (empty($info['stable']) && empty($info['unstable']))
282 {
283 throw new version_check_exception('VERSIONCHECK_FAIL');
284 }
285
286 $info['stable'] = (empty($info['stable'])) ? array() : $info['stable'];
287 $info['unstable'] = (empty($info['unstable'])) ? $info['stable'] : $info['unstable'];
288
289 $this->cache->put($cache_file, $info, 86400); // 24 hours
290 }
291
292 return $info;
293 }
294 }
295