From a11d7bf75091bc6b615d449aac94a2c572b2181b Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 16 Dec 2021 11:15:55 +0100 Subject: [PATCH 1/2] fix: strict enum attribute --- app/controllers/api/database.php | 4 ++++ app/init.php | 2 +- tests/e2e/Services/Database/DatabaseBase.php | 23 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/database.php b/app/controllers/api/database.php index 43b98dd5f3..6af8f1f98e 100644 --- a/app/controllers/api/database.php +++ b/app/controllers/api/database.php @@ -835,6 +835,10 @@ App::post('/v1/database/collections/:collectionId/attributes/enum') $size = ($length > $size) ? $length : $size; } + if (!is_null($default) && !in_array($default, $elements)) { + throw new Exception('Default value not found in elements', 400); + } + $attribute = createAttribute($collectionId, new Document([ '$id' => $attributeId, 'type' => Database::VAR_STRING, diff --git a/app/init.php b/app/init.php index 45cdf438b6..13df9c7b27 100644 --- a/app/init.php +++ b/app/init.php @@ -311,7 +311,7 @@ Structure::addFormat(APP_DATABASE_ATTRIBUTE_EMAIL, function() { Structure::addFormat(APP_DATABASE_ATTRIBUTE_ENUM, function($attribute) { $elements = $attribute['formatOptions']['elements']; - return new WhiteList($elements); + return new WhiteList($elements, true); }, Database::VAR_STRING); Structure::addFormat(APP_DATABASE_ATTRIBUTE_IP, function() { diff --git a/tests/e2e/Services/Database/DatabaseBase.php b/tests/e2e/Services/Database/DatabaseBase.php index 2f852d0f5e..34bed2bd61 100644 --- a/tests/e2e/Services/Database/DatabaseBase.php +++ b/tests/e2e/Services/Database/DatabaseBase.php @@ -1355,6 +1355,26 @@ trait DatabaseBase 'array' => true, ]); + $defaultRequired = $this->client->call(Client::METHOD_POST, '/database/collections/' . $collectionId . '/attributes/integer', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'attributeId' => 'defaultRequired', + 'required' => true, + 'default' => 12 + ]); + + $enumDefault = $this->client->call(Client::METHOD_POST, '/database/collections/' . $collectionId . '/attributes/enum', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'attributeId' => 'enumDefault', + 'elements' => ['north', 'west'], + 'default' => 'south' + ]); + $this->assertEquals(201, $email['headers']['status-code']); $this->assertEquals(201, $ip['headers']['status-code']); $this->assertEquals(201, $url['headers']['status-code']); @@ -1363,8 +1383,11 @@ trait DatabaseBase $this->assertEquals(201, $probability['headers']['status-code']); $this->assertEquals(201, $upperBound['headers']['status-code']); $this->assertEquals(201, $lowerBound['headers']['status-code']); + $this->assertEquals(201, $enum['headers']['status-code']); $this->assertEquals(400, $invalidRange['headers']['status-code']); $this->assertEquals(400, $defaultArray['headers']['status-code']); + $this->assertEquals(400, $defaultRequired['headers']['status-code']); + $this->assertEquals(400, $enumDefault['headers']['status-code']); $this->assertEquals('Minimum value must be lesser than maximum value', $invalidRange['body']['message']); $this->assertEquals('Cannot set default value for array attributes', $defaultArray['body']['message']); From a5840a478a6f77d79c1286e80f72281ff1b314e7 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 16 Dec 2021 14:06:32 +0100 Subject: [PATCH 2/2] tests: add enum strict check --- tests/e2e/Services/Database/DatabaseBase.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/e2e/Services/Database/DatabaseBase.php b/tests/e2e/Services/Database/DatabaseBase.php index 34bed2bd61..4b8280484e 100644 --- a/tests/e2e/Services/Database/DatabaseBase.php +++ b/tests/e2e/Services/Database/DatabaseBase.php @@ -1375,6 +1375,16 @@ trait DatabaseBase 'default' => 'south' ]); + $enumDefaultStrict = $this->client->call(Client::METHOD_POST, '/database/collections/' . $collectionId . '/attributes/enum', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'attributeId' => 'enumDefault', + 'elements' => ['north', 'west'], + 'default' => 'NORTH' + ]); + $this->assertEquals(201, $email['headers']['status-code']); $this->assertEquals(201, $ip['headers']['status-code']); $this->assertEquals(201, $url['headers']['status-code']); @@ -1388,6 +1398,7 @@ trait DatabaseBase $this->assertEquals(400, $defaultArray['headers']['status-code']); $this->assertEquals(400, $defaultRequired['headers']['status-code']); $this->assertEquals(400, $enumDefault['headers']['status-code']); + $this->assertEquals(400, $enumDefaultStrict['headers']['status-code']); $this->assertEquals('Minimum value must be lesser than maximum value', $invalidRange['body']['message']); $this->assertEquals('Cannot set default value for array attributes', $defaultArray['body']['message']);