diff options
| author | lain <lain@soykaf.club> | 2020-04-24 16:32:13 +0000 | 
|---|---|---|
| committer | lain <lain@soykaf.club> | 2020-04-24 16:32:13 +0000 | 
| commit | c30b3b2dc5c6da037ae72b6cb537898a78cd53bc (patch) | |
| tree | 3f9233539c314b2c95dcdc086b8e7dcffe8d837e /lib | |
| parent | d862c7156a1edcdc89425143901f140bc0b1f5eb (diff) | |
| parent | d89cd0a19733eec27b79b768df2e30a68bfc6d6b (diff) | |
| download | pleroma-c30b3b2dc5c6da037ae72b6cb537898a78cd53bc.tar.gz pleroma-c30b3b2dc5c6da037ae72b6cb537898a78cd53bc.zip | |
Merge branch 'reply-filtering-refactor' into 'develop'
Reply filtering refactor
See merge request pleroma/pleroma!2424
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/user.ex | 14 | ||||
| -rw-r--r-- | lib/pleroma/user/query.ex | 4 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 37 | ||||
| -rw-r--r-- | lib/pleroma/web/common_api/activity_draft.ex | 16 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex | 2 | 
5 files changed, 64 insertions, 9 deletions
| diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 477237756..b451202b2 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -832,6 +832,7 @@ defmodule Pleroma.User do    def set_cache(%User{} = user) do      Cachex.put(:user_cache, "ap_id:#{user.ap_id}", user)      Cachex.put(:user_cache, "nickname:#{user.nickname}", user) +    Cachex.put(:user_cache, "friends_ap_ids:#{user.nickname}", get_user_friends_ap_ids(user))      {:ok, user}    end @@ -847,9 +848,22 @@ defmodule Pleroma.User do      end    end +  def get_user_friends_ap_ids(user) do +    from(u in User.get_friends_query(user), select: u.ap_id) +    |> Repo.all() +  end + +  @spec get_cached_user_friends_ap_ids(User.t()) :: [String.t()] +  def get_cached_user_friends_ap_ids(user) do +    Cachex.fetch!(:user_cache, "friends_ap_ids:#{user.ap_id}", fn _ -> +      get_user_friends_ap_ids(user) +    end) +  end +    def invalidate_cache(user) do      Cachex.del(:user_cache, "ap_id:#{user.ap_id}")      Cachex.del(:user_cache, "nickname:#{user.nickname}") +    Cachex.del(:user_cache, "friends_ap_ids:#{user.ap_id}")    end    @spec get_cached_by_ap_id(String.t()) :: User.t() | nil diff --git a/lib/pleroma/user/query.ex b/lib/pleroma/user/query.ex index ec88088cf..ac77aab71 100644 --- a/lib/pleroma/user/query.ex +++ b/lib/pleroma/user/query.ex @@ -54,13 +54,13 @@ defmodule Pleroma.User.Query do              select: term(),              limit: pos_integer()            } -          | %{} +          | map()    @ilike_criteria [:nickname, :name, :query]    @equal_criteria [:email]    @contains_criteria [:ap_id, :nickname] -  @spec build(criteria()) :: Query.t() +  @spec build(Query.t(), criteria()) :: Query.t()    def build(query \\ base_query(), criteria) do      prepare_query(query, criteria)    end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index c67b3335d..9ec31fb03 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1047,6 +1047,41 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      )    end +  defp restrict_replies(query, %{ +         "reply_filtering_user" => user, +         "reply_visibility" => "self" +       }) do +    from( +      [activity, object] in query, +      where: +        fragment( +          "?->>'inReplyTo' is null OR ? = ANY(?)", +          object.data, +          ^user.ap_id, +          activity.recipients +        ) +    ) +  end + +  defp restrict_replies(query, %{ +         "reply_filtering_user" => user, +         "reply_visibility" => "following" +       }) do +    from( +      [activity, object] in query, +      where: +        fragment( +          "?->>'inReplyTo' is null OR ? && array_remove(?, ?) OR ? = ?", +          object.data, +          ^[user.ap_id | User.get_cached_user_friends_ap_ids(user)], +          activity.recipients, +          activity.actor, +          activity.actor, +          ^user.ap_id +        ) +    ) +  end +    defp restrict_replies(query, _), do: query    defp restrict_reblogs(query, %{"exclude_reblogs" => val}) when val == "true" or val == "1" do @@ -1261,6 +1296,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      |> maybe_set_thread_muted_field(opts)      |> maybe_order(opts)      |> restrict_recipients(recipients, opts["user"]) +    |> restrict_replies(opts)      |> restrict_tag(opts)      |> restrict_tag_reject(opts)      |> restrict_tag_all(opts) @@ -1275,7 +1311,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      |> restrict_media(opts)      |> restrict_visibility(opts)      |> restrict_thread_visibility(opts, config) -    |> restrict_replies(opts)      |> restrict_reblogs(opts)      |> restrict_pinned(opts)      |> restrict_muted_reblogs(restrict_muted_reblogs_opts) diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex index c1cd15bb2..244cf2be5 100644 --- a/lib/pleroma/web/common_api/activity_draft.ex +++ b/lib/pleroma/web/common_api/activity_draft.ex @@ -84,14 +84,18 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do      %__MODULE__{draft | attachments: attachments}    end -  defp in_reply_to(draft) do -    case Map.get(draft.params, "in_reply_to_status_id") do -      "" -> draft -      nil -> draft -      id -> %__MODULE__{draft | in_reply_to: Activity.get_by_id(id)} -    end +  defp in_reply_to(%{params: %{"in_reply_to_status_id" => ""}} = draft), do: draft + +  defp in_reply_to(%{params: %{"in_reply_to_status_id" => id}} = draft) when is_binary(id) do +    %__MODULE__{draft | in_reply_to: Activity.get_by_id(id)}    end +  defp in_reply_to(%{params: %{"in_reply_to_status_id" => %Activity{} = in_reply_to}} = draft) do +    %__MODULE__{draft | in_reply_to: in_reply_to} +  end + +  defp in_reply_to(draft), do: draft +    defp in_reply_to_conversation(draft) do      in_reply_to_conversation = Participation.get(draft.params["in_reply_to_conversation_id"])      %__MODULE__{draft | in_reply_to_conversation: in_reply_to_conversation} diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index b3c58005e..403d500e0 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -37,6 +37,7 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do        |> Map.put("type", ["Create", "Announce"])        |> Map.put("blocking_user", user)        |> Map.put("muting_user", user) +      |> Map.put("reply_filtering_user", user)        |> Map.put("user", user)      recipients = [user.ap_id | User.following(user)] @@ -100,6 +101,7 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do          |> Map.put("local_only", local_only)          |> Map.put("blocking_user", user)          |> Map.put("muting_user", user) +        |> Map.put("reply_filtering_user", user)          |> ActivityPub.fetch_public_activities()        conn | 
