aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlain <lain@soykaf.club>2020-08-21 15:29:01 +0200
committerlain <lain@soykaf.club>2020-08-21 15:29:01 +0200
commit85561ead2546c7ff31ea37e96d44d0353bc66e38 (patch)
tree47cd0cb7d73628a99e1283d8034a798a0f12c415
parent2f1428d7ad1e5770d4fe4c65f13cdb1bf06915c8 (diff)
downloadpleroma-85561ead2546c7ff31ea37e96d44d0353bc66e38.tar.gz
.
-rw-r--r--lib/pleroma/web/matrix_controller.ex185
-rw-r--r--lib/pleroma/web/router.ex9
2 files changed, 163 insertions, 31 deletions
diff --git a/lib/pleroma/web/matrix_controller.ex b/lib/pleroma/web/matrix_controller.ex
index a6f8c1efa..749c43dcb 100644
--- a/lib/pleroma/web/matrix_controller.ex
+++ b/lib/pleroma/web/matrix_controller.ex
@@ -16,6 +16,9 @@ defmodule Pleroma.Web.MatrixController do
alias Pleroma.Web.MediaProxy
alias Pleroma.Web.OAuth.App
alias Pleroma.Web.OAuth.Token
+ alias Pleroma.Web.OAuth.Token
+ alias Pleroma.Web.CommonAPI
+ alias Pleroma.Object
import Ecto.Query
plug(
@@ -27,7 +30,22 @@ defmodule Pleroma.Web.MatrixController do
plug(
OAuthScopesPlug,
%{scopes: ["read"]}
- when action in [:pushrules, :sync, :filter, :key_query, :profile]
+ when action in [
+ :pushrules,
+ :sync,
+ :filter,
+ :key_query,
+ :profile,
+ :joined_groups,
+ :room_keys_version,
+ :key_upload,
+ :capabilities,
+ :set_read_marker,
+ :room_members,
+ :publicised_groups,
+ :turn_server,
+ :send_event
+ ]
)
def mxc(url) do
@@ -37,7 +55,6 @@ defmodule Pleroma.Web.MatrixController do
def client_versions(conn, _) do
data = %{
versions: ["r0.0.1", "r0.1.0", "r0.2.0", "r0.3.0", "r0.4.0", "r0.5.0"]
- # versions: ["r0.0.1", "r0.1.0"]
}
conn
@@ -97,9 +114,7 @@ defmodule Pleroma.Web.MatrixController do
|> json(data)
end
- def set_presence_status(conn, params) do
- IO.inspect(params)
-
+ def set_presence_status(conn, _params) do
conn
|> json(%{})
end
@@ -114,8 +129,6 @@ defmodule Pleroma.Web.MatrixController do
end
def set_filter(conn, params) do
- IO.inspect(params)
-
filter_id = :crypto.strong_rand_bytes(32) |> Base.url_encode64(padding: false)
Cachex.put(:matrix_compat, "filter:#{filter_id}", params)
@@ -129,7 +142,6 @@ defmodule Pleroma.Web.MatrixController do
def filter(conn, params) do
result = Cachex.get(:matrix_compat, "filter:#{params["filter_id"]}")
- IO.inspect(result)
conn
|> put_status(200)
@@ -169,23 +181,7 @@ defmodule Pleroma.Web.MatrixController do
membership_events =
[user, recipient]
- |> Enum.map(fn member ->
- avatar = User.avatar_url(user) |> MediaProxy.url()
-
- %{
- content: %{
- membership: "join",
- avatar_url: mxc(avatar),
- displayname: member.name
- },
- type: "m.room.member",
- event_id: "#{chat.id}/join/#{member.id}",
- room_id: chat.id,
- sender: matrix_name(member),
- origin_ts: DateTime.utc_now() |> DateTime.to_unix(),
- state_key: matrix_name(member)
- }
- end)
+ |> membership_events_from_list(chat)
messages =
chat
@@ -197,8 +193,6 @@ defmodule Pleroma.Web.MatrixController do
{:ok, date, _} = DateTime.from_iso8601(chat_data["published"])
- IO.inspect(chat_data["attachment"])
-
messages = [
%{
content: %{
@@ -310,15 +304,11 @@ defmodule Pleroma.Web.MatrixController do
end
def key_query(conn, params) do
- IO.inspect(params)
-
conn
|> json(params)
end
def profile(conn, params) do
- IO.inspect(params)
-
nickname =
params["user_id"]
|> String.trim_leading("@")
@@ -343,4 +333,137 @@ defmodule Pleroma.Web.MatrixController do
conn
|> redirect(external: url)
end
+
+ # Not documented, guessing what's expected here
+ def joined_groups(conn, _) do
+ data = %{
+ joined: %{}
+ }
+
+ conn
+ |> json(data)
+ end
+
+ # Not documented either lololo let's 404
+ def room_keys_version(conn, _) do
+ conn
+ |> put_status(404)
+ |> json("Not found")
+ end
+
+ # let's just pretend this worked.
+ def key_upload(conn, _params) do
+ # Enormous numbers so the client will stop trying to upload more
+ data = %{
+ one_time_key_counts: %{
+ curve25519: 100_000,
+ signed_curve25519: 2_000_000
+ }
+ }
+
+ conn
+ |> put_status(200)
+ |> json(data)
+ end
+
+ def capabilities(conn, _) do
+ data = %{
+ capabilities: %{
+ "m.change_password": %{
+ enabled: false
+ },
+ "m.room_versions": %{
+ default: "1",
+ available: %{
+ "1" => "stable"
+ }
+ }
+ }
+ }
+
+ conn
+ |> json(data)
+ end
+
+ # Just pretend it worked
+ def set_read_marker(conn, _) do
+ conn
+ |> json(%{})
+ end
+
+ def room_members(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"room_id" => chat_id}) do
+ with %Chat{user_id: ^user_id, recipient: recipient_id} = chat <- Chat.get_by_id(chat_id),
+ %User{} = recipient <- User.get_cached_by_ap_id(recipient_id) do
+ membership_events =
+ [user, recipient]
+ |> membership_events_from_list(chat)
+
+ data = %{
+ chunk: membership_events
+ }
+
+ conn
+ |> json(data)
+ end
+ end
+
+ # Undocumented
+ def publicised_groups(conn, _) do
+ data = %{
+ groups: %{}
+ }
+
+ conn
+ |> json(data)
+ end
+
+ defp membership_events_from_list(users, chat) do
+ users
+ |> Enum.map(fn member ->
+ avatar = User.avatar_url(member) |> MediaProxy.url()
+
+ %{
+ content: %{
+ membership: "join",
+ avatar_url: mxc(avatar),
+ displayname: member.name
+ },
+ type: "m.room.member",
+ event_id: "#{chat.id}/join/#{member.id}",
+ room_id: chat.id,
+ sender: matrix_name(member),
+ origin_ts: DateTime.utc_now() |> DateTime.to_unix(),
+ state_key: matrix_name(member)
+ }
+ end)
+ end
+
+ def turn_server(conn, _) do
+ conn
+ |> put_status(404)
+ |> json("not found")
+ end
+
+ def send_event(
+ %{assigns: %{user: %{id: user_id} = user}} = conn,
+ %{
+ "msgtype" => "m.text",
+ "body" => body,
+ "room_id" => chat_id,
+ "event_type" => "m.room.message"
+ }
+ ) do
+ with %Chat{user_id: ^user_id, recipient: recipient_id} <- Chat.get_by_id(chat_id),
+ %User{} = recipient <- User.get_cached_by_ap_id(recipient_id),
+ {:ok, activity} <- CommonAPI.post_chat_message(user, recipient, body) do
+ object = Object.normalize(activity, false)
+
+ data = %{
+ event_id: object.id
+ }
+
+ conn
+ |> json(data)
+ end
+ end
end
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index aa1112e2b..2064fc1bd 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -728,6 +728,15 @@ defmodule Pleroma.Web.Router do
get("/client/r0/sync", MatrixController, :sync)
post("/client/r0/keys/query", MatrixController, :key_query)
get("/client/r0/profile/:user_id", MatrixController, :profile)
+ get("/client/r0/joined_groups", MatrixController, :joined_groups)
+ get("/client/unstable/room_keys/version", MatrixController, :room_keys_version)
+ post("/client/r0/keys/upload", MatrixController, :key_upload)
+ get("/client/r0/capabilities", MatrixController, :capabilities)
+ post("/client/r0/rooms/:room_id/read_markers", MatrixController, :set_read_marker)
+ get("/client/r0/rooms/:room_id/members", MatrixController, :room_members)
+ post("/client/r0/publicised_groups", MatrixController, :publicised_groups)
+ get("/client/r0/voip/turnServer", MatrixController, :turn_server)
+ put("/client/r0/rooms/:room_id/send/:event_type/:txn_id", MatrixController, :send_event)
end
scope "/", Pleroma.Web.MongooseIM do