user.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package model
  2. import (
  3. "github.com/go-webauthn/webauthn/webauthn"
  4. "github.com/spf13/cast"
  5. "gorm.io/gorm"
  6. )
  7. type User struct {
  8. Model
  9. Name string `json:"name"`
  10. Password string `json:"-"`
  11. Status bool `json:"status" gorm:"default:1"`
  12. OTPSecret []byte `json:"-" gorm:"type:blob"`
  13. EnabledTwoFA bool `json:"enabled_2fa" gorm:"-"`
  14. }
  15. type AuthToken struct {
  16. UserID int `json:"user_id"`
  17. Token string `json:"token"`
  18. ExpiredAt int64 `json:"expired_at" gorm:"default:0"`
  19. }
  20. func (u *User) TableName() string {
  21. return "auths"
  22. }
  23. func (u *User) AfterFind(_ *gorm.DB) error {
  24. u.EnabledTwoFA = u.Enabled2FA()
  25. return nil
  26. }
  27. func (u *User) EnabledOTP() bool {
  28. return len(u.OTPSecret) != 0
  29. }
  30. func (u *User) EnabledPasskey() bool {
  31. var passkeys Passkey
  32. db.Where("user_id", u.ID).Limit(1).Find(&passkeys)
  33. return passkeys.ID != 0
  34. }
  35. func (u *User) Enabled2FA() bool {
  36. return u.EnabledOTP() || u.EnabledPasskey()
  37. }
  38. func (u *User) WebAuthnID() []byte {
  39. return []byte(cast.ToString(u.ID))
  40. }
  41. func (u *User) WebAuthnName() string {
  42. return u.Name
  43. }
  44. func (u *User) WebAuthnDisplayName() string {
  45. return u.Name
  46. }
  47. func (u *User) WebAuthnCredentials() (credentials []webauthn.Credential) {
  48. var passkeys []Passkey
  49. db.Where("user_id", u.ID).Find(&passkeys)
  50. for _, passkey := range passkeys {
  51. credentials = append(credentials, *passkey.Credential)
  52. }
  53. return
  54. }