From 20cbfb5cb5515044de03cc48e8464ec45ad0ca50 Mon Sep 17 00:00:00 2001
From: Stephanie Wilde-Hobbs <steph@rx14.co.uk>
Date: Thu, 14 May 2020 12:34:46 +0100
Subject: [PATCH] Allow whitelisting whole groups

---
 docs/configuration/cheatsheet.md                |  3 ++-
 .../web/admin_api/admin_api_controller.ex       |  8 ++++++--
 .../web/admin_api/admin_api_controller_test.exs | 17 ++++++++++++-----
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md
index 7b7a332c7..f0ecebc99 100644
--- a/docs/configuration/cheatsheet.md
+++ b/docs/configuration/cheatsheet.md
@@ -919,7 +919,8 @@ Example:
 ```elixir
 config :pleroma, :database_config_whitelist, [
   {:pleroma, :instance},
-  {:pleroma, Pleroma.Web.Metadata}
+  {:pleroma, Pleroma.Web.Metadata},
+  {:auto_linker}
 ]
 ```
 
diff --git a/lib/pleroma/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/admin_api_controller.ex
index 3053f57a1..c996a2a5a 100644
--- a/lib/pleroma/web/admin_api/admin_api_controller.ex
+++ b/lib/pleroma/web/admin_api/admin_api_controller.ex
@@ -1015,8 +1015,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
 
   defp whitelisted_config?(group, key) do
     if whitelisted_configs = Config.get(:database_config_whitelist) do
-      Enum.any?(whitelisted_configs, fn {whitelisted_group, whitelisted_key} ->
-        group == inspect(whitelisted_group) && key == inspect(whitelisted_key)
+      Enum.any?(whitelisted_configs, fn
+        {whitelisted_group} ->
+          group == inspect(whitelisted_group)
+
+        {whitelisted_group, whitelisted_key} ->
+          group == inspect(whitelisted_group) && key == inspect(whitelisted_key)
       end)
     else
       true
diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs
index 7d42a400c..e573220ba 100644
--- a/test/web/admin_api/admin_api_controller_test.exs
+++ b/test/web/admin_api/admin_api_controller_test.exs
@@ -2948,7 +2948,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
       clear_config(:database_config_whitelist, [
         {:pleroma, :key1},
         {:pleroma, :key2},
-        {:pleroma, Pleroma.Captcha.NotReal}
+        {:pleroma, Pleroma.Captcha.NotReal},
+        {:not_real}
       ])
 
       post(conn, "/api/pleroma/admin/config", %{
@@ -2957,7 +2958,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
           %{group: ":pleroma", key: ":key2", value: "value2"},
           %{group: ":pleroma", key: ":key3", value: "value3"},
           %{group: ":pleroma", key: "Pleroma.Web.Endpoint.NotReal", value: "value4"},
-          %{group: ":pleroma", key: "Pleroma.Captcha.NotReal", value: "value5"}
+          %{group: ":pleroma", key: "Pleroma.Captcha.NotReal", value: "value5"},
+          %{group: ":not_real", key: ":anything", value: "value6"}
         ]
       })
 
@@ -2966,6 +2968,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
       assert Application.get_env(:pleroma, :key3) == nil
       assert Application.get_env(:pleroma, Pleroma.Web.Endpoint.NotReal) == nil
       assert Application.get_env(:pleroma, Pleroma.Captcha.NotReal) == "value5"
+      assert Application.get_env(:not_real, :anything) == "value6"
     end
   end
 
@@ -3624,7 +3627,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
       clear_config(:database_config_whitelist, [
         {:pleroma, :instance},
         {:pleroma, :activitypub},
-        {:pleroma, Pleroma.Upload}
+        {:pleroma, Pleroma.Upload},
+        {:esshd}
       ])
 
       admin = insert(:user, is_admin: true)
@@ -3635,9 +3639,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
 
       children = json_response(conn, 200)
 
-      assert length(children) == 3
+      assert length(children) == 4
 
-      assert Enum.all?(children, fn c -> c["group"] == ":pleroma" end)
+      assert Enum.count(children, fn c -> c["group"] == ":pleroma" end) == 3
 
       instance = Enum.find(children, fn c -> c["key"] == ":instance" end)
       assert instance["children"]
@@ -3647,6 +3651,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
 
       web_endpoint = Enum.find(children, fn c -> c["key"] == "Pleroma.Upload" end)
       assert web_endpoint["children"]
+
+      esshd = Enum.find(children, fn c -> c["group"] == ":esshd" end)
+      assert esshd["children"]
     end
   end
 
-- 
2.49.0