95 lines
1.5 KiB
Go
95 lines
1.5 KiB
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
_ "embed"
|
|
"time"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
//go:embed setup.sql
|
|
var setupSql string
|
|
|
|
const DB_NAME = "s3Browser"
|
|
|
|
type DB struct {
|
|
dbConn *sql.DB
|
|
}
|
|
|
|
func NewDB(dataSourceName string) (*DB, error) {
|
|
db, err := sql.Open("mysql", dataSourceName)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
db.SetConnMaxLifetime(time.Minute * 3)
|
|
db.SetMaxOpenConns(10)
|
|
db.SetMaxIdleConns(10)
|
|
|
|
return &DB{
|
|
dbConn: db,
|
|
}, nil
|
|
}
|
|
|
|
func (d *DB) Setup() error {
|
|
tx, err := d.dbConn.Begin()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = tx.Exec(setupSql)
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
|
|
err = tx.Commit()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (d *DB) CheckLogin(ctx context.Context, username, password string) (bool, error) {
|
|
rows, err := d.dbConn.QueryContext(ctx, "SELECT password FROM user WHERE username = ?", username)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
if !rows.Next() {
|
|
return false, nil
|
|
}
|
|
|
|
var passwordHash []byte
|
|
err = rows.Scan(&passwordHash)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
if bcrypt.CompareHashAndPassword(passwordHash, []byte(password)) != nil {
|
|
return false, nil
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
func (d *DB) AddUser(ctx context.Context, username, password string) error {
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = d.dbConn.ExecContext(ctx, "INSERT INTO user (username,password) VALUES (?,?)", username, hash)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|