Deprecate and rewrite settings for quarentine settings
[akkoma] / lib / pleroma / config / deprecation_warnings.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Config.DeprecationWarnings do
6 alias Pleroma.Config
7
8 require Logger
9 alias Pleroma.Config
10
11 @type config_namespace() :: atom() | [atom()]
12 @type config_map() :: {config_namespace(), config_namespace(), String.t()}
13
14 @mrf_config_map [
15 {[:instance, :rewrite_policy], [:mrf, :policies],
16 "\n* `config :pleroma, :instance, rewrite_policy` is now `config :pleroma, :mrf, policies`"},
17 {[:instance, :mrf_transparency], [:mrf, :transparency],
18 "\n* `config :pleroma, :instance, mrf_transparency` is now `config :pleroma, :mrf, transparency`"},
19 {[:instance, :mrf_transparency_exclusions], [:mrf, :transparency_exclusions],
20 "\n* `config :pleroma, :instance, mrf_transparency_exclusions` is now `config :pleroma, :mrf, transparency_exclusions`"}
21 ]
22
23 def check_simple_policy_tuples do
24 has_strings =
25 Config.get([:mrf_simple])
26 |> Enum.any?(fn {_, v} -> Enum.any?(v, fn e -> is_binary(e) end) end)
27
28 if has_strings do
29 Logger.warn("""
30 !!!DEPRECATION WARNING!!!
31 Your config is using strings in the SimplePolicy configuration instead of tuples. They should work for now, but you are advised to change to the new configuration to prevent possible issues later:
32
33 ```
34 config :pleroma, :mrf_simple,
35 media_removal: ["instance.tld"],
36 media_nsfw: ["instance.tld"],
37 federated_timeline_removal: ["instance.tld"],
38 report_removal: ["instance.tld"],
39 reject: ["instance.tld"],
40 followers_only: ["instance.tld"],
41 accept: ["instance.tld"],
42 avatar_removal: ["instance.tld"],
43 banner_removal: ["instance.tld"],
44 reject_deletes: ["instance.tld"]
45 ```
46
47 Is now
48
49
50 ```
51 config :pleroma, :mrf_simple,
52 media_removal: [{"instance.tld", "Reason for media removal"}],
53 media_nsfw: [{"instance.tld", "Reason for media nsfw"}],
54 federated_timeline_removal: [{"instance.tld", "Reason for federated timeline removal"}],
55 report_removal: [{"instance.tld", "Reason for report removal"}],
56 reject: [{"instance.tld", "Reason for reject"}],
57 followers_only: [{"instance.tld", "Reason for followers only"}],
58 accept: [{"instance.tld", "Reason for accept"}],
59 avatar_removal: [{"instance.tld", "Reason for avatar removal"}],
60 banner_removal: [{"instance.tld", "Reason for banner removal"}],
61 reject_deletes: [{"instance.tld", "Reason for reject deletes"}]
62 ```
63 """)
64
65 new_config =
66 Config.get([:mrf_simple])
67 |> Enum.map(fn {k, v} ->
68 {k,
69 Enum.map(v, fn
70 {instance, reason} -> {instance, reason}
71 instance -> {instance, ""}
72 end)}
73 end)
74
75 Config.put([:mrf_simple], new_config)
76
77 :error
78 else
79 :ok
80 end
81 end
82
83 def check_quarantined_instances_tuples do
84 has_strings =
85 Config.get([:instance, :quarantined_instances]) |> Enum.any?(fn e -> is_binary(e) end)
86
87 if has_strings do
88 Logger.warn("""
89 !!!DEPRECATION WARNING!!!
90 Your config is using strings in the quarantined_instances configuration instead of tuples. They should work for now, but you are advised to change to the new configuration to prevent possible issues later:
91
92 ```
93 config :pleroma, :instance,
94 quarantined_instances: ["instance.tld"]
95 ```
96
97 Is now
98
99
100 ```
101 config :pleroma, :instance,
102 quarantined_instances: [{"instance.tld", "Reason for quarantine"}]
103 ```
104 """)
105
106 new_config =
107 Config.get([:instance, :quarantined_instances])
108 |> Enum.map(fn
109 {instance, reason} -> {instance, reason}
110 instance -> {instance, ""}
111 end)
112
113 Config.put([:instance, :quarantined_instances], new_config)
114
115 :error
116 else
117 :ok
118 end
119 end
120
121 def check_hellthread_threshold do
122 if Config.get([:mrf_hellthread, :threshold]) do
123 Logger.warn("""
124 !!!DEPRECATION WARNING!!!
125 You are using the old configuration mechanism for the hellthread filter. Please check config.md.
126 """)
127
128 :error
129 else
130 :ok
131 end
132 end
133
134 def warn do
135 with :ok <- check_hellthread_threshold(),
136 :ok <- check_old_mrf_config(),
137 :ok <- check_media_proxy_whitelist_config(),
138 :ok <- check_welcome_message_config(),
139 :ok <- check_gun_pool_options(),
140 :ok <- check_activity_expiration_config(),
141 :ok <- check_remote_ip_plug_name(),
142 :ok <- check_uploders_s3_public_endpoint(),
143 :ok <- check_old_chat_shoutbox(),
144 :ok <- check_quarantined_instances_tuples(),
145 :ok <- check_simple_policy_tuples() do
146 :ok
147 else
148 _ ->
149 :error
150 end
151 end
152
153 def check_welcome_message_config do
154 instance_config = Pleroma.Config.get([:instance])
155
156 use_old_config =
157 Keyword.has_key?(instance_config, :welcome_user_nickname) or
158 Keyword.has_key?(instance_config, :welcome_message)
159
160 if use_old_config do
161 Logger.error("""
162 !!!DEPRECATION WARNING!!!
163 Your config is using the old namespace for Welcome messages configuration. You need to convert to the new namespace. e.g.,
164 \n* `config :pleroma, :instance, welcome_user_nickname` and `config :pleroma, :instance, welcome_message` are now equal to:
165 \n* `config :pleroma, :welcome, direct_message: [enabled: true, sender_nickname: "NICKNAME", message: "Your welcome message"]`"
166 """)
167
168 :error
169 else
170 :ok
171 end
172 end
173
174 def check_old_mrf_config do
175 warning_preface = """
176 !!!DEPRECATION WARNING!!!
177 Your config is using old namespaces for MRF configuration. They should work for now, but you are advised to change to new namespaces to prevent possible issues later:
178 """
179
180 move_namespace_and_warn(@mrf_config_map, warning_preface)
181 end
182
183 @spec move_namespace_and_warn([config_map()], String.t()) :: :ok | nil
184 def move_namespace_and_warn(config_map, warning_preface) do
185 warning =
186 Enum.reduce(config_map, "", fn
187 {old, new, err_msg}, acc ->
188 old_config = Config.get(old)
189
190 if old_config do
191 Config.put(new, old_config)
192 acc <> err_msg
193 else
194 acc
195 end
196 end)
197
198 if warning == "" do
199 :ok
200 else
201 Logger.warn(warning_preface <> warning)
202 :error
203 end
204 end
205
206 @spec check_media_proxy_whitelist_config() :: :ok | nil
207 def check_media_proxy_whitelist_config do
208 whitelist = Config.get([:media_proxy, :whitelist])
209
210 if Enum.any?(whitelist, &(not String.starts_with?(&1, "http"))) do
211 Logger.warn("""
212 !!!DEPRECATION WARNING!!!
213 Your config is using old format (only domain) for MediaProxy whitelist option. Setting should work for now, but you are advised to change format to scheme with port to prevent possible issues later.
214 """)
215
216 :error
217 else
218 :ok
219 end
220 end
221
222 def check_gun_pool_options do
223 pool_config = Config.get(:connections_pool)
224
225 if timeout = pool_config[:await_up_timeout] do
226 Logger.warn("""
227 !!!DEPRECATION WARNING!!!
228 Your config is using old setting `config :pleroma, :connections_pool, await_up_timeout`. Please change to `config :pleroma, :connections_pool, connect_timeout` to ensure compatibility with future releases.
229 """)
230
231 Config.put(:connections_pool, Keyword.put_new(pool_config, :connect_timeout, timeout))
232 end
233
234 pools_configs = Config.get(:pools)
235
236 warning_preface = """
237 !!!DEPRECATION WARNING!!!
238 Your config is using old setting name `timeout` instead of `recv_timeout` in pool settings. Setting should work for now, but you are advised to change format to scheme with port to prevent possible issues later.
239 """
240
241 updated_config =
242 Enum.reduce(pools_configs, [], fn {pool_name, config}, acc ->
243 if timeout = config[:timeout] do
244 Keyword.put(acc, pool_name, Keyword.put_new(config, :recv_timeout, timeout))
245 else
246 acc
247 end
248 end)
249
250 if updated_config != [] do
251 pool_warnings =
252 updated_config
253 |> Keyword.keys()
254 |> Enum.map(fn pool_name ->
255 "\n* `:timeout` options in #{pool_name} pool is now `:recv_timeout`"
256 end)
257
258 Logger.warn(Enum.join([warning_preface | pool_warnings]))
259
260 Config.put(:pools, updated_config)
261 :error
262 else
263 :ok
264 end
265 end
266
267 @spec check_activity_expiration_config() :: :ok | nil
268 def check_activity_expiration_config do
269 warning_preface = """
270 !!!DEPRECATION WARNING!!!
271 Your config is using old namespace for activity expiration configuration. Setting should work for now, but you are advised to change to new namespace to prevent possible issues later:
272 """
273
274 move_namespace_and_warn(
275 [
276 {Pleroma.ActivityExpiration, Pleroma.Workers.PurgeExpiredActivity,
277 "\n* `config :pleroma, Pleroma.ActivityExpiration` is now `config :pleroma, Pleroma.Workers.PurgeExpiredActivity`"}
278 ],
279 warning_preface
280 )
281 end
282
283 @spec check_remote_ip_plug_name() :: :ok | nil
284 def check_remote_ip_plug_name do
285 warning_preface = """
286 !!!DEPRECATION WARNING!!!
287 Your config is using old namespace for RemoteIp Plug. Setting should work for now, but you are advised to change to new namespace to prevent possible issues later:
288 """
289
290 move_namespace_and_warn(
291 [
292 {Pleroma.Plugs.RemoteIp, Pleroma.Web.Plugs.RemoteIp,
293 "\n* `config :pleroma, Pleroma.Plugs.RemoteIp` is now `config :pleroma, Pleroma.Web.Plugs.RemoteIp`"}
294 ],
295 warning_preface
296 )
297 end
298
299 @spec check_uploders_s3_public_endpoint() :: :ok | nil
300 def check_uploders_s3_public_endpoint do
301 s3_config = Pleroma.Config.get([Pleroma.Uploaders.S3])
302
303 use_old_config = Keyword.has_key?(s3_config, :public_endpoint)
304
305 if use_old_config do
306 Logger.error("""
307 !!!DEPRECATION WARNING!!!
308 Your config is using the old setting for controlling the URL of media uploaded to your S3 bucket.\n
309 Please make the following change at your earliest convenience.\n
310 \n* `config :pleroma, Pleroma.Uploaders.S3, public_endpoint` is now equal to:
311 \n* `config :pleroma, Pleroma.Upload, base_url`
312 """)
313
314 :error
315 else
316 :ok
317 end
318 end
319
320 @spec check_old_chat_shoutbox() :: :ok | nil
321 def check_old_chat_shoutbox do
322 instance_config = Pleroma.Config.get([:instance])
323 chat_config = Pleroma.Config.get([:chat]) || []
324
325 use_old_config =
326 Keyword.has_key?(instance_config, :chat_limit) or
327 Keyword.has_key?(chat_config, :enabled)
328
329 if use_old_config do
330 Logger.error("""
331 !!!DEPRECATION WARNING!!!
332 Your config is using the old namespace for the Shoutbox configuration. You need to convert to the new namespace. e.g.,
333 \n* `config :pleroma, :chat, enabled` and `config :pleroma, :instance, chat_limit` are now equal to:
334 \n* `config :pleroma, :shout, enabled` and `config :pleroma, :shout, limit`
335 """)
336
337 :error
338 else
339 :ok
340 end
341 end
342 end