Verzeichnisstruktur phpBB-3.3.15
- Veröffentlicht
- 28.08.2024
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 |
service.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\cache;
015
016 /**
017 * Class for grabbing/handling cached entries
018 */
019 class service
020 {
021 /** @var string Name of event used for cache purging */
022 private const PURGE_DEFERRED_ON_EVENT = 'core.garbage_collection';
023
024 /** @var bool Flag whether cache purge has been deferred */
025 private $cache_purge_deferred = false;
026
027 /**
028 * Cache driver.
029 *
030 * @var \phpbb\cache\driver\driver_interface
031 */
032 protected $driver;
033
034 /**
035 * The config.
036 *
037 * @var \phpbb\config\config
038 */
039 protected $config;
040
041 /**
042 * Database connection.
043 *
044 * @var \phpbb\db\driver\driver_interface
045 */
046 protected $db;
047
048 /** @var \phpbb\event\dispatcher phpBB Event dispatcher */
049 protected $dispatcher;
050
051 /**
052 * Root path.
053 *
054 * @var string
055 */
056 protected $phpbb_root_path;
057
058 /**
059 * PHP file extension.
060 *
061 * @var string
062 */
063 protected $php_ext;
064
065 /**
066 * Creates a cache service around a cache driver
067 *
068 * @param \phpbb\cache\driver\driver_interface $driver The cache driver
069 * @param \phpbb\config\config $config The config
070 * @param \phpbb\db\driver\driver_interface $db Database connection
071 * @param \phpbb\event\dispatcher $dispatcher Event dispatcher
072 * @param string $phpbb_root_path Root path
073 * @param string $php_ext PHP file extension
074 */
075 public function __construct(\phpbb\cache\driver\driver_interface $driver, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\event\dispatcher $dispatcher, $phpbb_root_path, $php_ext)
076 {
077 $this->set_driver($driver);
078 $this->config = $config;
079 $this->db = $db;
080 $this->dispatcher = $dispatcher;
081 $this->phpbb_root_path = $phpbb_root_path;
082 $this->php_ext = $php_ext;
083 }
084
085 /**
086 * Returns the cache driver used by this cache service.
087 *
088 * @return \phpbb\cache\driver\driver_interface The cache driver
089 */
090 public function get_driver()
091 {
092 return $this->driver;
093 }
094
095 /**
096 * Deferred purge of the cache.
097 *
098 * A deferred purge will be executed after rendering a page.
099 * It is recommended to be used in cases where an instant purge of the cache
100 * is not required, i.e. when the goal of a cache purge is to start from a
101 * clear cache at the next page load.
102 *
103 * @return void
104 */
105 public function deferred_purge(): void
106 {
107 if (!$this->cache_purge_deferred)
108 {
109 $this->dispatcher->addListener(self::PURGE_DEFERRED_ON_EVENT, [$this, 'purge']);
110 $this->cache_purge_deferred = true;
111 }
112 }
113
114 /**
115 * Replaces the cache driver used by this cache service.
116 *
117 * @param \phpbb\cache\driver\driver_interface $driver The cache driver
118 */
119 public function set_driver(\phpbb\cache\driver\driver_interface $driver)
120 {
121 $this->driver = $driver;
122 }
123
124 public function __call($method, $arguments)
125 {
126 return call_user_func_array(array($this->driver, $method), $arguments);
127 }
128
129 /**
130 * Obtain list of naughty words and build preg style replacement arrays for use by the
131 * calling script
132 */
133 function obtain_word_list()
134 {
135 if (($censors = $this->driver->get('_word_censors')) === false)
136 {
137 $sql = 'SELECT word, replacement
138 FROM ' . WORDS_TABLE;
139 $result = $this->db->sql_query($sql);
140
141 $censors = array();
142 while ($row = $this->db->sql_fetchrow($result))
143 {
144 $censors['match'][] = get_censor_preg_expression($row['word']);
145 $censors['replace'][] = $row['replacement'];
146 }
147 $this->db->sql_freeresult($result);
148
149 $this->driver->put('_word_censors', $censors);
150 }
151
152 return $censors;
153 }
154
155 /**
156 * Obtain currently listed icons
157 */
158 function obtain_icons()
159 {
160 if (($icons = $this->driver->get('_icons')) === false)
161 {
162 // Topic icons
163 $sql = 'SELECT *
164 FROM ' . ICONS_TABLE . '
165 ORDER BY icons_order';
166 $result = $this->db->sql_query($sql);
167
168 $icons = array();
169 while ($row = $this->db->sql_fetchrow($result))
170 {
171 $icons[$row['icons_id']]['img'] = $row['icons_url'];
172 $icons[$row['icons_id']]['width'] = (int) $row['icons_width'];
173 $icons[$row['icons_id']]['height'] = (int) $row['icons_height'];
174 $icons[$row['icons_id']]['alt'] = ($row['icons_alt']) ? $row['icons_alt'] : '';
175 $icons[$row['icons_id']]['display'] = (bool) $row['display_on_posting'];
176 }
177 $this->db->sql_freeresult($result);
178
179 $this->driver->put('_icons', $icons);
180 }
181
182 return $icons;
183 }
184
185 /**
186 * Obtain ranks
187 */
188 function obtain_ranks()
189 {
190 if (($ranks = $this->driver->get('_ranks')) === false)
191 {
192 $sql = 'SELECT *
193 FROM ' . RANKS_TABLE . '
194 ORDER BY rank_min DESC';
195 $result = $this->db->sql_query($sql);
196
197 $ranks = array();
198 while ($row = $this->db->sql_fetchrow($result))
199 {
200 if ($row['rank_special'])
201 {
202 unset($row['rank_min']);
203 $ranks['special'][$row['rank_id']] = $row;
204 }
205 else
206 {
207 $ranks['normal'][$row['rank_id']] = $row;
208 }
209 }
210 $this->db->sql_freeresult($result);
211
212 $this->driver->put('_ranks', $ranks);
213 }
214
215 return $ranks;
216 }
217
218 /**
219 * Obtain allowed extensions
220 *
221 * @param mixed $forum_id If false then check for private messaging, if int then check for forum id. If true, then only return extension informations.
222 *
223 * @return array allowed extensions array.
224 */
225 function obtain_attach_extensions($forum_id)
226 {
227 if (($extensions = $this->driver->get('_extensions')) === false)
228 {
229 $extensions = array(
230 '_allowed_post' => array(),
231 '_allowed_pm' => array(),
232 );
233
234 // The rule is to only allow those extensions defined. ;)
235 $sql = 'SELECT e.extension, g.*
236 FROM ' . EXTENSIONS_TABLE . ' e, ' . EXTENSION_GROUPS_TABLE . ' g
237 WHERE e.group_id = g.group_id
238 AND (g.allow_group = 1 OR g.allow_in_pm = 1)';
239 $result = $this->db->sql_query($sql);
240
241 while ($row = $this->db->sql_fetchrow($result))
242 {
243 $extension = strtolower(trim($row['extension']));
244
245 $extensions[$extension] = array(
246 'display_cat' => (int) $row['cat_id'],
247 'download_mode' => (int) $row['download_mode'],
248 'upload_icon' => trim($row['upload_icon']),
249 'max_filesize' => (int) $row['max_filesize'],
250 'allow_group' => $row['allow_group'],
251 'allow_in_pm' => $row['allow_in_pm'],
252 'group_name' => $row['group_name'],
253 );
254
255 $allowed_forums = ($row['allowed_forums']) ? unserialize(trim($row['allowed_forums'])) : array();
256
257 // Store allowed extensions forum wise
258 if ($row['allow_group'])
259 {
260 $extensions['_allowed_post'][$extension] = (!count($allowed_forums)) ? 0 : $allowed_forums;
261 }
262
263 if ($row['allow_in_pm'])
264 {
265 $extensions['_allowed_pm'][$extension] = 0;
266 }
267 }
268 $this->db->sql_freeresult($result);
269
270 $this->driver->put('_extensions', $extensions);
271 }
272
273 // Forum post
274 if ($forum_id === false)
275 {
276 // We are checking for private messages, therefore we only need to get the pm extensions...
277 $return = array('_allowed_' => array());
278
279 foreach ($extensions['_allowed_pm'] as $extension => $check)
280 {
281 $return['_allowed_'][$extension] = 0;
282 $return[$extension] = $extensions[$extension];
283 }
284
285 $extensions = $return;
286 }
287 else if ($forum_id === true)
288 {
289 return $extensions;
290 }
291 else
292 {
293 $forum_id = (int) $forum_id;
294 $return = array('_allowed_' => array());
295
296 foreach ($extensions['_allowed_post'] as $extension => $check)
297 {
298 // Check for allowed forums
299 if (is_array($check))
300 {
301 $allowed = (!in_array($forum_id, $check)) ? false : true;
302 }
303 else
304 {
305 $allowed = true;
306 }
307
308 if ($allowed)
309 {
310 $return['_allowed_'][$extension] = 0;
311 $return[$extension] = $extensions[$extension];
312 }
313 }
314
315 $extensions = $return;
316 }
317
318 if (!isset($extensions['_allowed_']))
319 {
320 $extensions['_allowed_'] = array();
321 }
322
323 return $extensions;
324 }
325
326 /**
327 * Obtain active bots
328 */
329 function obtain_bots()
330 {
331 if (($bots = $this->driver->get('_bots')) === false)
332 {
333 switch ($this->db->get_sql_layer())
334 {
335 case 'mssql_odbc':
336 case 'mssqlnative':
337 $sql = 'SELECT user_id, bot_agent, bot_ip
338 FROM ' . BOTS_TABLE . '
339 WHERE bot_active = 1
340 ORDER BY LEN(bot_agent) DESC';
341 break;
342
343 // LENGTH supported by MySQL, IBM DB2 and Oracle for sure...
344 default:
345 $sql = 'SELECT user_id, bot_agent, bot_ip
346 FROM ' . BOTS_TABLE . '
347 WHERE bot_active = 1
348 ORDER BY LENGTH(bot_agent) DESC';
349 break;
350 }
351 $result = $this->db->sql_query($sql);
352
353 $bots = array();
354 while ($row = $this->db->sql_fetchrow($result))
355 {
356 $bots[] = $row;
357 }
358 $this->db->sql_freeresult($result);
359
360 $this->driver->put('_bots', $bots);
361 }
362
363 return $bots;
364 }
365
366 /**
367 * Obtain cfg file data
368 */
369 function obtain_cfg_items($style)
370 {
371 $parsed_array = $this->driver->get('_cfg_' . $style['style_path']);
372
373 if ($parsed_array === false)
374 {
375 $parsed_array = array();
376 }
377
378 $filename = $this->phpbb_root_path . 'styles/' . $style['style_path'] . '/style.cfg';
379
380 if (!file_exists($filename))
381 {
382 return $parsed_array;
383 }
384
385 if (!isset($parsed_array['filetime']) || (($this->config['load_tplcompile'] && @filemtime($filename) > $parsed_array['filetime'])))
386 {
387 // Re-parse cfg file
388 $parsed_array = parse_cfg_file($filename);
389 $parsed_array['filetime'] = @filemtime($filename);
390
391 $this->driver->put('_cfg_' . $style['style_path'], $parsed_array);
392 }
393
394 return $parsed_array;
395 }
396
397 /**
398 * Obtain disallowed usernames
399 */
400 function obtain_disallowed_usernames()
401 {
402 if (($usernames = $this->driver->get('_disallowed_usernames')) === false)
403 {
404 $sql = 'SELECT disallow_username
405 FROM ' . DISALLOW_TABLE;
406 $result = $this->db->sql_query($sql);
407
408 $usernames = array();
409 while ($row = $this->db->sql_fetchrow($result))
410 {
411 $usernames[] = str_replace('%', '.*?', preg_quote(utf8_clean_string($row['disallow_username']), '#'));
412 }
413 $this->db->sql_freeresult($result);
414
415 $this->driver->put('_disallowed_usernames', $usernames);
416 }
417
418 return $usernames;
419 }
420 }
421