package users import ( "fmt" "golang.org/x/crypto/bcrypt" ) type SiteUser struct { Username string `yaml:"username"` PasswordHash string `yaml:"password-hash"` Password string `yaml:"password"` } func (su *SiteUser) SetPasswordHashIfNecessary() error { if su.Password == "" { return nil } res, err := bcrypt.GenerateFromPassword([]byte(su.Password), bcrypt.DefaultCost) if err != nil { return fmt.Errorf("SetPasswordHashIfNecessary: %w", err) } su.Password = "" su.PasswordHash = string(res) return nil } func (su *SiteUser) CheckPassword(pass string) error { err := su.SetPasswordHashIfNecessary() if err != nil { return err } err = bcrypt.CompareHashAndPassword([]byte(su.PasswordHash), []byte(pass)) if err != nil { return fmt.Errorf("CheckPassword: %w", err) } return nil }