80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
package models
|
|
|
|
import (
|
|
"github.com/go-webauthn/webauthn/protocol"
|
|
"github.com/go-webauthn/webauthn/webauthn"
|
|
"github.com/uptrace/bun"
|
|
)
|
|
|
|
type User struct {
|
|
bun.BaseModel `bun:"table:users"`
|
|
ID string `bun:",pk"`
|
|
|
|
Username string
|
|
Email string
|
|
Hash string
|
|
|
|
FirstName string `bun:"nullzero"`
|
|
LastName string `bun:",nullzero"`
|
|
DisplayName string `bun:",nullzero"`
|
|
|
|
LoginMethods []*UserLoginMethod `bun:"rel:has-many,join:id=user_id"`
|
|
Logs []*UserLog `bun:"rel:has-many,join:id=user_id"`
|
|
}
|
|
|
|
type UserLoginMethod struct {
|
|
bun.BaseModel `bun:"table:users_login_methods"`
|
|
ID int64 `bun:",pk,autoincrement"`
|
|
UserID string
|
|
|
|
Type string
|
|
Name string
|
|
WebAuthn *webauthn.Credential `bun:",nullzero,type:jsonb"`
|
|
}
|
|
|
|
func (u User) WebAuthnID() []byte {
|
|
return []byte(u.ID)
|
|
}
|
|
|
|
func (u User) WebAuthnName() string {
|
|
return u.Username
|
|
}
|
|
|
|
func (u User) WebAuthnDisplayName() string {
|
|
if len(u.DisplayName) != 0 {
|
|
return u.DisplayName
|
|
} else {
|
|
return u.FirstName + " " + u.LastName
|
|
}
|
|
}
|
|
|
|
func (u User) WebAuthnCredentials() []webauthn.Credential {
|
|
var credentials []webauthn.Credential
|
|
for _, l := range u.LoginMethods {
|
|
if l.WebAuthn != nil {
|
|
credentials = append(credentials, *l.WebAuthn)
|
|
}
|
|
}
|
|
return credentials
|
|
}
|
|
|
|
func (u User) WebAuthnCredentialExcludeList() []protocol.CredentialDescriptor {
|
|
var excludeList []protocol.CredentialDescriptor
|
|
|
|
webauthnCreds := u.WebAuthnCredentials()
|
|
for _, cred := range webauthnCreds {
|
|
descriptor := protocol.CredentialDescriptor{
|
|
Type: protocol.PublicKeyCredentialType,
|
|
CredentialID: cred.ID,
|
|
}
|
|
excludeList = append(excludeList, descriptor)
|
|
}
|
|
|
|
return excludeList
|
|
}
|
|
|
|
type UserLog struct {
|
|
bun.BaseModel `bun:"table:user_logs"`
|
|
ID int64 `bun:",pk,autoincrement"`
|
|
UserID int64 `bun:",pk"`
|
|
}
|