Вход Регистрация
Файл: phpbb/cache/service.php
Строк: 307
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/

namespace phpbbcache;

/**
* Class for grabbing/handling cached entries
*/
class service
{
    
/**
    * Cache driver.
    *
    * @var phpbbcachedriverdriver_interface
    */
    
protected $driver;

    
/**
    * The config.
    *
    * @var phpbbconfigconfig
    */
    
protected $config;

    
/**
    * Database connection.
    *
    * @var phpbbdbdriverdriver_interface
    */
    
protected $db;

    
/**
    * Root path.
    *
    * @var string
    */
    
protected $phpbb_root_path;

    
/**
    * PHP file extension.
    *
    * @var string
    */
    
protected $php_ext;

    
/**
    * Creates a cache service around a cache driver
    *
    * @param phpbbcachedriverdriver_interface $driver The cache driver
    * @param phpbbconfigconfig $config The config
    * @param phpbbdbdriverdriver_interface $db Database connection
    * @param string $phpbb_root_path Root path
    * @param string $php_ext PHP file extension
    */
    
public function __construct(phpbbcachedriverdriver_interface $driverphpbbconfigconfig $configphpbbdbdriverdriver_interface $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 phpbbcachedriverdriver_interface The cache driver
    */
    
public function get_driver()
    {
        return 
$this->driver;
    }

    
/**
    * Replaces the cache driver used by this cache service.
    *
    * @param phpbbcachedriverdriver_interface $driver The cache driver
    */
    
public function set_driver(phpbbcachedriverdriver_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'])
                {
                    unset(
$row['rank_min']);
                    
$ranks['special'][$row['rank_id']] = $row;
                }
                else
                {
                    
$ranks['normal'][$row['rank_id']] = $row;
                }
            }
            
$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)) ? $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->get_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;

                
// 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;
    }
}
Онлайн: 0
Реклама