Merge remote-tracking branch 'origin'
This commit is contained in:
commit
b51e061c56
5 changed files with 209 additions and 4 deletions
|
@ -5,71 +5,93 @@ return [
|
||||||
'developers' => 'https://developer.atlassian.com/bitbucket',
|
'developers' => 'https://developer.atlassian.com/bitbucket',
|
||||||
'icon' => 'icon-bitbucket',
|
'icon' => 'icon-bitbucket',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
'facebook' => [
|
'facebook' => [
|
||||||
'developers' => 'https://developers.facebook.com/',
|
'developers' => 'https://developers.facebook.com/',
|
||||||
'icon' => 'icon-facebook',
|
'icon' => 'icon-facebook',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
'github' => [
|
'github' => [
|
||||||
'developers' => 'https://developer.github.com/',
|
'developers' => 'https://developer.github.com/',
|
||||||
'icon' => 'icon-github-circled',
|
'icon' => 'icon-github-circled',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
'gitlab' => [
|
'gitlab' => [
|
||||||
'developers' => 'https://docs.gitlab.com/ee/api/',
|
'developers' => 'https://docs.gitlab.com/ee/api/',
|
||||||
'icon' => 'icon-gitlab',
|
'icon' => 'icon-gitlab',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
'google' => [
|
'google' => [
|
||||||
'developers' => 'https://developers.google.com/',
|
'developers' => 'https://developers.google.com/',
|
||||||
'icon' => 'icon-google',
|
'icon' => 'icon-google',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
// 'instagram' => [
|
// 'instagram' => [
|
||||||
// 'developers' => 'https://www.instagram.com/developer/',
|
// 'developers' => 'https://www.instagram.com/developer/',
|
||||||
// 'icon' => 'icon-instagram',
|
// 'icon' => 'icon-instagram',
|
||||||
// 'enabled' => false,
|
// 'enabled' => false,
|
||||||
|
// 'mock' => false,
|
||||||
// ],
|
// ],
|
||||||
'microsoft' => [
|
'microsoft' => [
|
||||||
'developers' => 'https://developer.microsoft.com/en-us/',
|
'developers' => 'https://developer.microsoft.com/en-us/',
|
||||||
'icon' => 'icon-windows',
|
'icon' => 'icon-windows',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
// 'twitter' => [
|
// 'twitter' => [
|
||||||
// 'developers' => 'https://developer.twitter.com/',
|
// 'developers' => 'https://developer.twitter.com/',
|
||||||
// 'icon' => 'icon-twitter',
|
// 'icon' => 'icon-twitter',
|
||||||
// 'enabled' => false,
|
// 'enabled' => false,
|
||||||
|
// 'mock' => false,
|
||||||
// ],
|
// ],
|
||||||
'linkedin' => [
|
'linkedin' => [
|
||||||
'developers' => 'https://developer.linkedin.com/',
|
'developers' => 'https://developer.linkedin.com/',
|
||||||
'icon' => 'icon-linkedin',
|
'icon' => 'icon-linkedin',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
'slack' => [
|
'slack' => [
|
||||||
'developers' => 'https://api.slack.com/',
|
'developers' => 'https://api.slack.com/',
|
||||||
'icon' => 'icon-slack',
|
'icon' => 'icon-slack',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
'dropbox' => [
|
'dropbox' => [
|
||||||
'developers' => 'https://www.dropbox.com/developers/documentation',
|
'developers' => 'https://www.dropbox.com/developers/documentation',
|
||||||
'icon' => 'icon-dropbox',
|
'icon' => 'icon-dropbox',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
// 'apple' => [
|
// 'apple' => [
|
||||||
// 'developers' => 'https://developer.apple.com/',
|
// 'developers' => 'https://developer.apple.com/',
|
||||||
// 'icon' => 'icon-apple',
|
// 'icon' => 'icon-apple',
|
||||||
// 'enabled' => false,
|
// 'enabled' => false,
|
||||||
|
// 'mock' => false,
|
||||||
// ],
|
// ],
|
||||||
'amazon' => [
|
'amazon' => [
|
||||||
'developers' => 'https://developer.amazon.com/apps-and-games/services-and-apis',
|
'developers' => 'https://developer.amazon.com/apps-and-games/services-and-apis',
|
||||||
'icon' => 'icon-amazon',
|
'icon' => 'icon-amazon',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
],
|
],
|
||||||
'vk' => [
|
'vk' => [
|
||||||
'developers' => 'https://vk.com/dev',
|
'developers' => 'https://vk.com/dev',
|
||||||
'icon' => 'icon-vk',
|
'icon' => 'icon-vk',
|
||||||
'enabled' => true,
|
'enabled' => true,
|
||||||
|
'mock' => false,
|
||||||
|
],
|
||||||
|
|
||||||
|
// Keep Last
|
||||||
|
'mock' => [
|
||||||
|
'developers' => 'https://appwrite.io',
|
||||||
|
'icon' => 'icon-appwrite',
|
||||||
|
'enabled' => true,
|
||||||
|
'mock' => true,
|
||||||
],
|
],
|
||||||
'twitter' => [
|
'twitter' => [
|
||||||
'developers' => 'https://developer.twitter.com/',
|
'developers' => 'https://developer.twitter.com/',
|
||||||
|
|
|
@ -6,6 +6,7 @@ use Utopia\Validator\Numeric;
|
||||||
use Utopia\Validator\Text;
|
use Utopia\Validator\Text;
|
||||||
use Utopia\Validator\ArrayList;
|
use Utopia\Validator\ArrayList;
|
||||||
use Storage\Validators\File;
|
use Storage\Validators\File;
|
||||||
|
use Utopia\Validator\Host;
|
||||||
|
|
||||||
$result = [];
|
$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) {
|
$utopia->shutdown(function() use ($response, $request, &$result, $utopia) {
|
||||||
|
|
||||||
$route = $utopia->match($request);
|
$route = $utopia->match($request);
|
||||||
|
|
|
@ -8,9 +8,6 @@ use Database\Database;
|
||||||
global $utopia, $request, $response, $register, $user, $project;
|
global $utopia, $request, $response, $register, $user, $project;
|
||||||
|
|
||||||
$utopia->init(function () use ($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);
|
$route = $utopia->match($request);
|
||||||
|
|
||||||
|
|
|
@ -318,7 +318,10 @@ $providers = $this->getParam('providers', []);
|
||||||
data-param-project-id="{{router.params.project}}"
|
data-param-project-id="{{router.params.project}}"
|
||||||
data-scope="console">
|
data-scope="console">
|
||||||
<ul class="list">
|
<ul class="list">
|
||||||
<?php foreach ($providers as $provider => $data): if (isset($data['enabled']) && !$data['enabled']) { continue; } ?>
|
<?php foreach ($providers as $provider => $data):
|
||||||
|
if (isset($data['enabled']) && !$data['enabled']) { continue; }
|
||||||
|
if (isset($data['mock']) && $data['mock']) { continue; }
|
||||||
|
?>
|
||||||
<li class="clear <?php echo (isset($data['enabled']) && !$data['enabled']) ? 'dev-feature' : ''; ?>">
|
<li class="clear <?php echo (isset($data['enabled']) && !$data['enabled']) ? 'dev-feature' : ''; ?>">
|
||||||
<div data-ui-modal class="modal close" data-button-text="Settings" data-button-class="pull-end">
|
<div data-ui-modal class="modal close" data-button-text="Settings" data-button-class="pull-end">
|
||||||
<button type="button" class="close pull-end" data-ui-modal-close=""><i class="icon-cancel"></i></button>
|
<button type="button" class="close pull-end" data-ui-modal-close=""><i class="icon-cancel"></i></button>
|
||||||
|
|
123
src/Auth/OAuth/Mock.php
Normal file
123
src/Auth/OAuth/Mock.php
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Auth\OAuth;
|
||||||
|
|
||||||
|
use Auth\OAuth;
|
||||||
|
|
||||||
|
class Mock extends OAuth
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $version = 'v1';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $user = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getName():string
|
||||||
|
{
|
||||||
|
return 'mock';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLoginURL():string
|
||||||
|
{
|
||||||
|
return 'http://localhost/'.$this->version.'/oauth?client_id='.urlencode($this->appID).'&redirect_uri='.urlencode($this->callback).'&scope=email&state='.urlencode(json_encode($this->state));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $code
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getAccessToken(string $code):string
|
||||||
|
{
|
||||||
|
$accessToken = $this->request(
|
||||||
|
'GET',
|
||||||
|
'http://localhost/'.$this->version.'/oauth/token?'.
|
||||||
|
'client_id='.urlencode($this->appID).
|
||||||
|
'&redirect_uri='.urlencode($this->callback).
|
||||||
|
'&client_secret='.urlencode($this->appSecret).
|
||||||
|
'&code='.urlencode($code)
|
||||||
|
);
|
||||||
|
|
||||||
|
$accessToken = json_decode($accessToken, true); //
|
||||||
|
|
||||||
|
if (isset($accessToken['access_token'])) {
|
||||||
|
return $accessToken['access_token'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $accessToken
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getUserID(string $accessToken):string
|
||||||
|
{
|
||||||
|
$user = $this->getUser($accessToken);
|
||||||
|
|
||||||
|
if (isset($user['id'])) {
|
||||||
|
return $user['id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $accessToken
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getUserEmail(string $accessToken):string
|
||||||
|
{
|
||||||
|
$user = $this->getUser($accessToken);
|
||||||
|
|
||||||
|
if (isset($user['email'])) {
|
||||||
|
return $user['email'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $accessToken
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getUserName(string $accessToken):string
|
||||||
|
{
|
||||||
|
$user = $this->getUser($accessToken);
|
||||||
|
|
||||||
|
if (isset($user['name'])) {
|
||||||
|
return $user['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $accessToken
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getUser(string $accessToken):array
|
||||||
|
{
|
||||||
|
if (empty($this->user)) {
|
||||||
|
$user = $this->request('GET', 'http://localhost/'.$this->version.'/oauth/user?token='.urlencode($accessToken));
|
||||||
|
|
||||||
|
$this->user = json_decode($user, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->user;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue