diff options
Diffstat (limited to 'lib/pleroma')
| -rw-r--r-- | lib/pleroma/plugs/http_signature.ex | 48 | 
1 files changed, 34 insertions, 14 deletions
| diff --git a/lib/pleroma/plugs/http_signature.ex b/lib/pleroma/plugs/http_signature.ex index 23d22a712..477a5b578 100644 --- a/lib/pleroma/plugs/http_signature.ex +++ b/lib/pleroma/plugs/http_signature.ex @@ -4,6 +4,7 @@  defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do    import Plug.Conn +  import Phoenix.Controller, only: [get_format: 1, text: 2]    require Logger    def init(options) do @@ -15,25 +16,27 @@ defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do    end    def call(conn, _opts) do -    headers = get_req_header(conn, "signature") -    signature = Enum.at(headers, 0) +    if get_format(conn) == "activity+json" do +      conn +      |> maybe_assign_valid_signature() +      |> maybe_require_signature() +    else +      conn +    end +  end -    if signature do +  defp maybe_assign_valid_signature(conn) do +    if has_signature_header?(conn) do        # 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}" -        ) +      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 +        conn +        |> put_req_header("(request-target)", request_target) +        |> case do +          %{assigns: %{digest: digest}} = conn -> put_req_header(conn, "digest", digest) +          conn -> conn          end        assign(conn, :valid_signature, HTTPSignatures.validate_conn(conn)) @@ -42,4 +45,21 @@ defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do        conn      end    end + +  defp has_signature_header?(conn) do +    conn |> get_req_header("signature") |> Enum.at(0, false) +  end + +  defp maybe_require_signature(%{assigns: %{valid_signature: true}} = conn), do: conn + +  defp maybe_require_signature(conn) do +    if Pleroma.Config.get([:activitypub, :authorized_fetch_mode], false) do +      conn +      |> put_status(:unauthorized) +      |> text("Request not signed") +      |> halt() +    else +      conn +    end +  end  end | 
