Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Pleroma
pleroma
Commits
4baf5ffe
Commit
4baf5ffe
authored
Jun 16, 2020
by
lain
Browse files
Merge branch 'fix/1787-mogrify-args' into 'develop'
Mogrify args in adminFE Closes
#1787
See merge request
!2616
parents
1e49bfa9
32c6576b
Pipeline
#27279
passed with stages
in 66 minutes and 13 seconds
Changes
13
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
lib/mix/tasks/pleroma/config.ex
View file @
4baf5ffe
...
...
@@ -72,8 +72,7 @@ defp create(group, settings) do
group
|>
Pleroma
.
Config
.
Loader
.
filter_group
(
settings
)
|>
Enum
.
each
(
fn
{
key
,
value
}
->
key
=
inspect
(
key
)
{
:ok
,
_
}
=
ConfigDB
.
update_or_create
(%{
group:
inspect
(
group
),
key:
key
,
value:
value
})
{
:ok
,
_
}
=
ConfigDB
.
update_or_create
(%{
group:
group
,
key:
key
,
value:
value
})
shell_info
(
"Settings for key
#{
key
}
migrated."
)
end
)
...
...
@@ -131,12 +130,9 @@ defp write_and_delete(config, file, delete?) do
end
defp
write
(
config
,
file
)
do
value
=
config
.
value
|>
ConfigDB
.
from_binary
()
|>
inspect
(
limit:
:infinity
)
value
=
inspect
(
config
.
value
,
limit:
:infinity
)
IO
.
write
(
file
,
"config
#{
config
.
group
}
,
#{
config
.
key
}
,
#{
value
}
\r\n\r\n
"
)
IO
.
write
(
file
,
"config
#{
inspect
(
config
.
group
)
}
,
#{
inspect
(
config
.
key
)
}
,
#{
value
}
\r\n\r\n
"
)
config
end
...
...
lib/pleroma/config/config_db.ex
View file @
4baf5ffe
...
...
@@ -6,7 +6,7 @@ defmodule Pleroma.ConfigDB do
use
Ecto
.
Schema
import
Ecto
.
Changeset
import
Ecto
.
Query
import
Ecto
.
Query
,
only:
[
select:
3
]
import
Pleroma
.
Web
.
Gettext
alias
__MODULE__
...
...
@@ -14,16 +14,6 @@ defmodule Pleroma.ConfigDB do
@type
t
::
%
__MODULE__
{}
@full_key_update
[
{
:pleroma
,
:ecto_repos
},
{
:quack
,
:meta
},
{
:mime
,
:types
},
{
:cors_plug
,
[
:max_age
,
:methods
,
:expose
,
:headers
]},
{
:auto_linker
,
:opts
},
{
:swarm
,
:node_blacklist
},
{
:logger
,
:backends
}
]
@full_subkey_update
[
{
:pleroma
,
:assets
,
:mascots
},
{
:pleroma
,
:emoji
,
:groups
},
...
...
@@ -32,14 +22,10 @@ defmodule Pleroma.ConfigDB do
{
:pleroma
,
:mrf_keyword
,
:replace
}
]
@regex
~r/^~r(?'delimiter'[\/
|
"'([{<]{1})(?'pattern'.+)[\/|"
')\]}>]{1}(?'
modifier
'[uismxfU]*)/u
@delimiters ["/", "|", "
\"
", "'
", {"
(
", "
)
"}, {"
[
", "
]
"}, {"
{
", "
}
"}, {"
<
", "
>
"}]
schema
"config"
do
field(:key,
:string
)
field(:group,
:string
)
field(:value,
:binary
)
field
(
:key
,
Pleroma
.
Config
.
Type
.
Atom
)
field
(
:group
,
Pleroma
.
Config
.
Type
.
Atom
)
field
(
:value
,
Pleroma
.
Config
.
Type
.
BinaryValue
)
field
(
:db
,
{
:array
,
:string
},
virtual:
true
,
default:
[])
timestamps
()
...
...
@@ -51,10 +37,6 @@ def get_all_as_keyword do
|>
select
([
c
],
{
c
.
group
,
c
.
key
,
c
.
value
})
|>
Repo
.
all
()
|>
Enum
.
reduce
([],
fn
{
group
,
key
,
value
},
acc
->
group = ConfigDB.from_string(group)
key = ConfigDB.from_string(key)
value = from_binary(value)
Keyword
.
update
(
acc
,
group
,
[{
key
,
value
}],
&
Keyword
.
merge
(
&1
,
[{
key
,
value
}]))
end
)
end
...
...
@@ -64,50 +46,41 @@ def get_by_params(params), do: Repo.get_by(ConfigDB, params)
@spec
changeset
(
ConfigDB
.
t
(),
map
())
::
Changeset
.
t
()
def
changeset
(
config
,
params
\\
%{})
do
params = Map.put(params, :value, transform(params[:value]))
config
|>
cast
(
params
,
[
:key
,
:group
,
:value
])
|>
validate_required
([
:key
,
:group
,
:value
])
|>
unique_constraint
(
:key
,
name:
:config_group_key_index
)
end
@spec create(map()) :: {:ok, ConfigDB.t()} | {:error, Changeset.t()}
def create(params) do
defp
create
(
params
)
do
%
ConfigDB
{}
|>
changeset
(
params
)
|>
Repo
.
insert
()
end
@spec update(ConfigDB.t(), map()) :: {:ok, ConfigDB.t()} | {:error, Changeset.t()}
def update(%ConfigDB{} = config, %{value: value}) do
defp
update
(%
ConfigDB
{}
=
config
,
%{
value:
value
})
do
config
|>
changeset
(%{
value:
value
})
|>
Repo
.
update
()
end
@spec get_db_keys(ConfigDB.t()) :: [String.t()]
def get_db_keys(%ConfigDB{} = config) do
config.value
|> ConfigDB.from_binary()
|> get_db_keys(config.key)
end
@spec
get_db_keys
(
keyword
(),
any
())
::
[
String
.
t
()]
def
get_db_keys
(
value
,
key
)
do
if Keyword.keyword?(value) do
value |> Keyword.keys() |> Enum.map(&convert(&1))
else
[convert(key)]
end
keys
=
if
Keyword
.
keyword?
(
value
)
do
Keyword
.
keys
(
value
)
else
[
key
]
end
Enum
.
map
(
keys
,
&
to_json_types
(
&1
))
end
@spec
merge_group
(
atom
(),
atom
(),
keyword
(),
keyword
())
::
keyword
()
def
merge_group
(
group
,
key
,
old_value
,
new_value
)
do
new_keys = to_map
_
set(new_value)
new_keys
=
to_mapset
(
new_value
)
intersect_keys =
old_value |> to_map_set() |> MapSet.intersection(new_keys) |> MapSet.to_list()
intersect_keys
=
old_value
|>
to_mapset
()
|>
MapSet
.
intersection
(
new_keys
)
|>
MapSet
.
to_list
()
merged_value
=
ConfigDB
.
merge
(
old_value
,
new_value
)
...
...
@@ -120,12 +93,10 @@ def merge_group(group, key, old_value, new_value) do
[]
end
)
|>
List
.
flatten
()
|> Enum.reduce(merged_value, fn subkey, acc ->
Keyword.put(acc, subkey, new_value[subkey])
end)
|>
Enum
.
reduce
(
merged_value
,
&
Keyword
.
put
(
&2
,
&1
,
new_value
[
&1
]))
end
defp to_map
_
set(keyword) do
defp
to_mapset
(
keyword
)
do
keyword
|>
Keyword
.
keys
()
|>
MapSet
.
new
()
...
...
@@ -159,43 +130,40 @@ defp deep_merge(_key, value1, value2) do
@spec
update_or_create
(
map
())
::
{
:ok
,
ConfigDB
.
t
()}
|
{
:error
,
Changeset
.
t
()}
def
update_or_create
(
params
)
do
params
=
Map
.
put
(
params
,
:value
,
to_elixir_types
(
params
[
:value
]))
search_opts
=
Map
.
take
(
params
,
[
:group
,
:key
])
with
%
ConfigDB
{}
=
config
<-
ConfigDB
.
get_by_params
(
search_opts
),
{:partial_update, true, config} <-
{:partial_update, can_be_partially_updated?(config), config},
old_value <- from_binary(config.value),
transformed_value <- do_transform(params[:value]),
{:can_be_merged, true, config} <- {:can_be_merged, is_list(transformed_value), config},
new_value <-
merge_group(
ConfigDB.from_string(config.group),
ConfigDB.from_string(config.key),
old_value,
transformed_value
) do
ConfigDB.update(config, %{value: new_value})
{
_
,
true
,
config
}
<-
{
:partial_update
,
can_be_partially_updated?
(
config
),
config
},
{
_
,
true
,
config
}
<-
{
:can_be_merged
,
is_list
(
params
[
:value
])
and
is_list
(
config
.
value
),
config
}
do
new_value
=
merge_group
(
config
.
group
,
config
.
key
,
config
.
value
,
params
[
:value
])
update
(
config
,
%{
value:
new_value
})
else
{
reason
,
false
,
config
}
when
reason
in
[
:partial_update
,
:can_be_merged
]
->
ConfigDB.
update(config, params)
update
(
config
,
params
)
nil
->
ConfigDB.
create(params)
create
(
params
)
end
end
defp
can_be_partially_updated?
(%
ConfigDB
{}
=
config
),
do
:
not
only_full_update?
(
config
)
defp only_full_update?(%ConfigDB{} = config) do
config_group = ConfigDB.from_string(config.group)
config_key = ConfigDB.from_string(config.key)
Enum.any?(@full_key_update, fn
{group, key} when is_list(key) ->
config_group == group and config_key in key
{group, key} ->
config_group == group and config_key == key
defp
only_full_update?
(%
ConfigDB
{
group:
group
,
key:
key
})
do
full_key_update
=
[
{
:pleroma
,
:ecto_repos
},
{
:quack
,
:meta
},
{
:mime
,
:types
},
{
:cors_plug
,
[
:max_age
,
:methods
,
:expose
,
:headers
]},
{
:auto_linker
,
:opts
},
{
:swarm
,
:node_blacklist
},
{
:logger
,
:backends
}
]
Enum
.
any?
(
full_key_update
,
fn
{
s_group
,
s_key
}
->
group
==
s_group
and
((
is_list
(
s_key
)
and
key
in
s_key
)
or
key
==
s_key
)
end
)
end
...
...
@@ -205,11 +173,10 @@ def delete(params) do
with
%
ConfigDB
{}
=
config
<-
ConfigDB
.
get_by_params
(
search_opts
),
{
config
,
sub_keys
}
when
is_list
(
sub_keys
)
<-
{
config
,
params
[
:subkeys
]},
old_value <- from_binary(config.value),
keys <- Enum.map(sub_keys, &do_transform_string(&1)),
{:partial_remove, config, new_value} when new_value != [] <-
{:partial_remove, config, Keyword.drop(old_value, keys)} do
ConfigDB.update(config, %{value: new_value})
keys
<-
Enum
.
map
(
sub_keys
,
&
string_to_elixir_types
(
&1
)),
{
_
,
config
,
new_value
}
when
new_value
!=
[]
<-
{
:partial_remove
,
config
,
Keyword
.
drop
(
config
.
value
,
keys
)}
do
update
(
config
,
%{
value:
new_value
})
else
{
:partial_remove
,
config
,
[]}
->
Repo
.
delete
(
config
)
...
...
@@ -225,37 +192,32 @@ def delete(params) do
end
end
@spec from_binary(binary()) :: term()
def from_binary(binary), do: :erlang.binary_to_term(binary)
@spec from_binary_with_convert(binary()) :: any()
def from_binary_with_convert(binary) do
binary
|> from_binary()
|> do_convert()
@spec
to_json_types
(
term
())
::
map
()
|
list
()
|
boolean
()
|
String
.
t
()
def
to_json_types
(
entity
)
when
is_list
(
entity
)
do
Enum
.
map
(
entity
,
&
to_json_types
/
1
)
end
@spec from_string(String.t()) :: atom() | no_return()
def from_string(string), do: do_transform_string(string)
def
to_json_types
(%
Regex
{}
=
entity
),
do
:
inspect
(
entity
)
@spec convert(any()) :: any()
def convert(entity), do: do_convert(entity)
defp do_convert(entity) when is_list(entity) do
for v <- entity, into: [], do: do_convert(v)
def
to_json_types
(
entity
)
when
is_map
(
entity
)
do
Map
.
new
(
entity
,
fn
{
k
,
v
}
->
{
to_json_types
(
k
),
to_json_types
(
v
)}
end
)
end
defp do_convert(%Regex{} = entity), do: inspect(entity)
def
to_json_types
({
:args
,
args
})
when
is_list
(
args
)
do
arguments
=
Enum
.
map
(
args
,
fn
arg
when
is_tuple
(
arg
)
->
inspect
(
arg
)
arg
->
to_json_types
(
arg
)
end
)
defp do_convert(entity) when is_map(entity) do
for {k, v} <- entity, into: %{}, do: {do_convert(k), do_convert(v)}
%{
"tuple"
=>
[
":args"
,
arguments
]}
end
def
p do_convert
({:proxy_url, {type, :localhost, port}}) do
%{"
tuple
" => ["
:proxy_url
", %{"
tuple
" => [
d
o_
convert
(type), "
localhost
", port]}]}
def
to_json_types
({
:proxy_url
,
{
type
,
:localhost
,
port
}})
do
%{
"tuple"
=>
[
":proxy_url"
,
%{
"tuple"
=>
[
t
o_
json_types
(
type
),
"localhost"
,
port
]}]}
end
def
p do_convert
({:proxy_url, {type, host, port}}) when is_tuple(host) do
def
to_json_types
({
:proxy_url
,
{
type
,
host
,
port
}})
when
is_tuple
(
host
)
do
ip
=
host
|>
:inet_parse
.
ntoa
()
...
...
@@ -264,66 +226,64 @@ defp do_convert({:proxy_url, {type, host, port}}) when is_tuple(host) do
%{
"tuple"
=>
[
":proxy_url"
,
%{"
tuple
" => [
d
o_
convert
(type), ip, port]}
%{
"tuple"
=>
[
t
o_
json_types
(
type
),
ip
,
port
]}
]
}
end
def
p do_convert
({:proxy_url, {type, host, port}}) do
def
to_json_types
({
:proxy_url
,
{
type
,
host
,
port
}})
do
%{
"tuple"
=>
[
":proxy_url"
,
%{"
tuple
" => [
d
o_
convert
(type), to_string(host), port]}
%{
"tuple"
=>
[
t
o_
json_types
(
type
),
to_string
(
host
),
port
]}
]
}
end
defp do_convert({:partial_chain, entity}), do: %{"
tuple
" => ["
:partial_chain
", inspect(entity)]}
def
to_json_types
({
:partial_chain
,
entity
}),
do
:
%{
"tuple"
=>
[
":partial_chain"
,
inspect
(
entity
)]}
def
p do_convert
(entity) when is_tuple(entity) do
def
to_json_types
(
entity
)
when
is_tuple
(
entity
)
do
value
=
entity
|>
Tuple
.
to_list
()
|>
d
o_
convert
()
|>
t
o_
json_types
()
%{
"tuple"
=>
value
}
end
defp do_convert(entity) when is_boolean(entity) or is_number(entity) or is_nil(entity) do
def
to_json_types
(
entity
)
when
is_binary
(
entity
),
do
:
entity
def
to_json_types
(
entity
)
when
is_boolean
(
entity
)
or
is_number
(
entity
)
or
is_nil
(
entity
)
do
entity
end
defp do_convert(entity)
when is_atom(entity) and entity in [:"
tlsv1
.
1
", :"
tlsv1
.
2
", :"
tlsv1
.
3
"] do
def
to_json_types
(
entity
)
when
entity
in
[
:"tlsv1.1"
,
:"tlsv1.2"
,
:"tlsv1.3"
]
do
":
#{
entity
}
"
end
def
p
do_convert
(
entity
)
when
is_atom
(
entity
),
do
:
inspect
(
entity
)
def
to_json_types
(
entity
)
when
is_atom
(
entity
),
do
:
inspect
(
entity
)
defp
do_convert
(
entity
)
when
is_binary
(
entity
),
do
:
entity
@spec
to_elixir_types
(
boolean
()
|
String
.
t
()
|
map
()
|
list
())
::
term
()
def
to_elixir_types
(%{
"tuple"
=>
[
":args"
,
args
]})
when
is_list
(
args
)
do
arguments
=
Enum
.
map
(
args
,
fn
arg
->
if
String
.
contains?
(
arg
,
[
"{"
,
"}"
])
do
{
elem
,
[]}
=
Code
.
eval_string
(
arg
)
elem
else
to_elixir_types
(
arg
)
end
end
)
@spec
transform
(
any
())
::
binary
()
|
no_return
()
def
transform
(
entity
)
when
is_binary
(
entity
)
or
is_map
(
entity
)
or
is_list
(
entity
)
do
entity
|>
do_transform
()
|>
to_binary
()
{
:args
,
arguments
}
end
def
transform
(
entity
),
do
:
to_binary
(
entity
)
@spec
transform_with_out_binary
(
any
())
::
any
()
def
transform_with_out_binary
(
entity
),
do
:
do_transform
(
entity
)
@spec
to_binary
(
any
())
::
binary
()
def
to_binary
(
entity
),
do
:
:erlang
.
term_to_binary
(
entity
)
defp
do_transform
(%
Regex
{}
=
entity
),
do
:
entity
defp
do_transform
(%{
"tuple"
=>
[
":proxy_url"
,
%{
"tuple"
=>
[
type
,
host
,
port
]}]})
do
{
:proxy_url
,
{
do_transform_string
(
type
),
parse_host
(
host
),
port
}}
def
to_elixir_types
(%{
"tuple"
=>
[
":proxy_url"
,
%{
"tuple"
=>
[
type
,
host
,
port
]}]})
do
{
:proxy_url
,
{
string_to_elixir_types
(
type
),
parse_host
(
host
),
port
}}
end
def
p
do_transform
(%{
"tuple"
=>
[
":partial_chain"
,
entity
]})
do
def
to_elixir_types
(%{
"tuple"
=>
[
":partial_chain"
,
entity
]})
do
{
partial_chain
,
[]}
=
entity
|>
String
.
replace
(
~r/[^\w|^{:,[|^,|^[|^\]^}|^\/
|^
\
.|^
"]^
\s
/, "")
...
...
@@ -332,25 +292,51 @@ defp do_transform(%{"tuple" => [":partial_chain", entity]}) do
{:partial_chain, partial_chain}
end
def
p do_transform
(%{"
tuple
" => entity}) do
Enum.reduce(entity, {},
fn val, acc ->
Tuple.append(
acc
,
d
o_
transform(val)) end
)
def
to_elixir_types
(%{"
tuple
" => entity}) do
Enum.reduce(entity, {},
&
Tuple.append(
&2
,
t
o_
elixir_types(&1))
)
end
def
p do_transform
(entity) when is_map(entity) do
for {k, v} <- entity, into: %{}, do:
{
d
o_
transform
(k),
d
o_
transform(v)}
def
to_elixir_types
(entity) when is_map(entity) do
Map.new(entity, fn {k, v} ->
{
t
o_
elixir_types
(k),
t
o_
elixir_types(v)} end)
end
def
p do_transform
(entity) when is_list(entity) do
for v <- entity, into: [], do: do_transform(v
)
def
to_elixir_types
(entity) when is_list(entity) do
Enum.map(entity, &to_elixir_types/1
)
end
def
p do_transform
(entity) when is_binary(entity) do
def
to_elixir_types
(entity) when is_binary(entity) do
entity
|> String.trim()
|> do_transform_string()
|> string_to_elixir_types()
end
def to_elixir_types(entity), do: entity
@spec string_to_elixir_types(String.t()) ::
atom() | Regex.t() | module() | String.t() | no_return()
def string_to_elixir_types("
~r" <> _pattern = regex) do
pattern =
~r/^~r(?'delimiter'[\/|"
'([{<]{1})(?'
pattern
'.+)[\/|"'
)\]}
>
]{
1
}(
?'
modifier
'[uismxfU]*)/u
delimiters = ["/", "|", "
\"
", "'
", {"
(
", "
)
"}, {"
[
", "
]
"}, {"
{
", "
}
"}, {"
<
", "
>
"}]
with %{"
modifier
" => modifier, "
pattern
" => pattern, "
delimiter
" => regex_delimiter} <-
Regex.named_captures(pattern, regex),
{:ok, {leading, closing}} <- find_valid_delimiter(delimiters, pattern, regex_delimiter),
{result, _} <- Code.eval_string("
~
r
#{leading}#{pattern}#{closing}#{modifier}") do
result
end
end
defp do_transform(entity), do: entity
def
string_to_elixir_types
(
":"
<>
atom
),
do
:
String
.
to_atom
(
atom
)
def
string_to_elixir_types
(
value
)
do
if
module_name?
(
value
)
do
String
.
to_existing_atom
(
"Elixir."
<>
value
)
else
value
end
end
defp
parse_host
(
"localhost"
),
do
:
:localhost
...
...
@@ -387,27 +373,8 @@ defp find_valid_delimiter([delimiter | others], pattern, regex_delimiter) do
end
end
defp do_transform_string("
~r" <> _pattern = regex) do
with %{"m
odifier
" => modifier, "
pattern
" => pattern, "
delimiter
" => regex_delimiter} <-
Regex.named_captures(@regex, regex),
{:ok, {leading, closing}} <- find_valid_delimiter(@delimiters, pattern, regex_delimiter),
{result, _} <- Code.eval_string("
~
r
#{leading}#{pattern}#{closing}#{modifier}") do
result
end
end
defp
do_transform_string
(
":"
<>
atom
),
do
:
String
.
to_atom
(
atom
)
defp
do_transform_string
(
value
)
do
if
is_module_name?
(
value
)
do
String
.
to_existing_atom
(
"Elixir."
<>
value
)
else
value
end
end
@spec
is_module_name?
(
String
.
t
())
::
boolean
()
def
is_module_name?
(
string
)
do
@spec
module_name?
(
String
.
t
())
::
boolean
()
def
module_name?
(
string
)
do
Regex
.
match?
(
~r/^(Pleroma|Phoenix|Tesla|Quack|Ueberauth|Swoosh)\./
,
string
)
or
string
in
[
"Oban"
,
"Ueberauth"
,
"ExSyslogger"
]
end
...
...
lib/pleroma/config/transfer_task.ex
View file @
4baf5ffe
...
...
@@ -28,10 +28,6 @@ defmodule Pleroma.Config.TransferTask do
{
:pleroma
,
Pleroma
.
Captcha
,
[
:seconds_valid
]},
{
:pleroma
,
Pleroma
.
Upload
,
[
:proxy_remote
]},
{
:pleroma
,
:instance
,
[
:upload_limit
]},
{
:pleroma
,
:email_notifications
,
[
:digest
]},
{
:pleroma
,
:oauth2
,
[
:clean_expired_tokens
]},
{
:pleroma
,
Pleroma
.
ActivityExpiration
,
[
:enabled
]},
{
:pleroma
,
Pleroma
.
ScheduledActivity
,
[
:enabled
]},
{
:pleroma
,
:gopher
,
[
:enabled
]}
]
...
...
@@ -48,7 +44,7 @@ def load_and_update_env(deleted_settings \\ [], restart_pleroma? \\ true) do
{
logger
,
other
}
=
(
Repo
.
all
(
ConfigDB
)
++
deleted_settings
)
|>
Enum
.
map
(
&
transform_and_merge
/
1
)
|>
Enum
.
map
(
&
merge_with_default
/
1
)
|>
Enum
.
split_with
(
fn
{
group
,
_
,
_
,
_
}
->
group
in
[
:logger
,
:quack
]
end
)
logger
...
...
@@ -92,11 +88,7 @@ defp maybe_set_pleroma_last(apps) do
end
end
defp
transform_and_merge
(%{
group:
group
,
key:
key
,
value:
value
}
=
setting
)
do
group
=
ConfigDB
.
from_string
(
group
)
key
=
ConfigDB
.
from_string
(
key
)
value
=
ConfigDB
.
from_binary
(
value
)
defp
merge_with_default
(%{
group:
group
,
key:
key
,
value:
value
}
=
setting
)
do
default
=
Config
.
Holder
.
default_config
(
group
,
key
)
merged
=
...
...
lib/pleroma/config/type/atom.ex
0 → 100644
View file @
4baf5ffe
defmodule
Pleroma
.
Config
.
Type
.
Atom
do
use
Ecto
.
Type
def
type
,
do
:
:atom
def
cast
(
key
)
when
is_atom
(
key
)
do
{
:ok
,
key
}
end
def
cast
(
key
)
when
is_binary
(
key
)
do
{
:ok
,
Pleroma
.
ConfigDB
.
string_to_elixir_types
(
key
)}
end
def
cast
(
_
),
do
:
:error
def
load
(
key
)
do
{
:ok
,
Pleroma
.
ConfigDB
.
string_to_elixir_types
(
key
)}
end
def
dump
(
key
)
when
is_atom
(
key
),
do
:
{
:ok
,
inspect
(
key
)}
def
dump
(
_
),
do
:
:error
end
lib/pleroma/config/type/binary_value.ex
0 → 100644
View file @
4baf5ffe
defmodule
Pleroma
.
Config
.
Type
.
BinaryValue
do
use
Ecto
.
Type
def
type
,
do
:
:term
def
cast
(
value
)
when
is_binary
(
value
)
do
if
String
.
valid?
(
value
)
do
{
:ok
,
value
}
else
{
:ok
,
:erlang
.
binary_to_term
(
value
)}
end
end
def
cast
(
value
),
do
:
{
:ok
,
value
}
def
load
(
value
)
when
is_binary
(
value
)
do
{
:ok
,
:erlang
.
binary_to_term
(
value
)}
end
def
dump
(
value
)
do
{
:ok
,
:erlang
.
term_to_binary
(
value
)}
end
end
lib/pleroma/web/admin_api/controllers/config_controller.ex
View file @
4baf5ffe
...
...
@@ -33,7 +33,11 @@ def descriptions(conn, _params) do
def
show
(
conn
,
%{
only_db:
true
})
do
with
:ok
<-
configurable_from_database
()
do
configs
=
Pleroma
.
Repo
.
all
(
ConfigDB
)
render
(
conn
,
"index.json"
,
%{
configs:
configs
})
render
(
conn
,
"index.json"
,
%{
configs:
configs
,
need_reboot:
Restarter
.
Pleroma
.
need_reboot?
()
})
end
end
...
...
@@ -61,17 +65,20 @@ def show(conn, _params) do
value
end
%{
group:
ConfigDB
.
convert
(
group
)
,
key:
ConfigDB
.
convert
(
key
)
,
value:
ConfigDB
.
convert
(
merged_value
)
%
ConfigDB
{
group:
group
,
key:
key
,
value:
merged_value
}
|>
Pleroma
.
Maps
.
put_if_present
(
:db
,
db
)
end
)
end
)
|>
List
.
flatten
()
json
(
conn
,
%{
configs:
merged
,
need_reboot:
Restarter
.
Pleroma
.
need_reboot?
()})
render
(
conn
,
"index.json"
,
%{
configs:
merged
,
need_reboot:
Restarter
.
Pleroma
.
need_reboot?
()
})
end
end
...
...
@@ -91,24 +98,17 @@ def update(%{body_params: %{configs: configs}} = conn, _) do
{
deleted
,
updated
}
=
results
|>
Enum
.
map
(
fn
{
:ok
,
config
}
->
Map
.
put
(
config
,
:db
,
ConfigDB
.
get_db_keys
(
config
))
end
)
|>
Enum
.
split_with
(
fn
config
->
Ecto
.
get_meta
(
config
,
:state
)
==
:deleted