1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-02-25 20:44:01 +01:00

[ticket/14431] Remote avatar uploading

Allow HTTPS images to be remotely uploaded.
Also includes support for redirects (currently up to 5)

PHPBB3-14431
This commit is contained in:
Scott Dutton 2016-01-24 14:21:32 +00:00
parent 67f3017274
commit 610048cc6d

View File

@ -752,10 +752,11 @@ class fileupload
* *
* @param string $upload_url URL pointing to file to upload, for example http://www.foobar.com/example.gif * @param string $upload_url URL pointing to file to upload, for example http://www.foobar.com/example.gif
* @param \phpbb\mimetype\guesser $mimetype_guesser Mimetype guesser * @param \phpbb\mimetype\guesser $mimetype_guesser Mimetype guesser
* @param int $redirect_count the current count of redirects
* @return object $file Object "filespec" is returned, all further operations can be done with this object * @return object $file Object "filespec" is returned, all further operations can be done with this object
* @access public * @access public
*/ */
function remote_upload($upload_url, \phpbb\mimetype\guesser $mimetype_guesser = null) function remote_upload($upload_url, \phpbb\mimetype\guesser $mimetype_guesser = null, $redirect_count = 0)
{ {
global $user, $phpbb_root_path; global $user, $phpbb_root_path;
@ -776,9 +777,18 @@ class fileupload
$url = parse_url($upload_url); $url = parse_url($upload_url);
$default_port = 80;
$hostname = $url['host'];
if ($url['scheme'] == 'https')
{
$default_port = 443;
$hostname = 'tls://' . $url['host'];
}
$host = $url['host']; $host = $url['host'];
$path = $url['path']; $path = $url['path'];
$port = (!empty($url['port'])) ? (int) $url['port'] : 80; $port = (!empty($url['port'])) ? (int) $url['port'] : $default_port;
$upload_ary['type'] = 'application/octet-stream'; $upload_ary['type'] = 'application/octet-stream';
@ -818,7 +828,7 @@ class fileupload
$errno = 0; $errno = 0;
$errstr = ''; $errstr = '';
if (!($fsock = @fsockopen($host, $port, $errno, $errstr))) if (!($fsock = @fsockopen($hostname, $port, $errno, $errstr)))
{ {
$file = new fileerror($user->lang[$this->error_prefix . 'NOT_UPLOADED']); $file = new fileerror($user->lang[$this->error_prefix . 'NOT_UPLOADED']);
return $file; return $file;
@ -899,6 +909,21 @@ class fileupload
$file = new fileerror($user->lang[$this->error_prefix . 'URL_NOT_FOUND']); $file = new fileerror($user->lang[$this->error_prefix . 'URL_NOT_FOUND']);
return $file; return $file;
} }
else if (stripos($line, 'location: ') !== false)
{
//there is a redirect, follow up to 5
if ($redirect_count >= 5)
{
$file = new fileerror($user->lang[$this->error_prefix . 'URL_NOT_FOUND']);
return $file;
}
$upload_url = rtrim(str_replace('location: ', '', strtolower($line)));
//close the current connection, lets not leave dangeling connections open
@fclose($fsock);
return $this->remote_upload($upload_url, $mimetype_guesser, ++$redirect_count);
}
} }
} }