diff --git a/app/config/providers.php b/app/config/providers.php index 10b7c61ff..a7d81c8e3 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -5,71 +5,93 @@ return [ 'developers' => 'https://developer.atlassian.com/bitbucket', 'icon' => 'icon-bitbucket', 'enabled' => true, + 'mock' => false, ], 'facebook' => [ 'developers' => 'https://developers.facebook.com/', 'icon' => 'icon-facebook', 'enabled' => true, + 'mock' => false, ], 'github' => [ 'developers' => 'https://developer.github.com/', 'icon' => 'icon-github-circled', 'enabled' => true, + 'mock' => false, ], 'gitlab' => [ 'developers' => 'https://docs.gitlab.com/ee/api/', 'icon' => 'icon-gitlab', 'enabled' => true, + 'mock' => false, ], 'google' => [ 'developers' => 'https://developers.google.com/', 'icon' => 'icon-google', 'enabled' => true, + 'mock' => false, ], // 'instagram' => [ // 'developers' => 'https://www.instagram.com/developer/', // 'icon' => 'icon-instagram', // 'enabled' => false, + // 'mock' => false, // ], 'microsoft' => [ 'developers' => 'https://developer.microsoft.com/en-us/', 'icon' => 'icon-windows', 'enabled' => true, + 'mock' => false, ], // 'twitter' => [ // 'developers' => 'https://developer.twitter.com/', // 'icon' => 'icon-twitter', // 'enabled' => false, + // 'mock' => false, // ], 'linkedin' => [ 'developers' => 'https://developer.linkedin.com/', 'icon' => 'icon-linkedin', 'enabled' => true, + 'mock' => false, ], 'slack' => [ 'developers' => 'https://api.slack.com/', 'icon' => 'icon-slack', 'enabled' => true, + 'mock' => false, ], 'dropbox' => [ 'developers' => 'https://www.dropbox.com/developers/documentation', 'icon' => 'icon-dropbox', 'enabled' => true, + 'mock' => false, ], // 'apple' => [ // 'developers' => 'https://developer.apple.com/', // 'icon' => 'icon-apple', // 'enabled' => false, + // 'mock' => false, // ], 'amazon' => [ 'developers' => 'https://developer.amazon.com/apps-and-games/services-and-apis', 'icon' => 'icon-amazon', 'enabled' => true, + 'mock' => false, ], 'vk' => [ 'developers' => 'https://vk.com/dev', 'icon' => 'icon-vk', 'enabled' => true, + 'mock' => false, + ], + + // Keep Last + 'mock' => [ + 'developers' => 'https://appwrite.io', + 'icon' => 'icon-appwrite', + 'enabled' => true, + 'mock' => true, ], 'twitter' => [ 'developers' => 'https://developer.twitter.com/', diff --git a/app/controllers/mock.php b/app/controllers/mock.php index 9fbcbc1dd..0ee8b5401 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -6,6 +6,7 @@ use Utopia\Validator\Numeric; use Utopia\Validator\Text; use Utopia\Validator\ArrayList; use Storage\Validators\File; +use Utopia\Validator\Host; $result = []; @@ -218,6 +219,65 @@ $utopia->get('/v1/mock/tests/general/empty') } ); +$utopia->get('/v1/mock/tests/general/oauth/login') + ->desc('Mock an OAuth login route') + ->label('scope', 'public') + ->label('docs', false) + ->param('client_id', '', function () { return new Text(100); }, 'OAuth Client ID.') + ->param('redirect_uri', '', function () { return new Host(['http://localhost']); }, 'OAuth Redirect URI.') // Important to deny an open redirect attack + ->param('scope', '', function () { return new Text(100); }, 'OAuth scope list.') + ->param('state', '', function () { return new Text(100); }, 'OAuth state.') + ->action( + function ($clientId, $redirectURI, $scope, $state) use ($response) { + $response->redirect($redirectURI); + } + ); + +$utopia->get('/v1/mock/tests/general/oauth/token') + ->desc('Mock an OAuth login route') + ->label('scope', 'public') + ->label('docs', false) + ->param('client_id', '', function () { return new Text(100); }, 'OAuth Client ID.') + ->param('redirect_uri', '', function () { return new Host(['http://localhost']); }, 'OAuth Redirect URI.') + ->param('client_secret', '', function () { return new Text(100); }, 'OAuth scope list.') + ->param('code', '', function () { return new Text(100); }, 'OAuth state.') + ->action( + function ($clientId, $redirectURI, $clientSecret, $code) use ($response) { + if($clientId != '1') { + throw new Exception('Invalid client ID'); + } + + if($clientSecret != 'secret') { + throw new Exception('Invalid client secret'); + } + + if($code != 'abcdef') { + throw new Exception('Invalid token'); + } + + $response->json(['access_token' => '123456']); + } + ); + +$utopia->get('/v1/mock/tests/general/oauth/user') + ->desc('Mock an OAuth user route') + ->label('scope', 'public') + ->label('docs', false) + ->param('token', '', function () { return new Text(100); }, 'OAuth Access Token.') + ->action( + function ($token) use ($response) { + if($token != '123456') { + throw new Exception('Invalid token'); + } + + $response->json([ + 'id' => 1, + 'name' => 'User Name', + 'email' => 'user@localhost', + ]); + } + ); + $utopia->shutdown(function() use ($response, $request, &$result, $utopia) { $route = $utopia->match($request); diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index f0cc1a2c3..1d95f5fad 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -8,9 +8,6 @@ use Database\Database; global $utopia, $request, $response, $register, $user, $project; $utopia->init(function () use ($utopia, $request, $response, $register, $user, $project) { - if (is_null($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS !== $project->getCollection()) { - // throw new Exception('Missing Project UID', 400); - } $route = $utopia->match($request); diff --git a/app/views/console/users/index.phtml b/app/views/console/users/index.phtml index f16b9df45..0ed2630e9 100644 --- a/app/views/console/users/index.phtml +++ b/app/views/console/users/index.phtml @@ -318,7 +318,10 @@ $providers = $this->getParam('providers', []); data-param-project-id="{{router.params.project}}" data-scope="console">