Merge branch 'hotfix/delete-activities' into 'develop'
authorrinpatch <rinpatch@sdf.org>
Thu, 14 Mar 2019 17:49:00 +0000 (17:49 +0000)
committerrinpatch <rinpatch@sdf.org>
Thu, 14 Mar 2019 17:49:00 +0000 (17:49 +0000)
Fix delete activities not federating

See merge request pleroma/pleroma!933

1  2 
lib/pleroma/web/activity_pub/activity_pub.ex

index d5b03cd2488d47be265fb9474c7418426120a20f,96b774c2124bd7476d7f3f1c598484b84bde0163..70db419cad6cf400b92efb3d2fc1ea2a69e05634
@@@ -4,17 -4,17 +4,17 @@@
  
  defmodule Pleroma.Web.ActivityPub.ActivityPub do
    alias Pleroma.Activity
 -  alias Pleroma.Repo
 +  alias Pleroma.Instances
 +  alias Pleroma.Notification
    alias Pleroma.Object
 +  alias Pleroma.Repo
    alias Pleroma.Upload
    alias Pleroma.User
 -  alias Pleroma.Notification
 -  alias Pleroma.Instances
 -  alias Pleroma.Web.ActivityPub.Transmogrifier
    alias Pleroma.Web.ActivityPub.MRF
 -  alias Pleroma.Web.WebFinger
 +  alias Pleroma.Web.ActivityPub.Transmogrifier
    alias Pleroma.Web.Federator
    alias Pleroma.Web.OStatus
 +  alias Pleroma.Web.WebFinger
  
    import Ecto.Query
    import Pleroma.Web.ActivityPub.Utils
               additional
             ),
           {:ok, activity} <- insert(create_data, local),
 -         # Changing note count prior to enqueuing federation task in order to avoid race conditions on updating user.info
 +         # Changing note count prior to enqueuing federation task in order to avoid
 +         # race conditions on updating user.info
           {:ok, _actor} <- increase_note_count_if_public(actor, activity),
           :ok <- maybe_federate(activity) do
        {:ok, activity}
  
    def delete(%Object{data: %{"id" => id, "actor" => actor}} = object, local \\ true) do
      user = User.get_cached_by_ap_id(actor)
-     to = object.data["to"] || [] ++ object.data["cc"] || []
+     to = (object.data["to"] || []) ++ (object.data["cc"] || [])
  
 -    data = %{
 -      "type" => "Delete",
 -      "actor" => actor,
 -      "object" => id,
 -      "to" => to
 -    }
 -
 -    with {:ok, _} <- Object.delete(object),
 +    with {:ok, object, activity} <- Object.delete(object),
 +         data <- %{
 +           "type" => "Delete",
 +           "actor" => actor,
 +           "object" => id,
 +           "to" => to,
 +           "deleted_activity_id" => activity && activity.id
 +         },
           {:ok, activity} <- insert(data, local),
 -         # Changing note count prior to enqueuing federation task in order to avoid race conditions on updating user.info
 +         # Changing note count prior to enqueuing federation task in order to avoid
 +         # race conditions on updating user.info
           {:ok, _actor} <- decrease_note_count_if_public(user, object),
           :ok <- maybe_federate(activity) do
        {:ok, activity}
         when is_list(tag_reject) and tag_reject != [] do
      from(
        activity in query,
 -      where: fragment("(not (? #> '{\"object\",\"tag\"}') \\?| ?)", activity.data, ^tag_reject)
 +      where: fragment(~s(\(not \(? #> '{"object","tag"}'\) \\?| ?\)), activity.data, ^tag_reject)
      )
    end
  
         when is_list(tag_all) and tag_all != [] do
      from(
        activity in query,
 -      where: fragment("(? #> '{\"object\",\"tag\"}') \\?& ?", activity.data, ^tag_all)
 +      where: fragment(~s(\(? #> '{"object","tag"}'\) \\?& ?), activity.data, ^tag_all)
      )
    end
  
    defp restrict_tag(query, %{"tag" => tag}) when is_list(tag) do
      from(
        activity in query,
 -      where: fragment("(? #> '{\"object\",\"tag\"}') \\?| ?", activity.data, ^tag)
 +      where: fragment(~s(\(? #> '{"object","tag"}'\) \\?| ?), activity.data, ^tag)
      )
    end
  
    defp restrict_tag(query, %{"tag" => tag}) when is_binary(tag) do
      from(
        activity in query,
 -      where: fragment("? <@ (? #> '{\"object\",\"tag\"}')", ^tag, activity.data)
 +      where: fragment(~s(? <@ (? #> '{"object","tag"}'\)), ^tag, activity.data)
      )
    end
  
    defp restrict_favorited_by(query, %{"favorited_by" => ap_id}) do
      from(
        activity in query,
 -      where: fragment("? <@ (? #> '{\"object\",\"likes\"}')", ^ap_id, activity.data)
 +      where: fragment(~s(? <@ (? #> '{"object","likes"}'\)), ^ap_id, activity.data)
      )
    end
  
    defp restrict_media(query, %{"only_media" => val}) when val == "true" or val == "1" do
      from(
        activity in query,
 -      where: fragment("not (? #> '{\"object\",\"attachment\"}' = ?)", activity.data, ^[])
 +      where: fragment(~s(not (? #> '{"object","attachment"}' = ?\)), activity.data, ^[])
      )
    end