From 8bc056ebe6d5876c6de2a2ca84bf234678c3e702 Mon Sep 17 00:00:00 2001
From: mrgoldy <gijsmartens1@gmail.com>
Date: Sun, 25 Aug 2019 21:24:22 +0200
Subject: [PATCH 1/2] [ticket/16076] addFileFilter to check max file size per
 mime type

PHPBB3-16076
---
 phpBB/assets/javascript/plupload.js           | 38 +++++++++++++++++++
 phpBB/phpbb/plupload/plupload.php             | 36 +++++++++---------
 phpBB/styles/prosilver/template/plupload.html |  9 ++++-
 3 files changed, 63 insertions(+), 20 deletions(-)

diff --git a/phpBB/assets/javascript/plupload.js b/phpBB/assets/javascript/plupload.js
index fab1ca6d7c..ab6d0d7e88 100644
--- a/phpBB/assets/javascript/plupload.js
+++ b/phpBB/assets/javascript/plupload.js
@@ -446,6 +446,44 @@ phpbb.plupload.fileError = function(file, error) {
 phpbb.plupload.uploader = new plupload.Uploader(phpbb.plupload.config);
 phpbb.plupload.initialize();
 
+/**
+ * Add a file filter to check for max file sizes per mime type.
+ */
+plupload.addFileFilter('mime_types_max_file_size', function(types, file, cb) {
+	if (file.size !== 'undefined') {
+		$(types).each(function(i, type) {
+			let extensions = [],
+				exts_array = type.extensions.split(',');
+
+			$(exts_array).each(function(i, extension) {
+				/^\s*\*\s*$/.test(extension) ? extensions.push("\\.*") : extensions.push("\\." + extension.replace(new RegExp("[" + "/^$.*+?|()[]{}\\".replace(/./g, "\\$&") + "]", "g"), "\\$&"));
+			});
+
+			let regex = new RegExp("(" + extensions.join("|") + ")$", "i");
+
+			if (regex.test(file.name)) {
+				if (type.max_file_size !== 'undefined' && type.max_file_size) {
+					if (file.size > type.max_file_size) {
+						phpbb.plupload.uploader.trigger('Error', {
+							code: plupload.FILE_SIZE_ERROR,
+							message: plupload.translate('File size error.'),
+							file: file
+						});
+
+						cb(false);
+					} else {
+						cb(true);
+					}
+				} else {
+					cb(true);
+				}
+
+				return false;
+			}
+		});
+	}
+});
+
 var $fileList = $('#file-list');
 
 /**
diff --git a/phpBB/phpbb/plupload/plupload.php b/phpBB/phpbb/plupload/plupload.php
index eb698fb35d..9ad12b1082 100644
--- a/phpBB/phpbb/plupload/plupload.php
+++ b/phpBB/phpbb/plupload/plupload.php
@@ -216,38 +216,36 @@ class plupload
 	}
 
 	/**
-	* Looks at the list of allowed extensions and generates a string
-	* appropriate for use in configuring plupload with
-	*
-	* @param \phpbb\cache\service $cache
-	* @param string $forum_id The ID of the forum
-	*
-	* @return string
-	*/
+	 * Looks at the list of allowed extensions and generates a string
+	 * appropriate for use in configuring plupload with
+	 *
+	 * @param \phpbb\cache\service	$cache		Cache service object
+	 * @param string				$forum_id	The forum identifier
+	 *
+	 * @return string
+	 */
 	public function generate_filter_string(\phpbb\cache\service $cache, $forum_id)
 	{
+		$groups = [];
+		$filters = [];
+
 		$attach_extensions = $cache->obtain_attach_extensions($forum_id);
 		unset($attach_extensions['_allowed_']);
-		$groups = array();
 
 		// Re-arrange the extension array to $groups[$group_name][]
 		foreach ($attach_extensions as $extension => $extension_info)
 		{
-			if (!isset($groups[$extension_info['group_name']]))
-			{
-				$groups[$extension_info['group_name']] = array();
-			}
-
-			$groups[$extension_info['group_name']][] = $extension;
+			$groups[$extension_info['group_name']]['extensions'][] = $extension;
+			$groups[$extension_info['group_name']]['max_file_size'] = (int) $extension_info['max_filesize'];
 		}
 
-		$filters = array();
-		foreach ($groups as $group => $extensions)
+		foreach ($groups as $group => $group_info)
 		{
 			$filters[] = sprintf(
-				"{title: '%s', extensions: '%s'}",
+				"{title: '%s', extensions: '%s', max_file_size: %s}",
 				addslashes(ucfirst(strtolower($group))),
-				addslashes(implode(',', $extensions))
+				addslashes(implode(',', $group_info['extensions'])),
+				$group_info['max_file_size']
 			);
 		}
 
diff --git a/phpBB/styles/prosilver/template/plupload.html b/phpBB/styles/prosilver/template/plupload.html
index 1eb84372e8..a2ab19a51f 100644
--- a/phpBB/styles/prosilver/template/plupload.html
+++ b/phpBB/styles/prosilver/template/plupload.html
@@ -45,7 +45,14 @@ phpbb.plupload = {
 		max_file_size: '{FILESIZE}b',
 		chunk_size: '{CHUNK_SIZE}b',
 		unique_names: true,
-		filters: [{FILTERS}],
+		filters: {
+			mime_types: [
+				{FILTERS}
+			],
+			mime_types_max_file_size: [
+				{FILTERS}
+			],
+		},
 		{S_RESIZE}
 		headers: {'X-PHPBB-USING-PLUPLOAD': '1', 'X-Requested-With': 'XMLHttpRequest'},
 		file_data_name: 'fileupload',

From c9284e1c687c4a76d6b8503f980eecc21bc35939 Mon Sep 17 00:00:00 2001
From: mrgoldy <gijsmartens1@gmail.com>
Date: Sun, 22 Sep 2019 12:04:10 +0200
Subject: [PATCH 2/2] [ticket/16076] camelCase and callback

PHPBB3-16076
---
 phpBB/assets/javascript/plupload.js | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/phpBB/assets/javascript/plupload.js b/phpBB/assets/javascript/plupload.js
index ab6d0d7e88..f82da1acb1 100644
--- a/phpBB/assets/javascript/plupload.js
+++ b/phpBB/assets/javascript/plupload.js
@@ -449,13 +449,13 @@ phpbb.plupload.initialize();
 /**
  * Add a file filter to check for max file sizes per mime type.
  */
-plupload.addFileFilter('mime_types_max_file_size', function(types, file, cb) {
+plupload.addFileFilter('mime_types_max_file_size', function(types, file, callback) {
 	if (file.size !== 'undefined') {
 		$(types).each(function(i, type) {
 			let extensions = [],
-				exts_array = type.extensions.split(',');
+				extsArray = type.extensions.split(',');
 
-			$(exts_array).each(function(i, extension) {
+			$(extsArray).each(function(i, extension) {
 				/^\s*\*\s*$/.test(extension) ? extensions.push("\\.*") : extensions.push("\\." + extension.replace(new RegExp("[" + "/^$.*+?|()[]{}\\".replace(/./g, "\\$&") + "]", "g"), "\\$&"));
 			});
 
@@ -470,12 +470,12 @@ plupload.addFileFilter('mime_types_max_file_size', function(types, file, cb) {
 							file: file
 						});
 
-						cb(false);
+						callback(false);
 					} else {
-						cb(true);
+						callback(true);
 					}
 				} else {
-					cb(true);
+					callback(true);
 				}
 
 				return false;