Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpmyadmin/phpmyadmin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJo Michael <me@mynetx.net>2012-04-07 02:23:53 +0400
committerJo Michael <me@mynetx.net>2012-04-07 02:23:53 +0400
commit54e34e5ef208c91b705666149e76fb6ec46486eb (patch)
tree62ebd5b84988deb61e0664259a59f2c0fe31dcc5 /import_status.php
parent20b5b9bd287dee35ecde6e2f1bba4843ed00aea0 (diff)
Fixed PHP 5.4 session.upload_progress import library with a workaround
Diffstat (limited to 'import_status.php')
-rw-r--r--import_status.php72
1 files changed, 72 insertions, 0 deletions
diff --git a/import_status.php b/import_status.php
index e1db636ca6..71dda3e49f 100644
--- a/import_status.php
+++ b/import_status.php
@@ -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
*/