@@ -145,6 +145,33 @@ defmodule Pleroma.Web.AdminAPI.Config do | |||
for {k, v} <- entity, into: %{}, do: {do_convert(k), do_convert(v)} | |||
end | |||
defp do_convert({:proxy_url, {type, :localhost, port}}) do | |||
%{"tuple" => [":proxy_url", %{"tuple" => [do_convert(type), "localhost", port]}]} | |||
end | |||
defp do_convert({:proxy_url, {type, host, port}}) when is_tuple(host) do | |||
ip = | |||
host | |||
|> :inet_parse.ntoa() | |||
|> to_string() | |||
%{ | |||
"tuple" => [ | |||
":proxy_url", | |||
%{"tuple" => [do_convert(type), ip, port]} | |||
] | |||
} | |||
end | |||
defp do_convert({:proxy_url, {type, host, port}}) do | |||
%{ | |||
"tuple" => [ | |||
":proxy_url", | |||
%{"tuple" => [do_convert(type), to_string(host), port]} | |||
] | |||
} | |||
end | |||
defp do_convert({:dispatch, [entity]}), do: %{"tuple" => [":dispatch", [inspect(entity)]]} | |||
# TODO: will become useless after removing hackney | |||
defp do_convert({:partial_chain, entity}), do: %{"tuple" => [":partial_chain", inspect(entity)]} | |||
@@ -173,6 +200,10 @@ defmodule Pleroma.Web.AdminAPI.Config do | |||
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}} | |||
end | |||
defp do_transform(%{"tuple" => [":dispatch", [entity]]}) do | |||
{dispatch_settings, []} = do_eval(entity) | |||
{:dispatch, [dispatch_settings]} | |||
@@ -204,6 +235,20 @@ defmodule Pleroma.Web.AdminAPI.Config do | |||
defp do_transform(entity), do: entity | |||
defp parse_host("localhost"), do: :localhost | |||
defp parse_host(host) do | |||
charlist = to_charlist(host) | |||
case :inet.parse_address(charlist) do | |||
{:error, :einval} -> | |||
charlist | |||
{:ok, ip} -> | |||
ip | |||
end | |||
end | |||
@delimiters ["/", "|", "\"", "'", {"(", ")"}, {"[", "]"}, {"{", "}"}, {"<", ">"}] | |||
defp find_valid_delimiter([], _string, _), | |||
@@ -1997,6 +1997,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||
setup %{conn: conn} do | |||
admin = insert(:user, is_admin: true) | |||
http = Application.get_env(:pleroma, :http) | |||
on_exit(fn -> | |||
Application.delete_env(:pleroma, :key1) | |||
Application.delete_env(:pleroma, :key2) | |||
@@ -2006,6 +2008,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||
Application.delete_env(:pleroma, :keyaa2) | |||
Application.delete_env(:pleroma, Pleroma.Web.Endpoint.NotReal) | |||
Application.delete_env(:pleroma, Pleroma.Captcha.NotReal) | |||
Application.put_env(:pleroma, :http, http) | |||
Application.put_env(:tesla, :adapter, Tesla.Mock) | |||
:ok = File.rm("config/test.exported_from_db.secret.exs") | |||
end) | |||
@@ -2656,17 +2659,102 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do | |||
] | |||
}) | |||
assert( | |||
json_response(conn, 200) == %{ | |||
"configs" => [ | |||
assert json_response(conn, 200) == %{ | |||
"configs" => [ | |||
%{ | |||
"group" => ":pleroma", | |||
"key" => ":keyaa1", | |||
"value" => [%{"tuple" => [":subkey2", "val2"]}] | |||
} | |||
] | |||
} | |||
end | |||
test "proxy tuple localhost", %{conn: conn} do | |||
conn = | |||
post(conn, "/api/pleroma/admin/config", %{ | |||
configs: [ | |||
%{ | |||
"group" => ":pleroma", | |||
"key" => ":keyaa1", | |||
"value" => [%{"tuple" => [":subkey2", "val2"]}] | |||
group: ":pleroma", | |||
key: ":http", | |||
value: [ | |||
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]}, | |||
%{"tuple" => [":send_user_agent", false]} | |||
] | |||
} | |||
] | |||
} | |||
) | |||
}) | |||
assert json_response(conn, 200) == %{ | |||
"configs" => [ | |||
%{ | |||
"group" => ":pleroma", | |||
"key" => ":http", | |||
"value" => [ | |||
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]}, | |||
%{"tuple" => [":send_user_agent", false]} | |||
] | |||
} | |||
] | |||
} | |||
end | |||
test "proxy tuple domain", %{conn: conn} do | |||
conn = | |||
post(conn, "/api/pleroma/admin/config", %{ | |||
configs: [ | |||
%{ | |||
group: ":pleroma", | |||
key: ":http", | |||
value: [ | |||
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]}, | |||
%{"tuple" => [":send_user_agent", false]} | |||
] | |||
} | |||
] | |||
}) | |||
assert json_response(conn, 200) == %{ | |||
"configs" => [ | |||
%{ | |||
"group" => ":pleroma", | |||
"key" => ":http", | |||
"value" => [ | |||
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]}, | |||
%{"tuple" => [":send_user_agent", false]} | |||
] | |||
} | |||
] | |||
} | |||
end | |||
test "proxy tuple ip", %{conn: conn} do | |||
conn = | |||
post(conn, "/api/pleroma/admin/config", %{ | |||
configs: [ | |||
%{ | |||
group: ":pleroma", | |||
key: ":http", | |||
value: [ | |||
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]}, | |||
%{"tuple" => [":send_user_agent", false]} | |||
] | |||
} | |||
] | |||
}) | |||
assert json_response(conn, 200) == %{ | |||
"configs" => [ | |||
%{ | |||
"group" => ":pleroma", | |||
"key" => ":http", | |||
"value" => [ | |||
%{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]}, | |||
%{"tuple" => [":send_user_agent", false]} | |||
] | |||
} | |||
] | |||
} | |||
end | |||
end | |||
@@ -217,6 +217,36 @@ defmodule Pleroma.Web.AdminAPI.ConfigTest do | |||
assert Config.from_binary(binary) == {"v1", :v2} | |||
end | |||
test "proxy tuple with localhost" do | |||
binary = | |||
Config.transform(%{ | |||
"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}] | |||
}) | |||
assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, :localhost, 1234}}) | |||
assert Config.from_binary(binary) == {:proxy_url, {:socks5, :localhost, 1234}} | |||
end | |||
test "proxy tuple with domain" do | |||
binary = | |||
Config.transform(%{ | |||
"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}] | |||
}) | |||
assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, 'domain.com', 1234}}) | |||
assert Config.from_binary(binary) == {:proxy_url, {:socks5, 'domain.com', 1234}} | |||
end | |||
test "proxy tuple with ip" do | |||
binary = | |||
Config.transform(%{ | |||
"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}] | |||
}) | |||
assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}}) | |||
assert Config.from_binary(binary) == {:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}} | |||
end | |||
test "tuple with n childs" do | |||
binary = | |||
Config.transform(%{ | |||