philomena/lib/philomena_web/plugs/user_attribution_plug.ex

54 lines
1.1 KiB
Elixir
Raw Permalink Normal View History

2019-11-17 19:29:07 +01:00
defmodule PhilomenaWeb.UserAttributionPlug do
@moduledoc """
This plug stores information about the current session for use in
model attribution.
## Example
plug PhilomenaWeb.UserAttributionPlug
"""
alias Plug.Conn
@doc false
@spec init(any()) :: any()
def init(opts), do: opts
@doc false
@spec call(Plug.Conn.t(), any()) :: Plug.Conn.t()
def call(conn, _opts) do
{:ok, remote_ip} = EctoNetwork.INET.cast(conn.remote_ip)
2019-11-17 19:29:07 +01:00
conn = Conn.fetch_cookies(conn)
user = conn.assigns.current_user
2020-01-11 05:20:19 +01:00
attributes = [
ip: remote_ip,
fingerprint: fingerprint(conn, conn.path_info),
referrer: referrer(conn.assigns.referrer),
2020-01-11 05:20:19 +01:00
user: user,
user_agent: user_agent(conn)
]
2019-11-17 19:29:07 +01:00
conn
|> Conn.assign(:attributes, attributes)
end
defp user_agent(conn) do
case Conn.get_req_header(conn, "user-agent") do
[ua] -> ua
2020-01-11 05:20:19 +01:00
_ -> nil
2019-11-17 19:29:07 +01:00
end
end
defp fingerprint(conn, ["api" | _]) do
"a#{:erlang.crc32(user_agent(conn))}"
end
defp fingerprint(conn, _) do
conn.cookies["_ses"]
end
defp referrer(nil), do: nil
defp referrer(r), do: String.slice(r, 0, 255)
2020-01-11 05:20:19 +01:00
end