Settings → Account → Passkeys: the Manage page fails with a server error for anyone who has a passkey #424
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#424
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found on 2026-09-29 in a read-only review of postulo at
95348908d, by rendering every allauth page the account settings link to.Related to #47.
Checked again on 2026-10-01 against
mainat0a5cad587: still present. The code is now ataccounts/settings_views.py:198(passkeys_url); the other locations have not moved.allauth's passkey list page loads the
humanizetemplate library, anddjango.contrib.humanizeis not installed. The page cannot be compiled, so everybody who has added a passkey and presses Manage gets a 500. That page is the only way to rename or remove a passkey, so a passkey on a lost or stolen device cannot be revoked from the interface.config/settings/base.py:37-73(INSTALLED_APPShas nodjango.contrib.humanize);accounts/settings_views.py:196(passkeys_url = reverse("mfa_list_webauthn"));templates/settings/account.html:105-109(the Manage link, shown wheneverpasskeys.countis non-zero). The failing template is allauth's ownmfa/webauthn/authenticator_list.html, whose fifth line is{% load humanize %}(it uses|naturaltime); Postulo overrides onlytemplates/mfa/base_entrance.htmlandtemplates/mfa/base_manage.html.GET /accounts/2fa/webauthn/raisesTemplateSyntaxError: 'humanize' is not a registered tag library, and the person sees a server error. The per-key Remove and Edit views are linked only from that page, and both redirect back to it on success (success_url = reverse_lazy("mfa_list_webauthn")in allauth'sRemoveWebAuthnViewandEditWebAuthnView), so even a remove that goes through ends on the error page. Checked against allauth 65.19.5 (installed, and pinned inuv.locktoday) and 65.19.2 (pinned when the review began); both loadhumanizethere.tests/e2e/test_passkeys.pyadds a passkey and signs in with it, and never opens Manage."django.contrib.humanize"toINSTALLED_APPS(it has no models and no migrations). Alternatively overridetemplates/mfa/webauthn/authenticator_list.htmlwithouthumanize, in Postulo's own layout, which the override would want anyway. allauth'susersessions/usersession_list.htmlloads it too, should that app ever be installed.Done when
tests/test_allauth_layout.pygives a user oneAuthenticatorof typeWEBAUTHN, requestsreverse("mfa_list_webauthn")and gets 200 with the passkey's name on the page; it fails today withTemplateSyntaxError.mfa_index,mfa_list_webauthn,mfa_add_webauthn, the recovery codes and TOTP pages) for a user who has each kind of authenticator, so a template library allauth adds later fails a test rather than a person.