diff options
| -rw-r--r-- | lib/pleroma/signature.ex | 23 | ||||
| -rw-r--r-- | test/pleroma/signature_test.exs | 5 | 
2 files changed, 20 insertions, 8 deletions
| diff --git a/lib/pleroma/signature.ex b/lib/pleroma/signature.ex index 43ab569a4..a71a504b3 100644 --- a/lib/pleroma/signature.ex +++ b/lib/pleroma/signature.ex @@ -10,17 +10,14 @@ defmodule Pleroma.Signature do    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub +  @known_suffixes ["/publickey", "/main-key"] +    def key_id_to_actor_id(key_id) do      uri = -      URI.parse(key_id) +      key_id +      |> URI.parse()        |> Map.put(:fragment, nil) - -    uri = -      if not is_nil(uri.path) and String.ends_with?(uri.path, "/publickey") do -        Map.put(uri, :path, String.replace(uri.path, "/publickey", "")) -      else -        uri -      end +      |> remove_suffix(@known_suffixes)      maybe_ap_id = URI.to_string(uri) @@ -36,6 +33,16 @@ defmodule Pleroma.Signature do      end    end +  defp remove_suffix(uri, [test | rest]) do +    if not is_nil(uri.path) and String.ends_with?(uri.path, test) do +      Map.put(uri, :path, String.replace(uri.path, test, "")) +    else +      remove_suffix(uri, rest) +    end +  end + +  defp remove_suffix(uri, []), do: uri +    def fetch_public_key(conn) do      with %{"keyId" => kid} <- HTTPSignatures.signature_for_conn(conn),           {:ok, actor_id} <- key_id_to_actor_id(kid), diff --git a/test/pleroma/signature_test.exs b/test/pleroma/signature_test.exs index 047c537e0..e3ae36b46 100644 --- a/test/pleroma/signature_test.exs +++ b/test/pleroma/signature_test.exs @@ -109,6 +109,11 @@ defmodule Pleroma.SignatureTest do                 {:ok, "https://example.com/users/1234"}      end +    test "it deduces the actor id for gotoSocial" do +      assert Signature.key_id_to_actor_id("https://example.com/users/1234/main-key") == +               {:ok, "https://example.com/users/1234"} +    end +      test "it calls webfinger for 'acct:' accounts" do        with_mock(Pleroma.Web.WebFinger,          finger: fn _ -> %{"ap_id" => "https://gensokyo.2hu/users/raymoo"} end | 
