From af7c3fab98f4f5d1fa541035fd8b2821e0abb77b Mon Sep 17 00:00:00 2001
From: FloatingGhost <hannah@coffee-and-dreams.uk>
Date: Wed, 21 Dec 2022 00:16:39 +0000
Subject: [PATCH] Do not crash on invalid atom in configDB

---
 CHANGELOG.md                        | 1 +
 lib/pleroma/config/transfer_task.ex | 5 +++++
 lib/pleroma/config_db.ex            | 6 +++++-
 test/pleroma/config_db_test.exs     | 4 ++++
 4 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6b99a0e3c..d556b39c3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
 ### Fixed 
 - /api/v1/accounts/lookup will now respect restrict\_unauthenticated
+- Unknown atoms in the config DB will no longer crash akkoma on boot
 
 ### Upgrade notes
 - Ensure `config :tesla, :adapter` is either unset, or set to `{Tesla.Adapter.Finch, name: MyFinch}` in your .exs config
diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex
index 4fcaab4a5..52f6346a5 100644
--- a/lib/pleroma/config/transfer_task.ex
+++ b/lib/pleroma/config/transfer_task.ex
@@ -42,6 +42,7 @@ defmodule Pleroma.Config.TransferTask do
       # We need to restart applications for loaded settings take effect
       {logger, other} =
         (Repo.all(ConfigDB) ++ deleted_settings)
+        |> Enum.reject(&invalid_key_or_group/1)
         |> Enum.map(&merge_with_default/1)
         |> Enum.split_with(fn {group, _, _, _} -> group == :logger end)
 
@@ -85,6 +86,10 @@ defmodule Pleroma.Config.TransferTask do
     end
   end
 
+  defp invalid_key_or_group(%ConfigDB{key: :invalid_atom}), do: true
+  defp invalid_key_or_group(%ConfigDB{group: :invalid_atom}), do: true
+  defp invalid_key_or_group(_), do: false
+
   defp merge_with_default(%{group: group, key: key, value: value} = setting) do
     default =
       if group == :pleroma do
diff --git a/lib/pleroma/config_db.ex b/lib/pleroma/config_db.ex
index 77f2c4e2d..9e4e6f3ea 100644
--- a/lib/pleroma/config_db.ex
+++ b/lib/pleroma/config_db.ex
@@ -342,7 +342,11 @@ defmodule Pleroma.ConfigDB do
 
   def string_to_elixir_types(value) do
     if module_name?(value) do
-      String.to_existing_atom("Elixir." <> value)
+      try do
+        String.to_existing_atom("Elixir." <> value)
+      rescue
+        ArgumentError -> :invalid_atom
+      end
     else
       value
     end
diff --git a/test/pleroma/config_db_test.exs b/test/pleroma/config_db_test.exs
index e68346ce4..3f1a5519b 100644
--- a/test/pleroma/config_db_test.exs
+++ b/test/pleroma/config_db_test.exs
@@ -227,6 +227,10 @@ defmodule Pleroma.ConfigDBTest do
       assert ConfigDB.to_elixir_types("Pleroma.Bookmark") == Pleroma.Bookmark
     end
 
+    test "removed module" do
+      assert ConfigDB.to_elixir_types("Pleroma.Nowhere") == :invalid_atom
+    end
+
     test "pleroma string" do
       assert ConfigDB.to_elixir_types("Pleroma") == "Pleroma"
     end