Skip to content

Commit 5007fd9

Browse files
committed
Wrap create key in a try statement.
1 parent 2bf4f89 commit 5007fd9

1 file changed

Lines changed: 23 additions & 17 deletions

File tree

hypha/apply/users/passkey_views.py

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,20 @@ def passkey_register_complete(request):
161161
name = (data.get("name") or "").strip()[:128] or timezone.now().strftime(
162162
"Passkey %Y-%m-%d"
163163
)
164-
Passkey.objects.create(
165-
user=request.user,
166-
name=name,
167-
credential_id=bytes_to_base64url(verification.credential_id),
168-
public_key=bytes_to_base64url(verification.credential_public_key),
169-
sign_count=verification.sign_count,
170-
transports=data["response"].get("transports", []),
171-
)
164+
try:
165+
Passkey.objects.create(
166+
user=request.user,
167+
name=name,
168+
credential_id=bytes_to_base64url(verification.credential_id),
169+
public_key=bytes_to_base64url(verification.credential_public_key),
170+
sign_count=verification.sign_count,
171+
transports=data["response"].get("transports", []),
172+
)
173+
except Exception:
174+
logger.warning(
175+
"Failed to save passkey for user %s", request.user.pk, exc_info=True
176+
)
177+
return JsonResponse({"error": _("Could not save passkey")}, status=500)
172178
logger.info("Passkey registered for user %s (name=%r)", request.user.pk, name)
173179
return JsonResponse({"status": "ok"})
174180

@@ -204,6 +210,10 @@ def passkey_auth_complete(request):
204210

205211
try:
206212
credential_id_b64 = bytes_to_base64url(base64url_to_bytes(data["rawId"]))
213+
raw_user_handle = data["response"].get("userHandle")
214+
user_handle_bytes = (
215+
base64url_to_bytes(raw_user_handle) if raw_user_handle else None
216+
)
207217
except Exception:
208218
return JsonResponse({"error": _("Invalid credential")}, status=400)
209219

@@ -215,12 +225,10 @@ def passkey_auth_complete(request):
215225
.get(credential_id=credential_id_b64)
216226
)
217227

218-
user_handle = data["response"].get("userHandle")
219-
if user_handle:
220-
if base64url_to_bytes(user_handle) != str(passkey.user.pk).encode():
221-
return JsonResponse(
222-
{"error": _("User handle mismatch")}, status=400
223-
)
228+
if user_handle_bytes is not None:
229+
if user_handle_bytes != str(passkey.user.pk).encode():
230+
raise InvalidAuthenticationResponse("User handle mismatch")
231+
224232
credential = AuthenticationCredential(
225233
id=data["id"],
226234
raw_id=base64url_to_bytes(data["rawId"]),
@@ -232,9 +240,7 @@ def passkey_auth_complete(request):
232240
data["response"]["authenticatorData"]
233241
),
234242
signature=base64url_to_bytes(data["response"]["signature"]),
235-
user_handle=base64url_to_bytes(user_handle)
236-
if user_handle
237-
else None,
243+
user_handle=user_handle_bytes,
238244
),
239245
)
240246
verification = verify_authentication_response(

0 commit comments

Comments
 (0)