diff options
| author | Sergey Suprunenko <suprunenko.s@gmail.com> | 2019-11-16 22:54:13 +0100 | 
|---|---|---|
| committer | Alexander Strizhakov <alex.strizhakov@gmail.com> | 2020-07-06 09:28:21 +0300 | 
| commit | 4a8c26654eb7ca7ce049dd4c485c16672b5837a6 (patch) | |
| tree | a85c4f8b2e949b7f9e8952c30091b1182b4956a0 /lib | |
| parent | c2a052a346d5104c3657343a885255d4d7179c75 (diff) | |
| download | pleroma-4a8c26654eb7ca7ce049dd4c485c16672b5837a6.tar.gz pleroma-4a8c26654eb7ca7ce049dd4c485c16672b5837a6.zip | |
Restrict statuses that contain user's irreversible filters
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/filter.ex | 42 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 22 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/controllers/filter_controller.ex | 2 | 
3 files changed, 63 insertions, 3 deletions
| diff --git a/lib/pleroma/filter.ex b/lib/pleroma/filter.ex index 4d61b3650..91884c6b3 100644 --- a/lib/pleroma/filter.ex +++ b/lib/pleroma/filter.ex @@ -34,10 +34,18 @@ defmodule Pleroma.Filter do      Repo.one(query)    end -  def get_filters(%User{id: user_id} = _user) do +  def get_active(query) do +    from(f in query, where: is_nil(f.expires_at) or f.expires_at > ^NaiveDateTime.utc_now()) +  end + +  def get_irreversible(query) do +    from(f in query, where: f.hide) +  end + +  def get_by_user(query, %User{id: user_id} = _user) do      query =        from( -        f in Pleroma.Filter, +        f in query,          where: f.user_id == ^user_id,          order_by: [desc: :id]        ) @@ -95,4 +103,34 @@ defmodule Pleroma.Filter do      |> validate_required([:phrase, :context])      |> Repo.update()    end + +  def compose_regex(user_or_filters, format \\ :postgres) + +  def compose_regex(%User{} = user, format) do +    __MODULE__ +    |> get_active() +    |> get_irreversible() +    |> get_by_user(user) +    |> compose_regex(format) +  end + +  def compose_regex([_ | _] = filters, format) do +    phrases = +      filters +      |> Enum.map(& &1.phrase) +      |> Enum.join("|") + +    case format do +      :postgres -> +        "\\y(#{phrases})\\y" + +      :re -> +        ~r/\b#{phrases}\b/i + +      _ -> +        nil +    end +  end + +  def compose_regex(_, _), do: nil  end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 94117202c..31353c866 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    alias Pleroma.Constants    alias Pleroma.Conversation    alias Pleroma.Conversation.Participation +  alias Pleroma.Filter    alias Pleroma.Maps    alias Pleroma.Notification    alias Pleroma.Object @@ -961,6 +962,26 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    defp restrict_instance(query, _), do: query +  defp restrict_filtered(query, %{user: %User{} = user}) do +    case Filter.compose_regex(user) do +      nil -> +        query + +      regex -> +        from([activity, object] in query, +          where: +            fragment("not(?->>'content' ~* ?)", object.data, ^regex) or +              activity.actor == ^user.ap_id +        ) +    end +  end + +  defp restrict_filtered(query, %{blocking_user: %User{} = user}) do +    restrict_filtered(query, %{user: user}) +  end + +  defp restrict_filtered(query, _), do: query +    defp exclude_poll_votes(query, %{include_poll_votes: true}), do: query    defp exclude_poll_votes(query, _) do @@ -1099,6 +1120,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      |> restrict_muted_reblogs(restrict_muted_reblogs_opts)      |> restrict_instance(opts)      |> restrict_announce_object_actor(opts) +    |> restrict_filtered(opts)      |> Activity.restrict_deactivated_users()      |> exclude_poll_votes(opts)      |> exclude_chat_messages(opts) diff --git a/lib/pleroma/web/mastodon_api/controllers/filter_controller.ex b/lib/pleroma/web/mastodon_api/controllers/filter_controller.ex index abbf0ce02..db1ff3189 100644 --- a/lib/pleroma/web/mastodon_api/controllers/filter_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/filter_controller.ex @@ -22,7 +22,7 @@ defmodule Pleroma.Web.MastodonAPI.FilterController do    @doc "GET /api/v1/filters"    def index(%{assigns: %{user: user}} = conn, _) do -    filters = Filter.get_filters(user) +    filters = Filter.get_by_user(Filter, user)      render(conn, "index.json", filters: filters)    end | 
