Add password hashing with argon2
This commit is contained in:
parent
01da46b81e
commit
1dd0332bc1
11 changed files with 107 additions and 15 deletions
4
internal/store/migrations/8.sql
Normal file
4
internal/store/migrations/8.sql
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
alter table user
|
||||
add column salt text;
|
||||
|
||||
pragma user_version = 8;
|
||||
|
|
@ -11,6 +11,7 @@ import (
|
|||
type Store struct {
|
||||
db *sql.DB
|
||||
cakes []models.Cake
|
||||
users map[string]models.User
|
||||
}
|
||||
|
||||
func OpenStore(filename string) *Store {
|
||||
|
|
@ -27,6 +28,10 @@ func OpenStore(filename string) *Store {
|
|||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
out.users, err = out.loadUsers()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
return &out
|
||||
}
|
||||
|
||||
|
|
|
|||
48
internal/store/user.go
Normal file
48
internal/store/user.go
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
package store
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/Bronku/iroon/internal/crypto"
|
||||
"github.com/Bronku/iroon/internal/models"
|
||||
)
|
||||
|
||||
func (s *Store) AddUser(login, password string) error {
|
||||
_, exists := s.GetUser(login)
|
||||
if exists {
|
||||
return errors.New("the user already exists")
|
||||
}
|
||||
query := "insert into user (login, password, salt) values(?, ?, ?)"
|
||||
salt := crypto.GenerateKey()
|
||||
hash := crypto.PasswordHash(password, salt)
|
||||
_, err := s.db.Exec(query, login, hash, salt)
|
||||
if err == nil {
|
||||
s.users[login] = models.User{Password: hash, Salt: salt}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *Store) loadUsers() (map[string]models.User, error) {
|
||||
out := make(map[string]models.User)
|
||||
query := "select login, password, salt from user;"
|
||||
rows, err := s.db.Query(query)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
var current models.User
|
||||
var login string
|
||||
err = rows.Scan(&login, ¤t.Password, ¤t.Salt)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
out[login] = current
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (s *Store) GetUser(login string) (models.User, bool) {
|
||||
value, ok := s.users[login]
|
||||
return value, ok
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue