From 80ff661aebbdbc1bb9233174e414d38a04f78f5f Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Wed, 17 Aug 2022 14:08:09 +0100 Subject: [PATCH] Continue working on response filters --- app/controllers/general.php | 4 + src/Appwrite/Utopia/Request/Filters/V15.php | 18 +++ src/Appwrite/Utopia/Response/Filters/V15.php | 113 ++++++++++++------- 3 files changed, 96 insertions(+), 39 deletions(-) create mode 100644 src/Appwrite/Utopia/Request/Filters/V15.php diff --git a/app/controllers/general.php b/app/controllers/general.php index c3ecfb873..a59aee0e6 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -30,6 +30,7 @@ use Utopia\Validator\Hostname; use Appwrite\Utopia\Request\Filters\V12 as RequestV12; use Appwrite\Utopia\Request\Filters\V13 as RequestV13; use Appwrite\Utopia\Request\Filters\V14 as RequestV14; +use Appwrite\Utopia\Request\Filters\V15 as RequestV15; use Utopia\Validator\Text; Config::setParam('domainVerification', false); @@ -65,6 +66,9 @@ App::init() case version_compare($requestFormat, '0.14.0', '<'): Request::setFilter(new RequestV14()); break; + case version_compare($requestFormat, '0.15.0', '<'): + Request::setFilter(new RequestV15()); + break; default: Request::setFilter(null); } diff --git a/src/Appwrite/Utopia/Request/Filters/V15.php b/src/Appwrite/Utopia/Request/Filters/V15.php new file mode 100644 index 000000000..8e93d91e2 --- /dev/null +++ b/src/Appwrite/Utopia/Request/Filters/V15.php @@ -0,0 +1,18 @@ +handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'registration', 'passwordUpdate']); + $parsedResponse = $this->handleUser($parsedResponse); + break; case Response::MODEL_METRIC: $parsedResponse = $this->handleMetricAttributes($content); + break; + case Response::MODEL_BUILD: + $parsedResponse = $this->handleDatetimeAttributes($content, ['startTime', 'endTime']); + break; + case Response::MODEL_BUCKET: + case Response::MODEL_COLLECTION: + case Response::MODEL_DEPLOYMENT: + case Response::MODEL_DOCUMENT: + case Response::MODEL_EXECUTION: + case Response::MODEL_PLATFORM: + case Response::MODEL_PROJECT: + case Response::MODEL_TEAM: + case Response::MODEL_FILE: + case Response::MODEL_WEBHOOK: + $parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt']); + break; + case Response::MODEL_FUNCTION: + $parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'scheduleNext', 'schedulePrevious']); + break; + case Response::MODEL_KEY: + $parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'expire']); + break; + case Response::MODEL_LOG: + $parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'time']); + break; + case Response::MODEL_MEMBERSHIP: + $parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'invited', 'joined']); + break; + case Response::MODEL_SESSION: + $parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', 'expire', 'providerAccessTokenExpiry']); + break; + case Response::MODEL_TOKEN: + $parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', 'expire']); + break; } + // Downgrade Permissions for all models + $parsedResponse = $this->handleDowngradePermissions($parsedResponse); + return $parsedResponse; } + protected function handleDatetimeAttributes(array $content, array $attributes): array + { + foreach ($attributes as $attribute) { + if (isset($content[$attribute])) { + $content[$attribute] = strtotime($content[$attribute]); + } + } + return $content; + } + + protected function handleUser(array $content): array + { + unset($content['password']); + return $content; + } + protected function handleMetricAttributes(array $content) { $content['timestamp'] = $content['date']; unset($content['date']); } + protected function handleDowngradePermissions(array $content) + { + if (!isset($content['$permissions'])) { + return $content; + } + $content = array_merge($content, $this->downgradePermissions($content['permissions'])); + unset($content['permissions']); + return $content; + } + protected function downgradePermissionSelector(string $permSelector) { switch ($permSelector) @@ -77,8 +111,8 @@ class V15 extends Filter protected function downgradePermissions(array $permissions) { $result = [ - 'read' => [], - 'write' => [] + '$read' => [], + '$write' => [] ]; $splitPermissions = []; @@ -92,7 +126,8 @@ class V15 extends Filter // downgrade the permissions foreach ($permissions as $permission) { - // permission = "read('any')" = ["read" => "role:all"] + //TODO: Replace with Permission class + // permission = "read('any')" = ["$read" => "role:all"] $permission_type = explode('(', $permission)[0]; $permission_value = explode(')', explode('(', $permission)[1])[0]; @@ -103,13 +138,13 @@ class V15 extends Filter case 'delete': case 'write': case 'create': - if (!in_array(downgradePermissionSelector($permission_value), $result['write'])) { - $result['write'][] = downgradePermissionSelector($permission_value); + if (!in_array($this->downgradePermissionSelector($permission_value), $result['write'])) { + $result['$write'][] = $this->downgradePermissionSelector($permission_value); } break; case 'read': - if (!in_array(downgradePermissionSelector($permission_value), $result['read'])) { - $result['read'][] = downgradePermissionSelector($permission_value); + if (!in_array($this->downgradePermissionSelector($permission_value), $result['read'])) { + $result['$read'][] = $this->downgradePermissionSelector($permission_value); } break; }