Browse Source

parsing proxy url setting

revert/attachment-cleanup
Alexander Alexander Strizhakov 4 years ago
parent
commit
583cee4607
No known key found for this signature in database GPG Key ID: 22896A53AEF1381
3 changed files with 171 additions and 8 deletions
  1. +45
    -0
      lib/pleroma/web/admin_api/config.ex
  2. +96
    -8
      test/web/admin_api/admin_api_controller_test.exs
  3. +30
    -0
      test/web/admin_api/config_test.exs

+ 45
- 0
lib/pleroma/web/admin_api/config.ex View File

@@ -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, _),


+ 96
- 8
test/web/admin_api/admin_api_controller_test.exs View File

@@ -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



+ 30
- 0
test/web/admin_api/config_test.exs View File

@@ -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(%{


Loading…
Cancel
Save