From d0f56876877d5681a6faf5e8882c4de48a9bd4dc Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Tue, 26 Jan 2016 14:40:55 +0100
Subject: [PATCH] Dont set null values when validating storage definition

---
 apps/files_external/lib/definitionparameter.php           | 8 +++++---
 apps/files_external/lib/frontenddefinitiontrait.php       | 8 +++++---
 apps/files_external/tests/frontenddefinitiontraittest.php | 2 ++
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/apps/files_external/lib/definitionparameter.php b/apps/files_external/lib/definitionparameter.php
index 85c3dd08ad4..dc7985837f5 100644
--- a/apps/files_external/lib/definitionparameter.php
+++ b/apps/files_external/lib/definitionparameter.php
@@ -154,6 +154,10 @@ class DefinitionParameter implements \JsonSerializable {
 		return $prefix . $this->getText();
 	}
 
+	public function isOptional() {
+		return $this->isFlagSet(self::FLAG_OPTIONAL) || $this->isFlagSet(self::FLAG_USER_PROVIDED);
+	}
+
 	/**
 	 * Validate a parameter value against this
 	 * Convert type as necessary
@@ -162,8 +166,6 @@ class DefinitionParameter implements \JsonSerializable {
 	 * @return bool success
 	 */
 	public function validateValue(&$value) {
-		$optional = $this->isFlagSet(self::FLAG_OPTIONAL) || $this->isFlagSet(self::FLAG_USER_PROVIDED);
-
 		switch ($this->getType()) {
 			case self::VALUE_BOOLEAN:
 				if (!is_bool($value)) {
@@ -180,7 +182,7 @@ class DefinitionParameter implements \JsonSerializable {
 				}
 				break;
 			default:
-				if (!$value && !$optional) {
+				if (!$value && !$this->isOptional()) {
 					return false;
 				}
 				break;
diff --git a/apps/files_external/lib/frontenddefinitiontrait.php b/apps/files_external/lib/frontenddefinitiontrait.php
index eedd433f2d7..fc47a9515f3 100644
--- a/apps/files_external/lib/frontenddefinitiontrait.php
+++ b/apps/files_external/lib/frontenddefinitiontrait.php
@@ -136,10 +136,12 @@ trait FrontendDefinitionTrait {
 	public function validateStorageDefinition(StorageConfig $storage) {
 		foreach ($this->getParameters() as $name => $parameter) {
 			$value = $storage->getBackendOption($name);
-			if (!$parameter->validateValue($value)) {
-				return false;
+			if (!is_null($value) || !$parameter->isOptional()) {
+				if (!$parameter->validateValue($value)) {
+					return false;
+				}
+				$storage->setBackendOption($name, $value);
 			}
-			$storage->setBackendOption($name, $value);
 		}
 		return true;
 	}
diff --git a/apps/files_external/tests/frontenddefinitiontraittest.php b/apps/files_external/tests/frontenddefinitiontraittest.php
index 209b1abc7e0..27f49556330 100644
--- a/apps/files_external/tests/frontenddefinitiontraittest.php
+++ b/apps/files_external/tests/frontenddefinitiontraittest.php
@@ -61,6 +61,8 @@ class FrontendDefinitionTraitTest extends \Test\TestCase {
 				->getMock();
 			$param->method('getName')
 				->willReturn($name);
+			$param->method('isOptional')
+				->willReturn(false);
 			$param->expects($this->once())
 				->method('validateValue')
 				->willReturn($valid);
-- 
GitLab