Fixed PHP 5.4 session.upload_progress import library with a workaround
This commit is contained in:
parent
20b5b9bd28
commit
54e34e5ef2
@ -5,9 +5,81 @@
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
|
||||
/* PHP 5.4 stores upload progress data only in the default session.
|
||||
* After calling session_name(), we won't find the progress data anymore.
|
||||
|
||||
* The bug should be somewhere in
|
||||
* https://github.com/php/php-src/blob/master/ext/session/session.c#L2342
|
||||
|
||||
* Until this is fixed, we need to load the default session to load the data.
|
||||
* As we cannot load the phpMyAdmin-session after that, we will try to do
|
||||
* an internal POST request to call ourselves in a new instance.
|
||||
* That POST request grabs the transmitted upload data and stores them.
|
||||
*
|
||||
* TODO: The internal HTTP request may fail if the DNS name cannot be resolved
|
||||
* or if a firewall blocks outgoing requests on the used port.
|
||||
*/
|
||||
|
||||
if (version_compare(PHP_VERSION, '5.4.0', '>=')
|
||||
&& ini_get('session.upload_progress.enabled')) {
|
||||
|
||||
if (!isset($_POST['session_upload_progress'])) {
|
||||
$sessionupload = array();
|
||||
$prefix = ini_get('session.upload_progress.prefix');
|
||||
|
||||
session_start();
|
||||
foreach($_SESSION as $key => $value) {
|
||||
// only copy session-prefixed data
|
||||
if (substr($key, 0, strlen($prefix)) == $prefix) {
|
||||
$sessionupload[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
// perform internal self-request
|
||||
$url = 'http' .
|
||||
((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 's' : '') .
|
||||
'://' . $_SERVER['HTTP_HOST'] .
|
||||
$_SERVER['REQUEST_URI'];
|
||||
|
||||
if (!function_exists('curl_exec') || !function_exists('getallheaders')) {
|
||||
die();
|
||||
}
|
||||
$headers = @getallheaders();
|
||||
if (!isset($headers['Cookie'])) {
|
||||
die();
|
||||
}
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS,
|
||||
'session_upload_progress=' . rawurlencode(serialize($sessionupload)));
|
||||
curl_setopt($ch, CURLOPT_COOKIE, $headers['Cookie']);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
|
||||
|
||||
// to avoid problems with self-signed certs
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
|
||||
|
||||
// show the result of the internal request
|
||||
echo @curl_exec($ch);
|
||||
die();
|
||||
}
|
||||
}
|
||||
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/display_import_ajax.lib.php';
|
||||
|
||||
if (isset($_POST['session_upload_progress'])) {
|
||||
// this is the internal request response
|
||||
// restore sessionupload from the POSTed data (see above),
|
||||
// then write sessionupload back into the loaded session
|
||||
|
||||
$sessionupload = unserialize($_POST['session_upload_progress']);
|
||||
foreach($sessionupload as $key => $value) {
|
||||
$_SESSION[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets globals from $_GET
|
||||
*/
|
||||
|
||||
@ -72,12 +72,16 @@ function PMA_import_uploadprogressCheck()
|
||||
|
||||
/**
|
||||
* Checks if PHP 5.4 session upload-progress feature is available.
|
||||
* Due to a bug in PHP 5.4's session upload feature (see /import_status.php),
|
||||
* we need to check for cURL support.
|
||||
*
|
||||
* @return true if PHP 5.4 session upload-progress is available, false if it is not
|
||||
*/
|
||||
function PMA_import_sessionCheck()
|
||||
{
|
||||
if (PMA_PHP_INT_VERSION < 50400 || ! ini_get('session.upload_progress.enabled')) {
|
||||
if (PMA_PHP_INT_VERSION < 50400
|
||||
|| ! ini_get('session.upload_progress.enabled')
|
||||
|| ! function_exists('curl_exec')) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user