Add function to query whether server participates in a room

Move from integer timestamps to datetimes
This commit is contained in:
Pim Kunis 2021-08-16 19:30:47 +02:00
parent 5d75244bc0
commit 02edff90e7
7 changed files with 65 additions and 20 deletions

View file

@ -8,7 +8,7 @@ defmodule MatrixServer.Event do
@primary_key {:event_id, :string, []}
schema "events" do
field :type, :string
field :origin_server_ts, :integer
field :origin_server_ts, :utc_datetime_usec
field :state_key, :string
field :sender, :string
field :content, :map
@ -27,7 +27,7 @@ defmodule MatrixServer.Event do
room_id: room_id,
sender: MatrixServer.get_mxid(localpart),
event_id: generate_event_id(),
origin_server_ts: System.os_time(:millisecond),
origin_server_ts: DateTime.utc_now(),
prev_events: [],
auth_events: []
}

View file

@ -10,7 +10,7 @@ defmodule MatrixServer.ServerKeyInfo do
@primary_key {:server_name, :string, []}
schema "server_key_info" do
field :valid_until, :integer
field :valid_until, :utc_datetime
has_many :signing_keys, SigningKey, foreign_key: :server_name
end
@ -34,31 +34,33 @@ defmodule MatrixServer.ServerKeyInfo do
defp refresh_signing_keys(server_name) do
# TODO: Handle expired keys.
in_a_week = System.os_time(:millisecond) + 1000 * 60 * 60 * 24 * 7
in_a_week = DateTime.utc_now() |> DateTime.add(60 * 60 * 24 * 7, :second)
client = HTTPClient.client(server_name)
with {:ok,
%GetSigningKeys{
server_name: server_name,
verify_keys: verify_keys,
valid_until_ts: valid_until
}} <-
HTTPClient.get_signing_keys(client) do
valid_until_ts: valid_until_ts
}} <- HTTPClient.get_signing_keys(client),
{:ok, valid_until} <- DateTime.from_unix(valid_until_ts) do
signing_keys =
Enum.map(verify_keys, fn {key_id, %{"key" => key}} ->
[server_name: server_name, signing_key_id: key_id, signing_key: key]
end)
# Always check every week to prevent misuse.
ski = %ServerKeyInfo{server_name: server_name, valid_until: min(valid_until, in_a_week)}
ski = %ServerKeyInfo{
server_name: server_name,
valid_until: MatrixServer.min_datetime(in_a_week, valid_until)
}
case upsert_multi(server_name, ski, signing_keys) |> Repo.transaction() do
{:ok, %{new_ski: ski}} -> {:ok, ski}
{:error, _} -> :error
end
else
:error ->
:error
_ -> :error
end
end