diff options
author | Ariadne Conill <ariadne@dereferenced.org> | 2019-07-17 19:18:19 +0000 |
---|---|---|
committer | Ariadne Conill <ariadne@dereferenced.org> | 2019-07-17 19:18:19 +0000 |
commit | f84fb340b7358df195734f2db199e76a819e45bf (patch) | |
tree | e7410a1425e4e4d46bed7f3a57af85815424aa64 /lib | |
parent | 1e3aff6ef18c774783c4fc7eb46c245e7d8fb9b2 (diff) | |
download | pleroma-f84fb340b7358df195734f2db199e76a819e45bf.tar.gz |
http signatures: derive actor ID from key ID.
Almost all AP servers return their key ID as the actor URI with #main-key
added. Hubzilla, which doesn't, uses a URL which refers to the actor
anyway, so worst case, Hubzilla users get refetched.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/signature.ex | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/pleroma/signature.ex b/lib/pleroma/signature.ex index 1a4d54c62..a45c70a9d 100644 --- a/lib/pleroma/signature.ex +++ b/lib/pleroma/signature.ex @@ -8,10 +8,16 @@ defmodule Pleroma.Signature do alias Pleroma.Keys alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.ActivityPub.Utils + + defp key_id_to_actor_id(key_id) do + URI.parse(key_id) + |> Map.put(:fragment, nil) + |> URI.to_string() + end def fetch_public_key(conn) do - with actor_id <- Utils.get_ap_id(conn.params["actor"]), + with %{"keyId" => kid} <- HTTPSignatures.signature_for_conn(conn), + actor_id <- key_id_to_actor_id(kid), {:ok, public_key} <- User.get_public_key_for_ap_id(actor_id) do {:ok, public_key} else @@ -21,7 +27,8 @@ defmodule Pleroma.Signature do end def refetch_public_key(conn) do - with actor_id <- Utils.get_ap_id(conn.params["actor"]), + with %{"keyId" => kid} <- HTTPSignatures.signature_for_conn(conn), + actor_id <- key_id_to_actor_id(kid), {:ok, _user} <- ActivityPub.make_user_from_ap_id(actor_id), {:ok, public_key} <- User.get_public_key_for_ap_id(actor_id) do {:ok, public_key} |