1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-08-10 18:54:08 +02:00

[feature/avatars] Implement UCP remote/local avatars

Implementing selection logic for gallery and remote avatars. Modified
some of the driver interfaces to make things work nicer also. Upload
functionality will be in the next commit.

PHPBB3-10018
This commit is contained in:
Cullen Walsh
2011-04-18 22:54:35 -07:00
committed by Cullen Walsh
parent f102d9a631
commit 00d4b9d431
9 changed files with 165 additions and 64 deletions

View File

@@ -102,7 +102,7 @@ abstract class phpbb_avatar_driver
/**
* @TODO
**/
public function handle_form($template, &$error = array(), $submitted = false)
public function handle_form($template, $user_row, &$error, $submitted = false)
{
return false;
}

View File

@@ -47,13 +47,8 @@ class phpbb_avatar_driver_local extends phpbb_avatar_driver
/**
* @inheritdoc
*/
public function handle_form($template, &$error = array(), $submitted = false)
public function handle_form($template, $user_row, &$error, $submitted = false)
{
if ($submitted) {
$error[] = 'TODO';
return '';
}
$avatar_list = ($this->cache == null) ? false : $this->cache->get('av_local_list');
if (!$avatar_list)
@@ -78,10 +73,13 @@ class phpbb_avatar_driver_local extends phpbb_avatar_driver
// Match all images in the gallery folder
if (preg_match('#^[^&\'"<>]+\.(?:gif|png|jpe?g)$#i', $image))
{
$avatar_list[$cat][] = array(
$dims = getimagesize($this->phpbb_root_path . $this->config['avatar_gallery_path'] . '/' . $cat . '/' . $image);
$avatar_list[$cat][$image] = array(
'file' => rawurlencode($cat) . '/' . rawurlencode($image),
'filename' => rawurlencode($image),
'name' => ucfirst(str_replace('_', ' ', preg_replace('#^(.*)\..*$#', '\1', $image))),
'width' => $dims[0],
'height' => $dims[1],
);
}
}
@@ -98,8 +96,25 @@ class phpbb_avatar_driver_local extends phpbb_avatar_driver
$this->cache->put('av_local_list', $avatar_list);
}
}
$category = request_var('av_local_cat', '');
if ($submitted) {
$file = request_var('av_local_file', '');
if (!isset($avatar_list[$category][urldecode($file)]))
{
$error[] = 'AVATAR_URL_NOT_FOUND';
return false;
}
return array(
'user_avatar' => $category . '/' . $file,
'user_avatar_width' => $avatar_list[$category][urldecode($file)]['width'],
'user_avatar_height' => $avatar_list[$category][urldecode($file)]['height'],
);
}
$categories = array_keys($avatar_list);
foreach ($categories as $cat)

View File

