Packages
ash_authentication
4.4.4
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/token_resource/expunger.ex
defmodule AshAuthentication.TokenResource.Expunger do
@moduledoc """
A `GenServer` which periodically removes expired token revocations.
Scans all token revocation resources based on their configured expunge
interval and removes any expired records.
```elixir
defmodule MyApp.Accounts.Token do
use Ash.Resource,
extensions: [AshAuthentication.TokenResource],
domain: MyApp.Accounts
token do
expunge_interval 12
end
end
```
This GenServer is started by the `AshAuthentication.Supervisor` which should
be added to your app's supervision tree.
"""
use GenServer
alias AshAuthentication.{TokenResource, TokenResource.Actions, TokenResource.Info}
@doc false
@spec start_link(any) :: GenServer.on_start()
def start_link(opts), do: GenServer.start_link(__MODULE__, opts)
@doc false
@impl true
@spec init(any) :: {:ok, map}
def init(opts) do
otp_app = Keyword.fetch!(opts, :otp_app)
resource_states =
otp_app
|> Spark.sparks(Ash.Resource)
|> Stream.filter(&(TokenResource in Spark.extensions(&1)))
|> Enum.reduce(%{}, fn resource, resources ->
state =
resources
|> Map.get(resource, %{interval: nil, timer: nil})
|> maybe_update_timer(resource, interval_for(resource))
Map.put(resources, resource, state)
end)
{:ok, %{otp_app: otp_app, resources: resource_states}}
end
@doc false
@impl true
@spec handle_info(any, map) :: {:noreply, map}
def handle_info({:expunge, resource}, state) do
Actions.expunge_expired(resource)
resource_state =
state.resources
|> Map.get(resource)
|> maybe_update_timer(resource, interval_for(resource))
{:noreply, %{state | resources: Map.put(state.resources, resource, resource_state)}}
end
def handle_info(_, state), do: {:noreply, state}
defp interval_for(resource) do
Info.token_expunge_interval!(resource) * 60 * 60 * 1000
end
defp maybe_update_timer(state, resource, new_interval)
when state.interval == new_interval and is_nil(state.timer) do
{:ok, timer} = :timer.send_interval(new_interval, {:expunge, resource})
%{state | timer: timer}
end
defp maybe_update_timer(state, _resource, new_interval) when state.interval == new_interval,
do: state
defp maybe_update_timer(state, resource, new_interval) when is_nil(state.timer) do
{:ok, timer} = :timer.send_interval(new_interval, {:expunge, resource})
%{state | interval: new_interval, timer: timer}
end
defp maybe_update_timer(state, resource, new_interval) do
:timer.cancel(state.timer)
{:ok, timer} = :timer.send_interval(new_interval, {:expunge, resource})
%{state | interval: new_interval, timer: timer}
end
end