2020-01-26 21:36:50 +01:00
|
|
|
defmodule Mobilizon.Web.Auth.Context do
|
2019-01-03 14:59:59 +01:00
|
|
|
@moduledoc """
|
2020-01-26 21:36:50 +01:00
|
|
|
Guardian context for Mobilizon.Web
|
2019-01-03 14:59:59 +01:00
|
|
|
"""
|
2018-11-06 10:30:27 +01:00
|
|
|
@behaviour Plug
|
|
|
|
|
|
|
|
import Plug.Conn
|
2020-01-23 21:59:50 +01:00
|
|
|
|
2019-03-06 18:45:26 +01:00
|
|
|
alias Mobilizon.Users.User
|
2018-11-06 10:30:27 +01:00
|
|
|
|
2021-09-10 11:27:59 +02:00
|
|
|
@spec init(Plug.opts()) :: Plug.opts()
|
2018-11-06 10:30:27 +01:00
|
|
|
def init(opts) do
|
|
|
|
opts
|
|
|
|
end
|
|
|
|
|
2021-09-10 11:27:59 +02:00
|
|
|
@spec call(Plug.Conn.t(), Plug.opts()) :: Plug.Conn.t()
|
2020-08-27 15:42:09 +02:00
|
|
|
def call(%{assigns: %{ip: _}} = conn, _opts), do: conn
|
|
|
|
|
|
|
|
def call(conn, _opts) do
|
2020-08-28 09:23:49 +02:00
|
|
|
set_user_information_in_context(conn)
|
2020-08-27 15:42:09 +02:00
|
|
|
end
|
|
|
|
|
2021-09-10 11:27:59 +02:00
|
|
|
@spec set_user_information_in_context(Plug.Conn.t()) :: Plug.Conn.t()
|
|
|
|
defp set_user_information_in_context(conn) do
|
2020-08-27 15:42:09 +02:00
|
|
|
context = %{ip: conn.remote_ip |> :inet.ntoa() |> to_string()}
|
2019-03-14 18:31:14 +01:00
|
|
|
|
2021-09-24 16:46:42 +02:00
|
|
|
user_agent = conn |> Plug.Conn.get_req_header("user-agent") |> List.first()
|
2021-09-10 11:31:29 +02:00
|
|
|
|
2021-12-15 09:47:52 +01:00
|
|
|
if Application.get_env(:sentry, :dsn) != nil do
|
2021-10-10 16:25:50 +02:00
|
|
|
Sentry.Context.set_request_context(%{
|
|
|
|
url: Plug.Conn.request_url(conn),
|
|
|
|
method: conn.method,
|
|
|
|
headers: %{
|
|
|
|
"User-Agent": user_agent,
|
|
|
|
Referer: conn |> Plug.Conn.get_req_header("referer") |> List.first()
|
|
|
|
},
|
|
|
|
query_string: conn.query_string,
|
|
|
|
env: %{
|
|
|
|
REQUEST_ID: conn |> Plug.Conn.get_resp_header("x-request-id") |> List.first(),
|
|
|
|
SERVER_NAME: conn.host
|
|
|
|
}
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
2021-07-27 19:47:54 +02:00
|
|
|
{conn, context} =
|
2019-03-14 18:31:14 +01:00
|
|
|
case Guardian.Plug.current_resource(conn) do
|
2021-04-20 15:07:57 +02:00
|
|
|
%User{id: user_id, email: user_email} = user ->
|
2021-12-15 09:47:52 +01:00
|
|
|
if Application.get_env(:sentry, :dsn) != nil do
|
2021-10-10 16:25:50 +02:00
|
|
|
Sentry.Context.set_user_context(%{
|
|
|
|
id: user_id,
|
|
|
|
email: user_email,
|
|
|
|
ip_address: context.ip
|
2021-09-10 11:31:29 +02:00
|
|
|
})
|
2021-06-27 13:15:24 +02:00
|
|
|
end
|
|
|
|
|
2021-07-27 19:47:54 +02:00
|
|
|
context = Map.put(context, :current_user, user)
|
|
|
|
conn = assign(conn, :user_locale, user.locale)
|
|
|
|
{conn, context}
|
2019-03-14 18:31:14 +01:00
|
|
|
|
|
|
|
nil ->
|
2021-07-27 19:47:54 +02:00
|
|
|
{conn, context}
|
2019-03-14 18:31:14 +01:00
|
|
|
end
|
|
|
|
|
2021-09-10 11:31:29 +02:00
|
|
|
context = if is_nil(user_agent), do: context, else: Map.put(context, :user_agent, user_agent)
|
2020-08-28 09:23:49 +02:00
|
|
|
|
2019-03-14 18:31:14 +01:00
|
|
|
put_private(conn, :absinthe, %{context: context})
|
2018-11-06 10:30:27 +01:00
|
|
|
end
|
|
|
|
end
|