Reject passkey verification for already claimed session
This commit is contained in:
@@ -125,6 +125,12 @@ var ErrFileNotFoundInAlbum = ApiError{
|
||||
Message: "File is either deleted or moved to different collection",
|
||||
}
|
||||
|
||||
var ErrSessionAlreadyClaimed = ApiError{
|
||||
Code: "SESSION_ALREADY_CLAIMED",
|
||||
Message: "Session is already claimed",
|
||||
HttpStatusCode: http.StatusConflict,
|
||||
}
|
||||
|
||||
var ErrPublicCollectDisabled = ApiError{
|
||||
Code: PublicCollectDisabled,
|
||||
Message: "User has not enabled public collect for this url",
|
||||
|
||||
@@ -325,6 +325,17 @@ func (h *UserHandler) BeginPasskeyAuthenticationCeremony(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
isSessionAlreadyClaimed, err := h.UserController.PasskeyRepo.IsSessionAlreadyClaimed(request.SessionID)
|
||||
if err != nil {
|
||||
handler.Error(c, stacktrace.Propagate(err, ""))
|
||||
return
|
||||
}
|
||||
|
||||
if isSessionAlreadyClaimed {
|
||||
handler.Error(c, stacktrace.Propagate(&ente.ErrSessionAlreadyClaimed, "Session already claimed"))
|
||||
return
|
||||
}
|
||||
|
||||
user, err := h.UserController.UserRepo.Get(userID)
|
||||
if err != nil {
|
||||
handler.Error(c, stacktrace.Propagate(err, ""))
|
||||
|
||||
@@ -174,6 +174,19 @@ func (r *Repository) GetUserIDWithPasskeyTwoFactorSession(sessionID string) (use
|
||||
return
|
||||
}
|
||||
|
||||
// IsSessionAlreadyClaimed checks if the both token_data and verified_at are not null for a given session ID
|
||||
func (r *Repository) IsSessionAlreadyClaimed(sessionID string) (bool, error) {
|
||||
var verifiedAt sql.NullInt64
|
||||
err := r.DB.QueryRow(`SELECT verified_at FROM passkey_login_sessions WHERE session_id = $1`, sessionID).Scan(&verifiedAt)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return false, nil
|
||||
}
|
||||
return false, stacktrace.Propagate(err, "")
|
||||
}
|
||||
return verifiedAt.Valid, nil
|
||||
}
|
||||
|
||||
// StoreTokenData takes a sessionID, and tokenData, and updates the tokenData in the database
|
||||
func (r *Repository) StoreTokenData(sessionID string, tokenData ente.TwoFactorAuthorizationResponse) error {
|
||||
tokenDataJson, err := json.Marshal(tokenData)
|
||||
|
||||
Reference in New Issue
Block a user