diff --git a/.gitpod.yml b/.gitpod.yml index 5f8eac91e1..a63c07bad2 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -22,6 +22,7 @@ ports: vscode: extensions: - ms-azuretools.vscode-docker + - zobo.php-intellisense github: # https://www.gitpod.io/docs/prebuilds#github-specific-configuration diff --git a/app/config/providers.php b/app/config/providers.php index cf58282107..205d07123b 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -101,6 +101,16 @@ return [ // Ordered by ABC. 'beta' => false, 'mock' => false, ], + 'disqus' => [ + 'name' => 'Disqus', + 'developers' => 'https://disqus.com/api/docs/auth/', + 'icon' => 'icon-disqus', + 'enabled' => true, + 'sandbox' => false, + 'form' => false, + 'beta' => false, + 'mock' => false, + ], 'dropbox' => [ 'name' => 'Dropbox', 'developers' => 'https://www.dropbox.com/developers/documentation', diff --git a/composer.lock b/composer.lock index 93b8455cac..bce5b90d88 100644 --- a/composer.lock +++ b/composer.lock @@ -5370,5 +5370,5 @@ "platform-overrides": { "php": "8.0" }, - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.3.0" } diff --git a/public/images/users/disqus.png b/public/images/users/disqus.png new file mode 100644 index 0000000000..29187942e1 Binary files /dev/null and b/public/images/users/disqus.png differ diff --git a/src/Appwrite/Auth/OAuth2/Disqus.php b/src/Appwrite/Auth/OAuth2/Disqus.php new file mode 100644 index 0000000000..58b7f48914 --- /dev/null +++ b/src/Appwrite/Auth/OAuth2/Disqus.php @@ -0,0 +1,188 @@ +endpoint . 'oauth/2.0/authorize/?' . + \http_build_query([ + 'response_type' => 'code', + 'client_id' => $this->appID, + 'state' => \json_encode($this->state), + 'redirect_uri' => $this->callback, + 'scope' => \implode(',', $this->getScopes()) + ]); + + return $url; + } + + /** + * @param string $code + * + * @return array + */ + protected function getTokens(string $code): array + { + if (empty($this->tokens)) { + $this->tokens = \json_decode($this->request( + 'POST', + $this->endpoint . 'oauth/2.0/access_token/', + ['Content-Type: application/x-www-form-urlencoded'], + \http_build_query([ + 'grant_type' => 'authorization_code', + 'client_id' => $this->appID, + 'client_secret' => $this->appSecret, + 'redirect_uri' => $this->callback, + 'code' => $code, + 'scope' => \implode(' ', $this->getScopes()), + ]) + ), true); + } + return $this->tokens; + } + + /** + * @param string $refreshToken + * + * @return array + */ + public function refreshTokens(string $refreshToken): array + { + $this->tokens = \json_decode($this->request( + 'POST', + $this->endpoint . 'oauth/2.0/access_token/?', + ['Content-Type: application/x-www-form-urlencoded'], + \http_build_query([ + 'grant_type' => 'refresh_token', + 'refresh_token' => $refreshToken, + 'client_id' => $this->appID, + 'client_secret' => $this->appSecret, + ]) + ), true); + + if (empty($this->tokens['refresh_token'])) { + $this->tokens['refresh_token'] = $refreshToken; + } + return $this->tokens; + } + + /** + * @param string $token + * + * @return string + */ + public function getUserID(string $accessToken): string + { + $user = $this->getUser($accessToken); + + $userId = $user['id']; + + return $userId; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + $user = $this->getUser($accessToken); + + $userEmail = $user['email']; + + return $userEmail; + } + + /** + * @param string $accessToken + * + * @return bool + */ + public function isEmailVerified(string $accessToken): bool + { + + // Look out for the change in their enpoint. + // It's in Beta so they may provide a parameter in the future. + // https://disqus.com/api/docs/users/details/ + + return false; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + $user = $this->getUser($accessToken); + + $username = $user['name'] ?? ''; + + return $username; + } + + /** + * @param string $accessToken + * + * @return array + */ + protected function getUser(string $accessToken): array + { + if (empty($this->user)) { + $user = $this->request( + 'GET', + $this->endpoint . '3.0/users/details.json?' . \http_build_query([ + 'access_token' => $accessToken, + 'api_key' => $this->appID, + 'api_secret' => $this->appSecret + ]), + ); + $this->user = \json_decode($user, true)['response']; + } + + return $this->user; + } +} diff --git a/src/Appwrite/Auth/OAuth2/Linkedin.php b/src/Appwrite/Auth/OAuth2/Linkedin.php index 8cf9b8aff7..340cab2df0 100644 --- a/src/Appwrite/Auth/OAuth2/Linkedin.php +++ b/src/Appwrite/Auth/OAuth2/Linkedin.php @@ -80,7 +80,6 @@ class Linkedin extends OAuth2 ]) ), true); } - return $this->tokens; } @@ -107,7 +106,6 @@ class Linkedin extends OAuth2 if (empty($this->tokens['refresh_token'])) { $this->tokens['refresh_token'] = $refreshToken; } - return $this->tokens; }