From db4c7fe743d7cd2019612c9acd732ca0ec4467ea Mon Sep 17 00:00:00 2001
From: Vincent Petry <pvince81@owncloud.com>
Date: Mon, 2 May 2016 17:34:24 +0200
Subject: [PATCH] Add encoding wrapper as opt-in mount option

The encoding wrapper is now only applied when the mount option is set,
disabled by default.
---
 apps/files_external/js/settings.js           | 32 +++++++++++++-------
 apps/files_external/templates/settings.php   |  1 +
 apps/files_external/tests/js/settingsSpec.js |  3 +-
 lib/private/legacy/util.php                  |  6 ++--
 4 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index 55c12cc0ac9..91f5f8d8118 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -33,8 +33,12 @@ var MOUNT_OPTIONS_DROPDOWN_TEMPLATE =
 	'			<option value="1" selected="selected">{{t "files_external" "Once every direct access"}}</option>' +
 	'		</select>' +
 	'	</div>' +
+	'	<div class="optionRow">' +
+	'		<input id="mountOptionsEncoding" name="encoding_compatibility" type="checkbox" value="true"/>' +
+	'		<label for="mountOptionsEncoding">{{t "files_external" "Enable encoding compatibility (decreases performance)"}}</label>' +
+	'	</div>' +
 	'</div>';
-	
+
 /**
  * Returns the selection of applicable users in the given configuration row
  *
@@ -476,9 +480,9 @@ MountOptionsDropdown.prototype = {
 	 *
 	 * @param {Object} $container container
 	 * @param {Object} mountOptions mount options
-	 * @param {Array} enabledOptions enabled mount options
+	 * @param {Array} visibleOptions enabled mount options
 	 */
-	show: function($container, mountOptions, enabledOptions) {
+	show: function($container, mountOptions, visibleOptions) {
 		if (MountOptionsDropdown._last) {
 			MountOptionsDropdown._last.hide();
 		}
@@ -492,7 +496,7 @@ MountOptionsDropdown.prototype = {
 		var $el = $(template());
 		this.$el = $el;
 
-		this.setOptions(mountOptions, enabledOptions);
+		this.setOptions(mountOptions, visibleOptions);
 
 		this.$el.appendTo($container);
 		MountOptionsDropdown._last = this;
@@ -538,9 +542,9 @@ MountOptionsDropdown.prototype = {
 	 * Sets the mount options to the dropdown controls
 	 *
 	 * @param {Object} options mount options
-	 * @param {Array} enabledOptions enabled mount options
+	 * @param {Array} visibleOptions enabled mount options
 	 */
-	setOptions: function(options, enabledOptions) {
+	setOptions: function(options, visibleOptions) {
 		var $el = this.$el;
 		_.each(options, function(value, key) {
 			var $optionEl = $el.find('input, select').filterAttr('name', key);
@@ -556,7 +560,7 @@ MountOptionsDropdown.prototype = {
 		$el.find('.optionRow').each(function(i, row){
 			var $row = $(row);
 			var optionId = $row.find('input, select').attr('name');
-			if (enabledOptions.indexOf(optionId) === -1) {
+			if (visibleOptions.indexOf(optionId) === -1) {
 				$row.hide();
 			} else {
 				$row.show();
@@ -883,7 +887,8 @@ MountConfigListView.prototype = _.extend({
 				'encrypt': true,
 				'previews': true,
 				'enable_sharing': false,
-				'filesystem_check_changes': 1
+				'filesystem_check_changes': 1,
+				'encoding_compatibility': false
 			}));
 		}
 
@@ -1253,11 +1258,16 @@ MountConfigListView.prototype = _.extend({
 		var storage = this.getStorageConfig($tr);
 		var $toggle = $tr.find('.mountOptionsToggle');
 		var dropDown = new MountOptionsDropdown();
-		var enabledOptions = ['previews', 'filesystem_check_changes', 'enable_sharing'];
+		var visibleOptions = [
+			'previews',
+			'filesystem_check_changes',
+			'enable_sharing',
+			'encoding_compatibility'
+		];
 		if (this._encryptionEnabled) {
-			enabledOptions.push('encrypt');
+			visibleOptions.push('encrypt');
 		}
-		dropDown.show($toggle, storage.mountOptions || [], enabledOptions);
+		dropDown.show($toggle, storage.mountOptions || [], visibleOptions);
 		$('body').on('mouseup.mountOptionsDropdown', function(event) {
 			var $target = $(event.target);
 			if ($toggle.has($target).length) {
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index c9cc40b0ba0..16e0e629bdb 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -10,6 +10,7 @@
 	$l->t("Check for changes");
 	$l->t("Never");
 	$l->t("Once every direct access");
+	$l->t("Enable encoding compatibility (decreases performance)");
 
 	script('files_external', 'settings');
 	style('files_external', 'settings');
diff --git a/apps/files_external/tests/js/settingsSpec.js b/apps/files_external/tests/js/settingsSpec.js
index 462407e9540..7aa49b2c82a 100644
--- a/apps/files_external/tests/js/settingsSpec.js
+++ b/apps/files_external/tests/js/settingsSpec.js
@@ -370,7 +370,8 @@ describe('OCA.External.Settings tests', function() {
 					encrypt: true,
 					previews: true,
 					enable_sharing: false,
-					filesystem_check_changes: 0
+					filesystem_check_changes: 0,
+					encoding_compatibility: false
 				});
 			});
 		});
diff --git a/lib/private/legacy/util.php b/lib/private/legacy/util.php
index 4196aa6637c..de97a762246 100644
--- a/lib/private/legacy/util.php
+++ b/lib/private/legacy/util.php
@@ -172,10 +172,8 @@ class OC_Util {
 			return $storage;
 		});
 
-		// install storage availability wrapper, before most other wrappers
-		\OC\Files\Filesystem::addStorageWrapper('oc_encoding', function ($mountPoint, $storage) {
-			// TODO: only do this opt-in if the mount option is specified
-			if (!$storage->instanceOfStorage('\OC\Files\Storage\Shared') && !$storage->isLocal()) {
+		\OC\Files\Filesystem::addStorageWrapper('oc_encoding', function ($mountPoint, \OCP\Files\Storage $storage, \OCP\Files\Mount\IMountPoint $mount) {
+			if ($mount->getOption('encoding_compatibility', true) && !$storage->instanceOfStorage('\OC\Files\Storage\Shared') && !$storage->isLocal()) {
 				return new \OC\Files\Storage\Wrapper\Encoding(['storage' => $storage]);
 			}
 			return $storage;
-- 
GitLab