diff options
| author | lain <lain@soykaf.club> | 2019-11-15 12:44:54 +0000 | 
|---|---|---|
| committer | lain <lain@soykaf.club> | 2019-11-15 12:44:54 +0000 | 
| commit | 13b6aefd59776b5979175cfce8d6d8dd0183a324 (patch) | |
| tree | f8c9666ce4961b2b8112fe53e974bedc4ffa34ea /lib | |
| parent | 09b4f7269e5307f29fc8ca7b548e93cd93836dc5 (diff) | |
| parent | 075789c442501edc10cf20dc54cf011ddcc5bc14 (diff) | |
| download | pleroma-13b6aefd59776b5979175cfce8d6d8dd0183a324.tar.gz pleroma-13b6aefd59776b5979175cfce8d6d8dd0183a324.zip | |
Merge branch 'feature/mrf-object-age-policy' into 'develop'
MRF: add ObjectAgePolicy
See merge request pleroma/pleroma!1982
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/web/activity_pub/mrf/object_age_policy.ex | 101 | 
1 files changed, 101 insertions, 0 deletions
| diff --git a/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex b/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex new file mode 100644 index 000000000..8b36c1021 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex @@ -0,0 +1,101 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy do +  alias Pleroma.Config +  alias Pleroma.User +  alias Pleroma.Web.ActivityPub.MRF + +  require Pleroma.Constants + +  @moduledoc "Filter activities depending on their age" +  @behaviour MRF + +  defp check_date(%{"published" => published} = message) do +    with %DateTime{} = now <- DateTime.utc_now(), +         {:ok, %DateTime{} = then, _} <- DateTime.from_iso8601(published), +         max_ttl <- Config.get([:mrf_object_age, :threshold]), +         {:ttl, false} <- {:ttl, DateTime.diff(now, then) > max_ttl} do +      {:ok, message} +    else +      {:ttl, true} -> +        {:reject, nil} + +      e -> +        {:error, e} +    end +  end + +  defp check_reject(message, actions) do +    if :reject in actions do +      {:reject, nil} +    else +      {:ok, message} +    end +  end + +  defp check_delist(message, actions) do +    if :delist in actions do +      with %User{} = user <- User.get_cached_by_ap_id(message["actor"]) do +        to = List.delete(message["to"], Pleroma.Constants.as_public()) ++ [user.follower_address] +        cc = List.delete(message["cc"], user.follower_address) ++ [Pleroma.Constants.as_public()] + +        message = +          message +          |> Map.put("to", to) +          |> Map.put("cc", cc) + +        {:ok, message} +      else +        # Unhandleable error: somebody is messing around, just drop the message. +        _e -> +          {:reject, nil} +      end +    else +      {:ok, message} +    end +  end + +  defp check_strip_followers(message, actions) do +    if :strip_followers in actions do +      with %User{} = user <- User.get_cached_by_ap_id(message["actor"]) do +        to = List.delete(message["to"], user.follower_address) +        cc = List.delete(message["cc"], user.follower_address) + +        message = +          message +          |> Map.put("to", to) +          |> Map.put("cc", cc) + +        {:ok, message} +      else +        # Unhandleable error: somebody is messing around, just drop the message. +        _e -> +          {:reject, nil} +      end +    else +      {:ok, message} +    end +  end + +  @impl true +  def filter(%{"type" => "Create", "published" => _} = message) do +    with actions <- Config.get([:mrf_object_age, :actions]), +         {:reject, _} <- check_date(message), +         {:ok, message} <- check_reject(message, actions), +         {:ok, message} <- check_delist(message, actions), +         {:ok, message} <- check_strip_followers(message, actions) do +      {:ok, message} +    else +      # check_date() is allowed to short-circuit the pipeline +      e -> e +    end +  end + +  @impl true +  def filter(message), do: {:ok, message} + +  @impl true +  def describe, do: {:ok, %{}} +end | 
