2020-11-24 08:44:48 -07:00
defmodule Pleroma.Config.ReleaseRuntimeProvider do
@moduledoc """
2021-03-27 00:05:33 -06:00
Imports runtime config and ` { env } . exported_from_db . secret . exs ` for releases .
2020-11-24 08:44:48 -07:00
"""
@behaviour Config.Provider
@impl true
def init ( opts ) , do : opts
@impl true
2021-03-27 00:05:33 -06:00
def load ( config , opts ) do
2020-11-24 08:44:48 -07:00
with_defaults = Config.Reader . merge ( config , Pleroma.Config.Holder . release_defaults ( ) )
2021-04-08 06:45:31 -06:00
config_path =
2022-07-06 12:28:41 -06:00
cond do
opts [ :config_path ] -> opts [ :config_path ]
System . get_env ( " AKKOMA_CONFIG_PATH " ) -> System . get_env ( " AKKOMA_CONFIG_PATH " )
2022-08-03 04:52:21 -06:00
System . get_env ( " PLEROMA_CONFIG_PATH " ) -> System . get_env ( " PLEROMA_CONFIG_PATH " )
File . exists? ( " /etc/pleroma/config.exs " ) -> " /etc/pleroma/config.exs "
true -> " /etc/akkoma/config.exs "
2022-07-06 12:28:41 -06:00
end
2020-11-24 08:44:48 -07:00
with_runtime_config =
2021-04-08 06:45:31 -06:00
if File . exists? ( config_path ) do
2023-06-21 16:46:52 -06:00
# <https://git.pleroma.social/pleroma/pleroma/-/issues/3135>
% File.Stat { mode : mode } = File . lstat! ( config_path )
if Bitwise . band ( mode , 0o007 ) > 0 do
raise " Configuration at #{ config_path } has world-permissions, execute the following: chmod o= #{ config_path } "
end
if Bitwise . band ( mode , 0o020 ) > 0 do
raise " Configuration at #{ config_path } has group-wise write permissions, execute the following: chmod g-w #{ config_path } "
end
# Note: Elixir doesn't provides a getuid(2)
# so cannot forbid group-read only when config is owned by us
2020-11-24 08:44:48 -07:00
runtime_config = Config.Reader . read! ( config_path )
with_defaults
|> Config.Reader . merge ( pleroma : [ config_path : config_path ] )
|> Config.Reader . merge ( runtime_config )
else
warning = [
IO.ANSI . red ( ) ,
IO.ANSI . bright ( ) ,
2022-08-03 04:52:21 -06:00
" !!! Config path is not declared! Please ensure it exists and that AKKOMA_CONFIG_PATH and/or PLEROMA_CONFIG_PATH is unset or points to an existing file " ,
2020-11-24 08:44:48 -07:00
IO.ANSI . reset ( )
]
IO . puts ( warning )
with_defaults
end
2021-04-08 06:45:31 -06:00
exported_config_path =
opts [ :exported_config_path ] ||
config_path
|> Path . dirname ( )
|> Path . join ( " #{ Pleroma.Config . get ( :env ) } .exported_from_db.secret.exs " )
2020-11-24 08:44:48 -07:00
with_exported =
2021-04-08 06:45:31 -06:00
if File . exists? ( exported_config_path ) do
2021-03-26 10:19:19 -06:00
exported_config = Config.Reader . read! ( exported_config_path )
2020-11-24 08:44:48 -07:00
Config.Reader . merge ( with_runtime_config , exported_config )
else
with_runtime_config
end
with_exported
end
end