Packages
ash_authentication
5.0.0-rc.9
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/oidc_connection/transformer.ex
# SPDX-FileCopyrightText: 2022 Alembic Pty Ltd
#
# SPDX-License-Identifier: MIT
defmodule AshAuthentication.OidcConnection.Transformer do
@moduledoc """
Sets up default attributes and actions for resources extended with
`AshAuthentication.OidcConnection`.
For each configured field (`base_url_field`, `client_id_field`, etc.), if
the resource doesn't already define it (as an attribute, calculation,
aggregate, or relationship), a default string attribute is built. Users
can replace any field with a calculation (e.g. one that decrypts an
encrypted column on load) by simply defining it on the resource.
"""
use Spark.Dsl.Transformer
alias Ash.{Resource, Type}
alias AshAuthentication.OidcConnection
alias Spark.Dsl.Transformer
import AshAuthentication.Utils
@doc false
@impl true
@spec after?(any) :: boolean()
def after?(Resource.Transformers.ValidatePrimaryActions), do: true
def after?(_), do: false
@doc false
@impl true
@spec before?(any) :: boolean
def before?(Resource.Transformers.CachePrimaryKey), do: true
def before?(Resource.Transformers.DefaultAccept), do: true
def before?(Resource.Transformers.ValidateRelationshipAttributes), do: true
def before?(_), do: false
@doc false
@impl true
@spec transform(map) ::
:ok | {:ok, map} | {:error, term} | {:warn, map, String.t() | [String.t()]} | :halt
def transform(dsl_state) do
with {:ok, dsl_state} <- maybe_set_domain(dsl_state, :oidc_connection),
{:ok, id_attribute} <- OidcConnection.Info.oidc_connection_id_attribute_name(dsl_state),
{:ok, dsl_state} <-
maybe_build_attribute(dsl_state, id_attribute, Type.UUID,
allow_nil?: false,
writable?: true,
primary_key?: true,
default: &Ash.UUID.generate/0
),
{:ok, dsl_state} <-
maybe_build_field(dsl_state, :base_url_field, Type.String,
allow_nil?: false,
writable?: true,
public?: true
),
{:ok, dsl_state} <-
maybe_build_field(dsl_state, :client_id_field, Type.String,
allow_nil?: false,
writable?: true,
public?: true
),
{:ok, dsl_state} <-
maybe_build_field(dsl_state, :client_secret_field, Type.String,
allow_nil?: false,
writable?: true,
sensitive?: true
),
{:ok, dsl_state} <-
maybe_build_field(dsl_state, :display_name_field, Type.String,
allow_nil?: true,
writable?: true,
public?: true
),
{:ok, dsl_state} <-
maybe_build_field(dsl_state, :icon_url_field, Type.String,
allow_nil?: true,
writable?: true,
public?: true
),
{:ok, read_action_name} <-
OidcConnection.Info.oidc_connection_read_action_name(dsl_state) do
maybe_build_action(dsl_state, read_action_name, fn _ ->
build_read_action(read_action_name)
end)
end
end
# If the resource doesn't already define a field with the configured name
# (whether as an attribute, calculation, aggregate, or relationship),
# build the default string attribute for it. Users can replace the
# auto-built attribute by defining one of those themselves — e.g. a
# calculation that decrypts an encrypted column on load.
defp maybe_build_field(dsl_state, dsl_key, type, opts) do
info_function = String.to_existing_atom("oidc_connection_#{dsl_key}")
{:ok, field_name} = apply(OidcConnection.Info, info_function, [dsl_state])
cond do
is_nil(field_name) -> {:ok, dsl_state}
Ash.Resource.Info.field(dsl_state, field_name) -> {:ok, dsl_state}
true -> maybe_build_attribute(dsl_state, field_name, type, opts)
end
end
defp build_read_action(action_name) do
Transformer.build_entity(Resource.Dsl, [:actions], :read,
name: action_name,
primary?: true
)
end
end