added database
This commit is contained in:
96
internal/db/db.go
Normal file
96
internal/db/db.go
Normal file
@@ -0,0 +1,96 @@
|
||||
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(driver, dataSourceName string) (*DB, error) {
|
||||
db, err := sql.Open(driver, dataSourceName)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if driver == "mysql" {
|
||||
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
|
||||
}
|
||||
11
internal/db/setup.sql
Normal file
11
internal/db/setup.sql
Normal file
@@ -0,0 +1,11 @@
|
||||
CREATE TABLE s3Browser.`user` (
|
||||
id INT auto_increment NOT NULL,
|
||||
username varchar(100) NOT NULL,
|
||||
password varchar(60) NOT NULL,
|
||||
CONSTRAINT user_PK PRIMARY KEY (id),
|
||||
CONSTRAINT user_UN UNIQUE KEY (username)
|
||||
)
|
||||
|
||||
ENGINE=InnoDB
|
||||
DEFAULT CHARSET=utf8mb4
|
||||
COLLATE=utf8mb4_general_ci;
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"github.com/minio/minio-go/v7"
|
||||
|
||||
"git.kapelle.org/niklas/s3browser/internal/db"
|
||||
helper "git.kapelle.org/niklas/s3browser/internal/helper"
|
||||
"git.kapelle.org/niklas/s3browser/internal/loader"
|
||||
types "git.kapelle.org/niklas/s3browser/internal/types"
|
||||
@@ -203,8 +204,11 @@ func deleteDirectory(ctx context.Context, id types.ID) error {
|
||||
//login Checks for valid username password combination. Returns singed jwt string
|
||||
func login(ctx context.Context, username, password string) (types.LoginResult, error) {
|
||||
|
||||
// TODO: replace with propper user management
|
||||
if username != "admin" && password != "hunter2" {
|
||||
dbStore := ctx.Value("dbStore").(*db.DB)
|
||||
|
||||
succes, err := dbStore.CheckLogin(ctx, username, password)
|
||||
|
||||
if !succes {
|
||||
return types.LoginResult{
|
||||
Successful: false,
|
||||
}, nil
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"github.com/minio/minio-go/v7/pkg/credentials"
|
||||
log "github.com/sirupsen/logrus"
|
||||
|
||||
"git.kapelle.org/niklas/s3browser/internal/db"
|
||||
gql "git.kapelle.org/niklas/s3browser/internal/gql"
|
||||
httpserver "git.kapelle.org/niklas/s3browser/internal/httpserver"
|
||||
"git.kapelle.org/niklas/s3browser/internal/loader"
|
||||
@@ -55,6 +56,11 @@ func Start(config types.AppConfig) {
|
||||
}
|
||||
log.Info("s3 client connected")
|
||||
|
||||
dbStore, err := db.NewDB("mysql", "s3Browser:hunter2@/s3Browser")
|
||||
if err != nil {
|
||||
log.Error("Failed to connect DB: ", err.Error())
|
||||
}
|
||||
|
||||
log.Debug("Creating dataloader")
|
||||
loader := loader.NewLoader(config)
|
||||
|
||||
@@ -69,6 +75,7 @@ func Start(config types.AppConfig) {
|
||||
|
||||
resolveContext := context.WithValue(context.Background(), "s3Client", s3Client)
|
||||
resolveContext = context.WithValue(resolveContext, "loader", loader)
|
||||
resolveContext = context.WithValue(resolveContext, "dbStore", dbStore)
|
||||
|
||||
log.Debug("Starting HTTP server")
|
||||
err = httpserver.InitHttp(resolveContext, schema, config.Address)
|
||||
|
||||
Reference in New Issue
Block a user