Added method to add first user on first run

This commit is contained in:
konrad 2017-11-16 12:28:27 +01:00 committed by kolaente
parent f4ba392f93
commit 4715459d95
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
4 changed files with 82 additions and 7 deletions

View File

@ -6,3 +6,10 @@ User = root
Password = jup2000 Password = jup2000
Host = 127.0.0.1 Host = 127.0.0.1
Database = library2 Database = library2
; First user to be created, on every startup the program checks if he exists, if not it creates it
[User]
Name = Nie Mand
Username = konrad
Password = 1234
Email = k@knt.li

View File

@ -3,10 +3,11 @@ package models
import ( import (
"github.com/go-ini/ini" "github.com/go-ini/ini"
"os" "os"
"fmt"
) )
// Config holds the config struct // Config holds the config struct
var Config struct { type ConfigStruct struct {
Database struct { Database struct {
Host string Host string
User string User string
@ -15,8 +16,12 @@ var Config struct {
} }
JWTLoginSecret []byte JWTLoginSecret []byte
FirstUser User `ini:"User"`
} }
var Config = new(ConfigStruct)
// SetConfig initianlises the config and publishes it for other functions to use // SetConfig initianlises the config and publishes it for other functions to use
func SetConfig() error { func SetConfig() error {
@ -30,8 +35,25 @@ func SetConfig() error {
return err return err
} }
// Database err = cfg.MapTo(Config)
cfg.Section("Database").MapTo(Config.Database) if err != nil {
return err
}
// Check if the first user already exists, aka a user with the ID = 1. If not, insert it
_, exists, err := GetUserByID(1)
if err != nil {
return err
}
// If it doesn't exist, create it
if !exists {
_, err = CreateUser(Config.FirstUser)
if err != nil {
return err
}
fmt.Println("Created new user " + Config.FirstUser.Username)
}
// JWT secret // JWT secret
Config.JWTLoginSecret = []byte(cfg.Section("General").Key("JWTSecret").String()) Config.JWTLoginSecret = []byte(cfg.Section("General").Key("JWTSecret").String())

View File

@ -15,9 +15,9 @@ type UserLogin struct {
type User struct { type User struct {
ID int64 `xorm:"int(11) autoincr not null unique pk"` ID int64 `xorm:"int(11) autoincr not null unique pk"`
Name string `xorm:"varchar(250)"` Name string `xorm:"varchar(250)"`
Username string `xorm:"varchar(250) not null"` Username string `xorm:"varchar(250) not null unique"`
Password string `xorm:"varchar(250) not null"` Password string `xorm:"varchar(250) not null"`
Email string `xorm:"varchar(250) not null"` Email string `xorm:"varchar(250)"`
Created int64 `xorm:"created"` Created int64 `xorm:"created"`
Updated int64 `xorm:"updated"` Updated int64 `xorm:"updated"`
} }
@ -27,8 +27,54 @@ func (User) TableName() string {
return "users" return "users"
} }
// GetUserByID gets informations about a user by its ID
func GetUserByID(id int64) (user User, exists bool, err error) {
exists, err = x.Id(id).Get(&user)
return user, exists, err
}
func GetUserByUsername(username string) (user User, exists bool, err error) {
user.Username = username
exists, err = x.Get(&user)
return user, exists, err
}
// CreateUser creates a new user and inserts it into the database
func CreateUser(user User) (newUser User, err error) {
newUser = user
// Check if we have all needed informations
if newUser.Password == "" || newUser.Username == "" {
return User{}, fmt.Errorf("You need to specify at least a username and a password!")
}
// Check if the user already exists
_, exists, err := GetUserByUsername(newUser.Username)
if err != nil {
return User{}, err
}
if exists {
return User{}, fmt.Errorf("This username is already taken. Please use another.")
}
// Hash the password
newUser.Password, err = hashPassword(user.Password)
if err != nil {
return User{}, err
}
// Insert it
_, err = x.Insert(newUser)
if err != nil {
return User{}, err
}
return newUser, nil
}
// HashPassword hashes a password // HashPassword hashes a password
func HashPassword(password string) (string, error) { func hashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14) bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err return string(bytes), err
} }

View File

@ -38,7 +38,7 @@ func RegisterRoutes(e *echo.Echo) {
}) })
// Basic Route // Basic Route
e.Static("/", "assets/index.html") e.Static("/", "frontend/dist/")
// Login Route // Login Route
e.POST("/login", Login) e.POST("/login", Login)