mirror of
https://github.com/phpbb/phpbb.git
synced 2025-02-24 12:03:21 +01:00
If you are using SQL Server, please try to test this new dbal so we can safely include it in 3.0.8. If you want to try it on a current phpBB version you can apply the latest version of the patch to your board which you can find attached to the bug tracker ticket (look in the comments for the latest version, the one in the ticket itself is outdated): http://www.phpbb.com/bugs/phpbb3/ticket.php?ticket_id=57055 git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@10489 89ea8834-ac86-4346-8a33-228a782c2dd0
447 lines
9.6 KiB
PHP
447 lines
9.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, extends acm_file or acm_db depending on the setup
|
|
* @package acm
|
|
*/
|
|
class cache extends acm
|
|
{
|
|
/**
|
|
* Get config values
|
|
*/
|
|
function obtain_config()
|
|
{
|
|
global $db;
|
|
|
|
if (($config = $this->get('config')) !== false)
|
|
{
|
|
$sql = 'SELECT config_name, config_value
|
|
FROM ' . CONFIG_TABLE . '
|
|
WHERE is_dynamic = 1';
|
|
$result = $db->sql_query($sql);
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$config[$row['config_name']] = $row['config_value'];
|
|
}
|
|
$db->sql_freeresult($result);
|
|
}
|
|
else
|
|
{
|
|
$config = $cached_config = array();
|
|
|
|
$sql = 'SELECT config_name, config_value, is_dynamic
|
|
FROM ' . CONFIG_TABLE;
|
|
$result = $db->sql_query($sql);
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
if (!$row['is_dynamic'])
|
|
{
|
|
$cached_config[$row['config_name']] = $row['config_value'];
|
|
}
|
|
|
|
$config[$row['config_name']] = $row['config_value'];
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$this->put('config', $cached_config);
|
|
}
|
|
|
|
return $config;
|
|
}
|
|
|
|
/**
|
|
* 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->get('_word_censors')) === false)
|
|
{
|
|
$sql = 'SELECT word, replacement
|
|
FROM ' . WORDS_TABLE;
|
|
$result = $db->sql_query($sql);
|
|
|
|
$censors = array();
|
|
$unicode = ((version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>='))) && @preg_match('/\p{L}/u', 'a') !== false) ? true : false;
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
if ($unicode)
|
|
{
|
|
$censors['match'][] = '#(?<![\p{Nd}\p{L}_])(' . str_replace('\*', '[\p{Nd}\p{L}_]*?', preg_quote($row['word'], '#')) . ')(?![\p{Nd}\p{L}_])#iu';
|
|
}
|
|
else
|
|
{
|
|
$censors['match'][] = '#(?<!\S)(' . str_replace('\*', '\S*?', preg_quote($row['word'], '#')) . ')(?!\S)#iu';
|
|
}
|
|
|
|
$censors['replace'][] = $row['replacement'];
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$this->put('_word_censors', $censors);
|
|
}
|
|
|
|
return $censors;
|
|
}
|
|
|
|
/**
|
|
* Obtain currently listed icons
|
|
*/
|
|
function obtain_icons()
|
|
{
|
|
if (($icons = $this->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->put('_icons', $icons);
|
|
}
|
|
|
|
return $icons;
|
|
}
|
|
|
|
/**
|
|
* Obtain ranks
|
|
*/
|
|
function obtain_ranks()
|
|
{
|
|
if (($ranks = $this->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->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->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->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->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->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->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->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->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->put('_disallowed_usernames', $usernames);
|
|
}
|
|
|
|
return $usernames;
|
|
}
|
|
|
|
/**
|
|
* Obtain hooks...
|
|
*/
|
|
function obtain_hooks()
|
|
{
|
|
global $phpbb_root_path, $phpEx;
|
|
|
|
if (($hook_files = $this->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->put('_hooks', $hook_files);
|
|
}
|
|
|
|
return $hook_files;
|
|
}
|
|
}
|
|
|
|
?>
|