Implement retrieving a single event over federation
Fix url encoding during homeserver signature check
This commit is contained in:
parent
1881b7f3d6
commit
e510c3bb6a
14 changed files with 173 additions and 22 deletions
|
@ -9,7 +9,7 @@ defmodule MatrixServer.Event do
|
|||
# TODO: Could refactor to also always set prev_events, but not necessary.
|
||||
@type t :: %__MODULE__{
|
||||
type: String.t(),
|
||||
origin_server_ts: DateTime.t(),
|
||||
origin_server_ts: integer(),
|
||||
state_key: String.t(),
|
||||
sender: UserId.t(),
|
||||
content: map(),
|
||||
|
@ -23,7 +23,7 @@ defmodule MatrixServer.Event do
|
|||
@primary_key {:event_id, :string, []}
|
||||
schema "events" do
|
||||
field :type, :string
|
||||
field :origin_server_ts, :utc_datetime_usec
|
||||
field :origin_server_ts, :integer
|
||||
field :state_key, :string
|
||||
field :sender, UserId
|
||||
field :content, :map
|
||||
|
@ -36,12 +36,38 @@ defmodule MatrixServer.Event do
|
|||
belongs_to :room, Room, type: :string
|
||||
end
|
||||
|
||||
defimpl Jason.Encoder, for: Event do
|
||||
@pdu_keys [
|
||||
:auth_events,
|
||||
:content,
|
||||
:depth,
|
||||
:hashes,
|
||||
:origin,
|
||||
:origin_server_ts,
|
||||
:prev_events,
|
||||
:redacts,
|
||||
:room_id,
|
||||
:sender,
|
||||
:signatures,
|
||||
:state_key,
|
||||
:type,
|
||||
:unsigned
|
||||
]
|
||||
|
||||
def encode(event, opts) do
|
||||
event
|
||||
|> Map.take(@pdu_keys)
|
||||
|> Map.update!(:sender, &Kernel.to_string/1)
|
||||
|> Jason.Encode.map(opts)
|
||||
end
|
||||
end
|
||||
|
||||
@spec new(Room.t(), Account.t()) :: %Event{}
|
||||
def new(%Room{id: room_id}, %Account{localpart: localpart}) do
|
||||
%Event{
|
||||
room_id: room_id,
|
||||
sender: %UserId{localpart: localpart, domain: MatrixServer.server_name()},
|
||||
origin_server_ts: DateTime.utc_now(),
|
||||
origin_server_ts: DateTime.utc_now() |> DateTime.to_unix(:millisecond),
|
||||
prev_events: [],
|
||||
auth_events: []
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ defmodule MatrixServer.ServerKeyInfo do
|
|||
|
||||
@primary_key {:server_name, :string, []}
|
||||
schema "server_key_info" do
|
||||
field :valid_until, :utc_datetime
|
||||
field :valid_until, :integer
|
||||
|
||||
has_many :signing_keys, SigningKey, foreign_key: :server_name
|
||||
end
|
||||
|
@ -43,7 +43,7 @@ defmodule MatrixServer.ServerKeyInfo do
|
|||
verify_keys: verify_keys,
|
||||
valid_until_ts: valid_until_ts
|
||||
}} <- HTTPClient.get_signing_keys(client),
|
||||
{:ok, valid_until} <- DateTime.from_unix(valid_until_ts) do
|
||||
{:ok, valid_until} <- DateTime.from_unix(valid_until_ts, :millisecond) do
|
||||
signing_keys =
|
||||
Enum.map(verify_keys, fn {key_id, %{"key" => key}} ->
|
||||
[server_name: server_name, signing_key_id: key_id, signing_key: key]
|
||||
|
@ -52,7 +52,8 @@ defmodule MatrixServer.ServerKeyInfo do
|
|||
# Always check every week to prevent misuse.
|
||||
ski = %ServerKeyInfo{
|
||||
server_name: server_name,
|
||||
valid_until: MatrixServer.min_datetime(in_a_week, valid_until)
|
||||
valid_until:
|
||||
MatrixServer.min_datetime(in_a_week, valid_until) |> DateTime.to_unix(:millisecond)
|
||||
}
|
||||
|
||||
case upsert_multi(server_name, ski, signing_keys) |> Repo.transaction() do
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue