diff options
author | FloatingGhost <hannah@coffee-and-dreams.uk> | 2022-07-18 15:21:27 +0100 |
---|---|---|
committer | Haelwenn (lanodan) Monnier <contact@hacktivis.me> | 2022-11-27 04:54:18 +0100 |
commit | 747311f623190cac9e345e1db3568ed850495ac2 (patch) | |
tree | dd8c78ee88934da1113a83b0c0959ad31fd699f7 | |
parent | 11d5ad24c5e316a9ba9f7de4c661d3af3b319c5c (diff) | |
download | pleroma-747311f623190cac9e345e1db3568ed850495ac2.tar.gz pleroma-747311f623190cac9e345e1db3568ed850495ac2.zip |
fix resolution of GTS user keys
-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 |