|
@@ -5,12 +5,14 @@ import (
|
|
"crypto/sha1"
|
|
"crypto/sha1"
|
|
"encoding/hex"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"fmt"
|
|
|
|
+ "time"
|
|
|
|
+
|
|
"github.com/0xJacky/Nginx-UI/internal/cache"
|
|
"github.com/0xJacky/Nginx-UI/internal/cache"
|
|
"github.com/0xJacky/Nginx-UI/internal/crypto"
|
|
"github.com/0xJacky/Nginx-UI/internal/crypto"
|
|
"github.com/0xJacky/Nginx-UI/model"
|
|
"github.com/0xJacky/Nginx-UI/model"
|
|
|
|
+ "github.com/0xJacky/Nginx-UI/query"
|
|
"github.com/google/uuid"
|
|
"github.com/google/uuid"
|
|
"github.com/pquerna/otp/totp"
|
|
"github.com/pquerna/otp/totp"
|
|
- "time"
|
|
|
|
)
|
|
)
|
|
|
|
|
|
func VerifyOTP(user *model.User, otp, recoveryCode string) (err error) {
|
|
func VerifyOTP(user *model.User, otp, recoveryCode string) (err error) {
|
|
@@ -24,14 +26,39 @@ func VerifyOTP(user *model.User, otp, recoveryCode string) (err error) {
|
|
return ErrOTPCode
|
|
return ErrOTPCode
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- recoverCode, err := hex.DecodeString(recoveryCode)
|
|
|
|
|
|
+ // get user from db
|
|
|
|
+ u := query.User
|
|
|
|
+ user, err = u.Where(u.ID.Eq(user.ID)).First()
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- k := sha1.Sum(user.OTPSecret)
|
|
|
|
- if !bytes.Equal(k[:], recoverCode) {
|
|
|
|
- return ErrRecoveryCode
|
|
|
|
|
|
+
|
|
|
|
+ // legacy recovery code
|
|
|
|
+ if !user.RecoveryCodeGenerated() {
|
|
|
|
+ if user.OTPSecret == nil {
|
|
|
|
+ return ErrTOTPNotEnabled
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ recoverCode, err := hex.DecodeString(recoveryCode)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ k := sha1.Sum(user.OTPSecret)
|
|
|
|
+ if !bytes.Equal(k[:], recoverCode) {
|
|
|
|
+ return ErrRecoveryCode
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // check recovery code
|
|
|
|
+ for _, code := range user.RecoveryCodes.Codes {
|
|
|
|
+ if code.Code == recoveryCode && code.UsedTime == nil {
|
|
|
|
+ t := time.Now()
|
|
|
|
+ code.UsedTime = &t
|
|
|
|
+ _, err = u.Where(u.ID.Eq(user.ID)).Updates(user)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ return ErrRecoveryCode
|
|
}
|
|
}
|
|
return
|
|
return
|
|
}
|
|
}
|