Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
14 / 14 |
CRAP | |
100.00% |
110 / 110 |
manager | |
100.00% |
1 / 1 |
|
100.00% |
14 / 14 |
37 | |
100.00% |
110 / 110 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
register_avatar_drivers | |
100.00% |
1 / 1 |
3 | |
100.00% |
7 / 7 |
|||
get_driver | |
100.00% |
1 / 1 |
7 | |
100.00% |
19 / 19 |
|||
load_enabled_drivers | |
100.00% |
1 / 1 |
4 | |
100.00% |
12 / 12 |
|||
get_all_drivers | |
100.00% |
1 / 1 |
3 | |
100.00% |
9 / 9 |
|||
get_enabled_drivers | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
clean_row | |
100.00% |
1 / 1 |
5 | |
100.00% |
13 / 13 |
|||
clean_driver_name | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
prepare_driver_name | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
is_enabled | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
get_avatar_settings | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
localize_errors | |
100.00% |
1 / 1 |
3 | |
100.00% |
9 / 9 |
|||
handle_avatar_delete | |
100.00% |
1 / 1 |
3 | |
100.00% |
20 / 20 |
|||
prefix_avatar_columns | |
100.00% |
1 / 1 |
2 | |
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; | |
} | |
} |