logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

remote_ip.ex (1357B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.Plugs.RemoteIp do
  5. @moduledoc """
  6. This is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration.
  7. """
  8. alias Pleroma.Config
  9. import Plug.Conn
  10. @behaviour Plug
  11. def init(_), do: nil
  12. def call(%{remote_ip: original_remote_ip} = conn, _) do
  13. if Config.get([__MODULE__, :enabled]) do
  14. %{remote_ip: new_remote_ip} = conn = RemoteIp.call(conn, remote_ip_opts())
  15. assign(conn, :remote_ip_found, original_remote_ip != new_remote_ip)
  16. else
  17. conn
  18. end
  19. end
  20. defp remote_ip_opts do
  21. headers = Config.get([__MODULE__, :headers], []) |> MapSet.new()
  22. reserved = Config.get([__MODULE__, :reserved], [])
  23. proxies =
  24. Config.get([__MODULE__, :proxies], [])
  25. |> Enum.concat(reserved)
  26. |> Enum.map(&maybe_add_cidr/1)
  27. {headers, proxies}
  28. end
  29. defp maybe_add_cidr(proxy) when is_binary(proxy) do
  30. proxy =
  31. cond do
  32. "/" in String.codepoints(proxy) -> proxy
  33. InetCidr.v4?(InetCidr.parse_address!(proxy)) -> proxy <> "/32"
  34. InetCidr.v6?(InetCidr.parse_address!(proxy)) -> proxy <> "/128"
  35. end
  36. InetCidr.parse_cidr!(proxy, true)
  37. end
  38. end