72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"database/sql"
|
|
_ "github.com/lib/pq"
|
|
)
|
|
|
|
//TODO: move into separate config file?
|
|
const (
|
|
DBHost = "127.0.0.1"
|
|
DBPort = 5432
|
|
DBUser = "username"
|
|
DBPass = "password"
|
|
DBName = "database"
|
|
)
|
|
|
|
type userData struct {
|
|
nameserver string
|
|
zonename string
|
|
hostname string
|
|
tsigkey string
|
|
}
|
|
|
|
func prepareDatabase() (*sql.DB, error) {
|
|
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s " +
|
|
"sslmode=disable", DBHost, DBPort, DBUser, DBPass,
|
|
DBName)
|
|
db, err := sql.Open("postgres", psqlInfo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, err = db.Exec("CREATE TABLE IF NOT EXISTS users " +
|
|
"(id SERIAL PRIMARY KEY, username VARCHAR(255) NULL, " +
|
|
"password VARCHAR(255) NULL, salt VARCHAR(255) NULL, " +
|
|
"nameserver VARCHAR(255) NULL, zone VARCHAR(255) NULL, " +
|
|
"hostname VARCHAR(255) NULL, tsig VARCHAR(255) NULL)")
|
|
if err != nil {
|
|
db.Close()
|
|
return nil, err
|
|
}
|
|
return db, nil
|
|
}
|
|
|
|
func getPasswordForUser(db *sql.DB, username string) (string, bool) {
|
|
var password string
|
|
|
|
row := db.QueryRow("SELECT password FROM users WHERE username=$1", username)
|
|
err := row.Scan(&password)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return "", false
|
|
} else {
|
|
panic(err)
|
|
}
|
|
}
|
|
return password, true
|
|
}
|
|
|
|
func getDataForUser(db *sql.DB, username string) (userData, error) {
|
|
var data userData
|
|
|
|
row := db.QueryRow("SELECT nameserver, zone, hostname, tsig " +
|
|
"FROM users WHERE username=$1", username)
|
|
err := row.Scan(&data.nameserver, &data.zonename, &data.hostname,
|
|
&data.tsigkey)
|
|
if err != nil {
|
|
return data, err
|
|
}
|
|
return data, nil
|
|
}
|