@@ -47,14 +47,111 @@ class phpbb_avatar_driver_remote extends phpbb_avatar_driver
/**
* @inheritdoc
*/
public function handle_form($template, &$error = array(), $submitted = false)
public function handle_form($template, $user_row, &$error, $submitted = false)
{
if ($submitted) {
$error[] = 'TODO';
return '';
if ($submitted)
{
$url = request_var('av_remote_url', '');
$width = request_var('av_remote_width', 0);
$height = request_var('av_remote_height', 0);
if (!preg_match('#^(http|https|ftp)://#i', $url))
{
$url = 'http://' . $url;
}
$error = array_merge($error, validate_data(array(
'url' => $url,
), array(
'url' => array('string', true, 5, 255),
)));
if (!empty($error))
{
return false;
}
// Check if this url looks alright
// This isn't perfect, but it's what phpBB 3.0 did, and might as well make sure everything is compatible
if (!preg_match('#^(http|https|ftp)://(?:(.*?\.)*?[a-z0-9\-]+?\.[a-z]{2,4}|(?:\d{1,3}\.){3,5}\d{1,3}):?([0-9]*?).*?\.(gif|jpg|jpeg|png)$#i', $url))
{
$error[] = 'AVATAR_URL_INVALID';
return false;
}
// Make sure getimagesize works...
if (($image_data = getimagesize($url)) === false && ($width <= 0 || $height <= 0))
{
$error[] = 'UNABLE_GET_IMAGE_SIZE';
return false;
}
if (!empty($image_data) && ($image_data[0] < 2 || $image_data[1] < 2))
{
$error[] = 'AVATAR_NO_SIZE';
return false;
}
$width = ($width && $height) ? $width : $image_data[0];
$height = ($width && $height) ? $height : $image_data[1];
if ($width < 2 || $height < 2)
{
$error[] = 'AVATAR_NO_SIZE';
return false;
}
include_once($this->phpbb_root_path . 'includes/functions_upload.' . $this->phpEx);
$types = fileupload::image_types();
$extension = strtolower(filespec::get_extension($url));
if (!empty($image_data) && (!isset($types[$image_data[2]]) || !in_array($extension, $types[$image_data[2]])))
{
if (!isset($types[$image_data[2]]))
{
$error[] = 'UNABLE_GET_IMAGE_SIZE';
}
else
{
$error[] = array('IMAGE_FILETYPE_MISMATCH', $types[$image_data[2]][0], $extension);
}
return false;
}
if ($this->config['avatar_max_width'] || $this->config['avatar_max_height'])
{
if ($width > $this->config['avatar_max_width'] || $height > $this->config['avatar_max_height'])
{
$error[] = array('AVATAR_WRONG_SIZE', $this->config['avatar_min_width'], $this->config['avatar_min_height'], $this->config['avatar_max_width'], $this->config['avatar_max_height'], $width, $height);
return false;
}
}
if ($this->config['avatar_min_width'] || $this->config['avatar_min_height'])
{
if ($width < $this->config['avatar_min_width'] || $height < $this->config['avatar_min_height'])
{
$error[] = array('AVATAR_WRONG_SIZE', $this->config['avatar_min_width'], $this->config['avatar_min_height'], $this->config['avatar_max_width'], $this->config['avatar_max_height'], $width, $height);
return false;
}
}
$result = array(
'user_avatar' => $url,
'user_avatar_width' => $width,
'user_avatar_height' => $height,
);
return $result;
}
else
{
$template->assign_vars(array(
'AV_REMOTE_WIDTH' => (($user_row['user_avatar_type'] == AVATAR_REMOTE || $user_row['user_avatar_type'] == 'remote') && $user_row['user_avatar_width']) ? $user_row['user_avatar_width'] : request_var('av_local_width', 0),
'AV_REMOTE_HEIGHT' => (($user_row['user_avatar_type'] == AVATAR_REMOTE || $user_row['user_avatar_type'] == 'remote') && $user_row['user_avatar_height']) ? $user_row['user_avatar_height'] : request_var('av_local_width', 0),
'AV_REMOTE_URL' => (($user_row['user_avatar_type'] == AVATAR_REMOTE || $user_row['user_avatar_type'] == 'remote') && $user_row['user_avatar']) ? $user_row['user_avatar'] : '',
));
return true;
}
}

View File

@@ -47,7 +47,7 @@ class phpbb_avatar_driver_upload extends phpbb_avatar_driver
/**
* @inheritdoc
*/
public function handle_form($template, &$error = array(), $submitted = false)
public function handle_form($template, $user_row, &$error, $submitted = false)
{
if ($submitted) {
$error[] = 'TODO';
@@ -60,6 +60,7 @@ class phpbb_avatar_driver_upload extends phpbb_avatar_driver
{
$template->assign_vars(array(
'S_UPLOAD_AVATAR_URL' => ($this->config['allow_avatar_remote_upload']) ? true : false,
'AV_UPLOAD_SIZE' => $this->config['avatar_filesize'],
));
return true;