add admin account recovery via setup secret
All checks were successful
deploy / deploy (push) Successful in 1m33s

When email isn't configured, the login page now hides the magic link
form and shows a recovery link. The /recover page logs the setup secret
to server logs and lets the admin reset their password with it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-02-21 21:40:53 +00:00
parent 194fec8240
commit b0607621f3
7 changed files with 343 additions and 25 deletions

View File

@@ -29,9 +29,39 @@ defmodule BerrypodWeb.SetupController do
end
end
@doc """
Logs in after a successful password recovery.
Same flow as setup login — validates the token, sets the session cookie,
then redirects to admin.
"""
def recover_login(conn, %{"token" => token}) do
if Accounts.get_user_by_magic_link_token(token) do
case Accounts.login_user_by_magic_link(token) do
{:ok, {user, tokens_to_disconnect}} ->
UserAuth.disconnect_sessions(tokens_to_disconnect)
conn
|> put_session(:user_return_to, ~p"/admin")
|> UserAuth.log_in_user(user)
_ ->
recover_login_failed(conn)
end
else
recover_login_failed(conn)
end
end
defp login_failed(conn) do
conn
|> put_flash(:error, "Login failed — please try again.")
|> redirect(to: ~p"/setup")
end
defp recover_login_failed(conn) do
conn
|> put_flash(:error, "Recovery login failed — please try again.")
|> redirect(to: ~p"/recover")
end
end