mirror of
https://github.com/phpbb/phpbb.git
synced 2025-01-17 14:18:24 +01:00
Merge pull request #6197 from rubencm/ticket/16764
[ticket/16764] Remove unused services
This commit is contained in:
commit
c27c846a1d
@ -62,25 +62,3 @@ services:
|
||||
- '@language'
|
||||
- '@php_ini'
|
||||
- '@request'
|
||||
|
||||
files.types.remote:
|
||||
class: phpbb\files\types\remote
|
||||
shared: false
|
||||
arguments:
|
||||
- '@config'
|
||||
- '@files.factory'
|
||||
- '@filesystem.temp'
|
||||
- '@language'
|
||||
- '@php_ini'
|
||||
- '@request'
|
||||
|
||||
files.types.remote_storage:
|
||||
class: phpbb\files\types\remote_storage
|
||||
shared: false
|
||||
arguments:
|
||||
- '@config'
|
||||
- '@files.factory'
|
||||
- '@filesystem.temp'
|
||||
- '@language'
|
||||
- '@php_ini'
|
||||
- '@request'
|
||||
|
@ -419,7 +419,6 @@ class acp_board
|
||||
'browser_check' => array('lang' => 'BROWSER_VALID', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
|
||||
'forwarded_for_check' => array('lang' => 'FORWARDED_FOR_VALID', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
|
||||
'referer_validation' => array('lang' => 'REFERRER_VALID', 'validate' => 'int:0:3','type' => 'custom', 'method' => 'select_ref_check', 'explain' => true),
|
||||
'remote_upload_verify' => array('lang' => 'UPLOAD_CERT_VALID', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
|
||||
'check_dnsbl' => array('lang' => 'CHECK_DNSBL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
|
||||
'email_check_mx' => array('lang' => 'EMAIL_CHECK_MX', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
|
||||
'min_pass_chars' => array('lang' => 'PASSWORD_LENGTH', 'validate' => 'int:1', 'type' => 'custom', 'method' => 'password_length', 'explain' => true),
|
||||
|
@ -42,7 +42,6 @@ define('USER_ACTIVATION_ADMIN', 2);
|
||||
define('USER_ACTIVATION_DISABLE', 3);
|
||||
|
||||
define('AVATAR_UPLOAD', 1);
|
||||
define('AVATAR_REMOTE', 2);
|
||||
define('AVATAR_GALLERY', 3);
|
||||
|
||||
define('USER_NORMAL', 0);
|
||||
|
@ -377,40 +377,6 @@ function mimetype($filename)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain the dimensions of all remotely hosted avatars
|
||||
* This should only be called from execute_last
|
||||
* There can be significant network overhead if there are a large number of remote avatars
|
||||
* @todo Look at the option of allowing the user to decide whether this is called or to force the dimensions
|
||||
*/
|
||||
function remote_avatar_dims()
|
||||
{
|
||||
global $db;
|
||||
|
||||
$sql = 'SELECT user_id, user_avatar
|
||||
FROM ' . USERS_TABLE . '
|
||||
WHERE user_avatar_type = ' . AVATAR_REMOTE;
|
||||
$result = $db->sql_query($sql);
|
||||
|
||||
$remote_avatars = array();
|
||||
while ($row = $db->sql_fetchrow($result))
|
||||
{
|
||||
$remote_avatars[(int) $row['user_id']] = $row['user_avatar'];
|
||||
}
|
||||
$db->sql_freeresult($result);
|
||||
|
||||
foreach ($remote_avatars as $user_id => $avatar)
|
||||
{
|
||||
$width = (int) get_remote_avatar_dim($avatar, 0);
|
||||
$height = (int) get_remote_avatar_dim($avatar, 1);
|
||||
|
||||
$sql = 'UPDATE ' . USERS_TABLE . '
|
||||
SET user_avatar_width = ' . (int) $width . ', user_avatar_height = ' . (int) $height . '
|
||||
WHERE user_id = ' . $user_id;
|
||||
$db->sql_query($sql);
|
||||
}
|
||||
}
|
||||
|
||||
function import_avatar_gallery($gallery_name = '', $subdirs_as_galleries = false)
|
||||
{
|
||||
global $config, $convert, $user;
|
||||
@ -810,23 +776,15 @@ function get_avatar_dim($src, $axis, $func = false, $arg1 = false, $arg2 = false
|
||||
{
|
||||
case AVATAR_UPLOAD:
|
||||
return get_upload_avatar_dim($src, $axis);
|
||||
break;
|
||||
|
||||
case AVATAR_GALLERY:
|
||||
return get_gallery_avatar_dim($src, $axis);
|
||||
break;
|
||||
|
||||
case AVATAR_REMOTE:
|
||||
// see notes on this functions usage and (hopefully) model $func to avoid this accordingly
|
||||
return get_remote_avatar_dim($src, $axis);
|
||||
break;
|
||||
|
||||
default:
|
||||
$default_x = (defined('DEFAULT_AVATAR_X_CUSTOM')) ? DEFAULT_AVATAR_X_CUSTOM : DEFAULT_AVATAR_X;
|
||||
$default_y = (defined('DEFAULT_AVATAR_Y_CUSTOM')) ? DEFAULT_AVATAR_Y_CUSTOM : DEFAULT_AVATAR_Y;
|
||||
|
||||
return $axis ? $default_y : $default_x;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -922,88 +880,6 @@ function get_gallery_avatar_dim($source, $axis)
|
||||
return $avatar_cache[$orig_source][$axis];
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain the size of the specified remote avatar (using the cache if possible) and cache the value
|
||||
* Whilst it's unlikely that remote avatars will be duplicated, it is possible so caching seems the best option
|
||||
* This should only be called from a post processing step due to the possibility of network timeouts
|
||||
*/
|
||||
function get_remote_avatar_dim($src, $axis)
|
||||
{
|
||||
if (empty($src))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static $remote_avatar_cache = array();
|
||||
|
||||
// an ugly hack: we assume that the dimensions of each remote avatar are accessed exactly twice (x and y)
|
||||
if (isset($remote_avatar_cache[$src]))
|
||||
{
|
||||
$retval = $remote_avatar_cache[$src][$axis];
|
||||
unset($remote_avatar_cache);
|
||||
return $retval;
|
||||
}
|
||||
|
||||
$url_info = @parse_url($src);
|
||||
if (empty($url_info['host']))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
$host = $url_info['host'];
|
||||
$port = (isset($url_info['port'])) ? $url_info['port'] : 0;
|
||||
$protocol = (isset($url_info['scheme'])) ? $url_info['scheme'] : 'http';
|
||||
if (empty($port))
|
||||
{
|
||||
switch (strtolower($protocol))
|
||||
{
|
||||
case 'ftp':
|
||||
$port = 21;
|
||||
break;
|
||||
|
||||
case 'https':
|
||||
$port = 443;
|
||||
break;
|
||||
|
||||
default:
|
||||
$port = 80;
|
||||
}
|
||||
}
|
||||
|
||||
$timeout = @ini_get('default_socket_timeout');
|
||||
@ini_set('default_socket_timeout', 2);
|
||||
|
||||
// We're just trying to reach the server to avoid timeouts
|
||||
$fp = @fsockopen($host, $port, $errno, $errstr, 1);
|
||||
if ($fp)
|
||||
{
|
||||
$remote_avatar_cache[$src] = @getimagesize($src);
|
||||
fclose($fp);
|
||||
}
|
||||
|
||||
$default_x = (defined('DEFAULT_AVATAR_X_CUSTOM')) ? DEFAULT_AVATAR_X_CUSTOM : DEFAULT_AVATAR_X;
|
||||
$default_y = (defined('DEFAULT_AVATAR_Y_CUSTOM')) ? DEFAULT_AVATAR_Y_CUSTOM : DEFAULT_AVATAR_Y;
|
||||
$default = array($default_x, $default_y);
|
||||
|
||||
if (empty($remote_avatar_cache[$src]) || empty($remote_avatar_cache[$src][0]) || empty($remote_avatar_cache[$src][1]))
|
||||
{
|
||||
$remote_avatar_cache[$src] = $default;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We trust gallery and uploaded avatars to conform to the size settings; we might have to adjust here
|
||||
if ($remote_avatar_cache[$src][0] > $default_x || $remote_avatar_cache[$src][1] > $default_y)
|
||||
{
|
||||
$bigger = ($remote_avatar_cache[$src][0] > $remote_avatar_cache[$src][1]) ? 0 : 1;
|
||||
$ratio = $default[$bigger] / $remote_avatar_cache[$src][$bigger];
|
||||
$remote_avatar_cache[$src][0] = (int) ($remote_avatar_cache[$src][0] * $ratio);
|
||||
$remote_avatar_cache[$src][1] = (int) ($remote_avatar_cache[$src][1] * $ratio);
|
||||
}
|
||||
}
|
||||
|
||||
@ini_set('default_socket_timeout', $timeout);
|
||||
return $remote_avatar_cache[$src][$axis];
|
||||
}
|
||||
|
||||
function set_user_options()
|
||||
{
|
||||
global $convert_row;
|
||||
|
@ -1508,15 +1508,9 @@ function phpbb_avatar_type($type)
|
||||
{
|
||||
case 1:
|
||||
return AVATAR_UPLOAD;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
return AVATAR_REMOTE;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
return AVATAR_GALLERY;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1548,11 +1542,6 @@ function phpbb_import_avatar($user_avatar)
|
||||
// Uploaded avatar
|
||||
return import_avatar($user_avatar, false, $convert_row['user_id']);
|
||||
}
|
||||
else if ($convert_row['user_avatar_type'] == 2)
|
||||
{
|
||||
// Remote avatar
|
||||
return $user_avatar;
|
||||
}
|
||||
else if ($convert_row['user_avatar_type'] == 3)
|
||||
{
|
||||
// Gallery avatar
|
||||
|
@ -265,7 +265,6 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('recaptcha_v3_thres
|
||||
INSERT INTO phpbb_config (config_name, config_value) VALUES ('recaptcha_v3_threshold_register', '0.5');
|
||||
INSERT INTO phpbb_config (config_name, config_value) VALUES ('recaptcha_v3_threshold_report', '0.5');
|
||||
INSERT INTO phpbb_config (config_name, config_value) VALUES ('referer_validation', '1');
|
||||
INSERT INTO phpbb_config (config_name, config_value) VALUES ('remote_upload_verify', '0');
|
||||
INSERT INTO phpbb_config (config_name, config_value) VALUES ('require_activation', '0');
|
||||
INSERT INTO phpbb_config (config_name, config_value) VALUES ('script_path', '');
|
||||
INSERT INTO phpbb_config (config_name, config_value) VALUES ('search_anonymous_interval', '0');
|
||||
|
@ -544,8 +544,6 @@ $lang = array_merge($lang, array(
|
||||
'REFERRER_VALID_EXPLAIN' => 'If enabled, the referrer of POST requests will be checked against the host/script path settings. This may cause issues with boards using several domains and or external logins.',
|
||||
'TPL_ALLOW_PHP' => 'Allow php in templates',
|
||||
'TPL_ALLOW_PHP_EXPLAIN' => 'If this option is enabled, <code>PHP</code> and <code>INCLUDEPHP</code> statements will be recognised and parsed in templates.',
|
||||
'UPLOAD_CERT_VALID' => 'Validate upload certificate',
|
||||
'UPLOAD_CERT_VALID_EXPLAIN' => 'If enabled, certificates of remote uploads will be validated. This requires the CA bundle to be defined by the <samp>openssl.cafile</samp> or <samp>curl.cainfo</samp> setting in your php.ini.',
|
||||
));
|
||||
|
||||
// Email Settings
|
||||
|
@ -121,7 +121,6 @@ $lang = array_merge($lang, array(
|
||||
'EDIT_REASON' => 'Reason for editing this post',
|
||||
'EMPTY_FILEUPLOAD' => 'The uploaded file is empty.',
|
||||
'EMPTY_MESSAGE' => 'You must enter a message when posting.',
|
||||
'EMPTY_REMOTE_DATA' => 'File could not be uploaded, please try uploading the file manually.',
|
||||
|
||||
'FLASH_IS_OFF' => '[flash] is <em>OFF</em>',
|
||||
'FLASH_IS_ON' => '[flash] is <em>ON</em>',
|
||||
@ -236,7 +235,6 @@ $lang = array_merge($lang, array(
|
||||
),
|
||||
'QUOTE_NO_NESTING' => 'You may not embed quotes within each other.',
|
||||
|
||||
'REMOTE_UPLOAD_TIMEOUT' => 'The specified file could not be uploaded because the request timed out.',
|
||||
'SAVE' => 'Save',
|
||||
'SAVE_DATE' => 'Saved at',
|
||||
'SAVE_DRAFT' => 'Save draft',
|
||||
|
@ -20,7 +20,6 @@ class avatar_types extends \phpbb\db\migration\migration
|
||||
*/
|
||||
protected $avatar_type_map = array(
|
||||
AVATAR_UPLOAD => 'avatar.driver.upload',
|
||||
AVATAR_REMOTE => 'avatar.driver.remote',
|
||||
AVATAR_GALLERY => 'avatar.driver.local',
|
||||
);
|
||||
|
||||
|
33
phpBB/phpbb/db/migration/data/v400/remove_remote_upload.php
Normal file
33
phpBB/phpbb/db/migration/data/v400/remove_remote_upload.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?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\db\migration\data\v400;
|
||||
|
||||
use phpbb\db\migration\container_aware_migration;
|
||||
|
||||
class remove_remote_upload extends container_aware_migration
|
||||
{
|
||||
public static function depends_on()
|
||||
{
|
||||
return [
|
||||
'\phpbb\db\migration\data\v320\remote_upload_validation'
|
||||
];
|
||||
}
|
||||
|
||||
public function update_data()
|
||||
{
|
||||
return [
|
||||
['config.remove', ['remote_upload_verify']],
|
||||
];
|
||||
}
|
||||
}
|
@ -1,205 +0,0 @@
|
||||
<?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\files\types;
|
||||
|
||||
use bantu\IniGetWrapper\IniGetWrapper;
|
||||
use phpbb\config\config;
|
||||
use phpbb\files\factory;
|
||||
use phpbb\files\filespec;
|
||||
use phpbb\filesystem\temp;
|
||||
use phpbb\language\language;
|
||||
use phpbb\request\request_interface;
|
||||
|
||||
class remote extends base
|
||||
{
|
||||
/** @var config phpBB config */
|
||||
protected $config;
|
||||
|
||||
/** @var factory Files factory */
|
||||
protected $factory;
|
||||
|
||||
/** @var temp Filesystem temp */
|
||||
protected $temp;
|
||||
|
||||
/** @var language */
|
||||
protected $language;
|
||||
|
||||
/** @var IniGetWrapper */
|
||||
protected $php_ini;
|
||||
|
||||
/** @var request_interface */
|
||||
protected $request;
|
||||
|
||||
/**
|
||||
* Construct a form upload type
|
||||
*
|
||||
* @param config $config phpBB config
|
||||
* @param factory $factory Files factory
|
||||
* @param temp $temp Filesystem temp
|
||||
* @param language $language Language class
|
||||
* @param IniGetWrapper $php_ini ini_get() wrapper
|
||||
* @param request_interface $request Request object
|
||||
*/
|
||||
public function __construct(config $config, factory $factory, temp $temp, language $language, IniGetWrapper $php_ini, request_interface $request)
|
||||
{
|
||||
$this->config = $config;
|
||||
$this->factory = $factory;
|
||||
$this->temp = $temp;
|
||||
$this->language = $language;
|
||||
$this->php_ini = $php_ini;
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function upload()
|
||||
{
|
||||
$args = func_get_args();
|
||||
return $this->remote_upload($args[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remote upload method
|
||||
* Uploads file from given url
|
||||
*
|
||||
* @param string $upload_url URL pointing to file to upload, for example http://www.foobar.com/example.gif
|
||||
* @return filespec $file Object "filespec" is returned, all further operations can be done with this object
|
||||
* @access public
|
||||
*/
|
||||
protected function remote_upload($upload_url)
|
||||
{
|
||||
$upload_ary = array();
|
||||
$upload_ary['local_mode'] = true;
|
||||
|
||||
if (!preg_match('#^(https?://).*?\.(' . implode('|', $this->upload->allowed_extensions) . ')$#i', $upload_url, $match))
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'URL_INVALID'));
|
||||
}
|
||||
|
||||
$url = parse_url($upload_url);
|
||||
|
||||
$upload_ary['type'] = 'application/octet-stream';
|
||||
|
||||
$url['path'] = explode('.', $url['path']);
|
||||
$ext = array_pop($url['path']);
|
||||
|
||||
$url['path'] = implode('', $url['path']);
|
||||
$upload_ary['name'] = utf8_basename($url['path']) . (($ext) ? '.' . $ext : '');
|
||||
|
||||
$remote_max_filesize = $this->get_max_file_size();
|
||||
|
||||
$guzzle_options = [
|
||||
'timeout' => $this->upload->upload_timeout,
|
||||
'connect_timeout' => $this->upload->upload_timeout,
|
||||
'verify' => !empty($this->config['remote_upload_verify']) ? (bool) $this->config['remote_upload_verify'] : false,
|
||||
];
|
||||
$client = new \GuzzleHttp\Client($guzzle_options);
|
||||
|
||||
try
|
||||
{
|
||||
$response = $client->get($upload_url, $guzzle_options);
|
||||
}
|
||||
catch (\GuzzleHttp\Exception\ClientException $clientException)
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'URL_NOT_FOUND');
|
||||
}
|
||||
catch (\GuzzleHttp\Exception\RequestException $requestException)
|
||||
{
|
||||
if (strpos($requestException->getMessage(), 'cURL error 28') !== false || preg_match('/408|504/', $requestException->getCode()))
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'REMOTE_UPLOAD_TIMEOUT');
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'NOT_UPLOADED'));
|
||||
}
|
||||
}
|
||||
catch (\Exception $e)
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'NOT_UPLOADED'));
|
||||
}
|
||||
|
||||
$content_length = $response->getBody()->getSize();
|
||||
if ($remote_max_filesize && $content_length > $remote_max_filesize)
|
||||
{
|
||||
$max_filesize = get_formatted_filesize($remote_max_filesize, false);
|
||||
|
||||
return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'WRONG_FILESIZE', $max_filesize['value'], $max_filesize['unit']));
|
||||
}
|
||||
|
||||
if ($content_length == 0)
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'EMPTY_REMOTE_DATA');
|
||||
}
|
||||
|
||||
$data = $response->getBody();
|
||||
|
||||
$filename = tempnam($this->temp->get_dir(), unique_id() . '-');
|
||||
|
||||
if (!($fp = @fopen($filename, 'wb')))
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'NOT_UPLOADED');
|
||||
}
|
||||
|
||||
$upload_ary['size'] = fwrite($fp, $data);
|
||||
fclose($fp);
|
||||
unset($data);
|
||||
|
||||
$upload_ary['tmp_name'] = $filename;
|
||||
|
||||
/** @var filespec $file */
|
||||
$file = $this->factory->get('filespec')
|
||||
->set_upload_ary($upload_ary)
|
||||
->set_upload_namespace($this->upload);
|
||||
$this->upload->common_checks($file);
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get maximum file size for remote uploads
|
||||
*
|
||||
* @return int Maximum file size
|
||||
*/
|
||||
protected function get_max_file_size()
|
||||
{
|
||||
$max_file_size = $this->upload->max_filesize;
|
||||
if (!$max_file_size)
|
||||
{
|
||||
$max_file_size = $this->php_ini->getString('upload_max_filesize');
|
||||
|
||||
if (!empty($max_file_size))
|
||||
{
|
||||
$unit = strtolower(substr($max_file_size, -1, 1));
|
||||
$max_file_size = (int) $max_file_size;
|
||||
|
||||
switch ($unit)
|
||||
{
|
||||
case 'g':
|
||||
$max_file_size *= 1024;
|
||||
// no break
|
||||
case 'm':
|
||||
$max_file_size *= 1024;
|
||||
// no break
|
||||
case 'k':
|
||||
$max_file_size *= 1024;
|
||||
// no break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $max_file_size;
|
||||
}
|
||||
}
|
@ -1,204 +0,0 @@
|
||||
<?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\files\types;
|
||||
|
||||
use bantu\IniGetWrapper\IniGetWrapper;
|
||||
use phpbb\config\config;
|
||||
use phpbb\files\factory;
|
||||
use phpbb\files\filespec;
|
||||
use phpbb\filesystem\temp;
|
||||
use phpbb\language\language;
|
||||
use phpbb\request\request_interface;
|
||||
|
||||
class remote_storage extends base
|
||||
{
|
||||
/** @var config phpBB config */
|
||||
protected $config;
|
||||
|
||||
/** @var factory Files factory */
|
||||
protected $factory;
|
||||
|
||||
/** @var temp Filesystem temp */
|
||||
protected $temp;
|
||||
|
||||
/** @var language */
|
||||
protected $language;
|
||||
|
||||
/** @var IniGetWrapper */
|
||||
protected $php_ini;
|
||||
|
||||
/** @var request_interface */
|
||||
protected $request;
|
||||
|
||||
/**
|
||||
* Construct a form upload type
|
||||
*
|
||||
* @param config $config phpBB config
|
||||
* @param factory $factory Files factory
|
||||
* @param temp $temp Filesystem temp
|
||||
* @param language $language Language class
|
||||
* @param IniGetWrapper $php_ini ini_get() wrapper
|
||||
* @param request_interface $request Request object
|
||||
*/
|
||||
public function __construct(config $config, factory $factory, temp $temp, language $language, IniGetWrapper $php_ini, request_interface $request)
|
||||
{
|
||||
$this->config = $config;
|
||||
$this->factory = $factory;
|
||||
$this->temp = $temp;
|
||||
$this->language = $language;
|
||||
$this->php_ini = $php_ini;
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function upload()
|
||||
{
|
||||
$args = func_get_args();
|
||||
return $this->remote_upload($args[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remote upload method
|
||||
* Uploads file from given url
|
||||
*
|
||||
* @param string $upload_url URL pointing to file to upload, for example http://www.foobar.com/example.gif
|
||||
* @return filespec $file Object "filespec" is returned, all further operations can be done with this object
|
||||
*/
|
||||
protected function remote_upload($upload_url)
|
||||
{
|
||||
$upload_ary = array();
|
||||
$upload_ary['local_mode'] = true;
|
||||
|
||||
if (!preg_match('#^(https?://).*?\.(' . implode('|', $this->upload->allowed_extensions) . ')$#i', $upload_url, $match))
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'URL_INVALID'));
|
||||
}
|
||||
|
||||
$url = parse_url($upload_url);
|
||||
|
||||
$upload_ary['type'] = 'application/octet-stream';
|
||||
|
||||
$url['path'] = explode('.', $url['path']);
|
||||
$ext = array_pop($url['path']);
|
||||
|
||||
$url['path'] = implode('', $url['path']);
|
||||
$upload_ary['name'] = utf8_basename($url['path']) . (($ext) ? '.' . $ext : '');
|
||||
|
||||
$remote_max_filesize = $this->get_max_file_size();
|
||||
|
||||
$guzzle_options = [
|
||||
'timeout' => $this->upload->upload_timeout,
|
||||
'connect_timeout' => $this->upload->upload_timeout,
|
||||
'verify' => !empty($this->config['remote_upload_verify']) ? (bool) $this->config['remote_upload_verify'] : false,
|
||||
];
|
||||
$client = new \GuzzleHttp\Client($guzzle_options);
|
||||
|
||||
try
|
||||
{
|
||||
$response = $client->get($upload_url, $guzzle_options);
|
||||
}
|
||||
catch (\GuzzleHttp\Exception\ClientException $clientException)
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'URL_NOT_FOUND');
|
||||
}
|
||||
catch (\GuzzleHttp\Exception\RequestException $requestException)
|
||||
{
|
||||
if (strpos($requestException->getMessage(), 'cURL error 28') !== false || preg_match('/408|504/', $requestException->getCode()))
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'REMOTE_UPLOAD_TIMEOUT');
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'NOT_UPLOADED'));
|
||||
}
|
||||
}
|
||||
catch (\Exception $e)
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'NOT_UPLOADED'));
|
||||
}
|
||||
|
||||
$content_length = $response->getBody()->getSize();
|
||||
if ($remote_max_filesize && $content_length > $remote_max_filesize)
|
||||
{
|
||||
$max_filesize = get_formatted_filesize($remote_max_filesize, false);
|
||||
|
||||
return $this->factory->get('filespec')->set_error($this->language->lang($this->upload->error_prefix . 'WRONG_FILESIZE', $max_filesize['value'], $max_filesize['unit']));
|
||||
}
|
||||
|
||||
if ($content_length === 0)
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'EMPTY_REMOTE_DATA');
|
||||
}
|
||||
|
||||
$data = $response->getBody();
|
||||
|
||||
$filename = tempnam($this->temp->get_dir(), unique_id() . '-');
|
||||
|
||||
if (!($fp = @fopen($filename, 'wb')))
|
||||
{
|
||||
return $this->factory->get('filespec')->set_error($this->upload->error_prefix . 'NOT_UPLOADED');
|
||||
}
|
||||
|
||||
$upload_ary['size'] = fwrite($fp, $data);
|
||||
fclose($fp);
|
||||
unset($data);
|
||||
|
||||
$upload_ary['tmp_name'] = $filename;
|
||||
|
||||
/** @var filespec $file */
|
||||
$file = $this->factory->get('filespec_storage')
|
||||
->set_upload_ary($upload_ary)
|
||||
->set_upload_namespace($this->upload);
|
||||
$this->upload->common_checks($file);
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get maximum file size for remote uploads
|
||||
*
|
||||
* @return int Maximum file size
|
||||
*/
|
||||
protected function get_max_file_size()
|
||||
{
|
||||
$max_file_size = $this->upload->max_filesize;
|
||||
if (!$max_file_size)
|
||||
{
|
||||
$max_file_size = $this->php_ini->getString('upload_max_filesize');
|
||||
|
||||
if (!empty($max_file_size))
|
||||
{
|
||||
$unit = strtolower(substr($max_file_size, -1, 1));
|
||||
$max_file_size = (int) $max_file_size;
|
||||
|
||||
switch ($unit)
|
||||
{
|
||||
case 'g':
|
||||
$max_file_size *= 1024;
|
||||
// no break
|
||||
case 'm':
|
||||
$max_file_size *= 1024;
|
||||
// no break
|
||||
case 'k':
|
||||
$max_file_size *= 1024;
|
||||
// no break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $max_file_size;
|
||||
}
|
||||
}
|
@ -46,9 +46,6 @@ class upload
|
||||
/** @var string Prefix for language variables of errors */
|
||||
public $error_prefix = '';
|
||||
|
||||
/** @var int Timeout for remote upload */
|
||||
public $upload_timeout = 6;
|
||||
|
||||
/** @var \phpbb\files\factory Files factory */
|
||||
protected $factory;
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
namespace phpbb\files\types;
|
||||
|
||||
class foo extends \phpbb\files\types\remote
|
||||
class foo extends \phpbb\files\types\upload
|
||||
{
|
||||
static public $tempnam_path;
|
||||
}
|
||||
|
@ -1,135 +0,0 @@
|
||||
<?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.
|
||||
*
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/type_foo.php';
|
||||
|
||||
class phpbb_files_types_remote_test extends phpbb_test_case
|
||||
{
|
||||
/** @var \phpbb\filesystem\filesystem */
|
||||
private $filesystem;
|
||||
|
||||
/** @var \phpbb\filesystem\temp */
|
||||
private $temp;
|
||||
|
||||
/** @var \phpbb\config\config */
|
||||
protected $config;
|
||||
|
||||
/** @var \Symfony\Component\DependencyInjection\ContainerInterface */
|
||||
protected $container;
|
||||
|
||||
/** @var \phpbb\files\factory */
|
||||
protected $factory;
|
||||
|
||||
/** @var \bantu\IniGetWrapper\IniGetWrapper */
|
||||
protected $php_ini;
|
||||
|
||||
/** @var \phpbb\language\language */
|
||||
protected $language;
|
||||
|
||||
/** @var \phpbb\request\request_interface */
|
||||
protected $request;
|
||||
|
||||
/** @var string phpBB root path */
|
||||
protected $phpbb_root_path;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
global $config, $phpbb_root_path, $phpEx;
|
||||
|
||||
$config = new \phpbb\config\config(array());
|
||||
$this->config = $config;
|
||||
$this->config->set('remote_upload_verify', 0);
|
||||
$this->request = $this->createMock('\phpbb\request\request');
|
||||
|
||||
$cache_path = $phpbb_root_path . 'cache/files';
|
||||
$this->filesystem = new \phpbb\filesystem\filesystem();
|
||||
$this->temp = new \phpbb\filesystem\temp($this->filesystem, $cache_path);
|
||||
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
|
||||
$this->php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
|
||||
|
||||
$this->container = new phpbb_mock_container_builder();
|
||||
$this->container->set('files.filespec', new \phpbb\files\filespec(
|
||||
$this->filesystem,
|
||||
$this->language,
|
||||
$this->php_ini,
|
||||
new \FastImageSize\FastImageSize(),
|
||||
$phpbb_root_path,
|
||||
new \phpbb\mimetype\guesser(array(
|
||||
'mimetype.extension_guesser' => new \phpbb\mimetype\extension_guesser(),
|
||||
))));
|
||||
$this->factory = new \phpbb\files\factory($this->container);
|
||||
|
||||
$this->phpbb_root_path = $phpbb_root_path;
|
||||
}
|
||||
|
||||
public function test_upload_fsock_fail()
|
||||
{
|
||||
$type_remote = new \phpbb\files\types\remote($this->config, $this->factory, $this->temp, $this->language, $this->php_ini, $this->request);
|
||||
$upload = new \phpbb\files\upload($this->factory, $this->language, $this->php_ini, $this->request);
|
||||
$upload->set_allowed_extensions(array('png'));
|
||||
$type_remote->set_upload($upload);
|
||||
|
||||
$file = $type_remote->upload('https://bärföö.com/foo.png');
|
||||
|
||||
$this->assertSame(array('NOT_UPLOADED'), $file->error);
|
||||
}
|
||||
|
||||
public function data_get_max_file_size()
|
||||
{
|
||||
return array(
|
||||
array('', 'http://phpbb.com/foo/bar.png'),
|
||||
array('2k', 'http://phpbb.com/foo/bar.png'),
|
||||
array('500k', 'http://phpbb.com/foo/bar.png'),
|
||||
array('500M', 'http://phpbb.com/foo/bar.png'),
|
||||
array('500m', 'http://phpbb.com/foo/bar.png'),
|
||||
array('500k', 'http://google.com/?.png', array('DISALLOWED_EXTENSION', 'DISALLOWED_CONTENT')),
|
||||
array('1', 'http://google.com/?.png', array('WRONG_FILESIZE')),
|
||||
array('500g', 'http://phpbb.com/foo/bar.png'),
|
||||
array('foobar', 'http://phpbb.com/foo/bar.png'),
|
||||
array('-5k', 'http://phpbb.com/foo/bar.png'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider data_get_max_file_size
|
||||
*/
|
||||
public function test_get_max_file_size($max_file_size, $link, $expected = array('URL_NOT_FOUND'))
|
||||
{
|
||||
$php_ini = $this->createMock('\bantu\IniGetWrapper\IniGetWrapper', array('getString'));
|
||||
$php_ini->expects($this->any())
|
||||
->method('getString')
|
||||
->willReturn($max_file_size);
|
||||
$type_remote = new \phpbb\files\types\remote($this->config, $this->factory, $this->temp, $this->language, $php_ini, $this->request);
|
||||
$upload = new \phpbb\files\upload($this->factory, $this->language, $this->php_ini, $this->request);
|
||||
$upload->set_allowed_extensions(array('png'));
|
||||
$type_remote->set_upload($upload);
|
||||
|
||||
$file = $type_remote->upload($link);
|
||||
|
||||
$this->assertSame($expected, $file->error);
|
||||
}
|
||||
|
||||
public function test_upload_wrong_path()
|
||||
{
|
||||
$type_remote = new \phpbb\files\types\foo($this->config, $this->factory, $this->temp, $this->language, $this->php_ini, $this->request);
|
||||
$upload = new \phpbb\files\upload($this->factory, $this->language, $this->php_ini, $this->request);
|
||||
$upload->set_allowed_extensions(array('png'));
|
||||
$type_remote->set_upload($upload);
|
||||
$type_remote::$tempnam_path = $this->phpbb_root_path . 'cache/wrong/path';
|
||||
|
||||
$file = $type_remote->upload('http://google.com/?.png');
|
||||
|
||||
$this->assertSame(array('NOT_UPLOADED'), $file->error);
|
||||
$type_remote::$tempnam_path = '';
|
||||
}
|
||||
}
|
@ -1,125 +0,0 @@
|
||||
<?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.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @group functional
|
||||
*/
|
||||
class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
|
||||
{
|
||||
/** @var \phpbb\filesystem\filesystem_interface */
|
||||
protected $filesystem;
|
||||
|
||||
/** @var \phpbb\filesystem\temp */
|
||||
protected $temp;
|
||||
|
||||
/** @var \phpbb\files\factory */
|
||||
protected $factory;
|
||||
|
||||
/** @var \bantu\IniGetWrapper\IniGetWrapper */
|
||||
protected $php_ini;
|
||||
|
||||
/** @var \phpbb\language\language */
|
||||
protected $language;
|
||||
|
||||
/** @var \phpbb\request\request_interface */
|
||||
protected $request;
|
||||
|
||||
/** @var string phpBB root path */
|
||||
protected $phpbb_root_path;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
// Only doing this within the functional framework because we need a
|
||||
// URL
|
||||
|
||||
// Global $config required by unique_id
|
||||
global $config, $phpbb_root_path, $phpEx;
|
||||
|
||||
if (!is_array($config))
|
||||
{
|
||||
$config = new \phpbb\config\config(array());
|
||||
}
|
||||
|
||||
$config['rand_seed'] = '';
|
||||
$config['rand_seed_last_update'] = time() + 600;
|
||||
$config['remote_upload_verify'] = 0;
|
||||
|
||||
$this->filesystem = new \phpbb\filesystem\filesystem();
|
||||
$this->temp = new \phpbb\filesystem\temp($this->filesystem, '');
|
||||
$this->language = new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx));
|
||||
$this->request = $this->createMock('\phpbb\request\request');
|
||||
$this->php_ini = new \bantu\IniGetWrapper\IniGetWrapper;
|
||||
|
||||
$container = new phpbb_mock_container_builder();
|
||||
$container->set('files.filespec', new \phpbb\files\filespec($this->filesystem, $this->language, $this->php_ini, new \FastImageSize\FastImageSize(), $this->phpbb_root_path));
|
||||
$this->factory = new \phpbb\files\factory($container);
|
||||
$container->set('files.factory', $this->factory);
|
||||
$container->set('files.types.remote', new \phpbb\files\types\remote($config, $this->factory, $this->temp, $this->language, $this->php_ini, $this->request));
|
||||
$this->phpbb_root_path = $phpbb_root_path;
|
||||
}
|
||||
|
||||
protected function tearDown(): void
|
||||
{
|
||||
global $config, $user;
|
||||
$user = null;
|
||||
$config = array();
|
||||
}
|
||||
|
||||
public function test_invalid_extension()
|
||||
{
|
||||
/** @var \phpbb\files\upload $upload */
|
||||
$upload = new \phpbb\files\upload($this->factory, $this->language, $this->php_ini, $this->request);
|
||||
$upload->set_error_prefix('')
|
||||
->set_allowed_extensions(array('jpg'))
|
||||
->set_max_filesize(100);
|
||||
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'develop/blank.gif');
|
||||
$this->assertEquals('URL_INVALID', $file->error[0]);
|
||||
}
|
||||
|
||||
public function test_empty_file()
|
||||
{
|
||||
/** @var \phpbb\files\upload $upload */
|
||||
$upload = new \phpbb\files\upload($this->factory, $this->language, $this->php_ini, $this->request);
|
||||
$upload->set_error_prefix('')
|
||||
->set_allowed_extensions(array('jpg'))
|
||||
->set_max_filesize(100);
|
||||
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'develop/blank.jpg');
|
||||
$this->assertEquals('EMPTY_REMOTE_DATA', $file->error[0]);
|
||||
}
|
||||
|
||||
public function test_successful_upload()
|
||||
{
|
||||
/** @var \phpbb\files\upload $upload */
|
||||
$upload = new \phpbb\files\upload($this->factory, $this->language, $this->php_ini, $this->request);
|
||||
$upload->set_error_prefix('')
|
||||
->set_allowed_extensions(array('gif'))
|
||||
->set_max_filesize(2000);
|
||||
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'develop/test.gif');
|
||||
$this->assertEquals(0, count($file->error));
|
||||
$this->assertTrue(file_exists($file->get('filename')));
|
||||
$this->assertTrue($file->is_uploaded());
|
||||
}
|
||||
|
||||
public function test_too_large()
|
||||
{
|
||||
/** @var \phpbb\files\upload $upload */
|
||||
$upload = new \phpbb\files\upload($this->factory, $this->language, $this->php_ini, $this->request);
|
||||
$upload->set_error_prefix('')
|
||||
->set_allowed_extensions(array('gif'))
|
||||
->set_max_filesize(100);
|
||||
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'develop/test.gif');
|
||||
$this->assertEquals(1, count($file->error));
|
||||
$this->assertEquals('WRONG_FILESIZE', $file->error[0]);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user