2021-08-06 20:03:34 +00:00
|
|
|
defmodule MatrixServerWeb.FederationClient do
|
|
|
|
use Tesla
|
|
|
|
|
|
|
|
alias MatrixServerWeb.Endpoint
|
|
|
|
alias MatrixServerWeb.Router.Helpers, as: RouteHelpers
|
|
|
|
|
|
|
|
# TODO: Maybe create database-backed homeserver struct to pass to client function.
|
|
|
|
|
|
|
|
@middleware [
|
|
|
|
Tesla.Middleware.JSON
|
|
|
|
]
|
|
|
|
|
|
|
|
@adapter {Tesla.Adapter.Finch, name: MatrixServerWeb.HTTPClient}
|
|
|
|
|
|
|
|
def client(server_name) do
|
2021-08-08 17:20:10 +00:00
|
|
|
Tesla.client([{Tesla.Middleware.BaseUrl, "http://" <> server_name} | @middleware], @adapter)
|
2021-08-06 20:03:34 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def get_signing_keys(client) do
|
|
|
|
Tesla.get(client, RouteHelpers.key_path(Endpoint, :get_signing_keys))
|
|
|
|
end
|
2021-08-08 17:20:10 +00:00
|
|
|
|
|
|
|
def test_server_auth(client) do
|
|
|
|
origin = "localhost:4001"
|
|
|
|
destination = "localhost:4000"
|
|
|
|
path = RouteHelpers.test_path(Endpoint, :test)
|
|
|
|
|
|
|
|
params = %{
|
|
|
|
method: "POST",
|
|
|
|
uri: path,
|
|
|
|
origin: origin,
|
|
|
|
destination: destination,
|
|
|
|
content: %{"hi" => "hello"}
|
|
|
|
}
|
|
|
|
|
|
|
|
{:ok, signed_object} = MatrixServer.SigningServer.sign_object(params)
|
|
|
|
auth_headers = create_signature_authorization_headers(signed_object, origin)
|
|
|
|
|
|
|
|
Tesla.post(client, path, signed_object, headers: auth_headers)
|
|
|
|
end
|
|
|
|
|
|
|
|
defp create_signature_authorization_headers(%{signatures: signatures}, origin) do
|
|
|
|
Enum.map(signatures[origin], fn {key, sig} ->
|
|
|
|
{"Authorization", "X-Matrix origin=#{origin},key=\"#{key}\",sig=\"#{sig}\""}
|
|
|
|
end)
|
|
|
|
end
|
2021-08-06 20:03:34 +00:00
|
|
|
end
|