From c3fe8d265b64945d7a9c984ff70f94b872b60fc9 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Sat, 25 Jun 2016 21:22:32 +0900 Subject: [PATCH] Move RFC5987 encoding function to UA class --- common/framework/ua.php | 61 ++++++++++++++++++++++++++++++++ modules/file/file.controller.php | 21 ++--------- 2 files changed, 63 insertions(+), 19 deletions(-) diff --git a/common/framework/ua.php b/common/framework/ua.php index b9cf7728b..341545831 100644 --- a/common/framework/ua.php +++ b/common/framework/ua.php @@ -270,4 +270,65 @@ class UA return $result; } + + /** + * This method encodes a UTF-8 filename for downloading in the current visitor's browser. + * + * @param string $filename + * @param string $ua (optional) + * @return string + */ + public static function encodeFilenameForDownload($filename, $ua = null) + { + // Get the User-Agent header if the caller did not specify $ua. + $ua = $ua ?: (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null); + + // Get the browser name and version. + $browser = self::getBrowserInfo($ua); + + // Find the best format that this browser supports. + if ($browser->browser === 'Chrome' && $browser->version >= 11) + { + $output_format = 'rfc5987'; + } + elseif ($browser->browser === 'Firefox' && $browser->version >= 6) + { + $output_format = 'rfc5987'; + } + elseif ($browser->browser === 'Safari' && $browser->version >= 6) + { + $output_format = 'rfc5987'; + } + elseif ($browser->browser === 'IE' && $browser->version >= 10) + { + $output_format = 'rfc5987'; + } + elseif ($browser->browser === 'IE') + { + $output_format = 'old_ie'; + } + else + { + $output_format = 'raw'; + } + + // Clean the filename. + $filename = Filters\FilenameFilter::clean($filename); + + // Apply the format and return. + switch ($output_format) + { + case 'raw': + return 'filename="' . $filename . '"'; + + case 'rfc5987': + $filename = rawurlencode($filename); + return "filename*=UTF-8''" . $filename . '; filename="' . $filename . '"'; + + case 'old_ie': + default: + $filename = rawurlencode($filename); + return 'filename="' . preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1) . '"'; + } + } } diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php index 730e19cab..2719cfc7a 100644 --- a/modules/file/file.controller.php +++ b/modules/file/file.controller.php @@ -342,25 +342,8 @@ class fileController extends file exit(); } - // Filename encoding for browsers that support RFC 5987 - if(preg_match('#(?:Chrome|Edge)/(\d+)\.#', $_SERVER['HTTP_USER_AGENT'], $matches) && $matches[1] >= 11) - { - $filename_param = "filename*=UTF-8''" . rawurlencode($filename) . '; filename="' . rawurlencode($filename) . '"'; - } - elseif(preg_match('#(?:Firefox|Safari|Trident)/(\d+)\.#', $_SERVER['HTTP_USER_AGENT'], $matches) && $matches[1] >= 6) - { - $filename_param = "filename*=UTF-8''" . rawurlencode($filename) . '; filename="' . rawurlencode($filename) . '"'; - } - // Filename encoding for browsers that do not support RFC 5987 - elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) - { - $filename = rawurlencode($filename); - $filename_param = 'filename="' . preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1) . '"'; - } - else - { - $filename_param = 'filename="' . $filename . '"'; - } + // Encode the filename. + $filename_param = Rhymix\Framework\UA::encodeFilenameForDownload($filename); // Close context to prevent blocking the session Context::close();