aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes
diff options
context:
space:
mode:
authorCullen Walsh <ckwalsh@phpbb.com>2011-04-18 22:54:35 -0700
committerCullen Walsh <ckwalsh@cullenwalsh.com>2012-03-18 22:20:45 +0000
commit00d4b9d431d6772889291f2f4c857a144bce93fb (patch)
treebc3506b3d6ee19a268dd3ef21d444711d0f24c3e /phpBB/includes
parentf102d9a631d6de464abefe2089ff1e6e13ed044d (diff)
downloadforums-00d4b9d431d6772889291f2f4c857a144bce93fb.tar
forums-00d4b9d431d6772889291f2f4c857a144bce93fb.tar.gz
forums-00d4b9d431d6772889291f2f4c857a144bce93fb.tar.bz2
forums-00d4b9d431d6772889291f2f4c857a144bce93fb.tar.xz
forums-00d4b9d431d6772889291f2f4c857a144bce93fb.zip
[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
Diffstat (limited to 'phpBB/includes')
-rw-r--r--phpBB/includes/avatar/driver.php2
-rw-r--r--phpBB/includes/avatar/driver/local.php31
-rw-r--r--phpBB/includes/avatar/driver/remote.php105
-rw-r--r--phpBB/includes/avatar/driver/upload.php3
-rw-r--r--phpBB/includes/ucp/ucp_profile.php58
5 files changed, 151 insertions, 48 deletions
diff --git a/phpBB/includes/avatar/driver.php b/phpBB/includes/avatar/driver.php
index 60ec18670e..a2ff5d804d 100644
--- a/phpBB/includes/avatar/driver.php
+++ b/phpBB/includes/avatar/driver.php
@@ -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;
}
diff --git a/phpBB/includes/avatar/driver/local.php b/phpBB/includes/avatar/driver/local.php
index 65340c92ce..c00f65a81d 100644
--- a/phpBB/includes/avatar/driver/local.php
+++ b/phpBB/includes/avatar/driver/local.php
@@ -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)
diff --git a/phpBB/includes/avatar/driver/remote.php b/phpBB/includes/avatar/driver/remote.php
index bfc1be263f..ebaf3cf5c4 100644
--- a/phpBB/includes/avatar/driver/remote.php
+++ b/phpBB/includes/avatar/driver/remote.php
@@ -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;
}
}
diff --git a/phpBB/includes/avatar/driver/upload.php b/phpBB/includes/avatar/driver/upload.php
index 9705a888b6..84168722ec 100644
--- a/phpBB/includes/avatar/driver/upload.php
+++ b/phpBB/includes/avatar/driver/upload.php
@@ -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;
diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php
index a93430644c..5d7dbe12d8 100644
--- a/phpBB/includes/ucp/ucp_profile.php
+++ b/phpBB/includes/ucp/ucp_profile.php
@@ -544,12 +544,8 @@ class ucp_profile
break;
case 'avatar':
- include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
-
- $display_gallery = request_var('display_gallery', '0');
- $avatar_select = basename(request_var('avatar_select', ''));
- $category = basename(request_var('category', ''));
-
+ include_once($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+
add_form_key('ucp_avatar');
$avatars_enabled = false;
@@ -572,18 +568,15 @@ class ucp_profile
{
if (check_form_key('ucp_avatar'))
{
- $result = $avatar->handle_form($template, $error, true);
+ $result = $avatar->handle_form($template, $user->data, $error, true);
if (empty($error))
{
// Success! Lets save the result in the database
- $sql_ary = array(
- 'user_avatar_type' => $driver,
- 'user_avatar' => (string) $result,
- );
+ $result['user_avatar_type'] = $driver;
$sql = 'UPDATE ' . USERS_TABLE . '
- SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
+ SET ' . $db->sql_build_array('UPDATE', $result) . '
WHERE user_id = ' . $user->data['user_id'];
$db->sql_query($sql);
@@ -599,7 +592,7 @@ class ucp_profile
}
}
- if ($avatar->handle_form($template, $error)) {
+ if ($avatar->handle_form($template, $user->data, $error)) {
$driver_u = strtoupper($driver);
$template->assign_block_vars('avatar_drivers', array(
@@ -613,39 +606,36 @@ class ucp_profile
}
}
}
-
- // Replace "error" strings with their real, localised form
- $error = array_map(array($user, 'lang'), $error);
+ // Replace "error" strings with their real, localised form
+ $err = $error;
+ $error = array();
+ foreach ($err as $e)
+ {
+ if (is_array($e))
+ {
+ $key = array_shift($e);
+ $error[] = vsprintf($user->lang($key), $e);
+ }
+ else
+ {
+ $error[] = $user->lang((string) $e);
+ }
+ }
+
$avatar = get_user_avatar($user->data, 'USER_AVATAR', true);
$template->assign_vars(array(
'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
'AVATAR' => $avatar,
- 'AVATAR_SIZE' => $config['avatar_filesize'],
-
- 'U_GALLERY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=profile&amp;mode=avatar&amp;display_gallery=1'),
'S_FORM_ENCTYPE' => ' enctype="multipart/form-data"',
'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(),
+
+ 'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled),
));
- if ($config['allow_avatar'] && $display_gallery && $auth->acl_get('u_chgavatar') && $config['allow_avatar_local'])
- {
- avatar_gallery($category, $avatar_select, 4);
- }
- else if ($config['allow_avatar'])
- {
- $template->assign_vars(array(
- 'AVATAR_WIDTH' => request_var('width', empty($avatar) ? 0 : $user->data['user_avatar_width']),
- 'AVATAR_HEIGHT' => request_var('height', empty($avatar) ? 0 : $user->data['user_avatar_height']),
-
- 'S_AVATARS_ENABLED' => $avatars_enabled,
- 'S_DISPLAY_GALLERY' => ($auth->acl_get('u_chgavatar') && $config['allow_avatar_local']) ? true : false)
- );
- }
-
break;
}