From a3d77ce84b0e8f30a6cbf9f87d5ebf188dbcaa4c Mon Sep 17 00:00:00 2001 From: William Desportes Date: Wed, 15 May 2019 15:52:07 +0200 Subject: [PATCH 1/5] Fix #14184 - HTTPS/HTTP cookie separation issue (aka Failed to set session cookie. Maybe you are using HTTP instead of HTTPS) Duplicate-of-pull-request: #14420 Fixes: #14184 Signed-off-by: William Desportes --- libraries/classes/Config.php | 63 ++++++++++++++----- libraries/classes/ErrorReport.php | 5 +- libraries/classes/LanguageManager.php | 4 +- .../Plugins/Auth/AuthenticationCookie.php | 29 +++++---- .../classes/Plugins/AuthenticationPlugin.php | 5 +- libraries/classes/Session.php | 10 +-- libraries/classes/ThemeManager.php | 7 ++- libraries/classes/Url.php | 11 +++- libraries/common.inc.php | 6 +- 9 files changed, 98 insertions(+), 42 deletions(-) diff --git a/libraries/classes/Config.php b/libraries/classes/Config.php index aa265a67b9..39eac61d0e 100644 --- a/libraries/classes/Config.php +++ b/libraries/classes/Config.php @@ -987,7 +987,7 @@ class Config } // save language - if (isset($_COOKIE['pma_lang']) || isset($_POST['lang'])) { + if ($this->issetCookie('pma_lang') || isset($_POST['lang'])) { if ((! isset($config_data['lang']) && $GLOBALS['lang'] != 'en') || isset($config_data['lang']) @@ -1061,7 +1061,7 @@ class Config */ public function getUserValue($cookie_name, $cfg_value) { - $cookie_exists = isset($_COOKIE) && !empty($_COOKIE[$cookie_name]); + $cookie_exists = isset($_COOKIE) && !empty($this->getCookie($cookie_name)); $prefs_type = $this->get('user_preferences'); if ($prefs_type == 'db') { // permanent user preferences value exists, remove cookie @@ -1069,7 +1069,7 @@ class Config $this->removeCookie($cookie_name); } } elseif ($cookie_exists) { - return $_COOKIE[$cookie_name]; + return $this->getCookie($cookie_name); } // return value from $cfg array return $cfg_value; @@ -1528,20 +1528,22 @@ class Config /** * removes cookie * - * @param string $cookie name of cookie to remove + * @param string $cookieName name of cookie to remove * * @return boolean result of setcookie() */ - public function removeCookie($cookie) + public function removeCookie($cookieName) { + $httpCookieName = $this->getCookieName($cookieName); + + if ($this->issetCookie($cookieName)) { + unset($_COOKIE[$httpCookieName]); + } if (defined('TESTSUITE')) { - if (isset($_COOKIE[$cookie])) { - unset($_COOKIE[$cookie]); - } return true; } return setcookie( - $cookie, + $httpCookieName, '', time() - 3600, $this->getRootPath(), @@ -1568,19 +1570,21 @@ class Config if (strlen($value) > 0 && null !== $default && $value === $default ) { // default value is used - if (isset($_COOKIE[$cookie])) { + if ($this->issetCookie($cookie)) { // remove cookie return $this->removeCookie($cookie); } return false; } - if (strlen($value) === 0 && isset($_COOKIE[$cookie])) { + if (strlen($value) === 0 && $this->issetCookie($cookie)) { // remove cookie, value is empty return $this->removeCookie($cookie); } - if (! isset($_COOKIE[$cookie]) || $_COOKIE[$cookie] !== $value) { + $httpCookieName = $this->getCookieName($cookie); + + if (! $this->issetCookie($cookie) || $this->getCookie($cookie) !== $value) { // set cookie with new value /* Calculate cookie validity */ if ($validity === null) { @@ -1593,11 +1597,11 @@ class Config $validity = time() + $validity; } if (defined('TESTSUITE')) { - $_COOKIE[$cookie] = $value; + $_COOKIE[$httpCookieName] = $value; return true; } return setcookie( - $cookie, + $httpCookieName, $value, $validity, $this->getRootPath(), @@ -1611,6 +1615,37 @@ class Config return true; } + /** + * get cookie + * + * @param string $cookieName The name of the cookie to get + * + * @return mixed result of getCookie() + */ + public function getCookie(string $cookieName) { + return @$_COOKIE[$this->getCookieName($cookieName)]; + } + + /** + * Get the real cookie name + * + * @param string $cookieName The name of the cookie + * @return string + */ + public function getCookieName(string $cookieName) { + return $cookieName. ( ($this->isHttps()) ? '_https' : '' ); + } + + /** + * isset cookie + * + * @param string $cookieName The name of the cookie to check + * + * @return bool result of issetCookie() + */ + public function issetCookie(string $cookieName) { + return isset($_COOKIE[$this->getCookieName($cookieName)]); + } /** * Error handler to catch fatal errors when loading configuration diff --git a/libraries/classes/ErrorReport.php b/libraries/classes/ErrorReport.php index d11462a67a..6a3e65a230 100644 --- a/libraries/classes/ErrorReport.php +++ b/libraries/classes/ErrorReport.php @@ -72,6 +72,9 @@ class ErrorReport */ public function getData($exceptionType = 'js') { + /** @var Config $PMA_Config */ + global $PMA_Config; + $relParams = $this->relation->getRelationsParam(); // common params for both, php & js exceptions $report = [ @@ -81,7 +84,7 @@ class ErrorReport "user_os" => PMA_USR_OS, "server_software" => $_SERVER['SERVER_SOFTWARE'], "user_agent_string" => $_SERVER['HTTP_USER_AGENT'], - "locale" => $_COOKIE['pma_lang'], + "locale" => $PMA_Config->getCookie('pma_lang'), "configuration_storage" => is_null($relParams['db']) ? "disabled" : "enabled", "php_version" => phpversion() diff --git a/libraries/classes/LanguageManager.php b/libraries/classes/LanguageManager.php index 6e117df9eb..692b8d9ceb 100644 --- a/libraries/classes/LanguageManager.php +++ b/libraries/classes/LanguageManager.php @@ -864,8 +864,8 @@ class LanguageManager } // check previous set language - if (! empty($_COOKIE['pma_lang'])) { - $lang = $this->getLanguage($_COOKIE['pma_lang']); + if (! empty($GLOBALS['PMA_Config']->getCookie('pma_lang'))) { + $lang = $this->getLanguage($GLOBALS['PMA_Config']->getCookie('pma_lang')); if ($lang !== false) { return $lang; } diff --git a/libraries/classes/Plugins/Auth/AuthenticationCookie.php b/libraries/classes/Plugins/Auth/AuthenticationCookie.php index a681f60db3..997fe9632d 100644 --- a/libraries/classes/Plugins/Auth/AuthenticationCookie.php +++ b/libraries/classes/Plugins/Auth/AuthenticationCookie.php @@ -357,12 +357,13 @@ class AuthenticationCookie extends AuthenticationPlugin // and $this->password variables from cookies // check cookies - if (empty($_COOKIE['pmaUser-' . $GLOBALS['server']])) { + $serverCookie = $GLOBALS['PMA_Config']->getCookie('pmaUser-' . $GLOBALS['server']); + if (empty($serverCookie)) { return false; } $value = $this->cookieDecrypt( - $_COOKIE['pmaUser-' . $GLOBALS['server']], + $serverCookie, $this->_getEncryptionSecret() ); @@ -404,11 +405,13 @@ class AuthenticationCookie extends AuthenticationPlugin } // check password cookie - if (empty($_COOKIE['pmaAuth-' . $GLOBALS['server']])) { + $serverCookie = $GLOBALS['PMA_Config']->getCookie('pmaAuth-' . $GLOBALS['server']); + + if (empty($serverCookie)) { return false; } $value = $this->cookieDecrypt( - $_COOKIE['pmaAuth-' . $GLOBALS['server']], + $serverCookie, $this->_getSessionEncryptionSecret() ); if ($value === false) { @@ -868,20 +871,22 @@ class AuthenticationCookie extends AuthenticationPlugin */ public function logOut() { + /** @var Config $PMA_Config */ + global $PMA_Config; + // -> delete password cookie(s) if ($GLOBALS['cfg']['LoginCookieDeleteAll']) { foreach ($GLOBALS['cfg']['Servers'] as $key => $val) { - $GLOBALS['PMA_Config']->removeCookie('pmaAuth-' . $key); - if (isset($_COOKIE['pmaAuth-' . $key])) { - unset($_COOKIE['pmaAuth-' . $key]); + $PMA_Config->removeCookie('pmaAuth-' . $key); + if ($PMA_Config->issetCookie('pmaAuth-' . $key)) { + $PMA_Config->removeCookie('pmaAuth-' . $key); } } } else { - $GLOBALS['PMA_Config']->removeCookie( - 'pmaAuth-' . $GLOBALS['server'] - ); - if (isset($_COOKIE['pmaAuth-' . $GLOBALS['server']])) { - unset($_COOKIE['pmaAuth-' . $GLOBALS['server']]); + $cookieName = 'pmaAuth-' . $GLOBALS['server']; + $PMA_Config->removeCookie($cookieName); + if ($PMA_Config->issetCookie($cookieName)) { + $PMA_Config->removeCookie($cookieName); } } parent::logOut(); diff --git a/libraries/classes/Plugins/AuthenticationPlugin.php b/libraries/classes/Plugins/AuthenticationPlugin.php index b174df0173..7e3edf6dbf 100644 --- a/libraries/classes/Plugins/AuthenticationPlugin.php +++ b/libraries/classes/Plugins/AuthenticationPlugin.php @@ -100,6 +100,9 @@ abstract class AuthenticationPlugin */ public function logOut() { + /** @var Config $PMA_Config */ + global $PMA_Config; + /* Obtain redirect URL (before doing logout) */ if (! empty($GLOBALS['cfg']['Server']['LogoutURL'])) { $redirect_url = $GLOBALS['cfg']['Server']['LogoutURL']; @@ -119,7 +122,7 @@ abstract class AuthenticationPlugin && $GLOBALS['cfg']['Server']['auth_type'] == 'cookie' ) { foreach ($GLOBALS['cfg']['Servers'] as $key => $val) { - if (isset($_COOKIE['pmaAuth-' . $key])) { + if ($PMA_Config->issetCookie('pmaAuth-' . $key)) { $server = $key; } } diff --git a/libraries/classes/Session.php b/libraries/classes/Session.php index 7e4cf62811..4290fd6081 100644 --- a/libraries/classes/Session.php +++ b/libraries/classes/Session.php @@ -175,12 +175,12 @@ class Session // proxy servers session_cache_limiter('private'); - $session_name = 'phpMyAdmin'; - @session_name($session_name); + $httpCookieName = $config->getCookieName('phpMyAdmin'); + @session_name($httpCookieName); // Restore correct sesion ID (it might have been reset by auto started session - if (isset($_COOKIE['phpMyAdmin'])) { - session_id($_COOKIE['phpMyAdmin']); + if ($config->issetCookie('phpMyAdmin')) { + session_id($config->getCookie('phpMyAdmin')); } // on first start of session we check for errors @@ -192,7 +192,7 @@ class Session if ($session_result !== true || $orig_error_count != $errorHandler->countErrors(false) ) { - setcookie($session_name, '', 1); + setcookie($httpCookieName, '', 1); $errors = $errorHandler->sliceErrors($orig_error_count); self::sessionFailed($errors); } diff --git a/libraries/classes/ThemeManager.php b/libraries/classes/ThemeManager.php index 9d7ff2c2de..0ac38fcfee 100644 --- a/libraries/classes/ThemeManager.php +++ b/libraries/classes/ThemeManager.php @@ -212,9 +212,12 @@ class ThemeManager */ public function getThemeCookie() { + /** @var Config $PMA_Config */ + global $PMA_Config; + $name = $this->getThemeCookieName(); - if (isset($_COOKIE[$name])) { - return $_COOKIE[$name]; + if ($PMA_Config->issetCookie($name)) { + return $PMA_Config->getCookie($name); } return false; diff --git a/libraries/classes/Url.php b/libraries/classes/Url.php index 6733d1265c..f527819fbb 100644 --- a/libraries/classes/Url.php +++ b/libraries/classes/Url.php @@ -33,6 +33,9 @@ class Url public static function getHiddenInputs($db = '', $table = '', $indent = 0, $skip = array() ) { + /** @var Config $PMA_Config */ + global $PMA_Config; + if (is_array($db)) { $params =& $db; $_indent = empty($table) ? $indent : $table; @@ -54,7 +57,7 @@ class Url ) { $params['server'] = $GLOBALS['server']; } - if (empty($_COOKIE['pma_lang']) && ! empty($GLOBALS['lang'])) { + if (empty($PMA_Config->getCookie('pma_lang')) && ! empty($GLOBALS['lang'])) { $params['lang'] = $GLOBALS['lang']; } @@ -198,18 +201,20 @@ class Url */ public static function getCommonRaw($params = array(), $divider = '?') { + /** @var Config $PMA_Config */ + global $PMA_Config; $separator = Url::getArgSeparator(); // avoid overwriting when creating navi panel links to servers if (isset($GLOBALS['server']) && $GLOBALS['server'] != $GLOBALS['cfg']['ServerDefault'] && ! isset($params['server']) - && ! $GLOBALS['PMA_Config']->get('is_setup') + && ! $PMA_Config->get('is_setup') ) { $params['server'] = $GLOBALS['server']; } - if (empty($_COOKIE['pma_lang']) && ! empty($GLOBALS['lang'])) { + if (empty($PMA_Config->getCookie('pma_lang')) && ! empty($GLOBALS['lang'])) { $params['lang'] = $GLOBALS['lang']; } diff --git a/libraries/common.inc.php b/libraries/common.inc.php index ed92fea624..b938bd0098 100644 --- a/libraries/common.inc.php +++ b/libraries/common.inc.php @@ -152,7 +152,8 @@ if (Core::checkPageValidity($_REQUEST['goto'])) { $GLOBALS['goto'] = $_REQUEST['goto']; $GLOBALS['url_params']['goto'] = $_REQUEST['goto']; } else { - unset($_REQUEST['goto'], $_GET['goto'], $_POST['goto'], $_COOKIE['goto']); + $GLOBALS['PMA_Config']->removeCookie('goto'); + unset($_REQUEST['goto'], $_GET['goto'], $_POST['goto']); } /** @@ -162,7 +163,8 @@ if (Core::checkPageValidity($_REQUEST['goto'])) { if (Core::checkPageValidity($_REQUEST['back'])) { $GLOBALS['back'] = $_REQUEST['back']; } else { - unset($_REQUEST['back'], $_GET['back'], $_POST['back'], $_COOKIE['back']); + $GLOBALS['PMA_Config']->removeCookie('back'); + unset($_REQUEST['back'], $_GET['back'], $_POST['back']); } /** From 09464ba8f5fecc3cbba61c0be7ae7b1b592a92f2 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Wed, 15 May 2019 21:17:41 +0200 Subject: [PATCH 2/5] Fix unit tests Signed-off-by: William Desportes --- test/classes/ConfigTest.php | 1 + test/classes/LanguageTest.php | 1 + test/classes/Plugins/Auth/AuthenticationCookieTest.php | 9 +++++++++ 3 files changed, 11 insertions(+) diff --git a/test/classes/ConfigTest.php b/test/classes/ConfigTest.php index 954f21047e..3726d27528 100644 --- a/test/classes/ConfigTest.php +++ b/test/classes/ConfigTest.php @@ -863,6 +863,7 @@ class ConfigTest extends PmaTestCase */ public function testSetCookie() { + $this->object->set('is_https', false); $this->assertFalse( $this->object->setCookie( 'TEST_DEF_COOKIE', diff --git a/test/classes/LanguageTest.php b/test/classes/LanguageTest.php index 72c9032afc..f225b969fa 100644 --- a/test/classes/LanguageTest.php +++ b/test/classes/LanguageTest.php @@ -159,6 +159,7 @@ class LanguageTest extends PmaTestCase public function testSelect($lang, $post, $get, $cookie, $accept, $agent, $default, $expect) { $GLOBALS['PMA_Config']->set('Lang', $lang); + $GLOBALS['PMA_Config']->set('is_https', false); $_POST['lang'] = $post; $_GET['lang'] = $get; $_COOKIE['pma_lang'] = $cookie; diff --git a/test/classes/Plugins/Auth/AuthenticationCookieTest.php b/test/classes/Plugins/Auth/AuthenticationCookieTest.php index 576ca7d49a..fc5e034c20 100644 --- a/test/classes/Plugins/Auth/AuthenticationCookieTest.php +++ b/test/classes/Plugins/Auth/AuthenticationCookieTest.php @@ -366,6 +366,7 @@ class AuthenticationCookieTest extends PmaTestCase */ public function testAuthHeaderPartial() { + $GLOBALS['PMA_Config']->set('is_https', false); $GLOBALS['cfg']['LoginCookieDeleteAll'] = false; $GLOBALS['cfg']['Servers'] = array(1, 2, 3); $GLOBALS['cfg']['Server']['LogoutURL'] = 'https://example.com/logout'; @@ -413,6 +414,7 @@ class AuthenticationCookieTest extends PmaTestCase $GLOBALS['cfg']['CaptchaLoginPublicKey'] = ''; $GLOBALS['cfg']['LoginCookieDeleteAll'] = true; $GLOBALS['PMA_Config']->set('PmaAbsoluteUri', ''); + $GLOBALS['PMA_Config']->set('is_https', false); $GLOBALS['cfg']['Servers'] = array(1); $_COOKIE['pmaAuth-0'] = 'test'; @@ -438,6 +440,7 @@ class AuthenticationCookieTest extends PmaTestCase $GLOBALS['cfg']['CaptchaLoginPublicKey'] = ''; $GLOBALS['cfg']['LoginCookieDeleteAll'] = false; $GLOBALS['PMA_Config']->set('PmaAbsoluteUri', ''); + $GLOBALS['PMA_Config']->set('is_https', false); $GLOBALS['cfg']['Servers'] = array(1); $GLOBALS['server'] = 1; $GLOBALS['cfg']['Server'] = array('auth_type' => 'cookie'); @@ -550,6 +553,7 @@ class AuthenticationCookieTest extends PmaTestCase $_SESSION['last_access_time'] = ''; $GLOBALS['cfg']['CaptchaLoginPrivateKey'] = ''; $GLOBALS['cfg']['CaptchaLoginPublicKey'] = ''; + $GLOBALS['PMA_Config']->set('is_https', false); // mock for blowfish function $this->object = $this->getMockBuilder('PhpMyAdmin\Plugins\Auth\AuthenticationCookie') @@ -590,6 +594,7 @@ class AuthenticationCookieTest extends PmaTestCase $GLOBALS['cfg']['CaptchaLoginPublicKey'] = ''; $_SESSION['browser_access_time']['default'] = time() - 1000; $GLOBALS['cfg']['LoginCookieValidity'] = 1440; + $GLOBALS['PMA_Config']->set('is_https', false); // mock for blowfish function $this->object = $this->getMockBuilder('PhpMyAdmin\Plugins\Auth\AuthenticationCookie') @@ -635,6 +640,8 @@ class AuthenticationCookieTest extends PmaTestCase $GLOBALS['cfg']['CaptchaLoginPublicKey'] = ''; $GLOBALS['cfg']['LoginCookieValidity'] = 0; $_SESSION['browser_access_time']['default'] = -1; + $GLOBALS['PMA_Config']->set('is_https', false); + // mock for blowfish function $this->object = $this->getMockBuilder('PhpMyAdmin\Plugins\Auth\AuthenticationCookie') ->disableOriginalConstructor() @@ -678,6 +685,7 @@ class AuthenticationCookieTest extends PmaTestCase $GLOBALS['server'] = 2; $GLOBALS['cfg']['LoginCookieStore'] = true; $GLOBALS['from_cookie'] = true; + $GLOBALS['PMA_Config']->set('is_https', false); $this->object->storeCredentials(); @@ -1064,6 +1072,7 @@ class AuthenticationCookieTest extends PmaTestCase public function testPasswordChange() { $newPassword = 'PMAPASSWD2'; + $GLOBALS['PMA_Config']->set('is_https', false); $GLOBALS['cfg']['AllowArbitraryServer'] = true; $GLOBALS['pma_auth_server'] = 'b 2'; $_SESSION['encryption_key'] = ''; From 45d46a6316c7a79d8c110ccbd18035c4d0c633fb Mon Sep 17 00:00:00 2001 From: William Desportes Date: Wed, 15 May 2019 21:26:45 +0200 Subject: [PATCH 3/5] Remove typehints for hhvm Signed-off-by: William Desportes --- libraries/classes/Config.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/classes/Config.php b/libraries/classes/Config.php index 39eac61d0e..969db189f6 100644 --- a/libraries/classes/Config.php +++ b/libraries/classes/Config.php @@ -1622,7 +1622,7 @@ class Config * * @return mixed result of getCookie() */ - public function getCookie(string $cookieName) { + public function getCookie($cookieName) { return @$_COOKIE[$this->getCookieName($cookieName)]; } @@ -1632,7 +1632,7 @@ class Config * @param string $cookieName The name of the cookie * @return string */ - public function getCookieName(string $cookieName) { + public function getCookieName($cookieName) { return $cookieName. ( ($this->isHttps()) ? '_https' : '' ); } @@ -1643,7 +1643,7 @@ class Config * * @return bool result of issetCookie() */ - public function issetCookie(string $cookieName) { + public function issetCookie($cookieName) { return isset($_COOKIE[$this->getCookieName($cookieName)]); } From 2dbaa6f3d984c8f467b462ea2f9e157794813a86 Mon Sep 17 00:00:00 2001 From: Kongfa Warorot Date: Fri, 1 Nov 2019 01:07:57 +0000 Subject: [PATCH 4/5] Translated using Weblate (Thai) Currently translated at 40.4% (1334 of 3304 strings) [CI skip] Translation: phpMyAdmin/4.9 Translate-URL: https://hosted.weblate.org/projects/phpmyadmin/4-9/th/ Signed-off-by: Kongfa Warorot --- po/th.po | 98 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/po/th.po b/po/th.po index 26c92852a8..ef56fd15b2 100644 --- a/po/th.po +++ b/po/th.po @@ -4,7 +4,7 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.9.2-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2019-10-29 00:34+0100\n" -"PO-Revision-Date: 2019-10-31 08:04+0000\n" +"PO-Revision-Date: 2019-11-02 04:04+0000\n" "Last-Translator: Kongfa Warorot \n" "Language-Team: Thai " "\n" @@ -2223,7 +2223,7 @@ msgid "" "Indicates that you have made changes to this page; you will be prompted for " "confirmation before abandoning changes" msgstr "" -"เพื่อระบุว่าคุณได้ทำการเปลี่ยนแปลงในหน้านี้ " +"เพื่อระบุว่าคุณได้ทำการเปลี่ยนแปลงในหน้านี้ " "คุณจะได้รับการแจ้งให้ยืนยันก่อนที่จะละทิ้งการเปลี่ยนแปลง" #: js/messages.php:555 @@ -2312,7 +2312,7 @@ msgstr "บันทึกการแก้ไขเรียบร้อยแ #: js/messages.php:581 #, php-format msgid "Add an option for column \"%s\"." -msgstr "เพิ่มตัวเลือกสำหรับคอลัมน์ \"%s\"" +msgstr "เพิ่มตัวเลือกสำหรับคอลัมน์ \"%s\"" #: js/messages.php:582 #, php-format @@ -2531,6 +2531,8 @@ msgid "" "Your export is incomplete, due to a low execution time limit at the PHP " "level!" msgstr "" +"การส่งออกของคุณไม่ประสบความสำเร็จ เนื่องจากการจำกัดของเวลาในการเรียกใช้คำสั่" +"งใน PHP!" #: js/messages.php:693 #, php-format @@ -2538,10 +2540,13 @@ msgid "" "Warning: a form on this page has more than %d fields. On submission, some of " "the fields might be ignored, due to PHP's max_input_vars configuration." msgstr "" +"คำเตือน: ฟอร์มในหน้านี้มีช่องฟิลด์มากกว่า %d ช่อง " +"ในการส่งข้อมูลบางส่วนของฟิลด์อาจถูกละเว้นเนื่องจากการกำหนดค่า max_input_vars " +"ของ PHP" #: js/messages.php:699 js/messages.php:712 msgid "Some errors have been detected on the server!" -msgstr "" +msgstr "มีข้อผิดพลาดบางอย่างถูกตรวจจับบนเซิร์ฟเวอร์ของคุณ!" #: js/messages.php:701 msgid "Please look at the bottom of this window." @@ -2554,7 +2559,7 @@ msgstr "ไม่สนใจทั้งหมด" #: js/messages.php:715 msgid "" "As per your settings, they are being submitted currently, please be patient." -msgstr "" +msgstr "ตามการตั้งค่าของคุณ พวกมันกำลังถูกส่งในขณะนี้กรุณาอดทนรอ" #: js/messages.php:725 msgid "Execute this query again?" @@ -2599,6 +2604,12 @@ msgid "" "cause such a problem, clearing your \"Offline Website Data\" might help. In " "Safari, such problem is commonly caused by \"Private Mode Browsing\"." msgstr "" +"มีปัญหาในการเข้าถึงที่เก็บเบราว์เซอร์ของคุณ " +"คุณลักษณะบางอย่างอาจไม่ทำงานอย่างถูกต้องสำหรับคุณ " +"มีแนวโน้มว่าเบราว์เซอร์ไม่สนับสนุนการจัดเก็บข้อมูลหรือถึงขีดจำกัดโควต้า ใน " +"Firefox การจัดเก็บข้อมูลที่เสียหายอาจทำให้เกิดปัญหาเช่นการล้างข้อมูล \"" +"ข้อมูลเว็บไซต์แบบออฟไลน์\" ของคุณอาจช่วยได้ ใน Safari ปัญหาดังกล่าวมักเกิ" +"ดจาก \"การเรียกดูโหมดส่วนตัว\"" #: js/messages.php:738 msgid "Copy tables to" @@ -2996,7 +3007,7 @@ msgstr "เกิกข้อผิดพลาดในขณะที่คำ #: libraries/classes/Advisor.php:290 #, php-format msgid "Failed evaluating precondition for rule '%s'." -msgstr "" +msgstr "การประเมินเงื่อนไขกฎ '%s' ล้มเหลว" #: libraries/classes/Advisor.php:307 #, php-format @@ -3022,7 +3033,7 @@ msgstr "ข้อผิดพลาดในการอ่านไฟล์: #, php-format msgid "" "Invalid rule declaration on line %1$s, expected line %2$s of previous rule." -msgstr "" +msgstr "การประกาศกฎไม่ถูกต้องบนบรรทัด %1$s คาดหวังบรรทัด %2$s ของกฎก่อนหน้านี้" #: libraries/classes/Advisor.php:567 #, php-format @@ -3089,6 +3100,7 @@ msgid "" "The configuration storage is not ready for the central list of columns " "feature." msgstr "" +"การจัดเก็บการกำหนดค่าไม่พร้อมใช้งานสำหรับรายการส่วนกลางของคุณลักษณะของคอลัมน์" #: libraries/classes/CentralColumns.php:362 #, php-format @@ -3103,7 +3115,7 @@ msgstr "คอลัมน์ไม่ได้ถูกเพิ่ม!" #, php-format msgid "" "Couldn't remove Column(s) %1$s as they don't exist in central columns list!" -msgstr "" +msgstr "ไม่สามารถลบคอลัมน์ %1$s ตามที่ไม่มีอยู่ในรายการคอลัมน์ส่วนกลาง!" #: libraries/classes/CentralColumns.php:466 msgid "Could not remove columns!" @@ -3470,11 +3482,9 @@ msgid "accent-sensitive" msgstr "สนใจสำเนียง" #: libraries/classes/Charsets.php:675 -#, fuzzy -#| msgid "case-sensitive" msgctxt "Collation variant" msgid "kana-sensitive" -msgstr "สนใจตัวเล็กตัวใหญ่" +msgstr "สนใจการเรียงลำดับตามตัวอักษรคาตาคานะ" #: libraries/classes/Charsets.php:679 msgctxt "Collation variant" @@ -3489,7 +3499,7 @@ msgstr "ข้อมูลไบนารี" #: libraries/classes/Charsets.php:685 msgctxt "Collation variant" msgid "no-pad" -msgstr "" +msgstr "ไม่ต้องเลื่อนช่องว่าง" #: libraries/classes/Config.php:1122 #, php-format @@ -3641,6 +3651,7 @@ msgid "" "Find any errors in the query before executing it. Requires CodeMirror to be " "enabled." msgstr "" +"พบข้อผิดพลาดในคิวรีก่อนที่จะดำเนินการ จำเป็นต้องให้ CodeMirror เปิดใช้งาน" #: libraries/classes/Config/Descriptions.php:127 msgid "Enable linter" @@ -3715,7 +3726,7 @@ msgstr "ยืนยันคิวรี่ DROP" #: libraries/classes/Config/Descriptions.php:167 msgid "" "Log SQL queries and their execution time, to be displayed in the console" -msgstr "" +msgstr "บันทึกคิวรี SQL และเวลาในการดำเนินการที่จะแสดงในคอนโซล" #: libraries/classes/Config/Descriptions.php:169 #: templates/console/display.twig:11 templates/console/display.twig:64 @@ -3723,17 +3734,17 @@ msgid "Debug SQL" msgstr "แก้จุดบกพร่อง SQL" #: libraries/classes/Config/Descriptions.php:171 +#, fuzzy msgid "Tab that is displayed when entering a database." -msgstr "" +msgstr "แท็บที่จะแสดงเมื่อป้อนฐานข้อมูล" #: libraries/classes/Config/Descriptions.php:173 -#, fuzzy msgid "Default database tab" -msgstr "เปลี่ยนชื่อฐานข้อมูลเป็น" +msgstr "แท็บฐานข้อมูลเริ่มต้น" #: libraries/classes/Config/Descriptions.php:175 msgid "Tab that is displayed when entering a server." -msgstr "" +msgstr "แท็บที่จะแสดงเมื่อเข้าสู่เซิร์ฟเวอร์" #: libraries/classes/Config/Descriptions.php:177 msgid "Default server tab" @@ -3741,50 +3752,39 @@ msgstr "แท็บเซิร์ฟเวอร์เริ่มต้น" #: libraries/classes/Config/Descriptions.php:179 msgid "Tab that is displayed when entering a table." -msgstr "" +msgstr "แท็บที่จะแสดงเมื่อเข้าสู่ตาราง" #: libraries/classes/Config/Descriptions.php:181 msgid "Default table tab" msgstr "แท็บตารางเริ่มต้น" #: libraries/classes/Config/Descriptions.php:183 -#, fuzzy -#| msgid "Enclose table and field names with backquotes" msgid "Autocomplete of the table and column names in the SQL queries." -msgstr "ใส่ 'backqoute' ให้กับชื่อตารางและฟิลด์" +msgstr "การทำให้สมบูรณ์โดยอัตโนมัติของชื่อตารางและคอลัมน์ในคิวรี SQL" #: libraries/classes/Config/Descriptions.php:185 -#, fuzzy -#| msgid "Enclose table and field names with backquotes" msgid "Enable autocomplete for table and column names" -msgstr "ใส่ 'backqoute' ให้กับชื่อตารางและฟิลด์" +msgstr "เปิดใช้งานการทำให้สมบูรณ์โดยอัตโนมัติของชื่อตารางและคอลัมน์" #: libraries/classes/Config/Descriptions.php:187 -#, fuzzy -#| msgid "Propose table structure" msgid "Whether the table structure actions should be hidden." -msgstr "เสนอโครงสร้างตาราง" +msgstr "ควรซ่อนการดำเนินการโครงสร้างตาราง" #: libraries/classes/Config/Descriptions.php:189 -#, fuzzy -#| msgid "Table comments" msgid "Show column comments" -msgstr "หมายเหตุของตาราง" +msgstr "แสดงหมายเหตุคอลัมน์" #: libraries/classes/Config/Descriptions.php:191 msgid "Whether column comments should be shown in table structure view" -msgstr "" +msgstr "ควรแสดงความคิดเห็นคอลัมน์ในมุมมองโครงสร้างตาราง" #: libraries/classes/Config/Descriptions.php:193 -#, fuzzy -#| msgid "Propose table structure" msgid "Hide table structure actions" -msgstr "เสนอโครงสร้างตาราง" +msgstr "ซ่อนการดำเนินการโครงสร้างตาราง" #: libraries/classes/Config/Descriptions.php:195 -#, fuzzy msgid "Default transformations for Hex" -msgstr "การแปลงที่เรียกใช้ได้" +msgstr "การแปลงค่าเริ่มต้นสำหรับเลขฐานสิบหก" #: libraries/classes/Config/Descriptions.php:197 #: libraries/classes/Config/Descriptions.php:201 @@ -3799,6 +3799,8 @@ msgid "" "Values for options list for default transformations. These will be " "overwritten if transformation is filled in at table structure page." msgstr "" +"ค่าสำหรับรายการตัวเลือกสำหรับการแปลงค่าเริ่มต้น สิ่งเหล่านี้จะถูกเขียนทับ " +"หากมีการแปลงถูกเติมที่หน้าโครงสร้างตาราง" #: libraries/classes/Config/Descriptions.php:199 #, fuzzy @@ -7457,11 +7459,11 @@ msgstr "" #: libraries/classes/Engines/Innodb.php:175 msgid "pages" -msgstr "" +msgstr "หน้า" #: libraries/classes/Engines/Innodb.php:189 msgid "Free pages" -msgstr "" +msgstr "หน้าฟรี" #: libraries/classes/Engines/Innodb.php:198 msgid "Dirty pages" @@ -7478,7 +7480,7 @@ msgstr "ล้างตาราง %s เรียบร้อยแล้ว" #: libraries/classes/Engines/Innodb.php:225 msgid "Busy pages" -msgstr "" +msgstr "หน้าไม่ว่าง" #: libraries/classes/Engines/Innodb.php:237 msgid "Latched pages" @@ -7498,23 +7500,23 @@ msgstr "" #: libraries/classes/Engines/Innodb.php:273 msgid "Read misses" -msgstr "" +msgstr "อ่านพลาด" #: libraries/classes/Engines/Innodb.php:282 msgid "Write waits" -msgstr "" +msgstr "การเขียนที่อยู่ในระหว่างการรอ" #: libraries/classes/Engines/Innodb.php:291 msgid "Read misses in %" -msgstr "" +msgstr "อ่านพลาดใน %" #: libraries/classes/Engines/Innodb.php:306 msgid "Write waits in %" -msgstr "" +msgstr "การเขียนที่อยู่ในระหว่างการรอใน %" #: libraries/classes/Engines/Myisam.php:28 msgid "Data pointer size" -msgstr "" +msgstr "ขนาดตัวชี้ข้อมูล" #: libraries/classes/Engines/Myisam.php:30 msgid "" @@ -7524,7 +7526,7 @@ msgstr "" #: libraries/classes/Engines/Myisam.php:36 msgid "Automatic recovery mode" -msgstr "" +msgstr "โหมดการกู้คืนอัตโนมัติ" #: libraries/classes/Engines/Myisam.php:38 msgid "" @@ -7534,7 +7536,7 @@ msgstr "" #: libraries/classes/Engines/Myisam.php:43 msgid "Maximum size for temporary sort files" -msgstr "" +msgstr "ขนาดสูงสุดสำหรับไฟล์ที่ถูกจัดเรียงชั่วคราว" #: libraries/classes/Engines/Myisam.php:45 msgid "" @@ -7556,7 +7558,7 @@ msgstr "" #: libraries/classes/Engines/Myisam.php:61 msgid "Repair threads" -msgstr "" +msgstr "ซ่อมแซมเธรด" #: libraries/classes/Engines/Myisam.php:63 msgid "" @@ -7597,7 +7599,7 @@ msgstr "" #: libraries/classes/Engines/Pbxt.php:49 msgid "Log cache size" -msgstr "" +msgstr "ขนาดการบันทึกประวัติการแคช" #: libraries/classes/Engines/Pbxt.php:51 msgid "" From 6baa5f272220a79cbbd4e89ee3b69d638b7ec674 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Sun, 3 Nov 2019 15:38:03 +0100 Subject: [PATCH 5/5] Add ChangeLog entry for #14184 Signed-off-by: William Desportes --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 3c76bf16d0..e054fdc488 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ phpMyAdmin - ChangeLog ====================== 4.9.2 (not yet released) +- issue #14184 Change the cookie name from phpMyAdmin to phpMyAdmin_https for HTTPS - issue #15304 Fix ssl_use php error - issue #14804 Fix undefined index: ssl_* variables - issue #14245 Fix mysql 8.0.3 and above fails on advisor