From cac78a4f4eced88878e746d96b305ecc62826494 Mon Sep 17 00:00:00 2001 From: Logan Hunt Date: Tue, 31 Jan 2023 14:01:35 -0700 Subject: Move to discord oauth --- lib/chessh/schema/player.ex | 6 ++--- lib/chessh/ssh/client/client.ex | 6 +++-- lib/chessh/web/web.ex | 51 +++++++++++++++++++++++------------------ 3 files changed, 36 insertions(+), 27 deletions(-) (limited to 'lib/chessh') diff --git a/lib/chessh/schema/player.ex b/lib/chessh/schema/player.ex index f12ad9e..9c83349 100644 --- a/lib/chessh/schema/player.ex +++ b/lib/chessh/schema/player.ex @@ -5,7 +5,7 @@ defmodule Chessh.Player do @derive {Inspect, except: [:password]} schema "players" do - field(:github_id, :integer) + field(:discord_id, :string) field(:username, :string) @@ -24,7 +24,7 @@ defmodule Chessh.Player do defimpl Jason.Encoder, for: Chessh.Player do def encode(value, opts) do Jason.Encode.map( - Map.take(value, [:id, :github_id, :username, :created_at, :updated_at]), + Map.take(value, [:id, :discord_id, :username, :created_at, :updated_at]), opts ) end @@ -37,7 +37,7 @@ defmodule Chessh.Player do def registration_changeset(player, attrs, opts \\ []) do player - |> cast(attrs, [:username, :password, :github_id]) + |> cast(attrs, [:username, :password, :discord_id]) |> validate_username() |> validate_password(opts) end diff --git a/lib/chessh/ssh/client/client.ex b/lib/chessh/ssh/client/client.ex index 461dfbe..9ec1250 100644 --- a/lib/chessh/ssh/client/client.ex +++ b/lib/chessh/ssh/client/client.ex @@ -1,7 +1,5 @@ defmodule Chessh.SSH.Client do alias IO.ANSI - require Logger - use GenServer @clear_codes [ @@ -164,6 +162,10 @@ defmodule Chessh.SSH.Client do "\e[B" -> :down "\e[D" -> :left "\e[C" -> :right + "\eOA" -> :up + "\eOB" -> :down + "\eOD" -> :left + "\eOC" -> :right "\r" -> :return x -> x end diff --git a/lib/chessh/web/web.ex b/lib/chessh/web/web.ex index 8c0929a..067a27c 100644 --- a/lib/chessh/web/web.ex +++ b/lib/chessh/web/web.ex @@ -2,7 +2,6 @@ defmodule Chessh.Web.Endpoint do alias Chessh.{Player, Repo, Key, PlayerSession} alias Chessh.Web.Token use Plug.Router - require Logger import Ecto.Query plug(Plug.Logger) @@ -17,27 +16,33 @@ defmodule Chessh.Web.Endpoint do plug(:dispatch) get "/oauth/redirect" do - [github_login_url, client_id, client_secret, github_user_api_url, github_user_agent] = - get_github_configs() + [ + discord_login_url, + discord_scope, + client_id, + client_secret, + discord_user_api_url, + discord_user_agent, + redirect_uri + ] = get_discord_configs() resp = case conn.params do %{"code" => req_token} -> case :httpc.request( :post, - {String.to_charlist( - "#{github_login_url}?client_id=#{client_id}&client_secret=#{client_secret}&code=#{req_token}" - ), [], 'application/json', ''}, + {String.to_charlist(discord_login_url), [], 'application/x-www-form-urlencoded', + 'scope=#{discord_scope}&client_id=#{client_id}&client_secret=#{client_secret}&code=#{req_token}&grant_type=authorization_code&redirect_uri=#{redirect_uri}'}, [], [] ) do {:ok, {{_, 200, 'OK'}, _, resp}} -> - URI.decode_query(String.Chars.to_string(resp)) + Jason.decode!(String.Chars.to_string(resp)) end end {status, body} = - create_player_from_github_response(resp, github_user_api_url, github_user_agent) + create_player_from_discord_response(resp, discord_user_api_url, discord_user_agent) conn |> assign_jwt_and_redirect_or_encode(status, body) @@ -200,14 +205,16 @@ defmodule Chessh.Web.Endpoint do end) end - defp get_github_configs() do + defp get_discord_configs() do Enum.map( [ - :github_oauth_login_url, - :github_client_id, - :github_client_secret, - :github_user_api_url, - :github_user_agent + :discord_oauth_login_url, + :discord_scope, + :discord_client_id, + :discord_client_secret, + :discord_user_api_url, + :discord_user_agent, + :client_redirect_after_successful_sign_in ], fn key -> Application.get_env(:chessh, Web)[key] end ) @@ -246,27 +253,27 @@ defmodule Chessh.Web.Endpoint do end end - defp create_player_from_github_response(resp, github_user_api_url, github_user_agent) do + defp create_player_from_discord_response(resp, discord_user_api_url, discord_user_agent) do case resp do %{"access_token" => access_token} -> case :httpc.request( :get, - {String.to_charlist(github_user_api_url), + {String.to_charlist(discord_user_api_url), [ {'Authorization', String.to_charlist("Bearer #{access_token}")}, - {'User-Agent', github_user_agent} + {'User-Agent', discord_user_agent} ]}, [], [] ) do {:ok, {{_, 200, 'OK'}, _, user_details}} -> - %{"login" => username, "id" => github_id} = + %{"username" => username, "id" => discord_id} = Jason.decode!(String.Chars.to_string(user_details)) %Player{id: id} = - Repo.insert!(%Player{github_id: github_id, username: username}, - on_conflict: [set: [github_id: github_id]], - conflict_target: :github_id + Repo.insert!(%Player{discord_id: discord_id, username: username}, + on_conflict: [set: [discord_id: discord_id]], + conflict_target: :discord_id ) {200, @@ -283,7 +290,7 @@ defmodule Chessh.Web.Endpoint do end _ -> - {400, %{errors: "Failed to retrieve token from GitHub. Try again."}} + {400, %{errors: "Failed to retrieve token from Discord. Try again."}} end end end -- cgit v1.2.3-70-g09d2