From e1cc6bc6249195f96a1f8f1092d650b2a8eee91c Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 15 Aug 2022 16:09:09 +0100 Subject: [PATCH 001/223] Start work on response filters for 0.16 --- app/controllers/general.php | 4 + src/Appwrite/Utopia/Response/Filters/V15.php | 125 +++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 src/Appwrite/Utopia/Response/Filters/V15.php diff --git a/app/controllers/general.php b/app/controllers/general.php index 9c2c5d3b81..c3ecfb8737 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -20,6 +20,7 @@ use Appwrite\Utopia\Response\Filters\V11 as ResponseV11; use Appwrite\Utopia\Response\Filters\V12 as ResponseV12; use Appwrite\Utopia\Response\Filters\V13 as ResponseV13; use Appwrite\Utopia\Response\Filters\V14 as ResponseV14; +use Appwrite\Utopia\Response\Filters\V15 as ResponseV15; use Utopia\CLI\Console; use Utopia\Database\Database; use Utopia\Database\Document; @@ -190,6 +191,9 @@ App::init() case version_compare($responseFormat, '0.14.0', '<='): Response::setFilter(new ResponseV14()); break; + case version_compare($responseFormat, '0.15.0', '<='): + Response::setFilter(new ResponseV15()); + break; default: Response::setFilter(null); } diff --git a/src/Appwrite/Utopia/Response/Filters/V15.php b/src/Appwrite/Utopia/Response/Filters/V15.php new file mode 100644 index 0000000000..0a6412ab9f --- /dev/null +++ b/src/Appwrite/Utopia/Response/Filters/V15.php @@ -0,0 +1,125 @@ +handleMetricAttributes($content); + } + + return $parsedResponse; + } + + protected function handleMetricAttributes(array $content) + { + $content['timestamp'] = $content['date']; + unset($content['date']); + } + + protected function parseRemoveAttributes(array $content, array $attributes) + { + foreach ($attributes as $attribute) { + unset($content[$attribute]); + } + + return $content; + } + + protected function parseRemoveAttributesList(array $content, string $property, array $attributes) + { + $documents = $content[$property]; + $parsedResponse = []; + foreach ($documents as $document) { + $parsedResponse[] = $this->parseRemoveAttributes($document, $attributes); + } + $content[$property] = $parsedResponse; + + return $content; + } + + protected function parseCreatedAt(array $content) + { + $content['dateCreated'] = $content['$createdAt']; + unset($content['$createdAt']); + unset($content['$updatedAt']); + + return $content; + } + + protected function parseCreatedAtList(array $content, string $property) + { + $documents = $content[$property]; + $parsedResponse = []; + foreach ($documents as $document) { + $parsedResponse[] = $this->parseCreatedAt($document); + } + $content[$property] = $parsedResponse; + + return $content; + } + + protected function parseCreatedAtAndUpdatedAt(array $content) + { + $content['dateCreated'] = $content['$createdAt']; + $content['dateUpdated'] = $content['$updatedAt']; + unset($content['$createdAt']); + unset($content['$updatedAt']); + + return $content; + } + + protected function parseCreatedAtAndUpdatedAtList(array $content, string $property) + { + $documents = $content[$property]; + $parsedResponse = []; + foreach ($documents as $document) { + $parsedResponse[] = $this->parseCreatedAtAndUpdatedAt($document); + } + $content[$property] = $parsedResponse; + + return $content; + } +} From 9f3ebe995648d5f2398a11529e81cd782132309c Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Wed, 17 Aug 2022 10:33:35 +0100 Subject: [PATCH 002/223] Continue working on permission backporting --- src/Appwrite/Utopia/Response/Filters/V15.php | 97 ++++++++++---------- 1 file changed, 46 insertions(+), 51 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V15.php b/src/Appwrite/Utopia/Response/Filters/V15.php index 0a6412ab9f..3bf5f9c567 100644 --- a/src/Appwrite/Utopia/Response/Filters/V15.php +++ b/src/Appwrite/Utopia/Response/Filters/V15.php @@ -59,67 +59,62 @@ class V15 extends Filter unset($content['date']); } - protected function parseRemoveAttributes(array $content, array $attributes) + protected function downgradePermissionSelector(string $permSelector) { - foreach ($attributes as $attribute) { - unset($content[$attribute]); + switch ($permSelector) + { + case 'any': + return 'role:all'; + case 'users': + return 'role:user'; + case 'guests': + return 'role:guest'; } - return $content; + return $permSelector; } - protected function parseRemoveAttributesList(array $content, string $property, array $attributes) + protected function downgradePermissions(array $permissions) { - $documents = $content[$property]; - $parsedResponse = []; - foreach ($documents as $document) { - $parsedResponse[] = $this->parseRemoveAttributes($document, $attributes); + $result = [ + 'read' => [], + 'write' => [] + ]; + + $splitPermissions = []; + + // split up the permisisons + foreach ($permissions as $permission) { + $permission_type = explode('(', $permission)[0]; + $permission_value = explode(')', explode('(', $permission)[1])[0]; + $splitPermissions[$permission_type][] = $permission_value; } - $content[$property] = $parsedResponse; - return $content; - } + // downgrade the permissions + foreach ($permissions as $permission) { + // permission = "read('any')" = ["read" => "role:all"] + $permission_type = explode('(', $permission)[0]; + $permission_value = explode(')', explode('(', $permission)[1])[0]; - protected function parseCreatedAt(array $content) - { - $content['dateCreated'] = $content['$createdAt']; - unset($content['$createdAt']); - unset($content['$updatedAt']); - - return $content; - } - - protected function parseCreatedAtList(array $content, string $property) - { - $documents = $content[$property]; - $parsedResponse = []; - foreach ($documents as $document) { - $parsedResponse[] = $this->parseCreatedAt($document); + // Old type permissions meant that 'write' is equivalent to 'create', 'update' and 'delete' + switch ($permission_type) + { + case 'update': + case 'delete': + case 'write': + case 'create': + if (!in_array(downgradePermissionSelector($permission_value), $result['write'])) { + $result['write'][] = downgradePermissionSelector($permission_value); + } + break; + case 'read': + if (!in_array(downgradePermissionSelector($permission_value), $result['read'])) { + $result['read'][] = downgradePermissionSelector($permission_value); + } + break; + } } - $content[$property] = $parsedResponse; - return $content; - } - - protected function parseCreatedAtAndUpdatedAt(array $content) - { - $content['dateCreated'] = $content['$createdAt']; - $content['dateUpdated'] = $content['$updatedAt']; - unset($content['$createdAt']); - unset($content['$updatedAt']); - - return $content; - } - - protected function parseCreatedAtAndUpdatedAtList(array $content, string $property) - { - $documents = $content[$property]; - $parsedResponse = []; - foreach ($documents as $document) { - $parsedResponse[] = $this->parseCreatedAtAndUpdatedAt($document); - } - $content[$property] = $parsedResponse; - - return $content; + return $result; } } From 80ff661aebbdbc1bb9233174e414d38a04f78f5f Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Wed, 17 Aug 2022 14:08:09 +0100 Subject: [PATCH 003/223] 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 c3ecfb8737..a59aee0e63 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 0000000000..8e93d91e2a --- /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; } From 4b5747c7308f49733103aae5bc5af4b3e9955394 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 4 Sep 2022 06:52:15 +0545 Subject: [PATCH 004/223] mock headers endpoint --- app/controllers/mock.php | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/controllers/mock.php b/app/controllers/mock.php index d3b150a55f..ec02c368da 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -194,6 +194,35 @@ App::delete('/v1/mock/tests/bar') ->action(function ($required, $default, $z) { }); +/** Endpoint to test if required headers are sent from the SDK */ +App::get('/v1/mock/tests/general/headers') + ->desc('Get headers') + ->groups(['mock']) + ->label('scope', 'public') + ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) + ->label('sdk.namespace', 'general') + ->label('sdk.method', 'headers') + ->label('sdk.description', 'Return headers from the request') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.model', Response::MODEL_MOCK) + ->label('sdk.mock', true) + ->inject('request') + ->inject('response') + ->action(function (Request $request, Response $response) { + $res = [ + 'x-sdk-name' => $request->getHeader('x-sdk-name'), + 'x-sdk-platform' => $request->getHeader('x-sdk-platform'), + 'x-sdk-language' => $request->getHeader('x-sdk-language'), + 'x-sdk-version' => $request->getHeader('x-sdk-version'), + ]; + $res = array_map(function ($key, $value) { + return $key . ': ' . $value; + }, array_keys($res), $res); + $res = implode("; ", $res); + + $response->dynamic(new Document(['result' => $res]), Response::MODEL_MOCK); + }); + App::get('/v1/mock/tests/general/download') ->desc('Download File') ->groups(['mock']) From 8e1dc84a48a3305dd006626b8d0e0641664aff07 Mon Sep 17 00:00:00 2001 From: shimon Date: Sun, 4 Sep 2022 10:32:56 +0300 Subject: [PATCH 005/223] account labels --- app/controllers/api/account.php | 21 +++++++++++++++++++++ app/controllers/shared/api.php | 2 ++ 2 files changed, 23 insertions(+) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 1309eade74..c9c69e6368 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -53,6 +53,7 @@ App::post('/v1/account') ->label('event', 'users.[userId].create') ->label('scope', 'public') ->label('auth.type', 'emailPassword') + ->label('audits.event', 'account.create') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') @@ -145,6 +146,7 @@ App::post('/v1/account/sessions/email') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('scope', 'public') ->label('auth.type', 'emailPassword') + ->label('audits.event', 'account.session.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.create') @@ -604,6 +606,7 @@ App::post('/v1/account/sessions/magic-url') ->groups(['api', 'account']) ->label('scope', 'public') ->label('auth.type', 'magic-url') + ->label('audits.event', 'account.session.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('sdk.auth', []) @@ -736,6 +739,7 @@ App::put('/v1/account/sessions/magic-url') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].sessions.[sessionId].create') + ->label('audits.event', 'account.session.update') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.create') @@ -855,6 +859,7 @@ App::post('/v1/account/sessions/phone') ->groups(['api', 'account']) ->label('scope', 'public') ->label('auth.type', 'phone') + ->label('audits.event', 'account.session.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('sdk.auth', []) @@ -1088,6 +1093,7 @@ App::post('/v1/account/sessions/anonymous') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('scope', 'public') ->label('auth.type', 'anonymous') + ->label('audits.event', 'account.session.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.create') @@ -1442,6 +1448,7 @@ App::patch('/v1/account/name') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.name') ->label('scope', 'account') + ->label('audits.event', 'account.name.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1472,6 +1479,7 @@ App::patch('/v1/account/password') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.password') ->label('scope', 'account') + ->label('audits.event', 'account.password.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -1511,6 +1519,7 @@ App::patch('/v1/account/email') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.email') ->label('scope', 'account') + ->label('audits.event', 'account.email.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1562,6 +1571,7 @@ App::patch('/v1/account/phone') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.phone') ->label('scope', 'account') + ->label('audits.event', 'account.phone.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1609,6 +1619,7 @@ App::patch('/v1/account/prefs') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.prefs') ->label('scope', 'account') + ->label('audits.event', 'account.preferences.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1637,6 +1648,7 @@ App::patch('/v1/account/status') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.status') ->label('scope', 'account') + ->label('audits.event', 'account.status.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1671,6 +1683,7 @@ App::delete('/v1/account/sessions/:sessionId') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].delete') + ->label('audits.event', 'account.session.delete') ->label('audits.resource', 'user/{user.$id}') ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1741,6 +1754,7 @@ App::patch('/v1/account/sessions/:sessionId') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].update') + ->label('audits.event', 'account.session.update') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.update') @@ -1822,6 +1836,7 @@ App::delete('/v1/account/sessions') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].delete') + ->label('audits.event', 'account.sessions.delete') ->label('audits.resource', 'user/{user.$id}') ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1883,6 +1898,7 @@ App::post('/v1/account/recovery') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].recovery.[tokenId].create') + ->label('audits.event', 'account.recovery.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -1988,6 +2004,7 @@ App::put('/v1/account/recovery') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].recovery.[tokenId].update') + ->label('audits.event', 'account.recovery.update') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -2056,6 +2073,7 @@ App::post('/v1/account/verification') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].verification.[tokenId].create') + ->label('audits.event', 'account.verification.create') ->label('audits.resource', 'user/{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -2144,6 +2162,7 @@ App::put('/v1/account/verification') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].verification.[tokenId].update') + ->label('audits.event', 'account.verification.update') ->label('audits.resource', 'user/{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -2202,6 +2221,7 @@ App::post('/v1/account/verification/phone') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].verification.[tokenId].create') + ->label('audits.event', 'account.verification.create') ->label('audits.resource', 'user/{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -2285,6 +2305,7 @@ App::put('/v1/account/verification/phone') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].verification.[tokenId].update') + ->label('audits.event', 'account.verification.update') ->label('audits.resource', 'user/{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 93bc020d97..7d9fa2509f 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -342,6 +342,8 @@ App::shutdown() $audits->setPayload($responsePayload); } + $audits->setEvent($route->getLabel('audits.event', '')); + foreach ($events->getParams() as $key => $value) { $audits->setParam($key, $value); } From 5d16c39d5fc4a458a18f195c19ccaa30fa70eb4b Mon Sep 17 00:00:00 2001 From: shimon Date: Sun, 4 Sep 2022 11:13:44 +0300 Subject: [PATCH 006/223] account labels --- app/controllers/api/databases.php | 21 +++++++++++++++++++++ app/controllers/api/functions.php | 13 +++++++++++++ app/controllers/api/storage.php | 6 ++++++ app/controllers/api/teams.php | 7 +++++++ app/controllers/api/users.php | 19 +++++++++++++++++++ 5 files changed, 66 insertions(+) diff --git a/app/controllers/api/databases.php b/app/controllers/api/databases.php index 3167287b1e..7b1f1f29bf 100644 --- a/app/controllers/api/databases.php +++ b/app/controllers/api/databases.php @@ -153,6 +153,7 @@ App::post('/v1/databases') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].create') ->label('scope', 'databases.write') + ->label('audits.event', 'databases.create') ->label('audits.resource', 'database/{response.$id}') ->label('usage.metric', 'databases.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -385,6 +386,7 @@ App::put('/v1/databases/:databaseId') ->groups(['api', 'database']) ->label('scope', 'databases.write') ->label('event', 'databases.[databaseId].update') + ->label('audits.event', 'databases.update') ->label('audits.resource', 'database/{response.$id}') ->label('usage.metric', 'databases.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -427,6 +429,7 @@ App::delete('/v1/databases/:databaseId') ->groups(['api', 'database']) ->label('scope', 'databases.write') ->label('event', 'databases.[databaseId].delete') + ->label('audits.event', 'databases.delete') ->label('audits.resource', 'database/{request.databaseId}') ->label('usage.metric', 'databases.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -473,6 +476,7 @@ App::post('/v1/databases/:databaseId/collections') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{response.$id}') ->label('usage.metric', 'collections.{scope}.requests.create') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -726,6 +730,7 @@ App::put('/v1/databases/:databaseId/collections/:collectionId') ->groups(['api', 'database']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].update') + ->label('audits.event', 'databases.collections.update') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -793,6 +798,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId') ->groups(['api', 'database']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].delete') + ->label('audits.event', 'databases.collections.delete') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.delete') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -849,6 +855,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/string ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.attributes.string.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -897,6 +904,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/email' ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.attributes.email.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -939,6 +947,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/enum') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.attributes.enum.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -997,6 +1006,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/ip') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.attributes.ip.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1039,6 +1049,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/url') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.attributes.url.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1081,6 +1092,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/intege ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.attributes.integer.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1152,6 +1164,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/float' ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.attributes.float.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1226,6 +1239,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/boolea ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.attributes.boolean.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1268,6 +1282,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/dateti ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.attributes.datetime.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1421,6 +1436,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/attributes/:key ->groups(['api', 'database']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].delete') + ->label('audits.event', 'databases.collections.attributes.delete') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1508,6 +1524,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/indexes') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].indexes.[indexId].create') ->label('scope', 'collections.write') + ->label('audits.event', 'databases.collections.indexes.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1743,6 +1760,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/indexes/:key') ->groups(['api', 'database']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].indexes.[indexId].delete') + ->label('audits.event', 'databases.collections.indexes.delete') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1810,6 +1828,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/documents') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].create') ->label('scope', 'documents.write') + ->label('audits.event', 'databases.collections.documents.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'documents.{scope}.requests.create') ->label('usage.params', ['databaseId:{request.databaseId}', 'collectionId:{request.collectionId}']) @@ -2190,6 +2209,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/documents/:docum ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].update') ->label('scope', 'documents.write') + ->label('audits.event', 'databases.collections.documents.update') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}/document/{response.$id}') ->label('usage.metric', 'documents.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}', 'collectionId:{request.collectionId}']) @@ -2322,6 +2342,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/documents/:docu ->groups(['api', 'database']) ->label('scope', 'documents.write') ->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].delete') + ->label('audits.event', 'databases.collections.documents.delete') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}/document/{request.documentId}') ->label('usage.metric', 'documents.{scope}.requests.delete') ->label('usage.params', ['databaseId:{request.databaseId}', 'collectionId:{request.collectionId}']) diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index eb7dbdad54..ddab426dc5 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -52,6 +52,7 @@ App::post('/v1/functions') ->desc('Create Function') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].create') + ->label('audits.event', 'functions.create') ->label('audits.resource', 'function/{response.$id}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -409,6 +410,7 @@ App::put('/v1/functions/:functionId') ->desc('Update Function') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].update') + ->label('audits.event', 'functions.update') ->label('audits.resource', 'function/{response.$id}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -471,6 +473,7 @@ App::patch('/v1/functions/:functionId/deployments/:deploymentId') ->desc('Update Function Deployment') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].update') + ->label('audits.event', 'functions.deployments.update') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -537,6 +540,7 @@ App::delete('/v1/functions/:functionId') ->desc('Delete Function') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].delete') + ->label('audits.event', 'functions.delete') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -575,6 +579,7 @@ App::post('/v1/functions/:functionId/deployments') ->desc('Create Deployment') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].create') + ->label('audits.event', 'functions.deployments.create') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -866,6 +871,7 @@ App::delete('/v1/functions/:functionId/deployments/:deploymentId') ->desc('Delete Deployment') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].delete') + ->label('audits.event', 'functions.deployments.delete') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -1237,6 +1243,7 @@ App::post('/v1/functions/:functionId/deployments/:deploymentId/builds/:buildId') ->desc('Retry Build') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].update') + ->label('audits.event', 'functions.deployments.builds.create') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'functions') @@ -1296,6 +1303,8 @@ App::post('/v1/functions/:functionId/variables') ->desc('Create Variable') ->groups(['api', 'functions']) ->label('scope', 'functions.write') + ->label('audits.event', 'functions.variables.create') + ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') ->label('sdk.method', 'createVariable') @@ -1433,6 +1442,8 @@ App::put('/v1/functions/:functionId/variables/:variableId') ->desc('Update Variable') ->groups(['api', 'functions']) ->label('scope', 'functions.write') + ->label('audits.event', 'functions.variables.update') + ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') ->label('sdk.method', 'updateVariable') @@ -1484,6 +1495,8 @@ App::delete('/v1/functions/:functionId/variables/:variableId') ->desc('Delete Variable') ->groups(['api', 'functions']) ->label('scope', 'functions.write') + ->label('audits.event', 'functions.variables.delete') + ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') ->label('sdk.method', 'deleteVariable') diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 2fe9a941a9..9040f10002 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -48,6 +48,7 @@ App::post('/v1/storage/buckets') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') ->label('event', 'buckets.[bucketId].create') + ->label('audits.event', 'buckets.create') ->label('audits.resource', 'buckets/{response.$id}') ->label('usage.metric', 'buckets.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -218,6 +219,7 @@ App::put('/v1/storage/buckets/:bucketId') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') ->label('event', 'buckets.[bucketId].update') + ->label('audits.event', 'buckets.update') ->label('audits.resource', 'buckets/{response.$id}') ->label('usage.metric', 'buckets.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -283,6 +285,7 @@ App::delete('/v1/storage/buckets/:bucketId') ->desc('Delete Bucket') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') + ->label('audits.event', 'buckets.delete') ->label('event', 'buckets.[bucketId].delete') ->label('audits.resource', 'buckets/{request.bucketId}') ->label('usage.metric', 'buckets.{scope}.requests.delete') @@ -325,6 +328,7 @@ App::post('/v1/storage/buckets/:bucketId/files') ->desc('Create File') ->groups(['api', 'storage']) ->label('scope', 'files.write') + ->label('audits.event', 'files.create') ->label('event', 'buckets.[bucketId].files.[fileId].create') ->label('audits.resource', 'files/{response.$id}') ->label('usage.metric', 'files.{scope}.requests.create') @@ -1236,6 +1240,7 @@ App::put('/v1/storage/buckets/:bucketId/files/:fileId') ->groups(['api', 'storage']) ->label('scope', 'files.write') ->label('event', 'buckets.[bucketId].files.[fileId].update') + ->label('audits.event', 'files.update') ->label('audits.resource', 'files/{response.$id}') ->label('usage.metric', 'files.{scope}.requests.update') ->label('usage.params', ['bucketId:{request.bucketId}']) @@ -1338,6 +1343,7 @@ App::delete('/v1/storage/buckets/:bucketId/files/:fileId') ->groups(['api', 'storage']) ->label('scope', 'files.write') ->label('event', 'buckets.[bucketId].files.[fileId].delete') + ->label('audits.event', 'files.delete') ->label('audits.resource', 'file/{request.fileId}') ->label('usage.metric', 'files.{scope}.requests.delete') ->label('usage.params', ['bucketId:{request.bucketId}']) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 40eab55630..ecb6894627 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -45,6 +45,7 @@ App::post('/v1/teams') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].create') ->label('scope', 'teams.write') + ->label('audits.event', 'teams.create') ->label('audits.resource', 'team/{response.$id}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') @@ -199,6 +200,7 @@ App::put('/v1/teams/:teamId') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].update') ->label('scope', 'teams.write') + ->label('audits.event', 'teams.update') ->label('audits.resource', 'team/{response.$id}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') @@ -234,6 +236,7 @@ App::delete('/v1/teams/:teamId') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].delete') ->label('scope', 'teams.write') + ->label('audits.event', 'teams.delete') ->label('audits.resource', 'team/{request.teamId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') @@ -288,6 +291,7 @@ App::post('/v1/teams/:teamId/memberships') ->label('event', 'teams.[teamId].memberships.[membershipId].create') ->label('scope', 'teams.write') ->label('auth.type', 'invites') + ->label('audits.event', 'teams.memberships.create') ->label('audits.resource', 'team/{request.teamId}') ->label('audits.userId', '{request.userId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -582,6 +586,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].memberships.[membershipId].update') ->label('scope', 'teams.write') + ->label('audits.event', 'teams.memberships.update') ->label('audits.resource', 'team/{request.teamId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') @@ -652,6 +657,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId/status') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].memberships.[membershipId].update.status') ->label('scope', 'public') + ->label('audits.event', 'teams.memberships.status.update') ->label('audits.resource', 'team/{request.teamId}') ->label('audits.userId', '{request.userId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -785,6 +791,7 @@ App::delete('/v1/teams/:teamId/memberships/:membershipId') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].memberships.[membershipId].delete') ->label('scope', 'teams.write') + ->label('audits.event', 'teams.memberships.delete') ->label('audits.resource', 'team/{request.teamId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 9f4b1489e8..5d9fff4cb7 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -88,6 +88,7 @@ App::post('/v1/users') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') + ->label('audits.event', 'users.create') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -117,6 +118,7 @@ App::post('/v1/users/bcrypt') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') + ->label('audits.event', 'users.create.bcrypt') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -145,6 +147,7 @@ App::post('/v1/users/md5') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') + ->label('audits.event', 'users.create.md5') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -173,6 +176,7 @@ App::post('/v1/users/argon2') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') + ->label('audits.event', 'users.create.argon2') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -201,6 +205,7 @@ App::post('/v1/users/sha') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') + ->label('audits.event', 'users.create.sha') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -236,6 +241,7 @@ App::post('/v1/users/phpass') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') + ->label('audits.event', 'users.create.phpass') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -264,6 +270,7 @@ App::post('/v1/users/scrypt') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') + ->label('audits.event', 'users.create.scrypt') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -305,6 +312,7 @@ App::post('/v1/users/scrypt-modified') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') + ->label('audits.event', 'users.create.scrypt-modified') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -601,6 +609,7 @@ App::patch('/v1/users/:userId/status') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.status') ->label('scope', 'users.write') + ->label('audits.event', 'users.status.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -637,6 +646,7 @@ App::patch('/v1/users/:userId/verification') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.verification') ->label('scope', 'users.write') + ->label('audits.event', 'users.verification.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -672,6 +682,7 @@ App::patch('/v1/users/:userId/verification/phone') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.verification') ->label('scope', 'users.write') + ->label('audits.event', 'users.verification.phone.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -707,6 +718,7 @@ App::patch('/v1/users/:userId/name') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.name') ->label('scope', 'users.write') + ->label('audits.event', 'users.name.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -747,6 +759,7 @@ App::patch('/v1/users/:userId/password') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.password') ->label('scope', 'users.write') + ->label('audits.event', 'users.password.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -788,6 +801,7 @@ App::patch('/v1/users/:userId/email') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.email') ->label('scope', 'users.write') + ->label('audits.event', 'users.email.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -834,6 +848,7 @@ App::patch('/v1/users/:userId/phone') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.phone') ->label('scope', 'users.write') + ->label('audits.event', 'users.phone.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -878,6 +893,7 @@ App::patch('/v1/users/:userId/verification') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.verification') ->label('scope', 'users.write') + ->label('audits.event', 'users.verification.email.update') ->label('audits.resource', 'user/{request.userId}') ->label('audits.userId', '{request.userId}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -947,6 +963,7 @@ App::delete('/v1/users/:userId/sessions/:sessionId') ->groups(['api', 'users']) ->label('event', 'users.[userId].sessions.[sessionId].delete') ->label('scope', 'users.write') + ->label('audits.event', 'users.session.delete') ->label('audits.resource', 'user/{request.userId}') ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -989,6 +1006,7 @@ App::delete('/v1/users/:userId/sessions') ->groups(['api', 'users']) ->label('event', 'users.[userId].sessions.[sessionId].delete') ->label('scope', 'users.write') + ->label('audits.event', 'users.sessions.delete') ->label('audits.resource', 'user/{user.$id}') ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -1031,6 +1049,7 @@ App::delete('/v1/users/:userId') ->groups(['api', 'users']) ->label('event', 'users.[userId].delete') ->label('scope', 'users.write') + ->label('audits.event', 'users.delete') ->label('audits.resource', 'user/{request.userId}') ->label('usage.metric', 'users.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) From 5ea081654090474ccaa2ba31aa950debb3d2d0c7 Mon Sep 17 00:00:00 2001 From: shimon Date: Sun, 4 Sep 2022 11:17:53 +0300 Subject: [PATCH 007/223] account labels --- app/controllers/shared/api.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 7d9fa2509f..d36fd90131 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -144,7 +144,7 @@ App::init() ->setMode($mode) ->setUserAgent($request->getUserAgent('')) ->setIP($request->getIP()) - ->setEvent($route->getLabel('event', '')) + ->setEvent($route->getLabel('audit.event', '')) ->setProject($project) ->setUser($user); @@ -342,8 +342,6 @@ App::shutdown() $audits->setPayload($responsePayload); } - $audits->setEvent($route->getLabel('audits.event', '')); - foreach ($events->getParams() as $key => $value) { $audits->setParam($key, $value); } From 2c9b749f72931e055d1bef9700198122aa96a76a Mon Sep 17 00:00:00 2001 From: shimon Date: Sun, 4 Sep 2022 11:23:24 +0300 Subject: [PATCH 008/223] account labels --- app/controllers/shared/api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index d36fd90131..e07f405140 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -144,7 +144,7 @@ App::init() ->setMode($mode) ->setUserAgent($request->getUserAgent('')) ->setIP($request->getIP()) - ->setEvent($route->getLabel('audit.event', '')) + ->setEvent($route->getLabel('audits.event', '')) ->setProject($project) ->setUser($user); From f63c740917dcb831618c6c11f3a74c43c405a6b2 Mon Sep 17 00:00:00 2001 From: shimon Date: Sun, 4 Sep 2022 11:45:53 +0300 Subject: [PATCH 009/223] decouple audits log from events --- app/controllers/shared/api.php | 2 ++ app/workers/audits.php | 4 ++-- src/Appwrite/Event/Audit.php | 25 ++++++++++++++++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index e07f405140..7d9b3fe4d9 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -342,6 +342,8 @@ App::shutdown() $audits->setPayload($responsePayload); } + var_dump($audits); + foreach ($events->getParams() as $key => $value) { $audits->setParam($key, $value); } diff --git a/app/workers/audits.php b/app/workers/audits.php index 696eb6df50..b86649543b 100644 --- a/app/workers/audits.php +++ b/app/workers/audits.php @@ -24,7 +24,7 @@ class AuditsV1 extends Worker public function run(): void { - $events = $this->args['events']; + $event = $this->args['event']; $payload = $this->args['payload']; $mode = $this->args['mode']; $resource = $this->args['resource']; @@ -42,7 +42,7 @@ class AuditsV1 extends Worker $audit->log( userId: $user->getId(), // Pass first, most verbose event pattern - event: $events[0], + event: $event, resource: $resource, userAgent: $userAgent, ip: $ip, diff --git a/src/Appwrite/Event/Audit.php b/src/Appwrite/Event/Audit.php index 4df3eeec62..2020548969 100644 --- a/src/Appwrite/Event/Audit.php +++ b/src/Appwrite/Event/Audit.php @@ -108,6 +108,29 @@ class Audit extends Event return $this->ip; } + /** + * Set description for this audit event + * + * @param string $event + * @return self + */ + public function setEvent(string $event): self + { + $this->event = $event; + + return $this; + } + + /** + * Returns the audit event description. + * + * @return string + */ + public function getEvent(): string + { + return $this->event; + } + /** * Executes the event and sends it to the audit worker. * @@ -124,7 +147,7 @@ class Audit extends Event 'mode' => $this->mode, 'ip' => $this->ip, 'userAgent' => $this->userAgent, - 'events' => Event::generateEvents($this->getEvent(), $this->getParams()) + 'event' => $this->event, ]); } } From db715f3e7dc6a354e22419977ac2d2f3bf77b979 Mon Sep 17 00:00:00 2001 From: shimon Date: Sun, 4 Sep 2022 13:31:38 +0300 Subject: [PATCH 010/223] decouple audits log from events --- app/controllers/api/account.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index c9c69e6368..490650a41e 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -146,7 +146,7 @@ App::post('/v1/account/sessions/email') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('scope', 'public') ->label('auth.type', 'emailPassword') - ->label('audits.event', 'account.session.create') + ->label('audits.event', 'account.session.email.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.create') @@ -606,7 +606,7 @@ App::post('/v1/account/sessions/magic-url') ->groups(['api', 'account']) ->label('scope', 'public') ->label('auth.type', 'magic-url') - ->label('audits.event', 'account.session.create') + ->label('audits.event', 'account.session.magic-url.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('sdk.auth', []) @@ -859,7 +859,7 @@ App::post('/v1/account/sessions/phone') ->groups(['api', 'account']) ->label('scope', 'public') ->label('auth.type', 'phone') - ->label('audits.event', 'account.session.create') + ->label('audits.event', 'account.session.phone.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('sdk.auth', []) @@ -1093,7 +1093,7 @@ App::post('/v1/account/sessions/anonymous') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('scope', 'public') ->label('auth.type', 'anonymous') - ->label('audits.event', 'account.session.create') + ->label('audits.event', 'account.session.anonymous.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.create') From eabc90ec497e46aeb92a4a9bd4e4190aa29eb15b Mon Sep 17 00:00:00 2001 From: shimon Date: Sun, 4 Sep 2022 17:53:37 +0300 Subject: [PATCH 011/223] decouple audits log from events --- app/controllers/shared/api.php | 2 -- tests/e2e/Services/Account/AccountBase.php | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 7d9b3fe4d9..e07f405140 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -342,8 +342,6 @@ App::shutdown() $audits->setPayload($responsePayload); } - var_dump($audits); - foreach ($events->getParams() as $key => $value) { $audits->setParam($key, $value); } diff --git a/tests/e2e/Services/Account/AccountBase.php b/tests/e2e/Services/Account/AccountBase.php index 90254a1489..37c4277e85 100644 --- a/tests/e2e/Services/Account/AccountBase.php +++ b/tests/e2e/Services/Account/AccountBase.php @@ -341,7 +341,7 @@ trait AccountBase $this->assertNotEmpty($response['body']['logs']); $this->assertCount(3, $response['body']['logs']); $this->assertIsNumeric($response['body']['total']); - $this->assertContains($response['body']['logs'][1]['event'], ["users.{$userId}.create", "users.{$userId}.sessions.{$sessionId}.create"]); + $this->assertContains($response['body']['logs'][1]['event'], ["account.session.email.create"]); $this->assertEquals($response['body']['logs'][1]['ip'], filter_var($response['body']['logs'][1]['ip'], FILTER_VALIDATE_IP)); $this->assertEquals(true, DateTime::isValid($response['body']['logs'][1]['time'])); @@ -363,7 +363,7 @@ trait AccountBase $this->assertEquals('--', $response['body']['logs'][1]['countryCode']); $this->assertEquals('Unknown', $response['body']['logs'][1]['countryName']); - $this->assertContains($response['body']['logs'][2]['event'], ["users.{$userId}.create", "users.{$userId}.sessions.{$sessionId}.create"]); + $this->assertContains($response['body']['logs'][2]['event'], ["account.create"]); $this->assertEquals($response['body']['logs'][2]['ip'], filter_var($response['body']['logs'][2]['ip'], FILTER_VALIDATE_IP)); $this->assertEquals(true, DateTime::isValid($response['body']['logs'][2]['time'])); From 5c08e066aa24e69b2310219657b37108f2a9d4b0 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Mon, 5 Sep 2022 13:41:01 +1200 Subject: [PATCH 012/223] Fix allowed permissions for documents/files --- app/controllers/api/databases.php | 4 ++-- app/controllers/api/storage.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/databases.php b/app/controllers/api/databases.php index 38489c8331..ff2ecc0d08 100644 --- a/app/controllers/api/databases.php +++ b/app/controllers/api/databases.php @@ -1827,7 +1827,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/documents') ->param('documentId', '', new CustomId(), 'Document ID. Choose your own unique ID or pass the string "unique()" to auto generate it. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') ->param('collectionId', null, new UID(), 'Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection). Make sure to define attributes before creating documents.') ->param('data', [], new JSON(), 'Document data as JSON object.') - ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE]), 'An array of permissions strings. By default the current user is granted with all permissions. [Learn more about permissions](/docs/permissions).', true) + ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE, 'write']), 'An array of permissions strings. By default the current user is granted with all permissions. [Learn more about permissions](/docs/permissions).', true) ->inject('response') ->inject('dbForProject') ->inject('user') @@ -2207,7 +2207,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/documents/:docum ->param('collectionId', null, new UID(), 'Collection ID.') ->param('documentId', null, new UID(), 'Document ID.') ->param('data', [], new JSON(), 'Document data as JSON object. Include only attribute and value pairs to be updated.', true) - ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE), 'An array of permissions strings. By default the current permissions are inherited. [Learn more about permissions](/docs/permissions).', true) + ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_CREATE, Database::PERMISSION_UPDATE, 'write']), 'An array of permissions strings. By default the current permissions are inherited. [Learn more about permissions](/docs/permissions).', true) ->inject('response') ->inject('dbForProject') ->inject('events') diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 2fe9a941a9..e9baa2971f 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -344,7 +344,7 @@ App::post('/v1/storage/buckets/:bucketId/files') ->param('bucketId', null, new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](/docs/server/storage#createBucket).') ->param('fileId', '', new CustomId(), 'File ID. Choose your own unique ID or pass the string "unique()" to auto generate it. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') ->param('file', [], new File(), 'Binary file.', false) - ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE]), 'An array of permission strings. By default the current user is granted with all permissions. [Learn more about permissions](/docs/permissions).', true) + ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE, 'write']), 'An array of permission strings. By default the current user is granted with all permissions. [Learn more about permissions](/docs/permissions).', true) ->inject('request') ->inject('response') ->inject('dbForProject') @@ -1251,7 +1251,7 @@ App::put('/v1/storage/buckets/:bucketId/files/:fileId') ->label('sdk.response.model', Response::MODEL_FILE) ->param('bucketId', null, new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](/docs/server/storage#createBucket).') ->param('fileId', '', new UID(), 'File unique ID.') - ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE), 'An array of permission string. By default the current permissions are inherited. [Learn more about permissions](/docs/permissions).', true) + ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_CREATE, Database::PERMISSION_UPDATE, 'write']), 'An array of permission string. By default the current permissions are inherited. [Learn more about permissions](/docs/permissions).', true) ->inject('response') ->inject('dbForProject') ->inject('user') From a861b174a2ebea522d5bb2ac5663d830dbb206d8 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Mon, 5 Sep 2022 14:16:40 +1200 Subject: [PATCH 013/223] Add allowed permissions tests --- composer.json | 2 +- composer.lock | 27 ++++-- .../Databases/DatabasesCustomClientTest.php | 86 +++++++++++++++++++ .../Storage/StorageCustomClientTest.php | 62 +++++++++++++ 4 files changed, 167 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 8fe79a7ace..462179e3cb 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "utopia-php/cache": "0.6.*", "utopia-php/cli": "0.13.*", "utopia-php/config": "0.2.*", - "utopia-php/database": "0.24.*", + "utopia-php/database": "dev-feat-write-helper as 0.24.0", "utopia-php/locale": "0.4.*", "utopia-php/registry": "0.5.*", "utopia-php/preloader": "0.2.*", diff --git a/composer.lock b/composer.lock index 5d2cef66f0..0a611f17e0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "39c0ee0169b4681e5c07889d2a285d01", + "content-hash": "acf850ed1f73f172c7573daf5ca54940", "packages": [ { "name": "adhocore/jwt", @@ -2060,16 +2060,16 @@ }, { "name": "utopia-php/database", - "version": "0.24.0", + "version": "dev-feat-write-helper", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "7da841d65d87e9f2c242589e58c38880def44dd8" + "reference": "d6a18e52df0118b33eda2228a8911c88533a1dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/7da841d65d87e9f2c242589e58c38880def44dd8", - "reference": "7da841d65d87e9f2c242589e58c38880def44dd8", + "url": "https://api.github.com/repos/utopia-php/database/zipball/d6a18e52df0118b33eda2228a8911c88533a1dbe", + "reference": "d6a18e52df0118b33eda2228a8911c88533a1dbe", "shasum": "" }, "require": { @@ -2118,9 +2118,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/0.24.0" + "source": "https://github.com/utopia-php/database/tree/feat-write-helper" }, - "time": "2022-08-27T09:16:05+00:00" + "time": "2022-09-05T01:47:47+00:00" }, { "name": "utopia-php/domains", @@ -5358,9 +5358,18 @@ "time": "2022-08-12T06:47:24+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "utopia-php/database", + "version": "dev-feat-write-helper", + "alias": "0.24.0", + "alias_normalized": "0.24.0.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "utopia-php/database": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/tests/e2e/Services/Databases/DatabasesCustomClientTest.php b/tests/e2e/Services/Databases/DatabasesCustomClientTest.php index 3ed1879288..595d0d632c 100644 --- a/tests/e2e/Services/Databases/DatabasesCustomClientTest.php +++ b/tests/e2e/Services/Databases/DatabasesCustomClientTest.php @@ -16,6 +16,92 @@ class DatabasesCustomClientTest extends Scope use ProjectCustom; use SideClient; + public function testAllowedPermissions(): void + { + /** + * Test for SUCCESS + */ + + $database = $this->client->call(Client::METHOD_POST, '/databases', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ], [ + 'databaseId' => ID::unique(), + 'name' => 'Test Database' + ]); + + $databaseId = $database['body']['$id']; + + // Collection aliases write to create, update, delete + $movies = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'collectionId' => ID::unique(), + 'name' => 'Movies', + 'documentSecurity' => true, + 'permissions' => [ + Permission::write(Role::user($this->getUser()['$id'])), + ], + ]); + + $this->assertContains(Permission::create(Role::user($this->getUser()['$id'])), $movies['body']['$permissions']); + $this->assertContains(Permission::update(Role::user($this->getUser()['$id'])), $movies['body']['$permissions']); + $this->assertContains(Permission::delete(Role::user($this->getUser()['$id'])), $movies['body']['$permissions']); + + // Document aliases write to update, delete + $document1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'documentId' => ID::unique(), + 'data' => [ + 'title' => 'Captain America', + 'releaseYear' => 1944, + 'birthDay' => '1975-06-12 14:12:55+02:00', + 'actors' => [ + 'Chris Evans', + 'Samuel Jackson', + ] + ], + 'permissions' => [ + Permission::write(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertNotContains(Permission::create(Role::user($this->getUser()['$id'])), $document1['body']['$permissions']); + $this->assertContains(Permission::update(Role::user($this->getUser()['$id'])), $document1['body']['$permissions']); + $this->assertContains(Permission::delete(Role::user($this->getUser()['$id'])), $document1['body']['$permissions']); + + /** + * Test for FAILURE + */ + + // Document does not allow create permission + $document2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'documentId' => ID::unique(), + 'data' => [ + 'title' => 'Captain America', + 'releaseYear' => 1944, + 'birthDay' => '1975-06-12 14:12:55+02:00', + 'actors' => [ + 'Chris Evans', + 'Samuel Jackson', + ] + ], + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertEquals(400, $document2['headers']['status-code']); + } + public function testUpdateWithoutPermission(): array { // If document has been created by server and client tried to update it without adjusting permissions, permission validation should be skipped diff --git a/tests/e2e/Services/Storage/StorageCustomClientTest.php b/tests/e2e/Services/Storage/StorageCustomClientTest.php index b7173658fd..f24e8c0f21 100644 --- a/tests/e2e/Services/Storage/StorageCustomClientTest.php +++ b/tests/e2e/Services/Storage/StorageCustomClientTest.php @@ -1065,6 +1065,68 @@ class StorageCustomClientTest extends Scope $this->assertEmpty($file['body']); } + public function testAllowedPermissions(): void + { + /** + * Test for SUCCESS + */ + + // Bucket aliases write to create, update, delete + $bucket = $this->client->call(Client::METHOD_POST, '/storage/buckets', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'], + ], [ + 'bucketId' => ID::unique(), + 'name' => 'Test Bucket', + 'permissions' => [ + Permission::write(Role::user($this->getUser()['$id'])), + ], + 'fileSecurity' => true, + ]); + + $bucketId = $bucket['body']['$id']; + $this->assertEquals(201, $bucket['headers']['status-code']); + + $this->assertContains(Permission::create(Role::user($this->getUser()['$id'])), $bucket['body']['$permissions']); + $this->assertContains(Permission::update(Role::user($this->getUser()['$id'])), $bucket['body']['$permissions']); + $this->assertContains(Permission::delete(Role::user($this->getUser()['$id'])), $bucket['body']['$permissions']); + + // File aliases write to update, delete + $file1 = $this->client->call(Client::METHOD_POST, '/storage/buckets/' . $bucketId . '/files', [ + 'content-type' => 'multipart/form-data', + 'x-appwrite-project' => $this->getProject()['$id'], + ], [ + 'fileId' => ID::unique(), + 'file' => new CURLFile(realpath(__DIR__ . '/../../../resources/logo.png'), 'image/png', 'permissions.png'), + 'permissions' => [ + Permission::write(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertNotContains(Permission::create(Role::user($this->getUser()['$id'])), $file1['body']['$permissions']); + $this->assertContains(Permission::update(Role::user($this->getUser()['$id'])), $file1['body']['$permissions']); + $this->assertContains(Permission::delete(Role::user($this->getUser()['$id'])), $file1['body']['$permissions']); + + /** + * Test for FAILURE + */ + + // File does not allow create permission + $file2 = $this->client->call(Client::METHOD_POST, '/storage/buckets/' . $bucketId . '/files', [ + 'content-type' => 'multipart/form-data', + 'x-appwrite-project' => $this->getProject()['$id'], + ], [ + 'fileId' => ID::unique(), + 'file' => new CURLFile(realpath(__DIR__ . '/../../../resources/logo.png'), 'image/png', 'permissions.png'), + 'permissions' => [ + Permission::create(Role::user($this->getUser()['$id'])), + ] + ]); + + $this->assertEquals(400, $file2['headers']['status-code']); + } + public function testCreateFileDefaultPermissions(): array { /** From e55faff0a1ae80530d7f784b98bf054d6f8d7883 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Mon, 5 Sep 2022 19:51:33 +1200 Subject: [PATCH 014/223] Fix tests --- app/controllers/api/databases.php | 2 +- app/controllers/api/storage.php | 2 +- composer.lock | 8 +-- .../Databases/DatabasesCustomClientTest.php | 30 +++++------ .../DatabasesPermissionsGuestTest.php | 50 +++++++++++++++++++ .../Storage/StorageCustomClientTest.php | 4 +- 6 files changed, 74 insertions(+), 22 deletions(-) diff --git a/app/controllers/api/databases.php b/app/controllers/api/databases.php index ff2ecc0d08..64421b52ce 100644 --- a/app/controllers/api/databases.php +++ b/app/controllers/api/databases.php @@ -2207,7 +2207,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/documents/:docum ->param('collectionId', null, new UID(), 'Collection ID.') ->param('documentId', null, new UID(), 'Document ID.') ->param('data', [], new JSON(), 'Document data as JSON object. Include only attribute and value pairs to be updated.', true) - ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_CREATE, Database::PERMISSION_UPDATE, 'write']), 'An array of permissions strings. By default the current permissions are inherited. [Learn more about permissions](/docs/permissions).', true) + ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE, 'write']), 'An array of permissions strings. By default the current permissions are inherited. [Learn more about permissions](/docs/permissions).', true) ->inject('response') ->inject('dbForProject') ->inject('events') diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index e9baa2971f..5799f04d20 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -1251,7 +1251,7 @@ App::put('/v1/storage/buckets/:bucketId/files/:fileId') ->label('sdk.response.model', Response::MODEL_FILE) ->param('bucketId', null, new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](/docs/server/storage#createBucket).') ->param('fileId', '', new UID(), 'File unique ID.') - ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_CREATE, Database::PERMISSION_UPDATE, 'write']), 'An array of permission string. By default the current permissions are inherited. [Learn more about permissions](/docs/permissions).', true) + ->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE, 'write']), 'An array of permission string. By default the current permissions are inherited. [Learn more about permissions](/docs/permissions).', true) ->inject('response') ->inject('dbForProject') ->inject('user') diff --git a/composer.lock b/composer.lock index 0a611f17e0..ac4e07cb0e 100644 --- a/composer.lock +++ b/composer.lock @@ -2064,12 +2064,12 @@ "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "d6a18e52df0118b33eda2228a8911c88533a1dbe" + "reference": "0a4119703ba11112f0e1d1fffa383fa1a882a588" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/d6a18e52df0118b33eda2228a8911c88533a1dbe", - "reference": "d6a18e52df0118b33eda2228a8911c88533a1dbe", + "url": "https://api.github.com/repos/utopia-php/database/zipball/0a4119703ba11112f0e1d1fffa383fa1a882a588", + "reference": "0a4119703ba11112f0e1d1fffa383fa1a882a588", "shasum": "" }, "require": { @@ -2120,7 +2120,7 @@ "issues": "https://github.com/utopia-php/database/issues", "source": "https://github.com/utopia-php/database/tree/feat-write-helper" }, - "time": "2022-09-05T01:47:47+00:00" + "time": "2022-09-05T03:51:48+00:00" }, { "name": "utopia-php/domains", diff --git a/tests/e2e/Services/Databases/DatabasesCustomClientTest.php b/tests/e2e/Services/Databases/DatabasesCustomClientTest.php index 595d0d632c..9f86bb66c0 100644 --- a/tests/e2e/Services/Databases/DatabasesCustomClientTest.php +++ b/tests/e2e/Services/Databases/DatabasesCustomClientTest.php @@ -47,24 +47,32 @@ class DatabasesCustomClientTest extends Scope ], ]); + $moviesId = $movies['body']['$id']; + $this->assertContains(Permission::create(Role::user($this->getUser()['$id'])), $movies['body']['$permissions']); $this->assertContains(Permission::update(Role::user($this->getUser()['$id'])), $movies['body']['$permissions']); $this->assertContains(Permission::delete(Role::user($this->getUser()['$id'])), $movies['body']['$permissions']); + $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $moviesId . '/attributes/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'title', + 'size' => 256, + 'required' => true, + ]); + + sleep(1); + // Document aliases write to update, delete - $document1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $data['moviesId'] . '/documents', array_merge([ + $document1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $moviesId . '/documents', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'documentId' => ID::unique(), 'data' => [ 'title' => 'Captain America', - 'releaseYear' => 1944, - 'birthDay' => '1975-06-12 14:12:55+02:00', - 'actors' => [ - 'Chris Evans', - 'Samuel Jackson', - ] ], 'permissions' => [ Permission::write(Role::user($this->getUser()['$id'])), @@ -80,19 +88,13 @@ class DatabasesCustomClientTest extends Scope */ // Document does not allow create permission - $document2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $data['moviesId'] . '/documents', array_merge([ + $document2 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $moviesId . '/documents', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'documentId' => ID::unique(), 'data' => [ 'title' => 'Captain America', - 'releaseYear' => 1944, - 'birthDay' => '1975-06-12 14:12:55+02:00', - 'actors' => [ - 'Chris Evans', - 'Samuel Jackson', - ] ], 'permissions' => [ Permission::create(Role::user($this->getUser()['$id'])), diff --git a/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php b/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php index 067e477695..c2293e30f4 100644 --- a/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php +++ b/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php @@ -225,4 +225,54 @@ class DatabasesPermissionsGuestTest extends Scope Authorization::setRole($role); } } + + public function testWriteDocumentWithPermissions() + { + $database = $this->client->call(Client::METHOD_POST, '/databases', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'databaseId' => ID::unique(), + 'name' => 'GuestPermissionsWrite', + ]); + $this->assertEquals(201, $database['headers']['status-code']); + $this->assertEquals('InvalidDocumentDatabase', $database['body']['name']); + + $databaseId = $database['body']['$id']; + $movies = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections', $this->getServerHeader(), [ + 'collectionId' => ID::unique(), + 'name' => 'Movies', + 'permissions' => [ + Permission::create(Role::any()), + ], + 'documentSecurity' => true + ]); + + $moviesId = $movies['body']['$id']; + + $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $moviesId . '/attributes/string', $this->getServerHeader(), [ + 'key' => 'title', + 'size' => 256, + 'required' => true, + ]); + + sleep(1); + + $document = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $moviesId . '/documents', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], [ + 'documentId' => ID::unique(), + 'data' => [ + 'title' => 'Thor: Ragnarok', + ], + 'permissions' => [ + Permission::read(Role::any()), + ] + ]); + + $this->assertEquals(201, $document['headers']['status-code']); + $this->assertEquals('Thor: Ragnarok', $document['body']['title']); + } } diff --git a/tests/e2e/Services/Storage/StorageCustomClientTest.php b/tests/e2e/Services/Storage/StorageCustomClientTest.php index f24e8c0f21..0e4daa9957 100644 --- a/tests/e2e/Services/Storage/StorageCustomClientTest.php +++ b/tests/e2e/Services/Storage/StorageCustomClientTest.php @@ -1093,10 +1093,10 @@ class StorageCustomClientTest extends Scope $this->assertContains(Permission::delete(Role::user($this->getUser()['$id'])), $bucket['body']['$permissions']); // File aliases write to update, delete - $file1 = $this->client->call(Client::METHOD_POST, '/storage/buckets/' . $bucketId . '/files', [ + $file1 = $this->client->call(Client::METHOD_POST, '/storage/buckets/' . $bucketId . '/files', array_merge([ 'content-type' => 'multipart/form-data', 'x-appwrite-project' => $this->getProject()['$id'], - ], [ + ], $this->getHeaders()), [ 'fileId' => ID::unique(), 'file' => new CURLFile(realpath(__DIR__ . '/../../../resources/logo.png'), 'image/png', 'permissions.png'), 'permissions' => [ From 13629020823bf9e8a4f8bc48e2bc6d77719574de Mon Sep 17 00:00:00 2001 From: shimon Date: Mon, 5 Sep 2022 11:00:08 +0300 Subject: [PATCH 015/223] audit event name reformation --- app/controllers/api/account.php | 41 ++++++++++----------- app/controllers/api/databases.php | 42 +++++++++++----------- app/controllers/api/functions.php | 20 +++++------ app/controllers/api/storage.php | 12 +++---- app/controllers/api/teams.php | 14 ++++---- app/controllers/api/users.php | 38 ++++++++++---------- tests/e2e/Services/Account/AccountBase.php | 2 +- 7 files changed, 85 insertions(+), 84 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 490650a41e..6683a3d828 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -146,7 +146,7 @@ App::post('/v1/account/sessions/email') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('scope', 'public') ->label('auth.type', 'emailPassword') - ->label('audits.event', 'account.session.email.create') + ->label('audits.event', 'session.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.create') @@ -368,6 +368,7 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect') ->label('error', __DIR__ . '/../../views/general/error.phtml') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('scope', 'public') + ->label('audits.event', 'session.create') ->label('audits.resource', 'user/{user.$id}') ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') @@ -606,7 +607,7 @@ App::post('/v1/account/sessions/magic-url') ->groups(['api', 'account']) ->label('scope', 'public') ->label('auth.type', 'magic-url') - ->label('audits.event', 'account.session.magic-url.create') + ->label('audits.event', 'session.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('sdk.auth', []) @@ -739,7 +740,7 @@ App::put('/v1/account/sessions/magic-url') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].sessions.[sessionId].create') - ->label('audits.event', 'account.session.update') + ->label('audits.event', 'session.update') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.create') @@ -859,7 +860,7 @@ App::post('/v1/account/sessions/phone') ->groups(['api', 'account']) ->label('scope', 'public') ->label('auth.type', 'phone') - ->label('audits.event', 'account.session.phone.create') + ->label('audits.event', 'session.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('sdk.auth', []) @@ -1093,7 +1094,7 @@ App::post('/v1/account/sessions/anonymous') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('scope', 'public') ->label('auth.type', 'anonymous') - ->label('audits.event', 'account.session.anonymous.create') + ->label('audits.event', 'session.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.create') @@ -1448,7 +1449,7 @@ App::patch('/v1/account/name') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.name') ->label('scope', 'account') - ->label('audits.event', 'account.name.update') + ->label('audits.event', 'account.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1479,7 +1480,7 @@ App::patch('/v1/account/password') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.password') ->label('scope', 'account') - ->label('audits.event', 'account.password.update') + ->label('audits.event', 'account.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -1519,7 +1520,7 @@ App::patch('/v1/account/email') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.email') ->label('scope', 'account') - ->label('audits.event', 'account.email.update') + ->label('audits.event', 'account.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1571,7 +1572,7 @@ App::patch('/v1/account/phone') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.phone') ->label('scope', 'account') - ->label('audits.event', 'account.phone.update') + ->label('audits.event', 'account.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1619,7 +1620,7 @@ App::patch('/v1/account/prefs') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.prefs') ->label('scope', 'account') - ->label('audits.event', 'account.preferences.update') + ->label('audits.event', 'account.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1648,7 +1649,7 @@ App::patch('/v1/account/status') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.status') ->label('scope', 'account') - ->label('audits.event', 'account.status.update') + ->label('audits.event', 'account.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1683,7 +1684,7 @@ App::delete('/v1/account/sessions/:sessionId') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].delete') - ->label('audits.event', 'account.session.delete') + ->label('audits.event', 'session.delete') ->label('audits.resource', 'user/{user.$id}') ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1754,7 +1755,7 @@ App::patch('/v1/account/sessions/:sessionId') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].update') - ->label('audits.event', 'account.session.update') + ->label('audits.event', 'session.update') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'sessions.{scope}.requests.update') @@ -1836,7 +1837,7 @@ App::delete('/v1/account/sessions') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].delete') - ->label('audits.event', 'account.sessions.delete') + ->label('audits.event', 'session.delete') ->label('audits.resource', 'user/{user.$id}') ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1898,7 +1899,7 @@ App::post('/v1/account/recovery') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].recovery.[tokenId].create') - ->label('audits.event', 'account.recovery.create') + ->label('audits.event', 'recovery.create') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -2004,7 +2005,7 @@ App::put('/v1/account/recovery') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].recovery.[tokenId].update') - ->label('audits.event', 'account.recovery.update') + ->label('audits.event', 'recovery.update') ->label('audits.resource', 'user/{response.userId}') ->label('audits.userId', '{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -2073,7 +2074,7 @@ App::post('/v1/account/verification') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].verification.[tokenId].create') - ->label('audits.event', 'account.verification.create') + ->label('audits.event', 'verification.create') ->label('audits.resource', 'user/{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -2162,7 +2163,7 @@ App::put('/v1/account/verification') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].verification.[tokenId].update') - ->label('audits.event', 'account.verification.update') + ->label('audits.event', 'verification.update') ->label('audits.resource', 'user/{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -2221,7 +2222,7 @@ App::post('/v1/account/verification/phone') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].verification.[tokenId].create') - ->label('audits.event', 'account.verification.create') + ->label('audits.event', 'verification.create') ->label('audits.resource', 'user/{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -2305,7 +2306,7 @@ App::put('/v1/account/verification/phone') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].verification.[tokenId].update') - ->label('audits.event', 'account.verification.update') + ->label('audits.event', 'verification.update') ->label('audits.resource', 'user/{response.userId}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) diff --git a/app/controllers/api/databases.php b/app/controllers/api/databases.php index 7b1f1f29bf..28b822a953 100644 --- a/app/controllers/api/databases.php +++ b/app/controllers/api/databases.php @@ -153,7 +153,7 @@ App::post('/v1/databases') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].create') ->label('scope', 'databases.write') - ->label('audits.event', 'databases.create') + ->label('audits.event', 'database.create') ->label('audits.resource', 'database/{response.$id}') ->label('usage.metric', 'databases.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -386,7 +386,7 @@ App::put('/v1/databases/:databaseId') ->groups(['api', 'database']) ->label('scope', 'databases.write') ->label('event', 'databases.[databaseId].update') - ->label('audits.event', 'databases.update') + ->label('audits.event', 'database.update') ->label('audits.resource', 'database/{response.$id}') ->label('usage.metric', 'databases.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -429,7 +429,7 @@ App::delete('/v1/databases/:databaseId') ->groups(['api', 'database']) ->label('scope', 'databases.write') ->label('event', 'databases.[databaseId].delete') - ->label('audits.event', 'databases.delete') + ->label('audits.event', 'database.delete') ->label('audits.resource', 'database/{request.databaseId}') ->label('usage.metric', 'databases.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -476,7 +476,7 @@ App::post('/v1/databases/:databaseId/collections') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.create') + ->label('audits.event', 'collection.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{response.$id}') ->label('usage.metric', 'collections.{scope}.requests.create') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -730,7 +730,7 @@ App::put('/v1/databases/:databaseId/collections/:collectionId') ->groups(['api', 'database']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].update') - ->label('audits.event', 'databases.collections.update') + ->label('audits.event', 'collection.update') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -798,7 +798,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId') ->groups(['api', 'database']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].delete') - ->label('audits.event', 'databases.collections.delete') + ->label('audits.event', 'collection.delete') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.delete') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -855,7 +855,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/string ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.attributes.string.create') + ->label('audits.event', 'attribute.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -904,7 +904,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/email' ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.attributes.email.create') + ->label('audits.event', 'attribute.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -947,7 +947,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/enum') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.attributes.enum.create') + ->label('audits.event', 'attribute.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1006,7 +1006,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/ip') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.attributes.ip.create') + ->label('audits.event', 'attribute.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1049,7 +1049,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/url') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.attributes.url.create') + ->label('audits.event', 'attribute.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1092,7 +1092,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/intege ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.attributes.integer.create') + ->label('audits.event', 'attribute.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1164,7 +1164,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/float' ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.attributes.float.create') + ->label('audits.event', 'attribute.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1239,7 +1239,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/boolea ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.attributes.boolean.create') + ->label('audits.event', 'attribute.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1282,7 +1282,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/dateti ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.attributes.datetime.create') + ->label('audits.event', 'attribute.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1436,7 +1436,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/attributes/:key ->groups(['api', 'database']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].delete') - ->label('audits.event', 'databases.collections.attributes.delete') + ->label('audits.event', 'attribute.delete') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1524,7 +1524,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/indexes') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].indexes.[indexId].create') ->label('scope', 'collections.write') - ->label('audits.event', 'databases.collections.indexes.create') + ->label('audits.event', 'index.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1760,7 +1760,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/indexes/:key') ->groups(['api', 'database']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].indexes.[indexId].delete') - ->label('audits.event', 'databases.collections.indexes.delete') + ->label('audits.event', 'index.delete') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'collections.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}']) @@ -1828,7 +1828,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/documents') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].create') ->label('scope', 'documents.write') - ->label('audits.event', 'databases.collections.documents.create') + ->label('audits.event', 'document.create') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}') ->label('usage.metric', 'documents.{scope}.requests.create') ->label('usage.params', ['databaseId:{request.databaseId}', 'collectionId:{request.collectionId}']) @@ -2209,7 +2209,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/documents/:docum ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].update') ->label('scope', 'documents.write') - ->label('audits.event', 'databases.collections.documents.update') + ->label('audits.event', 'document.update') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}/document/{response.$id}') ->label('usage.metric', 'documents.{scope}.requests.update') ->label('usage.params', ['databaseId:{request.databaseId}', 'collectionId:{request.collectionId}']) @@ -2342,7 +2342,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/documents/:docu ->groups(['api', 'database']) ->label('scope', 'documents.write') ->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].delete') - ->label('audits.event', 'databases.collections.documents.delete') + ->label('audits.event', 'document.delete') ->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}/document/{request.documentId}') ->label('usage.metric', 'documents.{scope}.requests.delete') ->label('usage.params', ['databaseId:{request.databaseId}', 'collectionId:{request.collectionId}']) diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index ddab426dc5..72c6580a13 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -52,7 +52,7 @@ App::post('/v1/functions') ->desc('Create Function') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].create') - ->label('audits.event', 'functions.create') + ->label('audits.event', 'function.create') ->label('audits.resource', 'function/{response.$id}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -410,7 +410,7 @@ App::put('/v1/functions/:functionId') ->desc('Update Function') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].update') - ->label('audits.event', 'functions.update') + ->label('audits.event', 'function.update') ->label('audits.resource', 'function/{response.$id}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -473,7 +473,7 @@ App::patch('/v1/functions/:functionId/deployments/:deploymentId') ->desc('Update Function Deployment') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].update') - ->label('audits.event', 'functions.deployments.update') + ->label('audits.event', 'deployment.update') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -540,7 +540,7 @@ App::delete('/v1/functions/:functionId') ->desc('Delete Function') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].delete') - ->label('audits.event', 'functions.delete') + ->label('audits.event', 'function.delete') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -579,7 +579,7 @@ App::post('/v1/functions/:functionId/deployments') ->desc('Create Deployment') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].create') - ->label('audits.event', 'functions.deployments.create') + ->label('audits.event', 'deployment.create') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -871,7 +871,7 @@ App::delete('/v1/functions/:functionId/deployments/:deploymentId') ->desc('Delete Deployment') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].delete') - ->label('audits.event', 'functions.deployments.delete') + ->label('audits.event', 'deployment.delete') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -1243,7 +1243,7 @@ App::post('/v1/functions/:functionId/deployments/:deploymentId/builds/:buildId') ->desc('Retry Build') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].update') - ->label('audits.event', 'functions.deployments.builds.create') + ->label('audits.event', 'build.create') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'functions') @@ -1303,7 +1303,7 @@ App::post('/v1/functions/:functionId/variables') ->desc('Create Variable') ->groups(['api', 'functions']) ->label('scope', 'functions.write') - ->label('audits.event', 'functions.variables.create') + ->label('audits.event', 'variable.create') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -1442,7 +1442,7 @@ App::put('/v1/functions/:functionId/variables/:variableId') ->desc('Update Variable') ->groups(['api', 'functions']) ->label('scope', 'functions.write') - ->label('audits.event', 'functions.variables.update') + ->label('audits.event', 'variable.update') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -1495,7 +1495,7 @@ App::delete('/v1/functions/:functionId/variables/:variableId') ->desc('Delete Variable') ->groups(['api', 'functions']) ->label('scope', 'functions.write') - ->label('audits.event', 'functions.variables.delete') + ->label('audits.event', 'variable.delete') ->label('audits.resource', 'function/{request.functionId}') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 9040f10002..2d83768d3d 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -48,7 +48,7 @@ App::post('/v1/storage/buckets') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') ->label('event', 'buckets.[bucketId].create') - ->label('audits.event', 'buckets.create') + ->label('audits.event', 'bucket.create') ->label('audits.resource', 'buckets/{response.$id}') ->label('usage.metric', 'buckets.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -219,7 +219,7 @@ App::put('/v1/storage/buckets/:bucketId') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') ->label('event', 'buckets.[bucketId].update') - ->label('audits.event', 'buckets.update') + ->label('audits.event', 'bucket.update') ->label('audits.resource', 'buckets/{response.$id}') ->label('usage.metric', 'buckets.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -285,7 +285,7 @@ App::delete('/v1/storage/buckets/:bucketId') ->desc('Delete Bucket') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') - ->label('audits.event', 'buckets.delete') + ->label('audits.event', 'bucket.delete') ->label('event', 'buckets.[bucketId].delete') ->label('audits.resource', 'buckets/{request.bucketId}') ->label('usage.metric', 'buckets.{scope}.requests.delete') @@ -328,7 +328,7 @@ App::post('/v1/storage/buckets/:bucketId/files') ->desc('Create File') ->groups(['api', 'storage']) ->label('scope', 'files.write') - ->label('audits.event', 'files.create') + ->label('audits.event', 'file.create') ->label('event', 'buckets.[bucketId].files.[fileId].create') ->label('audits.resource', 'files/{response.$id}') ->label('usage.metric', 'files.{scope}.requests.create') @@ -1240,7 +1240,7 @@ App::put('/v1/storage/buckets/:bucketId/files/:fileId') ->groups(['api', 'storage']) ->label('scope', 'files.write') ->label('event', 'buckets.[bucketId].files.[fileId].update') - ->label('audits.event', 'files.update') + ->label('audits.event', 'file.update') ->label('audits.resource', 'files/{response.$id}') ->label('usage.metric', 'files.{scope}.requests.update') ->label('usage.params', ['bucketId:{request.bucketId}']) @@ -1343,7 +1343,7 @@ App::delete('/v1/storage/buckets/:bucketId/files/:fileId') ->groups(['api', 'storage']) ->label('scope', 'files.write') ->label('event', 'buckets.[bucketId].files.[fileId].delete') - ->label('audits.event', 'files.delete') + ->label('audits.event', 'file.delete') ->label('audits.resource', 'file/{request.fileId}') ->label('usage.metric', 'files.{scope}.requests.delete') ->label('usage.params', ['bucketId:{request.bucketId}']) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index ecb6894627..19af59d08c 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -45,7 +45,7 @@ App::post('/v1/teams') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].create') ->label('scope', 'teams.write') - ->label('audits.event', 'teams.create') + ->label('audits.event', 'team.create') ->label('audits.resource', 'team/{response.$id}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') @@ -200,7 +200,7 @@ App::put('/v1/teams/:teamId') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].update') ->label('scope', 'teams.write') - ->label('audits.event', 'teams.update') + ->label('audits.event', 'team.update') ->label('audits.resource', 'team/{response.$id}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') @@ -236,7 +236,7 @@ App::delete('/v1/teams/:teamId') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].delete') ->label('scope', 'teams.write') - ->label('audits.event', 'teams.delete') + ->label('audits.event', 'team.delete') ->label('audits.resource', 'team/{request.teamId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') @@ -291,7 +291,7 @@ App::post('/v1/teams/:teamId/memberships') ->label('event', 'teams.[teamId].memberships.[membershipId].create') ->label('scope', 'teams.write') ->label('auth.type', 'invites') - ->label('audits.event', 'teams.memberships.create') + ->label('audits.event', 'membership.create') ->label('audits.resource', 'team/{request.teamId}') ->label('audits.userId', '{request.userId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -586,7 +586,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].memberships.[membershipId].update') ->label('scope', 'teams.write') - ->label('audits.event', 'teams.memberships.update') + ->label('audits.event', 'membership.update') ->label('audits.resource', 'team/{request.teamId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') @@ -657,7 +657,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId/status') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].memberships.[membershipId].update.status') ->label('scope', 'public') - ->label('audits.event', 'teams.memberships.status.update') + ->label('audits.event', 'membership.update') ->label('audits.resource', 'team/{request.teamId}') ->label('audits.userId', '{request.userId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -791,7 +791,7 @@ App::delete('/v1/teams/:teamId/memberships/:membershipId') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].memberships.[membershipId].delete') ->label('scope', 'teams.write') - ->label('audits.event', 'teams.memberships.delete') + ->label('audits.event', 'membership.delete') ->label('audits.resource', 'team/{request.teamId}') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'teams') diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 5d9fff4cb7..ad14291e8d 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -88,7 +88,7 @@ App::post('/v1/users') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') - ->label('audits.event', 'users.create') + ->label('audits.event', 'user.create') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -118,7 +118,7 @@ App::post('/v1/users/bcrypt') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') - ->label('audits.event', 'users.create.bcrypt') + ->label('audits.event', 'user.create') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -147,7 +147,7 @@ App::post('/v1/users/md5') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') - ->label('audits.event', 'users.create.md5') + ->label('audits.event', 'user.create') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -176,7 +176,7 @@ App::post('/v1/users/argon2') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') - ->label('audits.event', 'users.create.argon2') + ->label('audits.event', 'user.create') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -205,7 +205,7 @@ App::post('/v1/users/sha') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') - ->label('audits.event', 'users.create.sha') + ->label('audits.event', 'user.create') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -241,7 +241,7 @@ App::post('/v1/users/phpass') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') - ->label('audits.event', 'users.create.phpass') + ->label('audits.event', 'user.create') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -270,7 +270,7 @@ App::post('/v1/users/scrypt') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') - ->label('audits.event', 'users.create.scrypt') + ->label('audits.event', 'user.create') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -312,7 +312,7 @@ App::post('/v1/users/scrypt-modified') ->groups(['api', 'users']) ->label('event', 'users.[userId].create') ->label('scope', 'users.write') - ->label('audits.event', 'users.create.scrypt-modified') + ->label('audits.event', 'user.create') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -609,7 +609,7 @@ App::patch('/v1/users/:userId/status') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.status') ->label('scope', 'users.write') - ->label('audits.event', 'users.status.update') + ->label('audits.event', 'user.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -646,7 +646,7 @@ App::patch('/v1/users/:userId/verification') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.verification') ->label('scope', 'users.write') - ->label('audits.event', 'users.verification.update') + ->label('audits.event', 'verification.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -682,7 +682,7 @@ App::patch('/v1/users/:userId/verification/phone') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.verification') ->label('scope', 'users.write') - ->label('audits.event', 'users.verification.phone.update') + ->label('audits.event', 'verification.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -718,7 +718,7 @@ App::patch('/v1/users/:userId/name') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.name') ->label('scope', 'users.write') - ->label('audits.event', 'users.name.update') + ->label('audits.event', 'user.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -759,7 +759,7 @@ App::patch('/v1/users/:userId/password') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.password') ->label('scope', 'users.write') - ->label('audits.event', 'users.password.update') + ->label('audits.event', 'user.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -801,7 +801,7 @@ App::patch('/v1/users/:userId/email') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.email') ->label('scope', 'users.write') - ->label('audits.event', 'users.email.update') + ->label('audits.event', 'user.update') ->label('audits.resource', 'user/{response.$id}') ->label('audits.userId', '{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -848,7 +848,7 @@ App::patch('/v1/users/:userId/phone') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.phone') ->label('scope', 'users.write') - ->label('audits.event', 'users.phone.update') + ->label('audits.event', 'user.update') ->label('audits.resource', 'user/{response.$id}') ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -893,7 +893,7 @@ App::patch('/v1/users/:userId/verification') ->groups(['api', 'users']) ->label('event', 'users.[userId].update.verification') ->label('scope', 'users.write') - ->label('audits.event', 'users.verification.email.update') + ->label('audits.event', 'verification.update') ->label('audits.resource', 'user/{request.userId}') ->label('audits.userId', '{request.userId}') ->label('usage.metric', 'users.{scope}.requests.update') @@ -963,7 +963,7 @@ App::delete('/v1/users/:userId/sessions/:sessionId') ->groups(['api', 'users']) ->label('event', 'users.[userId].sessions.[sessionId].delete') ->label('scope', 'users.write') - ->label('audits.event', 'users.session.delete') + ->label('audits.event', 'session.delete') ->label('audits.resource', 'user/{request.userId}') ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -1006,7 +1006,7 @@ App::delete('/v1/users/:userId/sessions') ->groups(['api', 'users']) ->label('event', 'users.[userId].sessions.[sessionId].delete') ->label('scope', 'users.write') - ->label('audits.event', 'users.sessions.delete') + ->label('audits.event', 'session.delete') ->label('audits.resource', 'user/{user.$id}') ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -1049,7 +1049,7 @@ App::delete('/v1/users/:userId') ->groups(['api', 'users']) ->label('event', 'users.[userId].delete') ->label('scope', 'users.write') - ->label('audits.event', 'users.delete') + ->label('audits.event', 'user.delete') ->label('audits.resource', 'user/{request.userId}') ->label('usage.metric', 'users.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) diff --git a/tests/e2e/Services/Account/AccountBase.php b/tests/e2e/Services/Account/AccountBase.php index 37c4277e85..9e59c50551 100644 --- a/tests/e2e/Services/Account/AccountBase.php +++ b/tests/e2e/Services/Account/AccountBase.php @@ -341,7 +341,7 @@ trait AccountBase $this->assertNotEmpty($response['body']['logs']); $this->assertCount(3, $response['body']['logs']); $this->assertIsNumeric($response['body']['total']); - $this->assertContains($response['body']['logs'][1]['event'], ["account.session.email.create"]); + $this->assertContains($response['body']['logs'][1]['event'], ["session.create"]); $this->assertEquals($response['body']['logs'][1]['ip'], filter_var($response['body']['logs'][1]['ip'], FILTER_VALIDATE_IP)); $this->assertEquals(true, DateTime::isValid($response['body']['logs'][1]['time'])); From 04b9311190c46adc5763c023ee4419e2924f1029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Mon, 5 Sep 2022 09:37:21 +0000 Subject: [PATCH 016/223] Use correct icon --- app/views/console/databases/collection.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/console/databases/collection.phtml b/app/views/console/databases/collection.phtml index 6c844875e0..1e60f516d4 100644 --- a/app/views/console/databases/collection.phtml +++ b/app/views/console/databases/collection.phtml @@ -315,7 +315,7 @@ $permissions = $this->getParam('permissions', null);
  • - +
  • From 5294f86595dbc368b5fea75f62e6f4068e3b17d1 Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 5 Sep 2022 13:43:36 +0100 Subject: [PATCH 017/223] Run Linter --- src/Appwrite/Utopia/Request/Filters/V15.php | 3 +-- src/Appwrite/Utopia/Response/Filters/V15.php | 10 ++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/Appwrite/Utopia/Request/Filters/V15.php b/src/Appwrite/Utopia/Request/Filters/V15.php index 8e93d91e2a..300750f95e 100644 --- a/src/Appwrite/Utopia/Request/Filters/V15.php +++ b/src/Appwrite/Utopia/Request/Filters/V15.php @@ -10,9 +10,8 @@ class V15 extends Filter public function parse(array $content, string $model): array { switch ($model) { - } return $content; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Filters/V15.php b/src/Appwrite/Utopia/Response/Filters/V15.php index e168e9954a..1ba37ebd20 100644 --- a/src/Appwrite/Utopia/Response/Filters/V15.php +++ b/src/Appwrite/Utopia/Response/Filters/V15.php @@ -77,7 +77,7 @@ class V15 extends Filter return $content; } - protected function handleMetricAttributes(array $content) + protected function handleMetricAttributes(array $content) { $content['timestamp'] = $content['date']; unset($content['date']); @@ -95,8 +95,7 @@ class V15 extends Filter protected function downgradePermissionSelector(string $permSelector) { - switch ($permSelector) - { + switch ($permSelector) { case 'any': return 'role:all'; case 'users': @@ -132,8 +131,7 @@ class V15 extends Filter $permission_value = explode(')', explode('(', $permission)[1])[0]; // Old type permissions meant that 'write' is equivalent to 'create', 'update' and 'delete' - switch ($permission_type) - { + switch ($permission_type) { case 'update': case 'delete': case 'write': @@ -146,7 +144,7 @@ class V15 extends Filter if (!in_array($this->downgradePermissionSelector($permission_value), $result['read'])) { $result['$read'][] = $this->downgradePermissionSelector($permission_value); } - break; + break; } } From a04a968def96673143a55092ccdd30f513fcb9cd Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 5 Sep 2022 16:48:10 +0100 Subject: [PATCH 018/223] Update permission to use permission class --- src/Appwrite/Utopia/Response/Filters/V15.php | 29 ++++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/Appwrite/Utopia/Response/Filters/V15.php b/src/Appwrite/Utopia/Response/Filters/V15.php index 1ba37ebd20..19000c9567 100644 --- a/src/Appwrite/Utopia/Response/Filters/V15.php +++ b/src/Appwrite/Utopia/Response/Filters/V15.php @@ -4,6 +4,7 @@ namespace Appwrite\Utopia\Response\Filters; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter; +use Utopia\Database\Permission; class V15 extends Filter { @@ -33,6 +34,7 @@ class V15 extends Filter case Response::MODEL_TEAM: case Response::MODEL_FILE: case Response::MODEL_WEBHOOK: + case Response::MODEL_DOMAIN: $parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt']); break; case Response::MODEL_FUNCTION: @@ -107,31 +109,27 @@ class V15 extends Filter return $permSelector; } - protected function downgradePermissions(array $permissions) + protected function downgradePermissions(array $model) { + if (!isset($model['$permissions'])) { + return $model; + } + + $permissions = $model['$permissions']; + $result = [ '$read' => [], '$write' => [] ]; - $splitPermissions = []; - - // split up the permisisons - foreach ($permissions as $permission) { - $permission_type = explode('(', $permission)[0]; - $permission_value = explode(')', explode('(', $permission)[1])[0]; - $splitPermissions[$permission_type][] = $permission_value; - } - // downgrade the permissions foreach ($permissions as $permission) { - //TODO: Replace with Permission class + $permission = Permission::parse($permission); // permission = "read('any')" = ["$read" => "role:all"] - $permission_type = explode('(', $permission)[0]; - $permission_value = explode(')', explode('(', $permission)[1])[0]; // Old type permissions meant that 'write' is equivalent to 'create', 'update' and 'delete' - switch ($permission_type) { + + switch ($permission->getPermission()) { case 'update': case 'delete': case 'write': @@ -148,6 +146,7 @@ class V15 extends Filter } } - return $result; + unset($model['$permissions']); + return array_merge($model, $result); } } From 02f54eca6525fb59955744b07d9ecdd42f7beb19 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 6 Sep 2022 13:02:32 +1200 Subject: [PATCH 019/223] Fix tests --- composer.json | 2 +- composer.lock | 14 +++++++------- .../Databases/DatabasesCustomClientTest.php | 8 ++++++-- .../Databases/DatabasesPermissionsGuestTest.php | 2 +- .../Functions/FunctionsCustomServerTest.php | 1 + .../Services/Storage/StorageCustomClientTest.php | 13 ++++++++----- tests/e2e/Services/Webhooks/WebhooksBase.php | 1 - .../Services/Webhooks/WebhooksCustomClientTest.php | 2 ++ 8 files changed, 26 insertions(+), 17 deletions(-) diff --git a/composer.json b/composer.json index 52f26d24de..a792a11a4c 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "utopia-php/cache": "0.6.*", "utopia-php/cli": "0.13.*", "utopia-php/config": "0.2.*", - "utopia-php/database": "dev-feat-write-helper as 0.24.0", + "utopia-php/database": "0.24.0", "utopia-php/locale": "0.4.*", "utopia-php/registry": "0.5.*", "utopia-php/preloader": "0.2.*", diff --git a/composer.lock b/composer.lock index ac4e07cb0e..04659290c3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "acf850ed1f73f172c7573daf5ca54940", + "content-hash": "ee4de251e5e0a3bf5f982bded0d28176", "packages": [ { "name": "adhocore/jwt", @@ -2840,16 +2840,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "0.23.0", + "version": "0.24.0", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "efadccb9abd6263d045ef157881143d3a59dc710" + "reference": "310ab7210ee97266632ee2df9616c9770c7b37e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/efadccb9abd6263d045ef157881143d3a59dc710", - "reference": "efadccb9abd6263d045ef157881143d3a59dc710", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/310ab7210ee97266632ee2df9616c9770c7b37e6", + "reference": "310ab7210ee97266632ee2df9616c9770c7b37e6", "shasum": "" }, "require": { @@ -2884,9 +2884,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.23.0" + "source": "https://github.com/appwrite/sdk-generator/tree/0.24.0" }, - "time": "2022-09-04T17:29:33+00:00" + "time": "2022-09-05T06:37:25+00:00" }, { "name": "doctrine/instantiator", diff --git a/tests/e2e/Services/Databases/DatabasesCustomClientTest.php b/tests/e2e/Services/Databases/DatabasesCustomClientTest.php index 9f86bb66c0..da4eb80da5 100644 --- a/tests/e2e/Services/Databases/DatabasesCustomClientTest.php +++ b/tests/e2e/Services/Databases/DatabasesCustomClientTest.php @@ -43,7 +43,9 @@ class DatabasesCustomClientTest extends Scope 'name' => 'Movies', 'documentSecurity' => true, 'permissions' => [ - Permission::write(Role::user($this->getUser()['$id'])), + // To avoid need for a Database release for now + //Permission::write(Role::user($this->getUser()['$id'])), + 'write("user:' . $this->getUser()['$id'] . '")', ], ]); @@ -75,7 +77,9 @@ class DatabasesCustomClientTest extends Scope 'title' => 'Captain America', ], 'permissions' => [ - Permission::write(Role::user($this->getUser()['$id'])), + // To avoid need for a Database release for now + //Permission::write(Role::user($this->getUser()['$id'])), + 'write("user:' . $this->getUser()['$id'] . '")', ] ]); diff --git a/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php b/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php index c2293e30f4..1c15a363a8 100644 --- a/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php +++ b/tests/e2e/Services/Databases/DatabasesPermissionsGuestTest.php @@ -237,7 +237,7 @@ class DatabasesPermissionsGuestTest extends Scope 'name' => 'GuestPermissionsWrite', ]); $this->assertEquals(201, $database['headers']['status-code']); - $this->assertEquals('InvalidDocumentDatabase', $database['body']['name']); + $this->assertEquals('GuestPermissionsWrite', $database['body']['name']); $databaseId = $database['body']['$id']; $movies = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections', $this->getServerHeader(), [ diff --git a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php index 208382ae43..5e49599230 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php @@ -727,6 +727,7 @@ class FunctionsCustomServerTest extends Scope /** * @depends testUpdateDeployment */ + #[Retry(count: 1)] public function testSyncCreateExecution($data): array { /** diff --git a/tests/e2e/Services/Storage/StorageCustomClientTest.php b/tests/e2e/Services/Storage/StorageCustomClientTest.php index 0e4daa9957..fb2d93b371 100644 --- a/tests/e2e/Services/Storage/StorageCustomClientTest.php +++ b/tests/e2e/Services/Storage/StorageCustomClientTest.php @@ -1080,7 +1080,9 @@ class StorageCustomClientTest extends Scope 'bucketId' => ID::unique(), 'name' => 'Test Bucket', 'permissions' => [ - Permission::write(Role::user($this->getUser()['$id'])), + // To avoid need for a Database release for now + //Permission::write(Role::user($this->getUser()['$id'])), + 'write("user:' . $this->getUser()['$id'] . '")', ], 'fileSecurity' => true, ]); @@ -1100,7 +1102,9 @@ class StorageCustomClientTest extends Scope 'fileId' => ID::unique(), 'file' => new CURLFile(realpath(__DIR__ . '/../../../resources/logo.png'), 'image/png', 'permissions.png'), 'permissions' => [ - Permission::write(Role::user($this->getUser()['$id'])), + // To avoid need for a Database release for now + //Permission::write(Role::user($this->getUser()['$id'])), + 'write("user:' . $this->getUser()['$id'] . '")', ] ]); @@ -1282,9 +1286,8 @@ class StorageCustomClientTest extends Scope ], $this->getHeaders()), [ 'permissions' => [ Permission::read(Role::user(ID::custom('notme'))), - Permission::create(Role::user(ID::custom('notme'))), - Permission::update(Role::user(ID::custom('notme'))), - Permission::delete(Role::user(ID::custom('notme'))), + Permission::update(Role::user(ID::custom('notme'))), + Permission::delete(Role::user(ID::custom('notme'))), ], ]); diff --git a/tests/e2e/Services/Webhooks/WebhooksBase.php b/tests/e2e/Services/Webhooks/WebhooksBase.php index b12faf6321..bb7edfdb46 100644 --- a/tests/e2e/Services/Webhooks/WebhooksBase.php +++ b/tests/e2e/Services/Webhooks/WebhooksBase.php @@ -556,7 +556,6 @@ trait WebhooksBase ], $this->getHeaders()), [ 'permissions' => [ Permission::read(Role::any()), - Permission::create(Role::any()), Permission::update(Role::any()), Permission::delete(Role::any()), ], diff --git a/tests/e2e/Services/Webhooks/WebhooksCustomClientTest.php b/tests/e2e/Services/Webhooks/WebhooksCustomClientTest.php index 7c30234727..9e26322931 100644 --- a/tests/e2e/Services/Webhooks/WebhooksCustomClientTest.php +++ b/tests/e2e/Services/Webhooks/WebhooksCustomClientTest.php @@ -2,6 +2,7 @@ namespace Tests\E2E\Services\Webhooks; +use Appwrite\Tests\Retry; use Tests\E2E\Client; use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\ProjectCustom; @@ -416,6 +417,7 @@ class WebhooksCustomClientTest extends Scope /** * @depends testDeleteAccountSessions */ + #[Retry(count: 1)] public function testUpdateAccountName($data): array { $id = $data['id'] ?? ''; From e8a8069a6794778fd9ffa271c8cbc2baec9713a3 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 6 Sep 2022 16:13:24 +1200 Subject: [PATCH 020/223] Fix realtime test --- tests/e2e/Services/Realtime/RealtimeCustomClientTest.php | 1 - tests/e2e/Services/Users/UsersBase.php | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/e2e/Services/Realtime/RealtimeCustomClientTest.php b/tests/e2e/Services/Realtime/RealtimeCustomClientTest.php index 1cd7cd9c90..ab758ec7a9 100644 --- a/tests/e2e/Services/Realtime/RealtimeCustomClientTest.php +++ b/tests/e2e/Services/Realtime/RealtimeCustomClientTest.php @@ -1122,7 +1122,6 @@ class RealtimeCustomClientTest extends Scope ], $this->getHeaders()), [ 'permissions' => [ Permission::read(Role::any()), - Permission::create(Role::any()), Permission::update(Role::any()), Permission::delete(Role::any()), ], diff --git a/tests/e2e/Services/Users/UsersBase.php b/tests/e2e/Services/Users/UsersBase.php index 88bb8872e9..845510a6b7 100644 --- a/tests/e2e/Services/Users/UsersBase.php +++ b/tests/e2e/Services/Users/UsersBase.php @@ -2,6 +2,7 @@ namespace Tests\E2E\Services\Users; +use Appwrite\Tests\Retry; use Tests\E2E\Client; use Utopia\Database\ID; @@ -852,6 +853,7 @@ trait UsersBase /** * @depends testGetUser */ + #[Retry(count: 1)] public function testUpdateUserStatus(array $data): array { /** From 713ca7d55af418244fc30ed1657f9d3a1fde75c2 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 6 Sep 2022 16:42:46 +1200 Subject: [PATCH 021/223] Retry sync execution twice --- tests/e2e/Services/Functions/FunctionsCustomServerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php index 5e49599230..017ae24bbc 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php @@ -727,7 +727,7 @@ class FunctionsCustomServerTest extends Scope /** * @depends testUpdateDeployment */ - #[Retry(count: 1)] + #[Retry(count: 2)] public function testSyncCreateExecution($data): array { /** From d5d5c95507e8547e0eac982575cc4f299c156c79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 6 Sep 2022 09:07:29 +0000 Subject: [PATCH 022/223] Timezone awareness for datetime input --- app/views/console/databases/collection.phtml | 4 ++-- app/views/console/databases/document.phtml | 6 +++--- public/dist/scripts/app-all.js | 5 ++++- public/dist/scripts/app.js | 5 ++++- public/scripts/services/form.js | 20 ++++++++++++++++++++ 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/views/console/databases/collection.phtml b/app/views/console/databases/collection.phtml index 1e60f516d4..6c92bd3754 100644 --- a/app/views/console/databases/collection.phtml +++ b/app/views/console/databases/collection.phtml @@ -719,10 +719,10 @@ $permissions = $this->getParam('permissions', null);