diff options
author | Roger Braun <roger@rogerbraun.net> | 2017-03-20 17:45:47 +0100 |
---|---|---|
committer | Roger Braun <roger@rogerbraun.net> | 2017-03-20 17:56:45 +0100 |
commit | e32dbfc9a5477830dba7bf3e99621161e4454a29 (patch) | |
tree | 0179d3b453d98b30facfff72f857da2fec999f44 /lib | |
parent | a93f3421a704d6728a856d5d82cdbf9c43f3f897 (diff) | |
download | pleroma-e32dbfc9a5477830dba7bf3e99621161e4454a29.tar.gz |
Add basic auth.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/plugs/authentication_plug.ex | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/pleroma/plugs/authentication_plug.ex b/lib/pleroma/plugs/authentication_plug.ex new file mode 100644 index 000000000..76a4710c1 --- /dev/null +++ b/lib/pleroma/plugs/authentication_plug.ex @@ -0,0 +1,51 @@ +defmodule Pleroma.Plugs.AuthenticationPlug do + import Plug.Conn + + def init(options) do + options + end + + def call(conn, opts) do + with {:ok, username, password} <- decode_header(conn), + {:ok, user} <- opts[:fetcher].(username), + {:ok, verified_user} <- verify(user, password) + do + conn |> assign(:user, verified_user) + else + _ -> conn |> halt_or_continue(opts) + end + end + + defp verify(nil, _password) do + Comeonin.Pbkdf2.dummy_checkpw + :error + end + + defp verify(user, password) do + if Comeonin.Pbkdf2.checkpw(password, user[:password_hash]) do + {:ok, user} + else + :error + end + end + + defp decode_header(conn) do + with ["Basic " <> header] <- get_req_header(conn, "authorization"), + {:ok, userinfo} <- Base.decode64(header), + [username, password] <- String.split(userinfo, ":") + do + { :ok, username, password } + end + end + + defp halt_or_continue(conn, %{optional: true}) do + conn |> assign(:user, nil) + end + + defp halt_or_continue(conn, _) do + conn + |> put_resp_content_type("application/json") + |> send_resp(403, Poison.encode!(%{error: "Invalid credentials."})) + |> halt + end +end |