Packages
ash_authentication
4.7.0
5.0.0-rc.12
5.0.0-rc.11
5.0.0-rc.10
5.0.0-rc.9
5.0.0-rc.8
5.0.0-rc.7
5.0.0-rc.6
5.0.0-rc.5
5.0.0-rc.4
5.0.0-rc.3
5.0.0-rc.2
5.0.0-rc.1
5.0.0-rc.0
4.14.1
4.14.0
4.13.7
4.13.6
4.13.5
4.13.4
4.13.3
4.13.2
retired
4.13.1
retired
4.13.0
4.12.0
4.11.0
4.10.0
4.9.9
4.9.8
4.9.7
4.9.6
4.9.5
4.9.4
4.9.3
4.9.2
4.9.1
4.9.0
4.8.7
4.8.6
4.8.5
4.8.3
4.8.2
4.8.1
4.8.0
4.7.6
4.7.5
4.7.4
4.7.3
4.7.2
4.7.1
4.7.0
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.6
4.5.5
4.5.4
4.5.3
4.5.2
4.5.1
4.5.0
4.4.9
4.4.8
4.4.7
4.4.6
4.4.5
4.4.4
4.4.3
4.4.2
4.4.1
4.4.0
4.3.12
4.3.11
4.3.10
4.3.9
4.3.8
4.3.7
4.3.6
4.3.5
4.3.4
4.3.3
4.3.2
4.3.1
4.3.0
4.2.7
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.4
4.0.3
4.0.2
4.0.1
4.0.0
4.0.0-rc.6
4.0.0-rc.5
4.0.0-rc.3
4.0.0-rc.2
4.0.0-rc.1
4.0.0-rc.0
3.12.4
3.12.3
3.12.2
3.12.1
3.12.0
3.11.16
3.11.15
3.11.14
3.11.13
3.11.12
3.11.11
3.11.10
3.11.9
3.11.8
3.11.7
3.11.6
3.11.5
3.11.4
3.11.3
3.11.2
3.11.1
3.11.0
3.10.8
3.10.7
3.10.6
3.10.5
3.10.4
3.10.3
3.10.2
3.10.1
3.10.0
3.9.6
3.9.5
3.9.4
3.9.3
3.9.2
3.9.1
3.9.0
3.8.0
3.7.9
3.7.8
3.7.6
3.7.5
3.7.4
3.7.3
3.7.2
3.7.1
3.7.0
3.6.1
3.6.0
3.5.3
3.5.2
3.5.1
3.5.0
3.3.1
3.3.0
3.2.2
3.2.1
3.2.0
3.1.0
3.0.3
Authentication extension for the Ash Framework.
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/ash_authentication/plug/macros.ex
defmodule AshAuthentication.Plug.Macros do
@moduledoc """
Generators used within `use AshAuthentication.Plug`.
"""
alias Ash.Domain
alias AshAuthentication.Plug.Helpers
alias Plug.Conn
alias Spark.Dsl.Extension
@doc """
Generates the subject name validation code for the auth plug.
"""
@spec validate_subject_name_uniqueness(atom) :: Macro.t()
defmacro validate_subject_name_uniqueness(otp_app) do
quote do
unquote(otp_app)
|> Application.compile_env(:ash_domains, [])
|> Stream.flat_map(&Domain.Info.resources(&1))
|> Stream.map(&{&1, Extension.get_persisted(&1, :authentication)})
|> Stream.reject(&(elem(&1, 1) == nil))
|> Stream.map(&{elem(&1, 0), elem(&1, 1).subject_name})
|> Enum.group_by(&elem(&1, 1), &elem(&1, 0))
|> Enum.reject(&(length(elem(&1, 1)) < 2))
|> case do
[] ->
nil
duplicates ->
import AshAuthentication.Utils, only: [to_sentence: 2]
duplicates =
duplicates
|> Enum.map(fn {subject_name, resources} ->
resources =
resources
|> Enum.map(&"`#{inspect(&1)}`")
|> to_sentence(final: "and")
" `#{subject_name}`: #{resources}\n"
end)
raise """
Error: There are multiple resources configured with the same subject name.
This is bad because we will be unable to correctly convert between subjects and resources.
#{duplicates}
"""
end
end
end
@doc """
Generates the `load_from_session/2` plug with the `otp_app` prefilled.
"""
@spec define_load_from_session(atom) :: Macro.t()
defmacro define_load_from_session(otp_app) do
quote do
@doc """
Attempt to retrieve all users from the connections' session.
A wrapper around `AshAuthentication.Plug.Helpers.retrieve_from_session/3`
with the `otp_app` already present.
"""
@spec load_from_session(Conn.t(), any) :: Conn.t()
def load_from_session(conn, opts),
do: Helpers.retrieve_from_session(conn, unquote(otp_app), opts)
end
end
@doc """
Generates the `load_from_bearer/2` plug with the `otp_app` prefilled.
"""
@spec define_load_from_bearer(atom) :: Macro.t()
defmacro define_load_from_bearer(otp_app) do
quote do
@doc """
Attempt to retrieve users from the `Authorization` header(s).
A wrapper around `AshAuthentication.Plug.Helpers.retrieve_from_bearer/3` with the `otp_app` already present.
"""
@spec load_from_bearer(Conn.t(), any) :: Conn.t()
def load_from_bearer(conn, opts),
do: Helpers.retrieve_from_bearer(conn, unquote(otp_app), opts)
end
end
@doc """
Generates the `revoke_bearer_tokens/2` plug with the `otp_app` prefilled.
"""
@spec define_revoke_bearer_tokens(atom) :: Macro.t()
defmacro define_revoke_bearer_tokens(otp_app) do
quote do
@doc """
Revoke all authorization header(s).
Any bearer-style authorization headers will have their tokens revoked.
A wrapper around `AshAuthentication.Plug.Helpers.revoke_bearer_tokens/2` with the `otp_app` already present.
"""
@spec revoke_bearer_tokens(Conn.t(), any) :: Conn.t()
def revoke_bearer_tokens(conn, _opts),
do: Helpers.revoke_bearer_tokens(conn, unquote(otp_app))
end
end
end