diff options
author | lain <lain@soykaf.club> | 2020-05-13 08:12:09 +0000 |
---|---|---|
committer | lain <lain@soykaf.club> | 2020-05-13 08:12:09 +0000 |
commit | a5ccb5b0b1032b102c54d4df2e17c61423089e73 (patch) | |
tree | 48f8014dbdd9deb8b9aae1d894344c039c203918 /lib/pleroma/web/streamer/streamer.ex | |
parent | a6283bbae13a873af969336bd4e62011777a1a70 (diff) | |
parent | 2906cbbd40ea07c2ceb4d67e1c889cc7ab8b7662 (diff) | |
download | pleroma-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/streamer.ex')
-rw-r--r-- | lib/pleroma/web/streamer/streamer.ex | 65 |
1 files changed, 65 insertions, 0 deletions
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 |