From 97eff90ebe66976b918e39bccccac33a761ab924 Mon Sep 17 00:00:00 2001 From: Kristoffer Dalby Date: Fri, 19 Jun 2026 06:11:52 +0000 Subject: [PATCH] db: report a missing pre-auth key on expire and destroy Expiring or deleting a pre-auth key that does not exist updated zero rows and returned no error, so the caller could not tell a missing key from a successful no-op. Return ErrPreAuthKeyNotFound when RowsAffected is zero. --- hscontrol/db/preauth_keys.go | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/hscontrol/db/preauth_keys.go b/hscontrol/db/preauth_keys.go index bff75ea7..2f4f5de0 100644 --- a/hscontrol/db/preauth_keys.go +++ b/hscontrol/db/preauth_keys.go @@ -309,9 +309,13 @@ func DestroyPreAuthKey(tx *gorm.DB, id uint64) error { } // Then delete the pre-auth key - err = tx.Unscoped().Delete(&types.PreAuthKey{}, id).Error - if err != nil { - return err + res := tx.Unscoped().Delete(&types.PreAuthKey{}, id) + if res.Error != nil { + return res.Error + } + + if res.RowsAffected == 0 { + return ErrPreAuthKeyNotFound } return nil @@ -353,8 +357,19 @@ func UsePreAuthKey(tx *gorm.DB, k *types.PreAuthKey) error { return nil } -// ExpirePreAuthKey marks a [types.PreAuthKey] as expired. +// ExpirePreAuthKey marks a [types.PreAuthKey] as expired, returning +// [ErrPreAuthKeyNotFound] rather than succeeding silently when no such key exists. func ExpirePreAuthKey(tx *gorm.DB, id uint64) error { now := time.Now() - return tx.Model(&types.PreAuthKey{}).Where("id = ?", id).Update("expiration", now).Error + + res := tx.Model(&types.PreAuthKey{}).Where("id = ?", id).Update("expiration", now) + if res.Error != nil { + return res.Error + } + + if res.RowsAffected == 0 { + return ErrPreAuthKeyNotFound + } + + return nil }