akkoma/lib/pleroma/web/plugs/remote_ip.ex

49 lines
1.3 KiB
Elixir
Raw Normal View History

2019-09-27 21:59:23 +00:00
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
2019-09-27 21:59:23 +00:00
# SPDX-License-Identifier: AGPL-3.0-only
2020-06-24 06:30:32 +00:00
defmodule Pleroma.Web.Plugs.RemoteIp do
2019-09-27 21:59:23 +00:00
@moduledoc """
This is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration.
"""
alias Pleroma.Config
import Plug.Conn
2019-09-27 21:59:23 +00:00
@behaviour Plug
def init(_), do: nil
def call(%{remote_ip: original_remote_ip} = conn, _) do
if Config.get([__MODULE__, :enabled]) do
%{remote_ip: new_remote_ip} = conn = RemoteIp.call(conn, remote_ip_opts())
assign(conn, :remote_ip_found, original_remote_ip != new_remote_ip)
2019-09-27 21:59:23 +00:00
else
conn
end
end
2020-10-06 22:26:31 +00:00
defp remote_ip_opts do
headers = Config.get([__MODULE__, :headers], []) |> MapSet.new()
reserved = Config.get([__MODULE__, :reserved], [])
2019-09-27 21:59:23 +00:00
proxies =
Config.get([__MODULE__, :proxies], [])
2019-09-27 21:59:23 +00:00
|> Enum.concat(reserved)
|> Enum.map(&maybe_add_cidr/1)
2019-09-27 21:59:23 +00:00
{headers, proxies}
end
defp maybe_add_cidr(proxy) when is_binary(proxy) do
proxy =
cond do
"/" in String.codepoints(proxy) -> proxy
InetCidr.v4?(InetCidr.parse_address!(proxy)) -> proxy <> "/32"
InetCidr.v6?(InetCidr.parse_address!(proxy)) -> proxy <> "/128"
end
2020-10-07 19:16:53 +00:00
InetCidr.parse(proxy, true)
end
2019-09-27 21:59:23 +00:00
end