Do not crash on invalid atom in configDB
authorFloatingGhost <hannah@coffee-and-dreams.uk>
Wed, 21 Dec 2022 00:16:39 +0000 (00:16 +0000)
committerFloatingGhost <hannah@coffee-and-dreams.uk>
Wed, 21 Dec 2022 00:16:39 +0000 (00:16 +0000)
CHANGELOG.md
lib/pleroma/config/transfer_task.ex
lib/pleroma/config_db.ex
test/pleroma/config_db_test.exs

index 6b99a0e3c3341613c8c7fa5dcb2c4739df25f864..d556b39c38bf467e92f2d542a0550d2994b065df 100644 (file)
@@ -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
index 4fcaab4a59c0f96686c83030d44bb1758505f0ee..52f6346a550788cb75d7eb0bffa175527c60a7c9 100644 (file)
@@ -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
index 77f2c4e2d2c289ef58b872ded206b9a914c3fd0f..9e4e6f3ea7ae5b91c4e1e109faef1510a6732e07 100644 (file)
@@ -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
index e68346ce4537065e9d15556f0e020e0520630d1c..3f1a5519b7a364c482116cb04406b0306f801177 100644 (file)
@@ -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