checkHome/struct/user.go

107 lines
2.3 KiB
Go

package ckh
import (
"crypto"
_ "crypto/sha1"
)
type User struct {
Id int64 `json:"id"`
Username string `json:"username"`
password []byte
}
func GetUsers() (users []User, err error) {
if rows, errr := DBQuery("SELECT id_user, username, password FROM users"); errr != nil {
return nil, errr
} else {
defer rows.Close()
users = make([]User, 0)
for rows.Next() {
var u User
if err = rows.Scan(&u.Id, &u.Username, &u.password); err != nil {
return
}
users = append(users, u)
}
if err = rows.Err(); err != nil {
return
}
return
}
}
func GetUser(id int64) (u User, err error) {
err = DBQueryRow("SELECT id_user, username, password FROM users WHERE id_user = ?", id).Scan(&u.Id, &u.Username, &u.password)
return
}
func hashPassword(password string) []byte {
hash := crypto.SHA1.New()
return hash.Sum([]byte(password))
}
func NewUser(username string, password string) (User, error) {
hash := hashPassword(password)
if res, err := DBExec("INSERT INTO users (username, password) VALUES (?, ?)", username, hash); err != nil {
return User{}, err
} else if uid, err := res.LastInsertId(); err != nil {
return User{}, err
} else {
return User{uid, username, hash}, nil
}
}
func (u User) checkPassword(password string) bool {
givenHash := hashPassword(password)
if len(givenHash) != len(u.password) {
return false
}
for k := range u.password {
if u.password[k] != givenHash[k] {
return false
}
}
return true
}
func (u User) ChangePassword(password string) {
u.password = hashPassword(password)
}
func (u User) Update() (int64, error) {
if res, err := DBExec("UPDATE users SET username = ?, password = ? WHERE id_user = ?", u.Username, u.password, u.Id); err != nil {
return 0, err
} else if nb, err := res.RowsAffected(); err != nil {
return 0, err
} else {
return nb, err
}
}
func (u User) Delete() (int64, error) {
if res, err := DBExec("DELETE FROM users WHERE id_user = ?", u.Id); err != nil {
return 0, err
} else if nb, err := res.RowsAffected(); err != nil {
return 0, err
} else {
return nb, err
}
}
func ClearUsers() (int64, error) {
if res, err := DBExec("DELETE FROM users"); err != nil {
return 0, err
} else if nb, err := res.RowsAffected(); err != nil {
return 0, err
} else {
return nb, err
}
}