From 35ace5e38430868e1fc8996768c4d70db5e12bfc Mon Sep 17 00:00:00 2001 From: EA117 Date: Thu, 25 Feb 2021 11:55:08 -0600 Subject: [PATCH] [ticket/16708] Update the UTF-8 check for multiple encoding settings Fixed short array syntax, moved testing logic into member helper function. PHPBB3-16708 --- phpBB/includes/acp/acp_main.php | 36 ++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php index 265c7efbd5..2f99c056e6 100644 --- a/phpBB/includes/acp/acp_main.php +++ b/phpBB/includes/acp/acp_main.php @@ -702,9 +702,9 @@ class acp_main 'S_MBSTRING_LOADED' => true, 'S_MBSTRING_FUNC_OVERLOAD_FAIL' => $func_overload && ($func_overload & (MB_OVERLOAD_MAIL | MB_OVERLOAD_STRING)), 'S_MBSTRING_ENCODING_TRANSLATION_FAIL' => $encoding_translation && ($encoding_translation != 0), - 'S_MBSTRING_HTTP_INPUT_FAIL' => $http_input !== null && !in_array(strtolower($http_input), array('utf-8', '')), - 'S_MBSTRING_HTTP_OUTPUT_FAIL' => $http_output !== null && !in_array(strtolower($http_output), array('utf-8', '')), - 'S_DEFAULT_CHARSET_FAIL' => $default_charset !== null && !in_array(strtolower($default_charset), array('utf-8', '')), + 'S_MBSTRING_HTTP_INPUT_FAIL' => $this->warn_if_not_utf8($http_input), + 'S_MBSTRING_HTTP_OUTPUT_FAIL' => $this->warn_if_not_utf8($http_output), + 'S_DEFAULT_CHARSET_FAIL' => $this->warn_if_not_utf8($default_charset), ]); } @@ -717,4 +717,34 @@ class acp_main $this->tpl_name = 'acp_main'; $this->page_title = 'ACP_MAIN'; } + + /** + * Wrapper for checking IniGetWrapper::getString return value for "effectively UTF-8". + * + * Since PHP 5.6.x, PHP wants mbstring.http_input and mbstring.http_output to be blank, + * so that they will inherit default_charset. IniGetWrapper::getString itself returns + * NULL if a setting did not exist. But we can also see PHP itself return an empty string + * when the PHP.INI contains no reference to one of these settings. + * + * So we're going to account for three cases here, and consider that "all of them mean + * we're about to get the UTF-8 encoding behavior that phpBB requires." First is for + * either NULL or an empty string, either of which would represent a system configured + * per PHP documentation to "leave this setting blank." + * + * But we will also accept "UTF-8" or "utf-8". Not just because this is explicitly required + * for checking default_charset, but also because if either mbstring.http_input or + * mbstring.http_output were explicitly configured to this, phpBB is still getting the + * "PHP will use UTF-8" behavior intended. Creating a warning "just because they didn't + * get there with a blank value" doesn't make things better, and may not be a setting + * that the user can change in order to eliminate the unnecessary warning. + * + * @param string $config Value returned from IniGetWrapper::getString() to be examined. + * + * @return bool True (warning should be presented) if the configuration value + * was not effecitvely "UTF-8". Else false (no warning to be shown). + */ + function warn_if_not_utf8($config) + { + return ($config !== null) && (!in_array(strtolower($config), ['utf-8', ''])); + } }