user.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package model
  2. import (
  3. "time"
  4. "github.com/go-webauthn/webauthn/webauthn"
  5. "github.com/spf13/cast"
  6. "gorm.io/gorm"
  7. )
  8. type RecoveryCode struct {
  9. Code string `json:"code"`
  10. UsedTime *time.Time `json:"used_time,omitempty" gorm:"type:datetime;default:null"`
  11. }
  12. type RecoveryCodes struct {
  13. Codes []RecoveryCode `json:"codes"`
  14. LastViewed *time.Time `json:"last_viewed,omitempty" gorm:"type:datetime;default:null"`
  15. LastDownloaded *time.Time `json:"last_downloaded,omitempty" gorm:"type:datetime;default:null"`
  16. }
  17. type User struct {
  18. Model
  19. Name string `json:"name" cosy:"add:max=20;update:omitempty,max=20;list:fussy;db_unique"`
  20. Password string `json:"-" cosy:"json:password;add:required,max=20;update:omitempty,max=20"`
  21. Status bool `json:"status" gorm:"default:1"`
  22. OTPSecret []byte `json:"-" gorm:"type:blob"`
  23. RecoveryCodes RecoveryCodes `json:"-" gorm:"serializer:json"`
  24. EnabledTwoFA bool `json:"enabled_2fa" gorm:"-"`
  25. }
  26. type AuthToken struct {
  27. UserID uint64 `json:"user_id"`
  28. Token string `json:"token"`
  29. ExpiredAt int64 `json:"expired_at" gorm:"default:0"`
  30. }
  31. func (u *User) TableName() string {
  32. return "auths"
  33. }
  34. func (u *User) AfterFind(_ *gorm.DB) error {
  35. u.EnabledTwoFA = u.Enabled2FA()
  36. return nil
  37. }
  38. func (u *User) EnabledOTP() bool {
  39. return len(u.OTPSecret) != 0
  40. }
  41. func (u *User) RecoveryCodeGenerated() bool {
  42. return len(u.RecoveryCodes.Codes) > 0
  43. }
  44. func (u *User) RecoveryCodeViewed() bool {
  45. return u.RecoveryCodes.LastViewed != nil
  46. }
  47. func (u *User) EnabledPasskey() bool {
  48. var passkeys Passkey
  49. db.Where("user_id", u.ID).Limit(1).Find(&passkeys)
  50. return passkeys.ID != 0
  51. }
  52. func (u *User) Enabled2FA() bool {
  53. return u.EnabledOTP() || u.EnabledPasskey()
  54. }
  55. func (u *User) WebAuthnID() []byte {
  56. return []byte(cast.ToString(u.ID))
  57. }
  58. func (u *User) WebAuthnName() string {
  59. return u.Name
  60. }
  61. func (u *User) WebAuthnDisplayName() string {
  62. return u.Name
  63. }
  64. func (u *User) WebAuthnCredentials() (credentials []webauthn.Credential) {
  65. var passkeys []Passkey
  66. db.Where("user_id", u.ID).Find(&passkeys)
  67. for _, passkey := range passkeys {
  68. credentials = append(credentials, *passkey.Credential)
  69. }
  70. return
  71. }