improvement: validate that tokens are enabled when password resets are enabled. (#758)

Closes #232.
This commit is contained in:
James Harton 2024-08-05 15:34:55 +12:00 committed by GitHub
parent 9b9f11c3f0
commit a8d98ac40b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -11,7 +11,8 @@ defmodule AshAuthentication.Strategy.Password.Verifier do
@spec verify(Password.t(), map) :: :ok | {:error, Exception.t()}
def verify(strategy, dsl_state) do
with :ok <- validate_behaviour(strategy.hash_provider, HashProvider),
:ok <- validate_tokens_enabled_for_sign_in_tokens(dsl_state, strategy) do
:ok <- validate_tokens_enabled_for_sign_in_tokens(dsl_state, strategy),
:ok <- validate_tokens_enabled_for_resettable(dsl_state, strategy) do
maybe_validate_resettable_sender(dsl_state, strategy)
end
end
@ -69,6 +70,41 @@ defmodule AshAuthentication.Strategy.Password.Verifier do
defp validate_tokens_enabled_for_sign_in_tokens(_, _), do: :ok
defp validate_tokens_enabled_for_resettable(dsl_state, %{resettable: resettable, name: name})
when is_struct(resettable) do
resource = Verifier.get_persisted(dsl_state, :module)
if Info.authentication_tokens_enabled?(dsl_state) do
:ok
else
{:error,
DslError.exception(
module: resource,
path: [
:authentication,
:strategies,
:password,
name,
:resettable
],
message: """
The `resettable` option requires that tokens are enabled for your resource. For example:
authentication do
...
tokens do
enabled? true
end
end
"""
)}
end
end
defp validate_tokens_enabled_for_resettable(_, _), do: :ok
defp maybe_validate_resettable_sender(dsl_state, %{resettable: resettable})
when is_struct(resettable) do
with {:ok, {sender, _opts}} <- Map.fetch(resettable, :sender),