Add BasicAuthDecoderPlug
authorlain <lain@soykaf.club>
Wed, 5 Sep 2018 15:30:05 +0000 (17:30 +0200)
committerlain <lain@soykaf.club>
Wed, 5 Sep 2018 15:30:05 +0000 (17:30 +0200)
lib/pleroma/plugs/basic_auth_decoder_plug.ex [new file with mode: 0644]
test/plugs/basic_auth_decoder_plug_test.exs [new file with mode: 0644]

diff --git a/lib/pleroma/plugs/basic_auth_decoder_plug.ex b/lib/pleroma/plugs/basic_auth_decoder_plug.ex
new file mode 100644 (file)
index 0000000..fc8fcee
--- /dev/null
@@ -0,0 +1,21 @@
+defmodule Pleroma.Plugs.BasicAuthDecoderPlug do
+  import Plug.Conn
+
+  def init(options) do
+    options
+  end
+
+  def call(conn, opts) do
+    with ["Basic " <> header] <- get_req_header(conn, "authorization"),
+         {:ok, userinfo} <- Base.decode64(header),
+         [username, password] <- String.split(userinfo, ":", parts: 2) do
+      conn
+      |> assign(:auth_credentials, %{
+        username: username,
+        password: password
+      })
+    else
+      _ -> conn
+    end
+  end
+end
diff --git a/test/plugs/basic_auth_decoder_plug_test.exs b/test/plugs/basic_auth_decoder_plug_test.exs
new file mode 100644 (file)
index 0000000..317f7d1
--- /dev/null
@@ -0,0 +1,31 @@
+defmodule Pleroma.Plugs.AuthenticationPlugTest do
+  use Pleroma.Web.ConnCase, async: true
+
+  alias Pleroma.Plugs.BasicAuthDecoderPlug
+
+  defp basic_auth_enc(username, password) do
+    "Basic " <> Base.encode64("#{username}:#{password}")
+  end
+
+  test "it puts the decoded credentials into the assigns", %{conn: conn} do
+    header = basic_auth_enc("moonman", "iloverobek")
+
+    conn =
+      conn
+      |> put_req_header("authorization", header)
+      |> BasicAuthDecoderPlug.call(%{})
+
+    assert conn.assigns[:auth_credentials] == %{
+             username: "moonman",
+             password: "iloverobek"
+           }
+  end
+
+  test "without a authorization header it doesn't do anything", %{conn: conn} do
+    ret_conn =
+      conn
+      |> BasicAuthDecoderPlug.call(%{})
+
+    assert conn == ret_conn
+  end
+end