mirror of
https://github.com/phpbb/phpbb.git
synced 2025-05-06 23:55:26 +02:00
Changes: - Ascraeus now uses constants for the phpbb root path and the php extension. This ensures more security for external applications and modifications (no more overwriting of root path and extension possible through insecure mods and register globals enabled) as well as no more globalizing needed. - A second change implemented here is an additional short-hand-notation for append_sid(). It is allowed to omit the root path and extension now (for example calling append_sid('memberlist')) - in this case the root path and extension get added automatically. The hook is called after these are added. git-svn-id: file:///svn/phpbb/trunk@8572 89ea8834-ac86-4346-8a33-228a782c2dd0
422 lines
8.9 KiB
PHP
422 lines
8.9 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
|
|
{
|
|
/**
|
|
* Get config values
|
|
*/
|
|
public static function obtain_config()
|
|
{
|
|
global $db, $cache;
|
|
|
|
if (($config = $cache->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);
|
|
|
|
$cache->put('config', $cached_config);
|
|
}
|
|
|
|
return $config;
|
|
}
|
|
|
|
/**
|
|
* Obtain list of naughty words and build preg style replacement arrays for use by the
|
|
* calling script
|
|
*/
|
|
public static function obtain_word_list()
|
|
{
|
|
global $cache;
|
|
|
|
if (($censors = $cache->get('_word_censors')) === false)
|
|
{
|
|
global $db;
|
|
|
|
$sql = 'SELECT word, replacement
|
|
FROM ' . WORDS_TABLE;
|
|
$result = $db->sql_query($sql);
|
|
|
|
$censors = array();
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$censors['match'][] = '#(?<!\w)(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')(?!\w)#i';
|
|
$censors['replace'][] = $row['replacement'];
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$cache->put('_word_censors', $censors);
|
|
}
|
|
|
|
return $censors;
|
|
}
|
|
|
|
/**
|
|
* Obtain currently listed icons
|
|
*/
|
|
public static function obtain_icons()
|
|
{
|
|
global $cache;
|
|
|
|
if (($icons = $cache->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);
|
|
|
|
$cache->put('_icons', $icons);
|
|
}
|
|
|
|
return $icons;
|
|
}
|
|
|
|
/**
|
|
* Obtain ranks
|
|
*/
|
|
public static function obtain_ranks()
|
|
{
|
|
global $cache;
|
|
|
|
if (($ranks = $cache->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);
|
|
|
|
$cache->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.
|
|
*/
|
|
public static function obtain_attach_extensions($forum_id)
|
|
{
|
|
global $cache;
|
|
|
|
if (($extensions = $cache->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);
|
|
|
|
$cache->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
|
|
*/
|
|
public static function obtain_bots()
|
|
{
|
|
global $cache;
|
|
|
|
if (($bots = $cache->get('_bots')) === false)
|
|
{
|
|
global $db;
|
|
|
|
$sql = 'SELECT user_id, bot_agent, bot_ip
|
|
FROM ' . BOTS_TABLE . '
|
|
WHERE bot_active = 1
|
|
ORDER BY ' . $db->sql_function('length_varchar', 'bot_agent') . 'DESC';
|
|
$result = $db->sql_query($sql);
|
|
|
|
$bots = array();
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$bots[] = $row;
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$cache->put('_bots', $bots);
|
|
}
|
|
|
|
return $bots;
|
|
}
|
|
|
|
/**
|
|
* Obtain cfg file data
|
|
*
|
|
* @param array $theme An array containing the path to the item
|
|
*
|
|
* @param string $item The specific item to get: 'theme', 'template', or 'imageset'
|
|
*
|
|
*/
|
|
public static function obtain_cfg_item($theme, $item = 'theme')
|
|
{
|
|
global $config, $cache;
|
|
|
|
$parsed_array = $cache->get('_cfg_' . $item . '_' . $theme[$item . '_path']);
|
|
|
|
if ($parsed_array === false)
|
|
{
|
|
$parsed_array = array();
|
|
}
|
|
|
|
$reparse = false;
|
|
$filename = PHPBB_ROOT_PATH . 'styles/' . $theme[$item . '_path'] . '/' . $item . '/' . $item . '.cfg';
|
|
|
|
if (!file_exists($filename))
|
|
{
|
|
return $parsed_array;
|
|
}
|
|
|
|
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);
|
|
|
|
$cache->put('_cfg_' . $item . '_' . $theme[$item . '_path'], $parsed_array);
|
|
}
|
|
|
|
return $parsed_array;
|
|
}
|
|
|
|
/**
|
|
* Obtain disallowed usernames
|
|
*/
|
|
public static function obtain_disallowed_usernames()
|
|
{
|
|
global $cache;
|
|
|
|
if (($usernames = $cache->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);
|
|
|
|
$cache->put('_disallowed_usernames', $usernames);
|
|
}
|
|
|
|
return $usernames;
|
|
}
|
|
|
|
/**
|
|
* Obtain hooks...
|
|
*/
|
|
public static function obtain_hooks()
|
|
{
|
|
global $cache;
|
|
|
|
if (($hook_files = $cache->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(PHP_EXT) + 1)) === '.' . PHP_EXT)
|
|
{
|
|
$hook_files[] = substr($file, 0, -(strlen(PHP_EXT) + 1));
|
|
}
|
|
}
|
|
closedir($dh);
|
|
}
|
|
|
|
$cache->put('_hooks', $hook_files);
|
|
}
|
|
|
|
return $hook_files;
|
|
}
|
|
}
|
|
|
|
?>
|