From 341c845c8092384457c4a493e0e1e24c4e615bcd Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Fri, 6 Jul 2018 09:10:53 +0200 Subject: [PATCH] Add password encryption for User. Took 25 minutes --- sam/user.structs.go | 28 +++++++++++++++++++--------- sam/user.structs_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 sam/user.structs_test.go diff --git a/sam/user.structs.go b/sam/user.structs.go index 50e9c4b9c..4d0d1b814 100644 --- a/sam/user.structs.go +++ b/sam/user.structs.go @@ -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 } diff --git a/sam/user.structs_test.go b/sam/user.structs_test.go new file mode 100644 index 000000000..0bcb772f7 --- /dev/null +++ b/sam/user.structs_test.go @@ -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") + } +}