Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
14 / 14
CRAP
100.00% covered (success)
100.00%
110 / 110
manager
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
14 / 14
37
100.00% covered (success)
100.00%
110 / 110
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 register_avatar_drivers
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
7 / 7
 get_driver
100.00% covered (success)
100.00%
1 / 1
7
100.00% covered (success)
100.00%
19 / 19
 load_enabled_drivers
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
12 / 12
 get_all_drivers
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
9 / 9
 get_enabled_drivers
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
5 / 5
 clean_row
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
13 / 13
 clean_driver_name
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 prepare_driver_name
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 is_enabled
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 get_avatar_settings
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 localize_errors
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
9 / 9
 handle_avatar_delete
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
20 / 20
 prefix_avatar_columns
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
5 / 5
<?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 phpbb\avatar;
class manager
{
    /**
    * phpBB configuration
    * @var \phpbb\config\config
    */
    protected $config;
    /**
    * phpBB event dispatcher
    * @var \phpbb\event\dispatcher_interface
    */
    protected $phpbb_dispatcher;
    /**
    * Array that contains a list of enabled drivers
    * @var array
    */
    static protected $enabled_drivers = false;
    /**
    * Array that contains all available avatar drivers which are passed via the
    * service container
    * @var array
    */
    protected $avatar_drivers;
    /**
    * Default avatar data row
    * @var array
    */
    static protected $default_row = array(
        'avatar'        => '',
        'avatar_type'    => '',
        'avatar_width'    => 0,
        'avatar_height'    => 0,
    );
    /**
    * Construct an avatar manager object
    *
    * @param \phpbb\config\config $config phpBB configuration
    * @param \phpbb\event\dispatcher_interface $phpbb_dispatcher phpBB event dispatcher
    * @param array $avatar_drivers Avatar drivers passed via the service container
    */
    public function __construct(\phpbb\config\config $config, \phpbb\event\dispatcher_interface $phpbb_dispatcher, $avatar_drivers)
    {
        $this->config = $config;
        $this->phpbb_dispatcher = $phpbb_dispatcher;
        $this->register_avatar_drivers($avatar_drivers);
    }
    /**
    * Register avatar drivers
    *
    * @param array $avatar_drivers Service collection of avatar drivers
    */
    protected function register_avatar_drivers($avatar_drivers)
    {
        if (!empty($avatar_drivers))
        {
            foreach ($avatar_drivers as $driver)
            {
                $this->avatar_drivers[$driver->get_name()] = $driver;
            }
        }
    }
    /**
    * Get the driver object specified by the avatar type
    *
    * @param string $avatar_type Avatar type; by default an avatar's service container name
    * @param bool $load_enabled Load only enabled avatars
    *
    * @return object Avatar driver object
    */
    public function get_driver($avatar_type, $load_enabled = true)
    {
        if (self::$enabled_drivers === false)
        {
            $this->load_enabled_drivers();
        }
        $avatar_drivers = ($load_enabled) ? self::$enabled_drivers : $this->get_all_drivers();
        // Legacy stuff...
        switch ($avatar_type)
        {
            case AVATAR_GALLERY:
                $avatar_type = 'avatar.driver.local';
            break;
            case AVATAR_UPLOAD:
                $avatar_type = 'avatar.driver.upload';
            break;
            case AVATAR_REMOTE:
                $avatar_type = 'avatar.driver.remote';
            break;
        }
        if (!isset($avatar_drivers[$avatar_type]))
        {
            return null;
        }
        /*
        * There is no need to handle invalid avatar types as the following code
        * will cause a ServiceNotFoundException if the type does not exist
        */
        $driver = $this->avatar_drivers[$avatar_type];
        return $driver;
    }
    /**
    * Load the list of enabled drivers
    * This is executed once and fills self::$enabled_drivers
    */
    protected function load_enabled_drivers()
    {
        if (!empty($this->avatar_drivers))
        {
            self::$enabled_drivers = array();
            foreach ($this->avatar_drivers as $driver)
            {
                if ($this->is_enabled($driver))
                {
                    self::$enabled_drivers[$driver->get_name()] = $driver->get_name();
                }
            }
            asort(self::$enabled_drivers);
        }
    }
    /**
    * Get a list of all avatar drivers
    *
    * As this function will only be called in the ACP avatar settings page, it
    * doesn't make much sense to cache the list of all avatar drivers like the
    * list of the enabled drivers.
    *
    * @return array Array containing a list of all avatar drivers
    */
    public function get_all_drivers()
    {
        $drivers = array();
        if (!empty($this->avatar_drivers))
        {
            foreach ($this->avatar_drivers as $driver)
            {
                $drivers[$driver->get_name()] = $driver->get_name();
            }
            asort($drivers);
        }
        return $drivers;
    }
    /**
    * Get a list of enabled avatar drivers
    *
    * @return array Array containing a list of the enabled avatar drivers
    */
    public function get_enabled_drivers()
    {
        if (self::$enabled_drivers === false)
        {
            $this->load_enabled_drivers();
        }
        return self::$enabled_drivers;
    }
    /**
    * Strip out user_, group_, or other prefixes from array keys
    *
    * @param array    $row            User data or group data
    * @param string $prefix            Prefix of data keys (e.g. user), should not include the trailing underscore
    *
    * @return array    User or group data with keys that have been
    *            stripped from the preceding "user_" or "group_"
    *            Also the group id is prefixed with g, when the prefix group is removed.
    */
    static public function clean_row($row, $prefix = '')
    {
        // Upon creation of a user/group $row might be empty
        if (empty($row))
        {
            return self::$default_row;
        }
        $output = array();
        foreach ($row as $key => $value)
        {
            $key = preg_replace("#^(?:{$prefix}_)#", '', $key);
            $output[$key] = $value;
        }
        if ($prefix === 'group' && isset($output['id']))
        {
            $output['id'] = 'g' . $output['id'];
        }
        return $output;
    }
    /**
    * Clean driver names that are returned from template files
    * Underscores are replaced with dots
    *
    * @param string $name Driver name
    *
    * @return string Cleaned driver name
    */
    static public function clean_driver_name($name)
    {
        return str_replace(array('\\', '_'), '.', $name);
    }
    /**
    * Prepare driver names for use in template files
    * Dots are replaced with underscores
    *
    * @param string $name Clean driver name
    *
    * @return string Prepared driver name
    */
    static public function prepare_driver_name($name)
    {
        return str_replace('.', '_', $name);
    }
    /**
    * Check if avatar is enabled
    *
    * @param object $driver Avatar driver object
    *
    * @return bool True if avatar is enabled, false if it's disabled
    */
    public function is_enabled($driver)
    {
        $config_name = $driver->get_config_name();
        return $this->config["allow_avatar_{$config_name}"];
    }
    /**
    * Get the settings array for enabling/disabling an avatar driver
    *
    * @param object $driver Avatar driver object
    *
    * @return array Array of configuration options as consumed by acp_board
    */
    public function get_avatar_settings($driver)
    {
        $config_name = $driver->get_config_name();
        return array(
            'allow_avatar_' . $config_name    => array('lang' => 'ALLOW_' . strtoupper(str_replace('\\', '_', $config_name)),        'validate' => 'bool',    'type' => 'radio:yes_no', 'explain' => true),
        );
    }
    /**
    * Replace "error" strings with their real, localized form
    *
    * @param \phpbb\user phpBB User object
    * @param array    $error Array containing error strings
    *        Key values can either be a string with a language key or an array
    *        that will be passed to vsprintf() with the language key in the
    *        first array key.
    *
    * @return array Array containing the localized error strings
    */
    public function localize_errors(\phpbb\user $user, $error)
    {
        foreach ($error as $key => $lang)
        {
            if (is_array($lang))
            {
                $lang_key = array_shift($lang);
                $error[$key] = vsprintf($user->lang($lang_key), $lang);
            }
            else
            {
                $error[$key] = $user->lang("$lang");
            }
        }
        return $error;
    }
    /**
    * Handle deleting avatars
    *
    * @param \phpbb\db\driver\driver_interface $db phpBB dbal
    * @param \phpbb\user    $user phpBB user object
    * @param array          $avatar_data Cleaned user data containing the user's
    *                               avatar data
    * @param string         $table Database table from which the avatar should be deleted
    * @param string         $prefix Prefix of user data columns in database
    * @return null
    */
    public function handle_avatar_delete(\phpbb\db\driver\driver_interface $db, \phpbb\user $user, $avatar_data, $table, $prefix)
    {
        if ($driver = $this->get_driver($avatar_data['avatar_type']))
        {
            $driver->delete($avatar_data);
        }
        $result = $this->prefix_avatar_columns($prefix, self::$default_row);
        $sql = 'UPDATE ' . $table . '
            SET ' . $db->sql_build_array('UPDATE', $result) . '
            WHERE ' . $prefix . 'id = ' . (int) $avatar_data['id'];
        $db->sql_query($sql);
        // Make sure we also delete this avatar from the users
        if ($prefix === 'group_')
        {
            $result = $this->prefix_avatar_columns('user_', self::$default_row);
            $sql = 'UPDATE ' . USERS_TABLE . '
                SET ' . $db->sql_build_array('UPDATE', $result) . "
                WHERE user_avatar = '" . $db->sql_escape($avatar_data['avatar']) . "'";
            $db->sql_query($sql);
        }
        /**
        * Event is triggered after user avatar has been deleted
        *
        * @event core.avatar_manager_avatar_delete_after
        * @var    \phpbb\user    user        phpBB user object
        * @var    array        avatar_data    Normalised avatar-related user data
        * @var    string        table        Table to delete avatar from
        * @var    string        prefix        Column prefix to delete avatar from
        * @since 3.2.4-RC1
        */
        $vars = array('user', 'avatar_data', 'table', 'prefix');
        extract($this->phpbb_dispatcher->trigger_event('core.avatar_manager_avatar_delete_after', compact($vars)));
    }
    /**
     * Prefix avatar columns
     *
     * @param string $prefix Column prefix
     * @param array $data Column data
     *
     * @return array Column data with prefixed column names
     */
    public function prefix_avatar_columns($prefix, $data)
    {
        foreach ($data as $key => $value)
        {
            $data[$prefix . $key] = $value;
            unset($data[$key]);
        }
        return $data;
    }
}