diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 15 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/mrf.ex | 7 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex | 43 | ||||
| -rw-r--r-- | lib/pleroma/web/common_api/activity_draft.ex | 9 | ||||
| -rw-r--r-- | lib/pleroma/web/common_api/common_api.ex | 12 | 
5 files changed, 67 insertions, 19 deletions
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index aeec4beae..a5f8ba40a 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -5,6 +5,7 @@  defmodule Pleroma.Web.ActivityPub.ActivityPub do    alias Pleroma.Activity    alias Pleroma.Activity.Ir.Topics +  alias Pleroma.ActivityExpiration    alias Pleroma.Config    alias Pleroma.Constants    alias Pleroma.Conversation @@ -146,12 +147,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           {:containment, :ok} <- {:containment, Containment.contain_child(map)},           {:ok, map, object} <- insert_full_object(map) do        {:ok, activity} = -        Repo.insert(%Activity{ +        %Activity{            data: map,            local: local,            actor: map["actor"],            recipients: recipients -        }) +        } +        |> Repo.insert() +        |> maybe_create_activity_expiration()        # Splice in the child object if we have one.        activity = Maps.put_if_present(activity, :object, object) @@ -189,6 +192,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      stream_out_participations(participations)    end +  defp maybe_create_activity_expiration({:ok, %{data: %{"expires_at" => expires_at}} = activity}) do +    with {:ok, _} <- ActivityExpiration.create(activity, expires_at) do +      {:ok, activity} +    end +  end + +  defp maybe_create_activity_expiration(result), do: result +    defp create_or_bump_conversation(activity, actor) do      with {:ok, conversation} <- Conversation.create_or_bump_for(activity),           %User{} = user <- User.get_cached_by_ap_id(actor) do diff --git a/lib/pleroma/web/activity_pub/mrf.ex b/lib/pleroma/web/activity_pub/mrf.ex index a0b3af432..5a4a76085 100644 --- a/lib/pleroma/web/activity_pub/mrf.ex +++ b/lib/pleroma/web/activity_pub/mrf.ex @@ -8,11 +8,8 @@ defmodule Pleroma.Web.ActivityPub.MRF do    def filter(policies, %{} = object) do      policies      |> Enum.reduce({:ok, object}, fn -      policy, {:ok, object} -> -        policy.filter(object) - -      _, error -> -        error +      policy, {:ok, object} -> policy.filter(object) +      _, error -> error      end)    end diff --git a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex new file mode 100644 index 000000000..8e47f1e02 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex @@ -0,0 +1,43 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do +  @moduledoc "Adds expiration to all local Create activities" +  @behaviour Pleroma.Web.ActivityPub.MRF + +  @impl true +  def filter(activity) do +    activity = +      if note?(activity) and local?(activity) do +        maybe_add_expiration(activity) +      else +        activity +      end + +    {:ok, activity} +  end + +  @impl true +  def describe, do: {:ok, %{}} + +  defp local?(%{"id" => id}) do +    String.starts_with?(id, Pleroma.Web.Endpoint.url()) +  end + +  defp note?(activity) do +    match?(%{"type" => "Create", "object" => %{"type" => "Note"}}, activity) +  end + +  defp maybe_add_expiration(activity) do +    days = Pleroma.Config.get([:mrf_activity_expiration, :days], 365) +    expires_at = NaiveDateTime.utc_now() |> Timex.shift(days: days) + +    with %{"expires_at" => existing_expires_at} <- activity, +         :lt <- NaiveDateTime.compare(existing_expires_at, expires_at) do +      activity +    else +      _ -> Map.put(activity, "expires_at", expires_at) +    end +  end +end diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex index 3f1a50b96..9bcb9f587 100644 --- a/lib/pleroma/web/common_api/activity_draft.ex +++ b/lib/pleroma/web/common_api/activity_draft.ex @@ -197,6 +197,13 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do    defp changes(draft) do      direct? = draft.visibility == "direct" +    additional = %{"cc" => draft.cc, "directMessage" => direct?} + +    additional = +      case draft.expires_at do +        %NaiveDateTime{} = expires_at -> Map.put(additional, "expires_at", expires_at) +        _ -> additional +      end      changes =        %{ @@ -204,7 +211,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do          actor: draft.user,          context: draft.context,          object: draft.object, -        additional: %{"cc" => draft.cc, "directMessage" => direct?} +        additional: additional        }        |> Utils.maybe_add_list_data(draft.user, draft.visibility) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 5a194910d..04e081a8e 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -423,20 +423,10 @@ defmodule Pleroma.Web.CommonAPI do    def post(user, %{status: _} = data) do      with {:ok, draft} <- Pleroma.Web.CommonAPI.ActivityDraft.create(user, data) do -      draft.changes -      |> ActivityPub.create(draft.preview?) -      |> maybe_create_activity_expiration(draft.expires_at) +      ActivityPub.create(draft.changes, draft.preview?)      end    end -  defp maybe_create_activity_expiration({:ok, activity}, %NaiveDateTime{} = expires_at) do -    with {:ok, _} <- ActivityExpiration.create(activity, expires_at) do -      {:ok, activity} -    end -  end - -  defp maybe_create_activity_expiration(result, _), do: result -    def pin(id, %{ap_id: user_ap_id} = user) do      with %Activity{             actor: ^user_ap_id,  | 
