From bf050ece0fdebf6a54ea8e976377bcabeaeba556 Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 8 Aug 2022 15:44:07 +0100 Subject: [PATCH] Fix Exceptions --- app/controllers/general.php | 36 ++++++++++++++--------------- app/controllers/mock.php | 42 +++++++++++++++++----------------- app/controllers/shared/api.php | 16 ++++++------- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index c87d53c290..341ce18845 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -131,11 +131,11 @@ App::init() } if ($project->isEmpty()) { - throw new AppwriteException('Project not found', 404, AppwriteException::PROJECT_NOT_FOUND); + throw new AppwriteException(AppwriteException::PROJECT_NOT_FOUND); } if (!empty($route->getLabel('sdk.auth', [])) && $project->isEmpty() && ($route->getLabel('scope', '') !== 'public')) { - throw new AppwriteException('Missing or unknown project ID', 400, AppwriteException::PROJECT_UNKNOWN); + throw new AppwriteException(AppwriteException::PROJECT_UNKNOWN); } $referrer = $request->getReferer(); @@ -206,7 +206,7 @@ App::init() if (App::getEnv('_APP_OPTIONS_FORCE_HTTPS', 'disabled') === 'enabled') { // Force HTTPS if ($request->getProtocol() !== 'https') { if ($request->getMethod() !== Request::METHOD_GET) { - throw new AppwriteException('Method unsupported over HTTP.', 500, AppwriteException::GENERAL_PROTOCOL_UNSUPPORTED); + throw new AppwriteException(AppwriteException::GENERAL_PROTOCOL_UNSUPPORTED, 'Method unsupported over HTTP.'); } return $response->redirect('https://' . $request->getHostname() . $request->getURI()); @@ -239,7 +239,7 @@ App::init() && $route->getLabel('origin', false) !== '*' && empty($request->getHeader('x-appwrite-key', '')) ) { - throw new AppwriteException($originValidator->getDescription(), 403, AppwriteException::GENERAL_UNKNOWN_ORIGIN); + throw new AppwriteException(AppwriteException::GENERAL_UNKNOWN_ORIGIN, $originValidator->getDescription(), 403); } /* @@ -295,7 +295,7 @@ App::init() $expire = $key->getAttribute('expire', 0); if (!empty($expire) && $expire < \time()) { - throw new AppwriteException('Project key expired', 401, AppwriteException:: PROJECT_KEY_EXPIRED); + throw new AppwriteException(AppwriteException:: PROJECT_KEY_EXPIRED); } Authorization::setRole('role:' . Auth::USER_ROLE_APP); @@ -316,24 +316,24 @@ App::init() && !$project->getAttribute('services', [])[$service] && !(Auth::isPrivilegedUser(Authorization::getRoles()) || Auth::isAppUser(Authorization::getRoles())) ) { - throw new AppwriteException('Service is disabled', 503, AppwriteException::GENERAL_SERVICE_DISABLED); + throw new AppwriteException(AppwriteException::GENERAL_SERVICE_DISABLED); } } if (!\in_array($scope, $scopes)) { if ($project->isEmpty()) { // Check if permission is denied because project is missing - throw new AppwriteException('Project not found', 404, AppwriteException::PROJECT_NOT_FOUND); + throw new AppwriteException(AppwriteException::PROJECT_NOT_FOUND); } - throw new AppwriteException($user->getAttribute('email', 'User') . ' (role: ' . \strtolower($roles[$role]['label']) . ') missing scope (' . $scope . ')', 401, AppwriteException::GENERAL_UNAUTHORIZED_SCOPE); + throw new AppwriteException(AppwriteException::GENERAL_UNAUTHORIZED_SCOPE, $user->getAttribute('email', 'User') . ' (role: ' . \strtolower($roles[$role]['label']) . ') missing scope (' . $scope . ')'); } if (false === $user->getAttribute('status')) { // Account is blocked - throw new AppwriteException('Invalid credentials. User is blocked', 401, AppwriteException::USER_BLOCKED); + throw new AppwriteException(AppwriteException::USER_BLOCKED); } if ($user->getAttribute('reset')) { - throw new AppwriteException('Password reset is required', 412, AppwriteException::USER_PASSWORD_RESET_REQUIRED); + throw new AppwriteException(AppwriteException::USER_PASSWORD_RESET_REQUIRED); } }); @@ -445,7 +445,7 @@ App::error() /** Handle Utopia Errors */ if ($error instanceof Utopia\Exception) { - $error = new AppwriteException($message, $code, AppwriteException::GENERAL_UNKNOWN, $error); + $error = new AppwriteException(AppwriteException::GENERAL_UNKNOWN, $message, $code, $error); switch ($code) { case 400: $error->setType(AppwriteException::GENERAL_ARGUMENT_INVALID); @@ -458,7 +458,7 @@ App::error() /** Wrap all exceptions inside Appwrite\Extend\Exception */ if (!($error instanceof AppwriteException)) { - $error = new AppwriteException($message, $code, AppwriteException::GENERAL_UNKNOWN, $error); + $error = new AppwriteException(AppwriteException::GENERAL_UNKNOWN, $message, $code, $error); } switch ($code) { // Don't show 500 errors! @@ -601,32 +601,32 @@ App::get('/.well-known/acme-challenge') ]); if (!$validator->isValid($token) || \count($uriChunks) !== 4) { - throw new AppwriteException('Invalid challenge token.', 400); + throw new AppwriteException(AppwriteException::GENERAL_ARGUMENT_INVALID, 'Invalid challenge token.'); } $base = \realpath(APP_STORAGE_CERTIFICATES); $absolute = \realpath($base . '/.well-known/acme-challenge/' . $token); if (!$base) { - throw new AppwriteException('Storage error', 500, AppwriteException::GENERAL_SERVER_ERROR); + throw new AppwriteException(AppwriteException::GENERAL_SERVER_ERROR, 'Storage error'); } if (!$absolute) { - throw new AppwriteException('Unknown path', 404); + throw new AppwriteException(AppwriteException::GENERAL_ROUTE_NOT_FOUND, 'Unknown path'); } if (!\substr($absolute, 0, \strlen($base)) === $base) { - throw new AppwriteException('Invalid path', 401); + throw new AppwriteException(AppwriteException::GENERAL_UNAUTHORIZED_SCOPE, 'Invalid path'); } if (!\file_exists($absolute)) { - throw new AppwriteException('Unknown path', 404); + throw new AppwriteException(AppwriteException::GENERAL_ROUTE_NOT_FOUND, 'Unknown path'); } $content = @\file_get_contents($absolute); if (!$content) { - throw new AppwriteException('Failed to get contents', 500, AppwriteException::GENERAL_SERVER_ERROR); + throw new AppwriteException(AppwriteException::GENERAL_SERVER_ERROR, 'Failed to get contents'); } $response->text($content); diff --git a/app/controllers/mock.php b/app/controllers/mock.php index d3b150a55f..55a15d1966 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -253,31 +253,31 @@ App::post('/v1/mock/tests/general/upload') $file['size'] = (\is_array($file['size'])) ? $file['size'][0] : $file['size']; if (is_null($start) || is_null($end) || is_null($size)) { - throw new Exception('Invalid content-range header', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::GENERAL_MOCK); } if ($start > $end || $end > $size) { - throw new Exception('Invalid content-range header', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::GENERAL_MOCK); } if ($start === 0 && !empty($id)) { - throw new Exception('First chunked request cannot have id header', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::GENERAL_MOCK); } if ($start !== 0 && $id !== 'newfileid') { - throw new Exception('All chunked request must have id header (except first)', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::GENERAL_MOCK); } if ($end !== $size && $end - $start + 1 !== $chunkSize) { - throw new Exception('Chunk size must be 5MB (except last chunk)', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::GENERAL_MOCK); } if ($end !== $size && $file['size'] !== $chunkSize) { - throw new Exception('Wrong chunk size', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::GENERAL_MOCK); } if ($file['size'] > $chunkSize) { - throw new Exception('Chunk size must be 5MB or less', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::GENERAL_MOCK); } if ($end !== $size) { @@ -293,15 +293,15 @@ App::post('/v1/mock/tests/general/upload') $file['size'] = (\is_array($file['size'])) ? $file['size'][0] : $file['size']; if ($file['name'] !== 'file.png') { - throw new Exception('Wrong file name', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_INVALID_FILE_NAME); } if ($file['size'] !== 38756) { - throw new Exception('Wrong file size', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_INVALID_FILE_SIZE); } if (\md5(\file_get_contents($file['tmp_name'])) !== 'd80e7e6999a3eb2ae0d631a96fe135a4') { - throw new Exception('Wrong file uploaded', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_WRONG_FILE_UPLOADED); } } }); @@ -374,7 +374,7 @@ App::get('/v1/mock/tests/general/get-cookie') ->action(function (Request $request) { if ($request->getCookie('cookieName', '') !== 'cookieValue') { - throw new Exception('Missing cookie value', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_MISSING_COOKIE); } }); @@ -408,7 +408,7 @@ App::get('/v1/mock/tests/general/400-error') ->label('sdk.response.model', Response::MODEL_ERROR) ->label('sdk.mock', true) ->action(function () { - throw new Exception('Mock 400 error', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_400); }); App::get('/v1/mock/tests/general/500-error') @@ -424,7 +424,7 @@ App::get('/v1/mock/tests/general/500-error') ->label('sdk.response.model', Response::MODEL_ERROR) ->label('sdk.mock', true) ->action(function () { - throw new Exception('Mock 500 error', 500, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_500); }); App::get('/v1/mock/tests/general/502-error') @@ -480,11 +480,11 @@ App::get('/v1/mock/tests/general/oauth2/token') ->action(function (string $client_id, string $client_secret, string $grantType, string $redirectURI, string $code, string $refreshToken, Response $response) { if ($client_id != '1') { - throw new Exception('Invalid client ID', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_INVALID_CLIENT_ID); } if ($client_secret != '123456') { - throw new Exception('Invalid client secret', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_INVALID_CLIENT_SECRET); } $responseJson = [ @@ -495,18 +495,18 @@ App::get('/v1/mock/tests/general/oauth2/token') if ($grantType === 'authorization_code') { if ($code !== 'abcdef') { - throw new Exception('Invalid token', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_INVALID_TOKEN); } $response->json($responseJson); } elseif ($grantType === 'refresh_token') { if ($refreshToken !== 'tuvwxyz') { - throw new Exception('Invalid refresh token', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_INVALID_REFRESH_TOKEN); } $response->json($responseJson); } else { - throw new Exception('Invalid grant type', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_INVALID_GRANT_TYPE); } }); @@ -520,7 +520,7 @@ App::get('/v1/mock/tests/general/oauth2/user') ->action(function (string $token, Response $response) { if ($token != '123456') { - throw new Exception('Invalid token', 400, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_INVALID_TOKEN); } $response->json([ @@ -571,7 +571,7 @@ App::shutdown() $tests = (\file_exists($path)) ? \json_decode(\file_get_contents($path), true) : []; if (!\is_array($tests)) { - throw new Exception('Failed to read results', 500, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_FAILED_TO_READ_RESULTS); } $result[$route->getMethod() . ':' . $route->getPath()] = true; @@ -579,7 +579,7 @@ App::shutdown() $tests = \array_merge($tests, $result); if (!\file_put_contents($path, \json_encode($tests), LOCK_EX)) { - throw new Exception('Failed to save results', 500, Exception::GENERAL_MOCK); + throw new Exception(Exception::MOCK_FAILED_TO_SAVE_RESULTS); } $response->dynamic(new Document(['result' => $route->getMethod() . ':' . $route->getPath() . ':passed']), Response::MODEL_MOCK); diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 2d27209562..7394b611aa 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -39,7 +39,7 @@ App::init() $route = $utopia->match($request); if ($project->isEmpty() && $route->getLabel('abuse-limit', 0) > 0) { // Abuse limit requires an active project scope - throw new Exception('Missing or unknown project ID', 400, Exception::PROJECT_UNKNOWN); + throw new Exception(Exception::PROJECT_UNKNOWN); } /* @@ -89,7 +89,7 @@ App::init() && $abuse->check()) // Abuse is not disabled && (!$isAppUser && !$isPrivilegedUser) ) { // User is not an admin or API key - throw new Exception('Too many requests', 429, Exception::GENERAL_RATE_LIMIT_EXCEEDED); + throw new Exception(Exception::GENERAL_RATE_LIMIT_EXCEEDED); } } @@ -151,36 +151,36 @@ App::init() switch ($route->getLabel('auth.type', '')) { case 'emailPassword': if (($auths['emailPassword'] ?? true) === false) { - throw new Exception('Email / Password authentication is disabled for this project', 501, Exception::USER_AUTH_METHOD_UNSUPPORTED); + throw new Exception(Exception::USER_AUTH_METHOD_UNSUPPORTED, 'Email / Password authentication is disabled for this project'); } break; case 'magic-url': if ($project->getAttribute('usersAuthMagicURL', true) === false) { - throw new Exception('Magic URL authentication is disabled for this project', 501, Exception::USER_AUTH_METHOD_UNSUPPORTED); + throw new Exception(Exception::USER_AUTH_METHOD_UNSUPPORTED, 'Magic URL authentication is disabled for this project'); } break; case 'anonymous': if (($auths['anonymous'] ?? true) === false) { - throw new Exception('Anonymous authentication is disabled for this project', 501, Exception::USER_AUTH_METHOD_UNSUPPORTED); + throw new Exception(Exception::USER_AUTH_METHOD_UNSUPPORTED, 'Anonymous authentication is disabled for this project'); } break; case 'invites': if (($auths['invites'] ?? true) === false) { - throw new Exception('Invites authentication is disabled for this project', 501, Exception::USER_AUTH_METHOD_UNSUPPORTED); + throw new Exception(Exception::USER_AUTH_METHOD_UNSUPPORTED, 'Invites authentication is disabled for this project'); } break; case 'jwt': if (($auths['JWT'] ?? true) === false) { - throw new Exception('JWT authentication is disabled for this project', 501, Exception::USER_AUTH_METHOD_UNSUPPORTED); + throw new Exception(Exception::USER_AUTH_METHOD_UNSUPPORTED, 'JWT authentication is disabled for this project'); } break; default: - throw new Exception('Unsupported authentication route', 501, Exception::USER_AUTH_METHOD_UNSUPPORTED); + throw new Exception(Exception::USER_AUTH_METHOD_UNSUPPORTED, 'Unsupported authentication route'); break; } });