aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRoger Braun <roger@rogerbraun.net>2017-03-20 17:45:47 +0100
committerRoger Braun <roger@rogerbraun.net>2017-03-20 17:56:45 +0100
commite32dbfc9a5477830dba7bf3e99621161e4454a29 (patch)
tree0179d3b453d98b30facfff72f857da2fec999f44 /lib
parenta93f3421a704d6728a856d5d82cdbf9c43f3f897 (diff)
downloadpleroma-e32dbfc9a5477830dba7bf3e99621161e4454a29.tar.gz
Add basic auth.
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/plugs/authentication_plug.ex51
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