From 1e53776a8dba26a70b2b55dbc5216d63b9122433 Mon Sep 17 00:00:00 2001 From: Pim Kunis Date: Fri, 6 Aug 2021 22:03:34 +0200 Subject: [PATCH] Add federation API Add signing keys fed API request --- config/dev.exs | 7 +++++-- lib/matrix_server.ex | 2 +- lib/matrix_server/account.ex | 2 +- lib/matrix_server/application.ex | 3 ++- lib/matrix_server_web/federation_client.ex | 23 ++++++++++++++++++++++ mix.exs | 4 +++- mix.lock | 6 ++++++ 7 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 lib/matrix_server_web/federation_client.ex diff --git a/config/dev.exs b/config/dev.exs index 32f73ce..03489b3 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -1,5 +1,8 @@ use Mix.Config +hostname = "localhost" +port = System.get_env("PORT") || 4000 + # Configure your database config :matrix_server, MatrixServer.Repo, username: "matrix_server", @@ -16,7 +19,7 @@ config :matrix_server, MatrixServer.Repo, # watchers to your application. For example, we use it # with webpack to recompile .js and .css sources. config :matrix_server, MatrixServerWeb.Endpoint, - http: [port: 4000], + http: [port: port], debug_errors: true, code_reloader: true, check_origin: false, @@ -56,5 +59,5 @@ config :phoenix, :stacktrace_depth, 20 # Initialize plugs at runtime for faster development compilation config :phoenix, :plug_init_mode, :runtime -config :matrix_server, server_name: "localhost" +config :matrix_server, server_name: "#{hostname}:#{port}" config :matrix_server, private_key_file: "keys/id_ed25519" diff --git a/lib/matrix_server.ex b/lib/matrix_server.ex index 38872c1..af4e510 100644 --- a/lib/matrix_server.ex +++ b/lib/matrix_server.ex @@ -33,7 +33,7 @@ defmodule MatrixServer do def default_room_version, do: "7" def get_domain(id) do - case String.split(id, ":") do + case String.split(id, ":", parts: 2) do [_, server_name] -> server_name _ -> nil end diff --git a/lib/matrix_server/account.ex b/lib/matrix_server/account.ex index d76806c..0d8bc4b 100644 --- a/lib/matrix_server/account.ex +++ b/lib/matrix_server/account.ex @@ -102,7 +102,7 @@ defmodule MatrixServer.Account do end defp try_get_localpart("@" <> rest = user_id) do - case String.split(rest, ":") do + case String.split(rest, ":", parts: 2) do [localpart, _] -> localpart _ -> user_id end diff --git a/lib/matrix_server/application.ex b/lib/matrix_server/application.ex index 9281889..08c42f0 100644 --- a/lib/matrix_server/application.ex +++ b/lib/matrix_server/application.ex @@ -13,7 +13,8 @@ defmodule MatrixServer.Application do MatrixServerWeb.Endpoint, {Registry, keys: :unique, name: MatrixServer.RoomServer.Registry}, {DynamicSupervisor, name: MatrixServer.RoomServer.Supervisor, strategy: :one_for_one}, - MatrixServer.SigningServer + MatrixServer.SigningServer, + {Finch, name: MatrixServerWeb.HTTPClient} ] Supervisor.start_link(children, name: MatrixServer.Supervisor, strategy: :one_for_one) diff --git a/lib/matrix_server_web/federation_client.ex b/lib/matrix_server_web/federation_client.ex new file mode 100644 index 0000000..c48d66b --- /dev/null +++ b/lib/matrix_server_web/federation_client.ex @@ -0,0 +1,23 @@ +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.Headers, [{"Content-Type", "application/json"}]}, + Tesla.Middleware.JSON + ] + + @adapter {Tesla.Adapter.Finch, name: MatrixServerWeb.HTTPClient} + + def client(server_name) do + Tesla.client([{Tesla.Middleware.BaseUrl, server_name} | @middleware], @adapter) + end + + def get_signing_keys(client) do + Tesla.get(client, RouteHelpers.key_path(Endpoint, :get_signing_keys)) + end +end diff --git a/mix.exs b/mix.exs index 8e940de..0848f5f 100644 --- a/mix.exs +++ b/mix.exs @@ -44,7 +44,9 @@ defmodule MatrixServer.MixProject do {:bcrypt_elixir, "~> 2.3"}, {:cors_plug, "~> 2.0"}, {:ex_machina, "~> 2.7", only: :test}, - {:enacl, "~> 1.2"} + {:enacl, "~> 1.2"}, + {:tesla, "~> 1.4"}, + {:finch, "~> 0.8.1"} ] end diff --git a/mix.lock b/mix.lock index 6f01698..129829d 100644 --- a/mix.lock +++ b/mix.lock @@ -1,5 +1,6 @@ %{ "bcrypt_elixir": {:hex, :bcrypt_elixir, "2.3.0", "6cb662d5c1b0a8858801cf20997bd006e7016aa8c52959c9ef80e0f34fb60b7a", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "2c81d61d4f6ed0e5cf7bf27a9109b791ff216a1034b3d541327484f46dd43769"}, + "castore": {:hex, :castore, "0.1.11", "c0665858e0e1c3e8c27178e73dffea699a5b28eb72239a3b2642d208e8594914", [:mix], [], "hexpm", "91b009ba61973b532b84f7c09ce441cba7aa15cb8b006cf06c6f4bba18220081"}, "comeonin": {:hex, :comeonin, "5.3.2", "5c2f893d05c56ae3f5e24c1b983c2d5dfb88c6d979c9287a76a7feb1e1d8d646", [:mix], [], "hexpm", "d0993402844c49539aeadb3fe46a3c9bd190f1ecf86b6f9ebd71957534c95f04"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, "cors_plug": {:hex, :cors_plug, "2.0.3", "316f806d10316e6d10f09473f19052d20ba0a0ce2a1d910ddf57d663dac402ae", [:mix], [{:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ee4ae1418e6ce117fc42c2ba3e6cbdca4e95ecd2fe59a05ec6884ca16d469aea"}, @@ -13,8 +14,12 @@ "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, "enacl": {:hex, :enacl, "1.2.1", "7776480b9b3d42a51d66dbbcbf17fa3d79285b3d2adcb4d5b5bd0b70f0ef1949", [:rebar3], [], "hexpm", "67bbbeddd2564dc899a3dcbc3765cd6ad71629134f1e500a50ec071f0f75e552"}, "ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"}, + "finch": {:hex, :finch, "0.8.1", "761e39640c98d12c9ac7aa15b4d0732205669b20055e26bcc8da7ce826070fdc", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.3.5", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "bc80f759f701dd56793f4edfaa6dc6480707c23046fde3a98c9887b164924cad"}, "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, + "mint": {:hex, :mint, "1.3.0", "396b3301102f7b775e103da5a20494b25753aed818d6d6f0ad222a3a018c3600", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "a9aac960562e43ca69a77e5176576abfa78b8398cec5543dd4fb4ab0131d5c1e"}, + "nimble_options": {:hex, :nimble_options, "0.3.6", "365d03c05d43483d3eacf820671dafce5b49d692667b3bb8cae28447fd2414ef", [:mix], [], "hexpm", "1c1d3536c4aee1be2c8f3c691bf27c62dbd88d9bb3a0b1a011913453932e8c15"}, + "nimble_pool": {:hex, :nimble_pool, "0.2.4", "1db8e9f8a53d967d595e0b32a17030cdb6c0dc4a451b8ac787bf601d3f7704c3", [:mix], [], "hexpm", "367e8071e137b787764e6a9992ccb57b276dc2282535f767a07d881951ebeac6"}, "phoenix": {:hex, :phoenix, "1.5.9", "a6368d36cfd59d917b37c44386e01315bc89f7609a10a45a22f47c007edf2597", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7e4bce20a67c012f1fbb0af90e5da49fa7bf0d34e3a067795703b74aef75427d"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.3.0", "2c69a452c2e0ee8c93345ae1cdc1696ef4877ff9cbb15c305def41960c3c4ebf", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "0ac491924217550c8f42c81c1f390b5d81517d12ceaf9abf3e701156760a848e"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"}, @@ -26,4 +31,5 @@ "telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"}, "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.0", "da9d49ee7e6bb1c259d36ce6539cd45ae14d81247a2b0c90edf55e2b50507f7b", [:mix], [{:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5cfe67ad464b243835512aa44321cee91faed6ea868d7fb761d7016e02915c3d"}, "telemetry_poller": {:hex, :telemetry_poller, "0.5.1", "21071cc2e536810bac5628b935521ff3e28f0303e770951158c73eaaa01e962a", [:rebar3], [{:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4cab72069210bc6e7a080cec9afffad1b33370149ed5d379b81c7c5f0c663fd4"}, + "tesla": {:hex, :tesla, "1.4.3", "f5a494e08fb1abe4fd9c28abb17f3d9b62b8f6fc492860baa91efb1aab61c8a0", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "e0755bb664bf4d664af72931f320c97adbf89da4586670f4864bf259b5750386"}, }