From c88a9e604f3de4e83cee32f2549046c955deaf59 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 11 Oct 2018 00:09:50 +0200 Subject: [PATCH] Basic FederatedChatChannel. --- .../web/{ => channels}/chat_channel.ex | 0 .../web/channels/federated_chat_channel.ex | 15 ++++++++++ lib/pleroma/web/channels/user_socket.ex | 7 ++++- .../channels/federated_chat_channel_test.exs | 29 +++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) rename lib/pleroma/web/{ => channels}/chat_channel.ex (100%) create mode 100644 lib/pleroma/web/channels/federated_chat_channel.ex create mode 100644 test/web/channels/federated_chat_channel_test.exs diff --git a/lib/pleroma/web/chat_channel.ex b/lib/pleroma/web/channels/chat_channel.ex similarity index 100% rename from lib/pleroma/web/chat_channel.ex rename to lib/pleroma/web/channels/chat_channel.ex diff --git a/lib/pleroma/web/channels/federated_chat_channel.ex b/lib/pleroma/web/channels/federated_chat_channel.ex new file mode 100644 index 000000000..be37ee493 --- /dev/null +++ b/lib/pleroma/web/channels/federated_chat_channel.ex @@ -0,0 +1,15 @@ +defmodule Pleroma.Web.FederatedChatChannel do + use Phoenix.Channel + + def join("federated_chat:room:" <> room_id, params, socket) do + {:ok, socket} + end + + def join("federated_chat:user:" <> user_id, params, socket) do + if user_id == socket.assigns[:user_id] do + {:ok, socket} + else + {:error, %{reason: "unauthorized"}} + end + end +end diff --git a/lib/pleroma/web/channels/user_socket.ex b/lib/pleroma/web/channels/user_socket.ex index 21b22b409..44dec922f 100644 --- a/lib/pleroma/web/channels/user_socket.ex +++ b/lib/pleroma/web/channels/user_socket.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.UserSocket do # channel "room:*", Pleroma.Web.RoomChannel if Application.get_env(:pleroma, :chat) |> Keyword.get(:enabled) do channel("chat:*", Pleroma.Web.ChatChannel) + channel("federated_chat:*", Pleroma.Web.FederatedChatChannel) end ## Transports @@ -26,7 +27,11 @@ defmodule Pleroma.Web.UserSocket do def connect(%{"token" => token}, socket) do with {:ok, user_id} <- Phoenix.Token.verify(socket, "user socket", token, max_age: 84600), %User{} = user <- Pleroma.Repo.get(User, user_id) do - {:ok, assign(socket, :user_name, user.nickname)} + socket = socket + |> assign(:user_name, user.nickname) + |> assign(:user_id, to_string(user.id)) + + {:ok, socket} else _e -> :error end diff --git a/test/web/channels/federated_chat_channel_test.exs b/test/web/channels/federated_chat_channel_test.exs new file mode 100644 index 000000000..57517d0d5 --- /dev/null +++ b/test/web/channels/federated_chat_channel_test.exs @@ -0,0 +1,29 @@ +defmodule Pleroma.Web.FederatedChatChannelTest do + use Pleroma.DataCase + + import Pleroma.Factory + alias Pleroma.Web.FederatedChatChannel + alias Pleroma.Web.ActivityPub.Chat.Room + + test "it allows joining a user topic for the user itself" do + user = insert(:user) + other_user = insert(:user) + socket = %{assigns: %{user_id: to_string(user.id)}} + other_socket = %{assigns: %{user_id: to_string(other_user.id)}} + + topic = "federated_chat:user:#{user.id}" + assert {:ok, ^socket} = FederatedChatChannel.join(topic, %{}, socket) + + # Joining as another user will error out + assert {:error, %{reason: "unauthorized"}} = FederatedChatChannel.join(topic, %{}, other_socket) + end + + test "it allows joining an existing room" do + {:ok, room} = Room.create("test_room") + socket = %{test: :ok} + + topic = "federated_chat:room:#{room.data["id"]}" + + assert {:ok, ^socket} = FederatedChatChannel.join(topic, %{}, socket) + end +end