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 | 39 | ||||
| -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, 63 insertions, 19 deletions
| diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index d9f74b6a4..7d8bb1270 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 @@ -137,12 +138,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 = @@ -182,6 +185,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      end    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), 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..a9bdf3b69 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex @@ -0,0 +1,39 @@ +# 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 activity["type"] == "Create" && 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 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 c4356f93b..4211d6afb 100644 --- a/lib/pleroma/web/common_api/activity_draft.ex +++ b/lib/pleroma/web/common_api/activity_draft.ex @@ -193,6 +193,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 =        %{ @@ -200,7 +207,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 091011c6b..6b41c387c 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -282,20 +282,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 -    # Updates the emojis for a user based on their profile    def update(user) do      emoji = emoji_from_profile(user) | 
