mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-15 15:58:52 +00:00
There is a phpbb_config class which simply holds an array and does not persist any data. It implements ArrayAccess, Countable and IteratorAggregate to allow regular use of configuration as if it was still an array. The phpbb_config_db class depends on an instance of the dbal and a cache driver. It obtains the configuration data from cache and database as necessary and persists data to the database. The functions set_config and set_config_count remain for backward compatability but they only call methods on the new config class now instead of directly manipulating the database and cache. PHPBB3-9988
407 lines
8.6 KiB
PHP
407 lines
8.6 KiB
PHP
<?php
|
|
/**
|
|
*
|
|
* @package acm
|
|
* @version $Id$
|
|
* @copyright (c) 2005 phpBB Group
|
|
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @ignore
|
|
*/
|
|
if (!defined('IN_PHPBB'))
|
|
{
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Class for grabbing/handling cached entries
|
|
* @package acm
|
|
*/
|
|
class phpbb_cache_service
|
|
{
|
|
private $acm;
|
|
|
|
public function __construct(phpbb_cache_driver_interface $acm = null)
|
|
{
|
|
$this->set_acm($acm);
|
|
}
|
|
|
|
public function set_acm(phpbb_cache_driver_interface $acm)
|
|
{
|
|
$this->acm = $acm;
|
|
}
|
|
|
|
public function __call($method, $arguments)
|
|
{
|
|
return call_user_func_array(array($this->acm, $method), $arguments);
|
|
}
|
|
|
|
/**
|
|
* 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->acm->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->acm->put('_word_censors', $censors);
|
|
}
|
|
|
|
return $censors;
|
|
}
|
|
|
|
/**
|
|
* Obtain currently listed icons
|
|
*/
|
|
function obtain_icons()
|
|
{
|
|
if (($icons = $this->acm->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->acm->put('_icons', $icons);
|
|
}
|
|
|
|
return $icons;
|
|
}
|
|
|
|
/**
|
|
* Obtain ranks
|
|
*/
|
|
function obtain_ranks()
|
|
{
|
|
if (($ranks = $this->acm->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->acm->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->acm->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'],
|
|
);
|
|
|
|
$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->acm->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->acm->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->acm->put('_bots', $bots);
|
|
}
|
|
|
|
return $bots;
|
|
}
|
|
|
|
/**
|
|
* Obtain cfg file data
|
|
*/
|
|
function obtain_cfg_items($theme)
|
|
{
|
|
global $config, $phpbb_root_path;
|
|
|
|
$parsed_items = array(
|
|
'theme' => array(),
|
|
'template' => array(),
|
|
'imageset' => array()
|
|
);
|
|
|
|
foreach ($parsed_items as $key => $parsed_array)
|
|
{
|
|
$parsed_array = $this->acm->get('_cfg_' . $key . '_' . $theme[$key . '_path']);
|
|
|
|
if ($parsed_array === false)
|
|
{
|
|
$parsed_array = array();
|
|
}
|
|
|
|
$reparse = false;
|
|
$filename = $phpbb_root_path . 'styles/' . $theme[$key . '_path'] . '/' . $key . '/' . $key . '.cfg';
|
|
|
|
if (!file_exists($filename))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (!isset($parsed_array['filetime']) || (($config['load_tplcompile'] && @filemtime($filename) > $parsed_array['filetime'])))
|
|
{
|
|
$reparse = true;
|
|
}
|
|
|
|
// Re-parse cfg file
|
|
if ($reparse)
|
|
{
|
|
$parsed_array = parse_cfg_file($filename);
|
|
$parsed_array['filetime'] = @filemtime($filename);
|
|
|
|
$this->acm->put('_cfg_' . $key . '_' . $theme[$key . '_path'], $parsed_array);
|
|
}
|
|
$parsed_items[$key] = $parsed_array;
|
|
}
|
|
|
|
return $parsed_items;
|
|
}
|
|
|
|
/**
|
|
* Obtain disallowed usernames
|
|
*/
|
|
function obtain_disallowed_usernames()
|
|
{
|
|
if (($usernames = $this->acm->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->acm->put('_disallowed_usernames', $usernames);
|
|
}
|
|
|
|
return $usernames;
|
|
}
|
|
|
|
/**
|
|
* Obtain hooks...
|
|
*/
|
|
function obtain_hooks()
|
|
{
|
|
global $phpbb_root_path, $phpEx;
|
|
|
|
if (($hook_files = $this->acm->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->acm->put('_hooks', $hook_files);
|
|
}
|
|
|
|
return $hook_files;
|
|
}
|
|
}
|