2019-02-24 08:25:39 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2019-07-14 04:19:28 +01:00
|
|
|
"crypto/rand"
|
|
|
|
"database/sql"
|
|
|
|
"encoding/base64"
|
2019-02-24 08:25:39 +00:00
|
|
|
"fmt"
|
2020-02-24 18:07:47 +00:00
|
|
|
"github.com/gmemstr/nas/files"
|
|
|
|
"github.com/go-yaml/yaml"
|
2019-07-14 04:19:28 +01:00
|
|
|
"golang.org/x/crypto/bcrypt"
|
2020-02-24 18:07:47 +00:00
|
|
|
"io/ioutil"
|
2019-02-24 08:25:39 +00:00
|
|
|
"log"
|
|
|
|
"net/http"
|
2019-07-14 04:19:28 +01:00
|
|
|
"os"
|
2019-02-24 08:25:39 +00:00
|
|
|
|
|
|
|
"github.com/gmemstr/nas/router"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Main function that defines routes
|
|
|
|
func main() {
|
2019-07-14 04:19:28 +01:00
|
|
|
if _, err := os.Stat(".lock"); os.IsNotExist(err) {
|
|
|
|
createDatabase()
|
|
|
|
createLockFile()
|
|
|
|
}
|
|
|
|
|
2020-03-19 10:13:38 +00:00
|
|
|
// Initialize file providers.
|
2020-02-24 18:07:47 +00:00
|
|
|
file, err := ioutil.ReadFile("providers.yml")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2020-03-21 00:31:24 +00:00
|
|
|
err = yaml.Unmarshal(file, &files.ProviderConfig)
|
2020-02-24 18:07:47 +00:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2020-03-21 00:31:24 +00:00
|
|
|
files.SetupProviders()
|
2020-02-24 18:07:47 +00:00
|
|
|
|
2019-02-24 08:25:39 +00:00
|
|
|
r := router.Init()
|
|
|
|
fmt.Println("Your NAS instance is live on port :3000")
|
|
|
|
log.Fatal(http.ListenAndServe(":3000", r))
|
|
|
|
}
|
2019-07-14 04:19:28 +01:00
|
|
|
|
|
|
|
func createDatabase() {
|
|
|
|
fmt.Println("Initializing the database")
|
|
|
|
os.Create("assets/config/users.db")
|
|
|
|
|
|
|
|
db, err := sql.Open("sqlite3", "assets/config/users.db")
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Problem opening database file! %v", err)
|
|
|
|
}
|
|
|
|
|
2019-07-28 05:43:05 +01:00
|
|
|
_, err = db.Exec("CREATE TABLE IF NOT EXISTS `users` ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, `username` TEXT UNIQUE, `hash` TEXT, `token` TEXT, `permissions` INTEGER )")
|
2019-07-14 04:19:28 +01:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Problem creating database! %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
text, err := GenerateRandomString(12)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error randomly generating password", err)
|
|
|
|
}
|
|
|
|
fmt.Println("Admin password: ", text)
|
|
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(text), 4)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error generating hash", err)
|
|
|
|
}
|
|
|
|
if bcrypt.CompareHashAndPassword(hash, []byte(text)) == nil {
|
|
|
|
fmt.Println("Password hashed")
|
|
|
|
}
|
2019-07-28 05:43:05 +01:00
|
|
|
_, err = db.Exec("INSERT INTO users(id,username,hash,permissions) VALUES (0,'admin','" + string(hash) + "',2)")
|
2019-07-14 04:19:28 +01:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Problem creating database! %v", err)
|
|
|
|
}
|
|
|
|
defer db.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
func createLockFile() {
|
|
|
|
lock, err := os.Create(".lock")
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error: %v", err)
|
|
|
|
}
|
|
|
|
lock.Write([]byte("This file left intentionally empty"))
|
|
|
|
defer lock.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
func GenerateRandomBytes(n int) ([]byte, error) {
|
|
|
|
b := make([]byte, n)
|
|
|
|
_, err := rand.Read(b)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return b, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GenerateRandomString returns a URL-safe, base64 encoded
|
|
|
|
// securely generated random string.
|
|
|
|
func GenerateRandomString(s int) (string, error) {
|
|
|
|
b, err := GenerateRandomBytes(s)
|
|
|
|
return base64.URLEncoding.EncodeToString(b), err
|
|
|
|
}
|