Merge branch 'parallel588/pleroma-support/compile_warnings' into 'develop'
[akkoma] / lib / pleroma / plugs / http_signature.ex
index 7f40a20c0b62e0f30dcfd7098c94720d95b95e44..9e53371b74664baa54a8bede27db3079fa1e406d 100644 (file)
@@ -1,5 +1,6 @@
 defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do
   alias Pleroma.Web.HTTPSignatures
+  alias Pleroma.Web.ActivityPub.Utils
   import Plug.Conn
   require Logger
 
@@ -7,20 +8,43 @@ defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do
     options
   end
 
-  def call(%{assigns: %{valid_signature: true}} = conn, opts) do
+  def call(%{assigns: %{valid_signature: true}} = conn, _opts) do
     conn
   end
 
-  def call(conn, opts) do
-    user = conn.params["actor"]
+  def call(conn, _opts) do
+    user = Utils.get_ap_id(conn.params["actor"])
     Logger.debug("Checking sig for #{user}")
-    if get_req_header(conn, "signature") do
-      conn = conn
-      |> put_req_header("(request-target)", String.downcase("#{conn.method} #{conn.request_path}"))
+    [signature | _] = get_req_header(conn, "signature")
 
-      assign(conn, :valid_signature, HTTPSignatures.validate_conn(conn))
-    else
-      conn
+    cond do
+      signature && String.contains?(signature, user) ->
+        # set (request-target) header to the appropriate value
+        # we also replace the digest header with the one we computed
+        conn =
+          conn
+          |> put_req_header(
+            "(request-target)",
+            String.downcase("#{conn.method}") <> " #{conn.request_path}"
+          )
+
+        conn =
+          if conn.assigns[:digest] do
+            conn
+            |> put_req_header("digest", conn.assigns[:digest])
+          else
+            conn
+          end
+
+        assign(conn, :valid_signature, HTTPSignatures.validate_conn(conn))
+
+      signature ->
+        Logger.debug("Signature not from actor")
+        assign(conn, :valid_signature, false)
+
+      true ->
+        Logger.debug("No signature header!")
+        conn
     end
   end
 end