mirror of
				https://github.com/phpbb/phpbb.git
				synced 2025-10-26 13:16:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			407 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			407 lines
		
	
	
		
			8.9 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
 | |
| {
 | |
| 	/**
 | |
| 	* Cache driver.
 | |
| 	*
 | |
| 	* @var phpbb_cache_driver_interface
 | |
| 	*/
 | |
| 	protected $driver;
 | |
| 
 | |
| 	/**
 | |
| 	* The config.
 | |
| 	*
 | |
| 	* @var phpbb_config
 | |
| 	*/
 | |
| 	protected $config;
 | |
| 
 | |
| 	/**
 | |
| 	* Database connection.
 | |
| 	*
 | |
| 	* @var phpbb_db_driver
 | |
| 	*/
 | |
| 	protected $db;
 | |
| 
 | |
| 	/**
 | |
| 	* Root path.
 | |
| 	*
 | |
| 	* @var string
 | |
| 	*/
 | |
| 	protected $phpbb_root_path;
 | |
| 
 | |
| 	/**
 | |
| 	* PHP extension.
 | |
| 	*
 | |
| 	* @var string
 | |
| 	*/
 | |
| 	protected $php_ext;
 | |
| 
 | |
| 	/**
 | |
| 	* Creates a cache service around a cache driver
 | |
| 	*
 | |
| 	* @param phpbb_cache_driver_interface $driver The cache driver
 | |
| 	* @param phpbb_config $config The config
 | |
| 	* @param phpbb_db_driver $db Database connection
 | |
| 	* @param string $phpbb_root_path Root path
 | |
| 	* @param string $php_ext PHP extension
 | |
| 	*/
 | |
| 	public function __construct(phpbb_cache_driver_interface $driver, phpbb_config $config, phpbb_db_driver $db, $phpbb_root_path, $php_ext)
 | |
| 	{
 | |
| 		$this->set_driver($driver);
 | |
| 		$this->config = $config;
 | |
| 		$this->db = $db;
 | |
| 		$this->phpbb_root_path = $phpbb_root_path;
 | |
| 		$this->php_ext = $php_ext;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* 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);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Obtain list of naughty words and build preg style replacement arrays for use by the
 | |
| 	* calling script
 | |
| 	*/
 | |
| 	function obtain_word_list()
 | |
| 	{
 | |
| 		if (($censors = $this->driver->get('_word_censors')) === false)
 | |
| 		{
 | |
| 			$sql = 'SELECT word, replacement
 | |
| 				FROM ' . WORDS_TABLE;
 | |
| 			$result = $this->db->sql_query($sql);
 | |
| 
 | |
| 			$censors = array();
 | |
| 			while ($row = $this->db->sql_fetchrow($result))
 | |
| 			{
 | |
| 				$censors['match'][] = get_censor_preg_expression($row['word']);
 | |
| 				$censors['replace'][] = $row['replacement'];
 | |
| 			}
 | |
| 			$this->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)
 | |
| 		{
 | |
| 			// Topic icons
 | |
| 			$sql = 'SELECT *
 | |
| 				FROM ' . ICONS_TABLE . '
 | |
| 				ORDER BY icons_order';
 | |
| 			$result = $this->db->sql_query($sql);
 | |
| 
 | |
| 			$icons = array();
 | |
| 			while ($row = $this->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'];
 | |
| 			}
 | |
| 			$this->db->sql_freeresult($result);
 | |
| 
 | |
| 			$this->driver->put('_icons', $icons);
 | |
| 		}
 | |
| 
 | |
| 		return $icons;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Obtain ranks
 | |
| 	*/
 | |
| 	function obtain_ranks()
 | |
| 	{
 | |
| 		if (($ranks = $this->driver->get('_ranks')) === false)
 | |
| 		{
 | |
| 			$sql = 'SELECT *
 | |
| 				FROM ' . RANKS_TABLE . '
 | |
| 				ORDER BY rank_min DESC';
 | |
| 			$result = $this->db->sql_query($sql);
 | |
| 
 | |
| 			$ranks = array();
 | |
| 			while ($row = $this->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']
 | |
| 					);
 | |
| 				}
 | |
| 			}
 | |
| 			$this->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)
 | |
| 		{
 | |
| 			$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 = $this->db->sql_query($sql);
 | |
| 
 | |
| 			while ($row = $this->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;
 | |
| 				}
 | |
| 			}
 | |
| 			$this->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)
 | |
| 		{
 | |
| 			switch ($this->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 = $this->db->sql_query($sql);
 | |
| 
 | |
| 			$bots = array();
 | |
| 			while ($row = $this->db->sql_fetchrow($result))
 | |
| 			{
 | |
| 				$bots[] = $row;
 | |
| 			}
 | |
| 			$this->db->sql_freeresult($result);
 | |
| 
 | |
| 			$this->driver->put('_bots', $bots);
 | |
| 		}
 | |
| 
 | |
| 		return $bots;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	* Obtain cfg file data
 | |
| 	*/
 | |
| 	function obtain_cfg_items($style)
 | |
| 	{
 | |
| 		$parsed_array = $this->driver->get('_cfg_' . $style['style_path']);
 | |
| 
 | |
| 		if ($parsed_array === false)
 | |
| 		{
 | |
| 			$parsed_array = array();
 | |
| 		}
 | |
| 
 | |
| 		$filename = $this->phpbb_root_path . 'styles/' . $style['style_path'] . '/style.cfg';
 | |
| 
 | |
| 		if (!file_exists($filename))
 | |
| 		{
 | |
| 			return $parsed_array;
 | |
| 		}
 | |
| 
 | |
| 		if (!isset($parsed_array['filetime']) || (($this->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)
 | |
| 		{
 | |
| 			$sql = 'SELECT disallow_username
 | |
| 				FROM ' . DISALLOW_TABLE;
 | |
| 			$result = $this->db->sql_query($sql);
 | |
| 
 | |
| 			$usernames = array();
 | |
| 			while ($row = $this->db->sql_fetchrow($result))
 | |
| 			{
 | |
| 				$usernames[] = str_replace('%', '.*?', preg_quote(utf8_clean_string($row['disallow_username']), '#'));
 | |
| 			}
 | |
| 			$this->db->sql_freeresult($result);
 | |
| 
 | |
| 			$this->driver->put('_disallowed_usernames', $usernames);
 | |
| 		}
 | |
| 
 | |
| 		return $usernames;
 | |
| 	}
 | |
| }
 |