summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/web/activity_pub/activity_pub.ex23
-rw-r--r--lib/pleroma/web/activity_pub/transmogrifier.ex33
-rw-r--r--lib/pleroma/web/activity_pub/utils.ex36
3 files changed, 91 insertions, 1 deletions
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 24b4f045a..a711e6b76 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -221,6 +221,29 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
end
end
+ def block(blocker, blocked, local \\ true) do
+ follow_activity = fetch_latest_follow(blocker, blocked)
+
+ if follow_activity do
+ unfollow(blocker, blocked, local)
+ end
+
+ with block_data <- make_block_data(blocker, blocked),
+ {:ok, activity} <- insert(block_data, local),
+ :ok <- maybe_federate(activity) do
+ {:ok, activity}
+ end
+ end
+
+ def unblock(blocker, blocked, local \\ true) do
+ with %Activity{} = block_activity <- fetch_latest_block(blocker, blocked),
+ unblock_data <- make_unblock_data(blocker, blocked, block_activity),
+ {:ok, activity} <- insert(unblock_data, local),
+ :ok <- maybe_federate(activity) do
+ {:ok, activity}
+ end
+ end
+
def fetch_activities_for_context(context, opts \\ %{}) do
public = ["https://www.w3.org/ns/activitystreams#Public"]
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index a31452a63..d92ca9b65 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -244,6 +244,38 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def handle_incoming(
%{
"type" => "Undo",
+ "object" => %{"type" => "Follow", "object" => followed},
+ "actor" => follower,
+ "id" => id
+ } = data
+ ) do
+ with %User{local: true} = followed = User.get_cached_by_ap_id(followed),
+ %User{} = follower = User.get_or_fetch_by_ap_id(follower),
+ {:ok, activity} <- ActivityPub.unfollow(follower, followed, false) do
+ User.unfollow(follower, followed)
+ {:ok, activity}
+ else
+ e -> :error
+ end
+ end
+
+ def handle_incoming(
+ %{"type" => "Block", "object" => blocked, "actor" => blocker, "id" => id} = data
+ ) do
+ with %User{local: true} = blocked = User.get_cached_by_ap_id(blocked),
+ %User{} = blocker = User.get_or_fetch_by_ap_id(blocker),
+ {:ok, activity} <- ActivityPub.block(blocker, blocked, false) do
+ User.unfollow(blocker, blocked)
+ User.block(blocker, blocked)
+ {:ok, activity}
+ else
+ e -> :error
+ end
+ end
+
+ def handle_incoming(
+ %{
+ "type" => "Undo",
"object" => %{"type" => "Like", "object" => object_id},
"actor" => actor,
"id" => id
@@ -261,7 +293,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
# TODO
# Accept
- # Undo for non-Announce
def handle_incoming(_), do: :error
diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex
index 937f032c3..050413d51 100644
--- a/lib/pleroma/web/activity_pub/utils.ex
+++ b/lib/pleroma/web/activity_pub/utils.ex
@@ -355,6 +355,42 @@ defmodule Pleroma.Web.ActivityPub.Utils do
}
end
+ #### Block-related helpers
+ def fetch_latest_block(%User{ap_id: blocker_id}, %User{ap_id: blocked_id}) do
+ query =
+ from(
+ activity in Activity,
+ where:
+ fragment(
+ "? @> ?",
+ activity.data,
+ ^%{type: "Block", actor: blocker_id, object: blocked_id}
+ ),
+ order_by: [desc: :id],
+ limit: 1
+ )
+
+ Repo.one(query)
+ end
+
+ def make_block_data(blocker, blocked) do
+ %{
+ "type" => "Block",
+ "actor" => blocker.ap_id,
+ "to" => [blocked.ap_id],
+ "object" => blocked.ap_id
+ }
+ end
+
+ def make_unblock_data(blocker, blocked, block_activity) do
+ %{
+ "type" => "Undo",
+ "actor" => blocker.ap_id,
+ "to" => [blocked.ap_id],
+ "object" => block_activity.data
+ }
+ end
+
#### Create-related helpers
def make_create_data(params, additional) do