mirror of
https://github.com/phpbb/phpbb.git
synced 2025-07-30 13:30:25 +02:00
* upstream/develop: (666 commits) [ticket/11077] Remove code from old global announcements system [ticket/11189] Replace DEBUG_EXTRA with DEBUG [ticket/11189] Always log critical errors when in cron or in image output [ticket/11187] Added a blank array to fix errors in functional tests [ticket/10780] Make L_COLON available in the installer. [ticket/11183] Remove $load_extensions and weird dl() calls [ticket/10970] Added extra documentation to parse_dynamic_path. [ticket/10939] Added documentation for phpbb_request::file [ticket/10865] Use code tags for install/database_update.php. [ticket/10865] Should have been a slash. [ticket/10780] Use L_COLON on LDAP page. [ticket/10780] Use L_COLON on search backend ACP pages. [ticket/10780] Use L_COLON for "download all attachments". [ticket/10780] Use colon from language in ucp_pm_compose.php where possible. [ticket/10780] Replace colons in phpBB/adm/style/acp_ext_details.html. [ticket/10780] Replace colon usage in adm template output with {L_COLON} [ticket/10780] Replace colon usage in template output with {L_COLON} [ticket/11181] Bump PHP requirement to 5.3.3 (from 5.3.2) [develop-olympus] [ticket/11181] Bump PHP requirement to 5.3.3 (from 5.3.2) [ticket/10172] Show prosilver birthday list even if there are no birthdays. ... Conflicts: phpBB/common.php phpBB/download/file.php phpBB/includes/db/dbal.php phpBB/includes/db/firebird.php phpBB/includes/db/mssql.php phpBB/includes/db/mssql_odbc.php phpBB/includes/db/mssqlnative.php phpBB/includes/db/mysql.php phpBB/includes/db/mysqli.php phpBB/includes/db/oracle.php phpBB/includes/db/postgres.php phpBB/includes/db/sqlite.php phpBB/includes/extension/manager.php phpBB/install/database_update.php
452 lines
9.7 KiB
PHP
452 lines
9.7 KiB
PHP
<?php
|
|
/**
|
|
*
|
|
* @package acm
|
|
* @copyright (c) 2005 phpBB Group
|
|
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
if (!defined('IN_PHPBB'))
|
|
{
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Class for grabbing/handling cached entries
|
|
* @package acm
|
|
*/
|
|
class phpbb_cache_service
|
|
{
|
|
private $driver;
|
|
|
|
/**
|
|
* Creates a cache service around a cache driver
|
|
*
|
|
* @param phpbb_cache_driver_interface $driver The cache driver
|
|
*/
|
|
public function __construct(phpbb_cache_driver_interface $driver = null)
|
|
{
|
|
$this->set_driver($driver);
|
|
}
|
|
|
|
/**
|
|
* Returns the cache driver used by this cache service.
|
|
*
|
|
* @return phpbb_cache_driver_interface The cache driver
|
|
*/
|
|
public function get_driver()
|
|
{
|
|
return $this->driver;
|
|
}
|
|
|
|
/**
|
|
* Replaces the cache driver used by this cache service.
|
|
*
|
|
* @param phpbb_cache_driver_interface $driver The cache driver
|
|
*/
|
|
public function set_driver(phpbb_cache_driver_interface $driver)
|
|
{
|
|
$this->driver = $driver;
|
|
}
|
|
|
|
public function __call($method, $arguments)
|
|
{
|
|
return call_user_func_array(array($this->driver, $method), $arguments);
|
|
}
|
|
|
|
public function __get($var)
|
|
{
|
|
return $this->driver->$var;
|
|
}
|
|
|
|
/**
|
|
* Obtain list of naughty words and build preg style replacement arrays for use by the
|
|
* calling script
|
|
*/
|
|
function obtain_word_list()
|
|
{
|
|
global $db;
|
|
|
|
if (($censors = $this->driver->get('_word_censors')) === false)
|
|
{
|
|
$sql = 'SELECT word, replacement
|
|
FROM ' . WORDS_TABLE;
|
|
$result = $db->sql_query($sql);
|
|
|
|
$censors = array();
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$censors['match'][] = get_censor_preg_expression($row['word']);
|
|
$censors['replace'][] = $row['replacement'];
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$this->driver->put('_word_censors', $censors);
|
|
}
|
|
|
|
return $censors;
|
|
}
|
|
|
|
/**
|
|
* Obtain currently listed icons
|
|
*/
|
|
function obtain_icons()
|
|
{
|
|
if (($icons = $this->driver->get('_icons')) === false)
|
|
{
|
|
global $db;
|
|
|
|
// Topic icons
|
|
$sql = 'SELECT *
|
|
FROM ' . ICONS_TABLE . '
|
|
ORDER BY icons_order';
|
|
$result = $db->sql_query($sql);
|
|
|
|
$icons = array();
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$icons[$row['icons_id']]['img'] = $row['icons_url'];
|
|
$icons[$row['icons_id']]['width'] = (int) $row['icons_width'];
|
|
$icons[$row['icons_id']]['height'] = (int) $row['icons_height'];
|
|
$icons[$row['icons_id']]['display'] = (bool) $row['display_on_posting'];
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$this->driver->put('_icons', $icons);
|
|
}
|
|
|
|
return $icons;
|
|
}
|
|
|
|
/**
|
|
* Obtain ranks
|
|
*/
|
|
function obtain_ranks()
|
|
{
|
|
if (($ranks = $this->driver->get('_ranks')) === false)
|
|
{
|
|
global $db;
|
|
|
|
$sql = 'SELECT *
|
|
FROM ' . RANKS_TABLE . '
|
|
ORDER BY rank_min DESC';
|
|
$result = $db->sql_query($sql);
|
|
|
|
$ranks = array();
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
if ($row['rank_special'])
|
|
{
|
|
$ranks['special'][$row['rank_id']] = array(
|
|
'rank_title' => $row['rank_title'],
|
|
'rank_image' => $row['rank_image']
|
|
);
|
|
}
|
|
else
|
|
{
|
|
$ranks['normal'][] = array(
|
|
'rank_title' => $row['rank_title'],
|
|
'rank_min' => $row['rank_min'],
|
|
'rank_image' => $row['rank_image']
|
|
);
|
|
}
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$this->driver->put('_ranks', $ranks);
|
|
}
|
|
|
|
return $ranks;
|
|
}
|
|
|
|
/**
|
|
* Obtain allowed extensions
|
|
*
|
|
* @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.
|
|
*
|
|
* @return array allowed extensions array.
|
|
*/
|
|
function obtain_attach_extensions($forum_id)
|
|
{
|
|
if (($extensions = $this->driver->get('_extensions')) === false)
|
|
{
|
|
global $db;
|
|
|
|
$extensions = array(
|
|
'_allowed_post' => array(),
|
|
'_allowed_pm' => array(),
|
|
);
|
|
|
|
// The rule is to only allow those extensions defined. ;)
|
|
$sql = 'SELECT e.extension, g.*
|
|
FROM ' . EXTENSIONS_TABLE . ' e, ' . EXTENSION_GROUPS_TABLE . ' g
|
|
WHERE e.group_id = g.group_id
|
|
AND (g.allow_group = 1 OR g.allow_in_pm = 1)';
|
|
$result = $db->sql_query($sql);
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$extension = strtolower(trim($row['extension']));
|
|
|
|
$extensions[$extension] = array(
|
|
'display_cat' => (int) $row['cat_id'],
|
|
'download_mode' => (int) $row['download_mode'],
|
|
'upload_icon' => trim($row['upload_icon']),
|
|
'max_filesize' => (int) $row['max_filesize'],
|
|
'allow_group' => $row['allow_group'],
|
|
'allow_in_pm' => $row['allow_in_pm'],
|
|
'group_name' => $row['group_name'],
|
|
);
|
|
|
|
$allowed_forums = ($row['allowed_forums']) ? unserialize(trim($row['allowed_forums'])) : array();
|
|
|
|
// Store allowed extensions forum wise
|
|
if ($row['allow_group'])
|
|
{
|
|
$extensions['_allowed_post'][$extension] = (!sizeof($allowed_forums)) ? 0 : $allowed_forums;
|
|
}
|
|
|
|
if ($row['allow_in_pm'])
|
|
{
|
|
$extensions['_allowed_pm'][$extension] = 0;
|
|
}
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$this->driver->put('_extensions', $extensions);
|
|
}
|
|
|
|
// Forum post
|
|
if ($forum_id === false)
|
|
{
|
|
// We are checking for private messages, therefore we only need to get the pm extensions...
|
|
$return = array('_allowed_' => array());
|
|
|
|
foreach ($extensions['_allowed_pm'] as $extension => $check)
|
|
{
|
|
$return['_allowed_'][$extension] = 0;
|
|
$return[$extension] = $extensions[$extension];
|
|
}
|
|
|
|
$extensions = $return;
|
|
}
|
|
else if ($forum_id === true)
|
|
{
|
|
return $extensions;
|
|
}
|
|
else
|
|
{
|
|
$forum_id = (int) $forum_id;
|
|
$return = array('_allowed_' => array());
|
|
|
|
foreach ($extensions['_allowed_post'] as $extension => $check)
|
|
{
|
|
// Check for allowed forums
|
|
if (is_array($check))
|
|
{
|
|
$allowed = (!in_array($forum_id, $check)) ? false : true;
|
|
}
|
|
else
|
|
{
|
|
$allowed = true;
|
|
}
|
|
|
|
if ($allowed)
|
|
{
|
|
$return['_allowed_'][$extension] = 0;
|
|
$return[$extension] = $extensions[$extension];
|
|
}
|
|
}
|
|
|
|
$extensions = $return;
|
|
}
|
|
|
|
if (!isset($extensions['_allowed_']))
|
|
{
|
|
$extensions['_allowed_'] = array();
|
|
}
|
|
|
|
return $extensions;
|
|
}
|
|
|
|
/**
|
|
* Obtain active bots
|
|
*/
|
|
function obtain_bots()
|
|
{
|
|
if (($bots = $this->driver->get('_bots')) === false)
|
|
{
|
|
global $db;
|
|
|
|
switch ($db->sql_layer)
|
|
{
|
|
case 'mssql':
|
|
case 'mssql_odbc':
|
|
case 'mssqlnative':
|
|
$sql = 'SELECT user_id, bot_agent, bot_ip
|
|
FROM ' . BOTS_TABLE . '
|
|
WHERE bot_active = 1
|
|
ORDER BY LEN(bot_agent) DESC';
|
|
break;
|
|
|
|
case 'firebird':
|
|
$sql = 'SELECT user_id, bot_agent, bot_ip
|
|
FROM ' . BOTS_TABLE . '
|
|
WHERE bot_active = 1
|
|
ORDER BY CHAR_LENGTH(bot_agent) DESC';
|
|
break;
|
|
|
|
// LENGTH supported by MySQL, IBM DB2 and Oracle for sure...
|
|
default:
|
|
$sql = 'SELECT user_id, bot_agent, bot_ip
|
|
FROM ' . BOTS_TABLE . '
|
|
WHERE bot_active = 1
|
|
ORDER BY LENGTH(bot_agent) DESC';
|
|
break;
|
|
}
|
|
$result = $db->sql_query($sql);
|
|
|
|
$bots = array();
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$bots[] = $row;
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$this->driver->put('_bots', $bots);
|
|
}
|
|
|
|
return $bots;
|
|
}
|
|
|
|
/**
|
|
* Obtain cfg file data
|
|
*/
|
|
function obtain_cfg_items($style)
|
|
{
|
|
global $config, $phpbb_root_path;
|
|
|
|
$parsed_array = $this->driver->get('_cfg_' . $style['style_path']);
|
|
|
|
if ($parsed_array === false)
|
|
{
|
|
$parsed_array = array();
|
|
}
|
|
|
|
$filename = $phpbb_root_path . 'styles/' . $style['style_path'] . '/style.cfg';
|
|
|
|
if (!file_exists($filename))
|
|
{
|
|
return $parsed_array;
|
|
}
|
|
|
|
if (!isset($parsed_array['filetime']) || (($config['load_tplcompile'] && @filemtime($filename) > $parsed_array['filetime'])))
|
|
{
|
|
// Re-parse cfg file
|
|
$parsed_array = parse_cfg_file($filename);
|
|
$parsed_array['filetime'] = @filemtime($filename);
|
|
|
|
$this->driver->put('_cfg_' . $style['style_path'], $parsed_array);
|
|
}
|
|
|
|
return $parsed_array;
|
|
}
|
|
|
|
/**
|
|
* Obtain disallowed usernames
|
|
*/
|
|
function obtain_disallowed_usernames()
|
|
{
|
|
if (($usernames = $this->driver->get('_disallowed_usernames')) === false)
|
|
{
|
|
global $db;
|
|
|
|
$sql = 'SELECT disallow_username
|
|
FROM ' . DISALLOW_TABLE;
|
|
$result = $db->sql_query($sql);
|
|
|
|
$usernames = array();
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$usernames[] = str_replace('%', '.*?', preg_quote(utf8_clean_string($row['disallow_username']), '#'));
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$this->driver->put('_disallowed_usernames', $usernames);
|
|
}
|
|
|
|
return $usernames;
|
|
}
|
|
|
|
/**
|
|
* Obtain hooks...
|
|
*/
|
|
function obtain_hooks()
|
|
{
|
|
global $phpbb_root_path, $phpEx;
|
|
|
|
if (($hook_files = $this->driver->get('_hooks')) === false)
|
|
{
|
|
$hook_files = array();
|
|
|
|
// Now search for hooks...
|
|
$dh = @opendir($phpbb_root_path . 'includes/hooks/');
|
|
|
|
if ($dh)
|
|
{
|
|
while (($file = readdir($dh)) !== false)
|
|
{
|
|
if (strpos($file, 'hook_') === 0 && substr($file, -(strlen($phpEx) + 1)) === '.' . $phpEx)
|
|
{
|
|
$hook_files[] = substr($file, 0, -(strlen($phpEx) + 1));
|
|
}
|
|
}
|
|
closedir($dh);
|
|
}
|
|
|
|
$this->driver->put('_hooks', $hook_files);
|
|
}
|
|
|
|
return $hook_files;
|
|
}
|
|
|
|
public function sql_load()
|
|
{
|
|
return call_user_func_array(array($this->driver, __FUNCTION__), func_get_args());
|
|
}
|
|
|
|
public function sql_save($query, &$query_result, $ttl)
|
|
{
|
|
return call_user_func_array(array($this->driver, __FUNCTION__), array($query, &$query_result, $ttl));
|
|
}
|
|
|
|
public function sql_exists()
|
|
{
|
|
return call_user_func_array(array($this->driver, __FUNCTION__), func_get_args());
|
|
}
|
|
|
|
public function sql_fetchrow()
|
|
{
|
|
return call_user_func_array(array($this->driver, __FUNCTION__), func_get_args());
|
|
}
|
|
|
|
public function sql_fetchfield()
|
|
{
|
|
return call_user_func_array(array($this->driver, __FUNCTION__), func_get_args());
|
|
}
|
|
|
|
public function sql_rowseek()
|
|
{
|
|
return call_user_func_array(array($this->driver, __FUNCTION__), func_get_args());
|
|
}
|
|
|
|
public function sql_freeresult()
|
|
{
|
|
return call_user_func_array(array($this->driver, __FUNCTION__), func_get_args());
|
|
}
|
|
}
|