3
0

Add password encryption for User.

Took 25 minutes
This commit is contained in:
Denis Arh 2018-07-06 09:10:53 +02:00
parent 2b68799544
commit 341c845c80
2 changed files with 43 additions and 9 deletions

View File

@ -1,10 +1,14 @@
package sam
import (
"golang.org/x/crypto/bcrypt"
)
// Users
type User struct {
ID uint64
Username string
Password string `json:"-"`
Password []byte `json:"-"`
changed []string
}
@ -35,14 +39,20 @@ func (u *User) SetUsername(value string) *User {
}
return u
}
func (u *User) GetPassword() string {
return u.Password
func (u *User) SetPassword(value string) error {
if !u.ValidatePassword(value) {
if encrypted, err := bcrypt.GenerateFromPassword([]byte(value), bcrypt.DefaultCost); err != nil {
return err
} else {
u.Password = encrypted
u.changed = append(u.changed, "password")
}
}
return nil
}
func (u *User) SetPassword(value string) *User {
if u.Password != value {
u.changed = append(u.changed, "password")
u.Password = value
}
return u
func (u User) ValidatePassword(value string) bool {
return bcrypt.CompareHashAndPassword(u.Password, []byte(value)) == nil
}

24
sam/user.structs_test.go Normal file
View File

@ -0,0 +1,24 @@
package sam
import (
"testing"
)
func TestUser_SetPassword(t *testing.T) {
const dummyPwd = "Lorem ipsum dolor sit amet, consectetur adipiscing elit..."
dummy := &User{}
initChLen := len(dummy.changed)
dummy.SetPassword(dummyPwd)
if dummyPwd == string(dummy.Password) {
t.Error("Internal password value should be encrypted")
}
if len(dummy.changed) <= initChLen {
t.Error("Password change should be recorded")
}
if !dummy.ValidatePassword(dummyPwd) {
t.Error("Revalidating password should succeed")
}
}