Fix following groups + Add interface to manage followers
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -50,7 +50,6 @@ defmodule Mobilizon.Federation.ActivityPub do
|
||||
|
||||
alias Mobilizon.Web.Endpoint
|
||||
alias Mobilizon.Web.Email.{Admin, Group, Mailer}
|
||||
alias Mobilizon.Web.Email.Follow, as: FollowMailer
|
||||
|
||||
require Logger
|
||||
|
||||
@@ -320,13 +319,22 @@ defmodule Mobilizon.Federation.ActivityPub do
|
||||
@doc """
|
||||
Make an actor follow another
|
||||
"""
|
||||
def follow(%Actor{} = follower, %Actor{} = followed, activity_id \\ nil, local \\ true) do
|
||||
def follow(
|
||||
%Actor{} = follower,
|
||||
%Actor{} = followed,
|
||||
activity_id \\ nil,
|
||||
local \\ true,
|
||||
additional \\ %{}
|
||||
) do
|
||||
with {:different_actors, true} <- {:different_actors, followed.id != follower.id},
|
||||
{:ok, %Follower{} = follower} <-
|
||||
Actors.follow(followed, follower, activity_id, false),
|
||||
:ok <- FollowMailer.send_notification_to_admins(follower),
|
||||
follower_as_data <- Convertible.model_to_as(follower),
|
||||
{:ok, activity} <- create_activity(follower_as_data, local),
|
||||
{:ok, activity_data, %Follower{} = follower} <-
|
||||
Types.Actors.follow(
|
||||
follower,
|
||||
followed,
|
||||
local,
|
||||
Map.merge(additional, %{"activity_id" => activity_id})
|
||||
),
|
||||
{:ok, activity} <- create_activity(activity_data, local),
|
||||
:ok <- maybe_federate(activity) do
|
||||
{:ok, activity, follower}
|
||||
else
|
||||
|
||||
@@ -302,6 +302,10 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
||||
do_handle_incoming_accept_join(accepted_object, actor)} do
|
||||
{:ok, activity, object}
|
||||
else
|
||||
{:object_not_found, {:error, "Follow already accepted"}} ->
|
||||
Logger.info("Follow was already accepted. Ignoring.")
|
||||
:error
|
||||
|
||||
{:object_not_found, nil} ->
|
||||
Logger.warn(
|
||||
"Unable to process Accept activity #{inspect(id)}. Object #{inspect(accepted_object)} wasn't found."
|
||||
@@ -761,6 +765,10 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
||||
|
||||
{:ok, activity, follow}
|
||||
else
|
||||
{:follow, {:ok, %Follower{approved: true} = _follow}} ->
|
||||
Logger.debug("Follow already accepted")
|
||||
{:error, "Follow already accepted"}
|
||||
|
||||
{:follow, _} ->
|
||||
Logger.debug(
|
||||
"Tried to handle an Accept activity but it's not containing a Follow activity"
|
||||
@@ -770,9 +778,6 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
|
||||
|
||||
{:same_actor} ->
|
||||
{:error, "Actor who accepted the follow wasn't the target. Quite odd."}
|
||||
|
||||
{:ok, %Follower{approved: true} = _follow} ->
|
||||
{:error, "Follow already accepted"}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
|
||||
@moduledoc false
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.Actors.{Actor, Member}
|
||||
alias Mobilizon.Actors.{Actor, Follower, Member}
|
||||
alias Mobilizon.Federation.ActivityPub
|
||||
alias Mobilizon.Federation.ActivityPub.Audience
|
||||
alias Mobilizon.Federation.ActivityPub.Types.Entity
|
||||
@@ -9,6 +9,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
|
||||
alias Mobilizon.GraphQL.API.Utils, as: APIUtils
|
||||
alias Mobilizon.Service.Formatter.HTML
|
||||
alias Mobilizon.Service.Notifications.Scheduler
|
||||
alias Mobilizon.Web.Email.Follow, as: FollowMailer
|
||||
alias Mobilizon.Web.Endpoint
|
||||
import Mobilizon.Federation.ActivityPub.Utils, only: [make_create_data: 2, make_update_data: 2]
|
||||
|
||||
@@ -130,6 +131,15 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
|
||||
end
|
||||
end
|
||||
|
||||
def follow(%Actor{} = follower_actor, %Actor{} = followed, _local, additional) do
|
||||
with {:ok, %Follower{} = follower} <-
|
||||
Mobilizon.Actors.follow(followed, follower_actor, additional["activity_id"], false),
|
||||
:ok <- FollowMailer.send_notification_to_admins(follower),
|
||||
follower_as_data <- Convertible.model_to_as(follower) do
|
||||
approve_if_manually_approves_followers(follower, follower_as_data)
|
||||
end
|
||||
end
|
||||
|
||||
defp prepare_args_for_actor(args) do
|
||||
args
|
||||
|> maybe_sanitize_username()
|
||||
@@ -189,4 +199,21 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
|
||||
{:ok, activity_data, member}
|
||||
end
|
||||
end
|
||||
|
||||
defp approve_if_manually_approves_followers(
|
||||
%Follower{} = follower,
|
||||
follow_as_data
|
||||
) do
|
||||
unless follower.target_actor.manually_approves_followers do
|
||||
{:accept,
|
||||
ActivityPub.accept(
|
||||
:follow,
|
||||
follower,
|
||||
true,
|
||||
%{"actor" => follower.actor.url}
|
||||
)}
|
||||
end
|
||||
|
||||
{:ok, follow_as_data, follower}
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user