From 628c55cd84bba7e4a88a28f2c49e38424d03f766 Mon Sep 17 00:00:00 2001
From: Thomas Citharel <tcit@tcit.fr>
Date: Wed, 12 May 2021 11:02:46 +0200
Subject: [PATCH] Make sure relay and anonymous actors don't automatically
 approve followers

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
---
 lib/mobilizon/actors/actor.ex                 | 28 ++++++++++---------
 ...4824_repair_relay_and_anonymous_actors.exs | 15 ++++++++++
 2 files changed, 30 insertions(+), 13 deletions(-)
 create mode 100644 priv/repo/migrations/20210512084824_repair_relay_and_anonymous_actors.exs

diff --git a/lib/mobilizon/actors/actor.ex b/lib/mobilizon/actors/actor.ex
index 49316bc89..1bfa41c31 100644
--- a/lib/mobilizon/actors/actor.ex
+++ b/lib/mobilizon/actors/actor.ex
@@ -416,17 +416,18 @@ defmodule Mobilizon.Actors.Actor do
   @spec build_relay_creation_attrs :: Ecto.Changeset.t()
   def build_relay_creation_attrs do
     data = %{
-      "name" => Config.get([:instance, :name], "Mobilizon"),
-      "summary" =>
+      name: Config.get([:instance, :name], "Mobilizon"),
+      summary:
         Config.get(
           [:instance, :description],
           "An internal service actor for this Mobilizon instance"
         ),
-      "keys" => Crypto.generate_rsa_2048_private_key(),
-      "preferred_username" => "relay",
-      "domain" => nil,
-      "visibility" => :public,
-      "type" => :Application
+      keys: Crypto.generate_rsa_2048_private_key(),
+      preferred_username: "relay",
+      domain: nil,
+      visibility: :public,
+      type: :Application,
+      manually_approves_followers: true
     }
 
     %__MODULE__{}
@@ -440,12 +441,13 @@ defmodule Mobilizon.Actors.Actor do
   @spec build_anonymous_actor_creation_attrs :: Ecto.Changeset.t()
   def build_anonymous_actor_creation_attrs do
     data = %{
-      "name" => "Mobilizon Anonymous Actor",
-      "summary" => "A fake person for anonymous participations",
-      "keys" => Crypto.generate_rsa_2048_private_key(),
-      "preferred_username" => "anonymous",
-      "domain" => nil,
-      "type" => :Person
+      name: "Mobilizon Anonymous Actor",
+      summary: "A fake person for anonymous participations",
+      keys: Crypto.generate_rsa_2048_private_key(),
+      preferred_username: "anonymous",
+      domain: nil,
+      type: :Person,
+      manually_approves_followers: true
     }
 
     %__MODULE__{}
diff --git a/priv/repo/migrations/20210512084824_repair_relay_and_anonymous_actors.exs b/priv/repo/migrations/20210512084824_repair_relay_and_anonymous_actors.exs
new file mode 100644
index 000000000..3a9827b2b
--- /dev/null
+++ b/priv/repo/migrations/20210512084824_repair_relay_and_anonymous_actors.exs
@@ -0,0 +1,15 @@
+defmodule Mobilizon.Storage.Repo.Migrations.RepairRelayAndAnonymousActors do
+  use Ecto.Migration
+
+  def up do
+    Ecto.Adapters.SQL.query!(
+      Mobilizon.Storage.Repo,
+      "UPDATE actors SET manually_approves_followers = true WHERE preferred_username = 'relay' and domain is null"
+    )
+
+    Ecto.Adapters.SQL.query!(
+      Mobilizon.Storage.Repo,
+      "UPDATE actors SET manually_approves_followers = true WHERE preferred_username = 'anonymous' and domain is null"
+    )
+  end
+end