mirror of
https://git.pleroma.social/pleroma/pleroma.git
synced 2024-12-23 16:40:29 +00:00
CommonAPI: Don't make repeating announces possible
This commit is contained in:
parent
6e0b046771
commit
2e58fe08cd
4 changed files with 30 additions and 53 deletions
|
@ -83,8 +83,9 @@ defmodule Pleroma.Web.CommonAPI do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def repeat(id_or_ap_id, user, params \\ %{}) do
|
def repeat(id, user, params \\ %{}) do
|
||||||
with {_, %Activity{} = activity} <- {:find_activity, get_by_id_or_ap_id(id_or_ap_id)},
|
with {_, %Activity{data: %{"type" => "Create"}} = activity} <-
|
||||||
|
{:find_activity, Activity.get_by_id(id)},
|
||||||
object <- Object.normalize(activity),
|
object <- Object.normalize(activity),
|
||||||
announce_activity <- Utils.get_existing_announce(user.ap_id, object),
|
announce_activity <- Utils.get_existing_announce(user.ap_id, object),
|
||||||
public <- public_announce?(object, params) do
|
public <- public_announce?(object, params) do
|
||||||
|
@ -99,8 +100,9 @@ defmodule Pleroma.Web.CommonAPI do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def unrepeat(id_or_ap_id, user) do
|
def unrepeat(id, user) do
|
||||||
with {_, %Activity{} = activity} <- {:find_activity, get_by_id_or_ap_id(id_or_ap_id)} do
|
with {_, %Activity{data: %{"type" => "Create"}} = activity} <-
|
||||||
|
{:find_activity, Activity.get_by_id(id)} do
|
||||||
object = Object.normalize(activity)
|
object = Object.normalize(activity)
|
||||||
ActivityPub.unannounce(user, object)
|
ActivityPub.unannounce(user, object)
|
||||||
else
|
else
|
||||||
|
@ -109,8 +111,8 @@ defmodule Pleroma.Web.CommonAPI do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def favorite(id_or_ap_id, user) do
|
def favorite(id, user) do
|
||||||
with {_, %Activity{} = activity} <- {:find_activity, get_by_id_or_ap_id(id_or_ap_id)},
|
with {_, %Activity{} = activity} <- {:find_activity, Activity.get_by_id(id)},
|
||||||
object <- Object.normalize(activity),
|
object <- Object.normalize(activity),
|
||||||
like_activity <- Utils.get_existing_like(user.ap_id, object) do
|
like_activity <- Utils.get_existing_like(user.ap_id, object) do
|
||||||
if like_activity do
|
if like_activity do
|
||||||
|
@ -124,8 +126,9 @@ defmodule Pleroma.Web.CommonAPI do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def unfavorite(id_or_ap_id, user) do
|
def unfavorite(id, user) do
|
||||||
with {_, %Activity{} = activity} <- {:find_activity, get_by_id_or_ap_id(id_or_ap_id)} do
|
with {_, %Activity{data: %{"type" => "Create"}} = activity} <-
|
||||||
|
{:find_activity, Activity.get_by_id(id)} do
|
||||||
object = Object.normalize(activity)
|
object = Object.normalize(activity)
|
||||||
ActivityPub.unlike(user, object)
|
ActivityPub.unlike(user, object)
|
||||||
else
|
else
|
||||||
|
@ -316,12 +319,12 @@ defmodule Pleroma.Web.CommonAPI do
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
def pin(id_or_ap_id, %{ap_id: user_ap_id} = user) do
|
def pin(id, %{ap_id: user_ap_id} = user) do
|
||||||
with %Activity{
|
with %Activity{
|
||||||
actor: ^user_ap_id,
|
actor: ^user_ap_id,
|
||||||
data: %{"type" => "Create"},
|
data: %{"type" => "Create"},
|
||||||
object: %Object{data: %{"type" => object_type}}
|
object: %Object{data: %{"type" => object_type}}
|
||||||
} = activity <- get_by_id_or_ap_id(id_or_ap_id),
|
} = activity <- Activity.get_by_id_with_object(id),
|
||||||
true <- object_type in ["Note", "Article", "Question"],
|
true <- object_type in ["Note", "Article", "Question"],
|
||||||
true <- Visibility.is_public?(activity),
|
true <- Visibility.is_public?(activity),
|
||||||
{:ok, _user} <- User.add_pinnned_activity(user, activity) do
|
{:ok, _user} <- User.add_pinnned_activity(user, activity) do
|
||||||
|
@ -332,8 +335,8 @@ defmodule Pleroma.Web.CommonAPI do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def unpin(id_or_ap_id, user) do
|
def unpin(id, user) do
|
||||||
with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id),
|
with %Activity{data: %{"type" => "Create"}} = activity <- Activity.get_by_id(id),
|
||||||
{:ok, _user} <- User.remove_pinnned_activity(user, activity) do
|
{:ok, _user} <- User.remove_pinnned_activity(user, activity) do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
else
|
else
|
||||||
|
|
|
@ -24,24 +24,6 @@ defmodule Pleroma.Web.CommonAPI.Utils do
|
||||||
require Logger
|
require Logger
|
||||||
require Pleroma.Constants
|
require Pleroma.Constants
|
||||||
|
|
||||||
# This is a hack for twidere.
|
|
||||||
def get_by_id_or_ap_id(id) do
|
|
||||||
activity =
|
|
||||||
with true <- FlakeId.flake_id?(id),
|
|
||||||
%Activity{} = activity <- Activity.get_by_id_with_object(id) do
|
|
||||||
activity
|
|
||||||
else
|
|
||||||
_ -> Activity.get_create_by_object_ap_id_with_object(id)
|
|
||||||
end
|
|
||||||
|
|
||||||
activity &&
|
|
||||||
if activity.data["type"] == "Create" do
|
|
||||||
activity
|
|
||||||
else
|
|
||||||
Activity.get_create_by_object_ap_id_with_object(activity.data["object"])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def attachments_from_ids(%{"media_ids" => ids, "descriptions" => desc} = _) do
|
def attachments_from_ids(%{"media_ids" => ids, "descriptions" => desc} = _) do
|
||||||
attachments_from_ids_descs(ids, desc)
|
attachments_from_ids_descs(ids, desc)
|
||||||
end
|
end
|
||||||
|
|
|
@ -268,6 +268,16 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
{:ok, %Activity{}, _} = CommonAPI.repeat(activity.id, user)
|
{:ok, %Activity{}, _} = CommonAPI.repeat(activity.id, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "can't repeat a repeat" do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
|
||||||
|
|
||||||
|
{:ok, %Activity{} = announce, _} = CommonAPI.repeat(activity.id, other_user)
|
||||||
|
|
||||||
|
refute match?({:ok, %Activity{}, _}, CommonAPI.repeat(announce.id, user))
|
||||||
|
end
|
||||||
|
|
||||||
test "repeating a status privately" do
|
test "repeating a status privately" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
@ -294,8 +304,8 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
||||||
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
|
{:ok, activity} = CommonAPI.post(other_user, %{"status" => "cofe"})
|
||||||
{:ok, %Activity{} = activity, object} = CommonAPI.repeat(activity.id, user)
|
{:ok, %Activity{} = announce, object} = CommonAPI.repeat(activity.id, user)
|
||||||
{:ok, ^activity, ^object} = CommonAPI.repeat(activity.id, user)
|
{:ok, ^announce, ^object} = CommonAPI.repeat(activity.id, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "favoriting a status twice returns the status" do
|
test "favoriting a status twice returns the status" do
|
||||||
|
@ -369,7 +379,9 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
|
|
||||||
user = refresh_record(user)
|
user = refresh_record(user)
|
||||||
|
|
||||||
assert {:ok, ^activity} = CommonAPI.unpin(activity.id, user)
|
id = activity.id
|
||||||
|
|
||||||
|
assert match?({:ok, %{id: ^id}}, CommonAPI.unpin(activity.id, user))
|
||||||
|
|
||||||
user = refresh_record(user)
|
user = refresh_record(user)
|
||||||
|
|
||||||
|
|
|
@ -358,26 +358,6 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "get_by_id_or_ap_id/1" do
|
|
||||||
test "get activity by id" do
|
|
||||||
activity = insert(:note_activity)
|
|
||||||
%Pleroma.Activity{} = note = Utils.get_by_id_or_ap_id(activity.id)
|
|
||||||
assert note.id == activity.id
|
|
||||||
end
|
|
||||||
|
|
||||||
test "get activity by ap_id" do
|
|
||||||
activity = insert(:note_activity)
|
|
||||||
%Pleroma.Activity{} = note = Utils.get_by_id_or_ap_id(activity.data["object"])
|
|
||||||
assert note.id == activity.id
|
|
||||||
end
|
|
||||||
|
|
||||||
test "get activity by object when type isn't `Create` " do
|
|
||||||
activity = insert(:like_activity)
|
|
||||||
%Pleroma.Activity{} = like = Utils.get_by_id_or_ap_id(activity.id)
|
|
||||||
assert like.data["object"] == activity.data["object"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "to_master_date/1" do
|
describe "to_master_date/1" do
|
||||||
test "removes microseconds from date (NaiveDateTime)" do
|
test "removes microseconds from date (NaiveDateTime)" do
|
||||||
assert Utils.to_masto_date(~N[2015-01-23 23:50:07.123]) == "2015-01-23T23:50:07.000Z"
|
assert Utils.to_masto_date(~N[2015-01-23 23:50:07.123]) == "2015-01-23T23:50:07.000Z"
|
||||||
|
|
Loading…
Reference in a new issue