aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web/oauth/oauth_controller.ex
diff options
context:
space:
mode:
authorRoger Braun <roger@rogerbraun.net>2017-09-06 19:06:25 +0200
committerRoger Braun <roger@rogerbraun.net>2017-09-06 19:06:25 +0200
commit2a298d70f9938d1b6d5af04d8b8863fdd3299f46 (patch)
tree7029989860d19246a0840a7991db46ad5b3207df /lib/pleroma/web/oauth/oauth_controller.ex
parent4e785df984bed0e2ffc3f5a773a961ed3efd4760 (diff)
downloadpleroma-2a298d70f9938d1b6d5af04d8b8863fdd3299f46.tar.gz
Add very basic oauth and mastodon api support.
Diffstat (limited to 'lib/pleroma/web/oauth/oauth_controller.ex')
-rw-r--r--lib/pleroma/web/oauth/oauth_controller.ex44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex
new file mode 100644
index 000000000..f0e091ac2
--- /dev/null
+++ b/lib/pleroma/web/oauth/oauth_controller.ex
@@ -0,0 +1,44 @@
+defmodule Pleroma.Web.OAuth.OAuthController do
+ use Pleroma.Web, :controller
+
+ alias Pleroma.Web.OAuth.{Authorization, Token}
+ alias Pleroma.{Repo, User, App}
+ alias Comeonin.Pbkdf2
+
+ def authorize(conn, params) do
+ render conn, "show.html", %{
+ response_type: params["response_type"],
+ client_id: params["client_id"],
+ scope: params["scope"],
+ redirect_uri: params["redirect_uri"]
+ }
+ end
+
+ def create_authorization(conn, %{"authorization" => %{"name" => name, "password" => password, "client_id" => client_id}} = params) do
+ with %User{} = user <- User.get_cached_by_nickname(name),
+ true <- Pbkdf2.checkpw(password, user.password_hash),
+ %App{} = app <- Pleroma.Repo.get_by(Pleroma.App, client_id: client_id),
+ {:ok, auth} <- Authorization.create_authorization(app, user) do
+ render conn, "results.html", %{
+ auth: auth
+ }
+ end
+ end
+
+ # TODO CRITICAL
+ # - Check validity of auth token
+ def token_exchange(conn, %{"grant_type" => "authorization_code"} = params) do
+ with %App{} = app <- Repo.get_by(App, client_id: params["client_id"], client_secret: params["client_secret"]),
+ %Authorization{} = auth <- Repo.get_by(Authorization, token: params["code"], app_id: app.id),
+ {:ok, token} <- Token.create_token(app, Repo.get(User, auth.user_id)) do
+ response = %{
+ token_type: "Bearer",
+ access_token: token.token,
+ refresh_token: token.refresh_token,
+ expires_in: 60 * 10,
+ scope: "read write follow"
+ }
+ json(conn, response)
+ end
+ end
+end