From 5e0038b62d3b0b61ea5375991740de7b038e0a18 Mon Sep 17 00:00:00 2001 From: Jakub Vrana Date: Sun, 19 Aug 2012 13:42:13 -0700 Subject: [PATCH] Improve session management --- adminer/drivers/mysql.inc.php | 6 ++++-- adminer/include/bootstrap.inc.php | 2 +- adminer/include/design.inc.php | 1 + adminer/include/functions.inc.php | 9 +++++++++ adminer/select.inc.php | 1 - adminer/sql.inc.php | 5 +---- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 41c685c5..dce1433e 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -271,11 +271,13 @@ if (!defined("DRIVER")) { $return = &get_session("dbs"); if ($return === null) { if ($flush) { - restart_session(); ob_flush(); flush(); } - $return = get_vals($connection->server_info >= 5 ? "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA" : "SHOW DATABASES"); // SHOW DATABASES can be disabled by skip_show_database + $databases = get_vals($connection->server_info >= 5 ? "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA" : "SHOW DATABASES"); // SHOW DATABASES can be disabled by skip_show_database + restart_session(); + $return = $databases; + stop_session(); } return $return; } diff --git a/adminer/include/bootstrap.inc.php b/adminer/include/bootstrap.inc.php index e9d787fd..48a36dd1 100644 --- a/adminer/include/bootstrap.inc.php +++ b/adminer/include/bootstrap.inc.php @@ -76,8 +76,8 @@ include "../adminer/include/auth.inc.php"; include "./include/connect.inc.php"; include "./include/editing.inc.php"; -session_cache_limiter(""); // to allow restarting session if (!ini_bool("session.use_cookies") || @ini_set("session.use_cookies", false) !== false) { // @ - may be disabled + session_cache_limiter(""); // to allow restarting session session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later } diff --git a/adminer/include/design.inc.php b/adminer/include/design.inc.php index 4fb81df5..6bbcf564 100644 --- a/adminer/include/design.inc.php +++ b/adminer/include/design.inc.php @@ -77,6 +77,7 @@ document.body.className = document.body.className.replace(/ nojs/, ' js'); if (DB != "" && $databases && !in_array(DB, $databases, true)) { $databases = null; } + stop_session(); if ($error) { echo "
$error
\n"; } diff --git a/adminer/include/functions.inc.php b/adminer/include/functions.inc.php index 97d011eb..6f7004d2 100644 --- a/adminer/include/functions.inc.php +++ b/adminer/include/functions.inc.php @@ -396,6 +396,15 @@ function restart_session() { } } +/** Stop session if it would be possible to restart it later +* @return null +*/ +function stop_session() { + if (!ini_bool("session.use_cookies")) { + session_write_close(); + } +} + /** Get session variable for current server * @param string * @return mixed diff --git a/adminer/select.inc.php b/adminer/select.inc.php index 9a0a781f..23c2329e 100644 --- a/adminer/select.inc.php +++ b/adminer/select.inc.php @@ -189,7 +189,6 @@ if ($_POST && !$error) { $table_name = $adminer->tableName($table_status); page_header(lang('Select') . ": $table_name", $error); -session_write_close(); $set = null; if (isset($rights["insert"])) { diff --git a/adminer/sql.inc.php b/adminer/sql.inc.php index 58d260a7..6355c5c1 100644 --- a/adminer/sql.inc.php +++ b/adminer/sql.inc.php @@ -39,9 +39,6 @@ if (!$error && $_POST) { } } $space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\n]*\n|--\n)"; - if (!ini_bool("session.use_cookies")) { - session_write_close(); - } $delimiter = ";"; $offset = 0; $empty = true; @@ -136,7 +133,7 @@ if (!$error && $_POST) { if (preg_match("~^$space*(CREATE|DROP|ALTER)$space+(DATABASE|SCHEMA)\\b~isU", $q)) { restart_session(); set_session("dbs", null); // clear cache - session_write_close(); + stop_session(); } if (!$_POST["only_errors"]) { echo "

" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "$time\n";