forked from mirrors/akkoma
Include port in host for signatures
This commit is contained in:
parent
3f65f2ea79
commit
1dd767b8c7
2 changed files with 48 additions and 6 deletions
|
@ -49,7 +49,8 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
|
||||||
"""
|
"""
|
||||||
def publish_one(%{inbox: inbox, json: json, actor: %User{} = actor, id: id} = params) do
|
def publish_one(%{inbox: inbox, json: json, actor: %User{} = actor, id: id} = params) do
|
||||||
Logger.debug("Federating #{id} to #{inbox}")
|
Logger.debug("Federating #{id} to #{inbox}")
|
||||||
%{host: host, path: path} = URI.parse(inbox)
|
|
||||||
|
uri = URI.parse(inbox)
|
||||||
|
|
||||||
digest = "SHA-256=" <> (:crypto.hash(:sha256, json) |> Base.encode64())
|
digest = "SHA-256=" <> (:crypto.hash(:sha256, json) |> Base.encode64())
|
||||||
|
|
||||||
|
@ -57,8 +58,8 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
|
||||||
|
|
||||||
signature =
|
signature =
|
||||||
Pleroma.Signature.sign(actor, %{
|
Pleroma.Signature.sign(actor, %{
|
||||||
"(request-target)": "post #{path}",
|
"(request-target)": "post #{uri.path}",
|
||||||
host: host,
|
host: signature_host(uri),
|
||||||
"content-length": byte_size(json),
|
"content-length": byte_size(json),
|
||||||
digest: digest,
|
digest: digest,
|
||||||
date: date
|
date: date
|
||||||
|
@ -76,8 +77,9 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
|
||||||
{"digest", digest}
|
{"digest", digest}
|
||||||
]
|
]
|
||||||
) do
|
) do
|
||||||
if !Map.has_key?(params, :unreachable_since) || params[:unreachable_since],
|
if not Map.has_key?(params, :unreachable_since) || params[:unreachable_since] do
|
||||||
do: Instances.set_reachable(inbox)
|
Instances.set_reachable(inbox)
|
||||||
|
end
|
||||||
|
|
||||||
result
|
result
|
||||||
else
|
else
|
||||||
|
@ -96,6 +98,14 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
|
||||||
|> publish_one()
|
|> publish_one()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp signature_host(%URI{port: port, scheme: scheme, host: host}) do
|
||||||
|
if port == URI.default_port(scheme) do
|
||||||
|
host
|
||||||
|
else
|
||||||
|
"#{host}:#{port}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp should_federate?(inbox, public) do
|
defp should_federate?(inbox, public) do
|
||||||
if public do
|
if public do
|
||||||
true
|
true
|
||||||
|
|
|
@ -123,6 +123,39 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "publish_one/1" do
|
describe "publish_one/1" do
|
||||||
|
test "publish to url with with different ports" do
|
||||||
|
inbox80 = "http://42.site/users/nick1/inbox"
|
||||||
|
inbox42 = "http://42.site:42/users/nick1/inbox"
|
||||||
|
|
||||||
|
mock(fn
|
||||||
|
%{method: :post, url: "http://42.site:42/users/nick1/inbox"} ->
|
||||||
|
{:ok, %Tesla.Env{status: 200, body: "port 42"}}
|
||||||
|
|
||||||
|
%{method: :post, url: "http://42.site/users/nick1/inbox"} ->
|
||||||
|
{:ok, %Tesla.Env{status: 200, body: "port 80"}}
|
||||||
|
end)
|
||||||
|
|
||||||
|
actor = insert(:user)
|
||||||
|
|
||||||
|
assert {:ok, %{body: "port 42"}} =
|
||||||
|
Publisher.publish_one(%{
|
||||||
|
inbox: inbox42,
|
||||||
|
json: "{}",
|
||||||
|
actor: actor,
|
||||||
|
id: 1,
|
||||||
|
unreachable_since: true
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, %{body: "port 80"}} =
|
||||||
|
Publisher.publish_one(%{
|
||||||
|
inbox: inbox80,
|
||||||
|
json: "{}",
|
||||||
|
actor: actor,
|
||||||
|
id: 1,
|
||||||
|
unreachable_since: true
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is not specified",
|
test_with_mock "calls `Instances.set_reachable` on successful federation if `unreachable_since` is not specified",
|
||||||
Instances,
|
Instances,
|
||||||
[:passthrough],
|
[:passthrough],
|
||||||
|
@ -131,7 +164,6 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do
|
||||||
inbox = "http://200.site/users/nick1/inbox"
|
inbox = "http://200.site/users/nick1/inbox"
|
||||||
|
|
||||||
assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
|
assert {:ok, _} = Publisher.publish_one(%{inbox: inbox, json: "{}", actor: actor, id: 1})
|
||||||
|
|
||||||
assert called(Instances.set_reachable(inbox))
|
assert called(Instances.set_reachable(inbox))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue