2021-09-01 12:43:55 +00:00
|
|
|
defmodule ArchitexWeb.Federation.KeyController do
|
|
|
|
use ArchitexWeb, :controller
|
2021-08-06 13:52:03 +00:00
|
|
|
|
2021-09-01 12:43:55 +00:00
|
|
|
import ArchitexWeb.Error
|
2021-08-06 13:52:03 +00:00
|
|
|
|
2021-09-01 12:43:55 +00:00
|
|
|
alias Architex.KeyServer
|
2021-08-06 13:52:03 +00:00
|
|
|
|
2021-08-24 23:27:03 +00:00
|
|
|
@doc """
|
|
|
|
Gets the homeserver's published signing keys.
|
|
|
|
|
|
|
|
Action for GET /_matrix/key/v2/server/{keyId}.
|
|
|
|
"""
|
2021-08-06 13:52:03 +00:00
|
|
|
def get_signing_keys(conn, _params) do
|
|
|
|
keys =
|
2021-08-12 22:45:07 +00:00
|
|
|
KeyServer.get_own_signing_keys()
|
2021-08-06 13:52:03 +00:00
|
|
|
|> Enum.into(%{}, fn {key_id, key} ->
|
|
|
|
{key_id, %{"key" => key}}
|
|
|
|
end)
|
|
|
|
|
2021-08-16 17:30:47 +00:00
|
|
|
# TODO: Consider using TimeX.
|
|
|
|
# Valid for one month.
|
|
|
|
valid_until = DateTime.utc_now() |> DateTime.add(60 * 60 * 24 * 30, :second)
|
|
|
|
|
2021-08-06 13:52:03 +00:00
|
|
|
data = %{
|
2021-09-01 12:43:55 +00:00
|
|
|
server_name: Architex.server_name(),
|
2021-08-06 13:52:03 +00:00
|
|
|
verify_keys: keys,
|
|
|
|
old_verify_keys: %{},
|
2021-08-21 09:25:36 +00:00
|
|
|
valid_until_ts: DateTime.to_unix(valid_until, :millisecond)
|
2021-08-06 13:52:03 +00:00
|
|
|
}
|
|
|
|
|
2021-08-12 22:45:07 +00:00
|
|
|
case KeyServer.sign_object(data) do
|
|
|
|
{:ok, sig, key_id} ->
|
2021-09-01 12:43:55 +00:00
|
|
|
signed_data = Architex.add_signature(data, key_id, sig)
|
2021-08-12 22:45:07 +00:00
|
|
|
|
2021-08-06 13:52:03 +00:00
|
|
|
conn
|
|
|
|
|> put_status(200)
|
|
|
|
|> json(signed_data)
|
|
|
|
|
2021-08-12 22:45:07 +00:00
|
|
|
:error ->
|
2021-08-06 13:52:03 +00:00
|
|
|
put_error(conn, :unknown, "Error signing object.")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|