From e32dbfc9a5477830dba7bf3e99621161e4454a29 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Mon, 20 Mar 2017 17:45:47 +0100 Subject: Add basic auth. --- lib/pleroma/plugs/authentication_plug.ex | 51 ++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 lib/pleroma/plugs/authentication_plug.ex (limited to 'lib') 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 -- cgit v1.2.3