aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web/streamer
diff options
context:
space:
mode:
authorlain <lain@soykaf.club>2020-05-13 08:12:09 +0000
committerlain <lain@soykaf.club>2020-05-13 08:12:09 +0000
commita5ccb5b0b1032b102c54d4df2e17c61423089e73 (patch)
tree48f8014dbdd9deb8b9aae1d894344c039c203918 /lib/pleroma/web/streamer
parenta6283bbae13a873af969336bd4e62011777a1a70 (diff)
parent2906cbbd40ea07c2ceb4d67e1c889cc7ab8b7662 (diff)
downloadpleroma-2.0.5.tar.gz
Merge branch 'release/2.0.5' into 'stable'v2.0.5
Release/2.0.5 See merge request pleroma/secteam/pleroma!4
Diffstat (limited to 'lib/pleroma/web/streamer')
-rw-r--r--lib/pleroma/web/streamer/state.ex19
-rw-r--r--lib/pleroma/web/streamer/streamer.ex65
2 files changed, 69 insertions, 15 deletions
diff --git a/lib/pleroma/web/streamer/state.ex b/lib/pleroma/web/streamer/state.ex
index 999550b88..4eb462a1a 100644
--- a/lib/pleroma/web/streamer/state.ex
+++ b/lib/pleroma/web/streamer/state.ex
@@ -36,30 +36,28 @@ defmodule Pleroma.Web.Streamer.State do
end
def handle_call({:add, topic, socket}, _from, %{sockets: sockets} = state) do
- internal_topic = internal_topic(topic, socket)
stream_socket = StreamerSocket.from_socket(socket)
sockets_for_topic =
sockets
- |> Map.get(internal_topic, [])
+ |> Map.get(topic, [])
|> List.insert_at(0, stream_socket)
|> Enum.uniq()
- state = put_in(state, [:sockets, internal_topic], sockets_for_topic)
+ state = put_in(state, [:sockets, topic], sockets_for_topic)
Logger.debug("Got new conn for #{topic}")
{:reply, state, state}
end
def handle_call({:remove, topic, socket}, _from, %{sockets: sockets} = state) do
- internal_topic = internal_topic(topic, socket)
stream_socket = StreamerSocket.from_socket(socket)
sockets_for_topic =
sockets
- |> Map.get(internal_topic, [])
+ |> Map.get(topic, [])
|> List.delete(stream_socket)
- state = Kernel.put_in(state, [:sockets, internal_topic], sockets_for_topic)
+ state = Kernel.put_in(state, [:sockets, topic], sockets_for_topic)
{:reply, state, state}
end
@@ -70,13 +68,4 @@ defmodule Pleroma.Web.Streamer.State do
defp do_remove_socket(_env, topic, socket) do
GenServer.call(__MODULE__, {:remove, topic, socket})
end
-
- defp internal_topic(topic, socket)
- when topic in ~w[user user:notification direct] do
- "#{topic}:#{socket.assigns[:user].id}"
- end
-
- defp internal_topic(topic, _) do
- topic
- end
end
diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex
index 814d5a729..b7294d084 100644
--- a/lib/pleroma/web/streamer/streamer.ex
+++ b/lib/pleroma/web/streamer/streamer.ex
@@ -3,12 +3,77 @@
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.Streamer do
+ alias Pleroma.User
alias Pleroma.Web.Streamer.State
alias Pleroma.Web.Streamer.Worker
@timeout 60_000
@mix_env Mix.env()
+ @public_streams ["public", "public:local", "public:media", "public:local:media"]
+ @user_streams ["user", "user:notification", "direct"]
+
+ @doc "Expands and authorizes a stream, and registers the process for streaming."
+ @spec get_topic_and_add_socket(stream :: String.t(), State.t(), Map.t() | nil) ::
+ {:ok, topic :: String.t()} | {:error, :bad_topic} | {:error, :unauthorized}
+ def get_topic_and_add_socket(stream, socket, params \\ %{}) do
+ user =
+ case socket do
+ %{assigns: %{user: user}} -> user
+ _ -> nil
+ end
+
+ case get_topic(stream, user, params) do
+ {:ok, topic} ->
+ add_socket(topic, socket)
+ {:ok, topic}
+
+ error ->
+ error
+ end
+ end
+
+ @doc "Expand and authorizes a stream"
+ @spec get_topic(stream :: String.t(), User.t() | nil, Map.t()) ::
+ {:ok, topic :: String.t()} | {:error, :bad_topic}
+ def get_topic(stream, user, params \\ %{})
+
+ # Allow all public steams.
+ def get_topic(stream, _, _) when stream in @public_streams do
+ {:ok, stream}
+ end
+
+ # Allow all hashtags streams.
+ def get_topic("hashtag", _, %{"tag" => tag}) do
+ {:ok, "hashtag:" <> tag}
+ end
+
+ # Expand user streams.
+ def get_topic(stream, %User{} = user, _) when stream in @user_streams do
+ {:ok, stream <> ":" <> to_string(user.id)}
+ end
+
+ def get_topic(stream, _, _) when stream in @user_streams do
+ {:error, :unauthorized}
+ end
+
+ # List streams.
+ def get_topic("list", %User{} = user, %{"list" => id}) do
+ if Pleroma.List.get(id, user) do
+ {:ok, "list:" <> to_string(id)}
+ else
+ {:error, :bad_topic}
+ end
+ end
+
+ def get_topic("list", _, _) do
+ {:error, :unauthorized}
+ end
+
+ def get_topic(_, _, _) do
+ {:error, :bad_topic}
+ end
+
def add_socket(topic, socket) do
State.add_socket(topic, socket)
end