X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fweb%2Factivity_pub%2Factivity_pub.ex;h=d5d00d4a2726f0e5802af5b901836683a7c1b04d;hb=c8d418acddd72e628caad9a6b11ff6debd3386e9;hp=fde6e12d78f712e3074cbddd0cf0f37bc2653731;hpb=6c2903d9a175cfbf3785d5c1a43e6fcac6b0e9f5;p=akkoma diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index fde6e12d7..d5d00d4a2 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -43,12 +43,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do if activity.data["type"] in ["Create", "Announce"] do Pleroma.Web.Streamer.stream("user", activity) - if Enum.member?(activity.data["to"], "https://www.w3.org/ns/activitystreams#Public") do - Pleroma.Web.Streamer.stream("public", activity) + visibility = Pleroma.Web.MastodonAPI.StatusView.get_visibility(activity.data["object"]) - if activity.local do - Pleroma.Web.Streamer.stream("public:local", activity) - end + case visibility do + "public" -> + Pleroma.Web.Streamer.stream("public", activity) + if activity.local, do: Pleroma.Web.Streamer.stream("public:local", activity) + + "direct" -> + Pleroma.Web.Streamer.stream("direct", activity) end end end @@ -221,6 +224,28 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> Enum.reverse() end + @valid_visibilities ~w[direct unlisted public private] + + defp restrict_visibility(query, %{visibility: "direct"}) do + public = "https://www.w3.org/ns/activitystreams#Public" + + from( + activity in query, + join: sender in User, + on: sender.ap_id == activity.actor, + where: + fragment("not data->'to' \\? ?", ^public) and fragment("not data->'cc' \\? ?", ^public) and + fragment("not data->'to' \\? ?", sender.follower_address) + ) + end + + defp restrict_visibility(_query, %{visibility: visibility}) + when visibility not in @valid_visibilities do + Logger.error("Could not restrict visibility to #{visibility}") + end + + defp restrict_visibility(query, _visibility), do: query + defp restrict_since(query, %{"since_id" => since_id}) do from(activity in query, where: activity.id > ^since_id) end @@ -344,6 +369,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> restrict_recent(opts) |> restrict_blocked(opts) |> restrict_media(opts) + |> restrict_visibility(opts) end def fetch_activities(recipients, opts \\ %{}) do