158 lines
2.8 KiB
Go
158 lines
2.8 KiB
Go
package database
|
|
|
|
import (
|
|
"log"
|
|
"time"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
type User struct {
|
|
ID int
|
|
Username string
|
|
Password string
|
|
Email string
|
|
PublicKey string `db:"public_key"`
|
|
Admin bool
|
|
Enabled bool
|
|
BaseDir string `db:"base_dir"`
|
|
CreatedAt time.Time `db:"created_at"`
|
|
UpdatedAt time.Time `db:"updated_at"`
|
|
}
|
|
|
|
func CreateUser(user User) error {
|
|
log.Println(user)
|
|
_, err := db.NamedExec(`
|
|
INSERT INTO users (
|
|
username,
|
|
password,
|
|
email,
|
|
public_key,
|
|
admin,
|
|
enabled,
|
|
base_dir,
|
|
created_at,
|
|
updated_at
|
|
) VALUES (
|
|
:username,
|
|
:password,
|
|
:email,
|
|
:public_key,
|
|
:admin,
|
|
:enabled,
|
|
:base_dir,
|
|
:created_at,
|
|
:updated_at
|
|
)
|
|
`, user)
|
|
return err
|
|
}
|
|
|
|
func GetUser(id int) (User, error) {
|
|
var user User
|
|
err := db.Get(&user, `
|
|
SELECT
|
|
id,
|
|
username,
|
|
password,
|
|
email,
|
|
admin,
|
|
enabled,
|
|
base_dir,
|
|
created_at,
|
|
updated_at
|
|
FROM users
|
|
WHERE id = ?
|
|
`, id)
|
|
return user, err
|
|
}
|
|
|
|
func GetUserByUsername(username string) (User, error) {
|
|
var user User
|
|
err := db.Get(&user, `
|
|
SELECT
|
|
id,
|
|
username,
|
|
password,
|
|
email,
|
|
public_key,
|
|
admin,
|
|
enabled,
|
|
base_dir,
|
|
created_at,
|
|
updated_at
|
|
FROM users
|
|
WHERE username = ?
|
|
`, username)
|
|
return user, err
|
|
}
|
|
|
|
func UpdateUser(user User) error {
|
|
_, err := db.NamedExec(`
|
|
UPDATE users
|
|
SET
|
|
username = :username,
|
|
password = :password,
|
|
email = :email,
|
|
public_key = :public_key,
|
|
admin = :admin,
|
|
enabled = :enabled,
|
|
base_dir = :base_dir,
|
|
updated_at = :updated_at
|
|
WHERE id = :id
|
|
`, user)
|
|
return err
|
|
}
|
|
|
|
func DeleteUser(id int) error {
|
|
_, err := db.Exec(`
|
|
DELETE FROM users
|
|
WHERE id = ?
|
|
`, id)
|
|
return err
|
|
}
|
|
|
|
func ListUsers() ([]User, error) {
|
|
var users []User
|
|
err := db.Select(&users, `
|
|
SELECT
|
|
id,
|
|
username,
|
|
password,
|
|
email,
|
|
public_key,
|
|
admin,
|
|
enabled,
|
|
base_dir,
|
|
created_at,
|
|
updated_at
|
|
FROM users
|
|
`)
|
|
return users, err
|
|
}
|
|
|
|
// SetPassword sets the password of a user
|
|
func (u *User) SetPassword(password string) error {
|
|
byteHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
|
u.Password = string(byteHash)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return UpdateUser(*u)
|
|
}
|
|
|
|
// CheckPassword checks if the password of a user matches the given password
|
|
func CheckUserPassword(username, password string) (bool, error) {
|
|
var dbHash string
|
|
err := db.QueryRow(``, username).Scan(dbHash)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
err = bcrypt.CompareHashAndPassword([]byte(dbHash), []byte(password))
|
|
if err != nil {
|
|
log.Printf("Wrong password attempt for user %s", username)
|
|
return false, err
|
|
} else {
|
|
return true, nil
|
|
}
|
|
}
|