2020-01-20 21:17:43 +01:00
package server
import (
2020-03-01 02:01:09 +01:00
"encoding/json"
2020-02-08 20:50:33 +01:00
"fmt"
2020-01-20 21:17:43 +01:00
"time"
2020-02-08 20:50:33 +01:00
"github.com/deluan/navidrome/conf"
2020-01-24 01:44:08 +01:00
"github.com/deluan/navidrome/consts"
"github.com/deluan/navidrome/log"
"github.com/deluan/navidrome/model"
2020-01-20 21:17:43 +01:00
"github.com/google/uuid"
)
func initialSetup ( ds model . DataStore ) {
_ = ds . WithTx ( func ( tx model . DataStore ) error {
2020-01-27 15:41:33 +01:00
_ , err := ds . Property ( nil ) . Get ( consts . InitialSetupFlagKey )
2020-01-20 21:17:43 +01:00
if err == nil {
return nil
}
log . Warn ( "Running initial setup" )
if err = createJWTSecret ( ds ) ; err != nil {
return err
}
2020-02-08 20:50:33 +01:00
if conf . Server . DevAutoCreateAdminPassword != "" {
if err = createInitialAdminUser ( ds ) ; err != nil {
return err
}
}
2020-03-01 02:01:09 +01:00
if err = createDefaultTranscodings ( ds ) ; err != nil {
return err
}
2020-01-27 15:41:33 +01:00
err = ds . Property ( nil ) . Put ( consts . InitialSetupFlagKey , time . Now ( ) . String ( ) )
2020-01-20 21:17:43 +01:00
return err
} )
}
2020-02-08 20:50:33 +01:00
func createInitialAdminUser ( ds model . DataStore ) error {
2020-03-01 02:01:09 +01:00
c , err := ds . User ( nil ) . CountAll ( )
2020-02-08 20:50:33 +01:00
if err != nil {
panic ( fmt . Sprintf ( "Could not access User table: %s" , err ) )
}
if c == 0 {
id , _ := uuid . NewRandom ( )
random , _ := uuid . NewRandom ( )
initialPassword := random . String ( )
if conf . Server . DevAutoCreateAdminPassword != "" {
initialPassword = conf . Server . DevAutoCreateAdminPassword
}
log . Warn ( "Creating initial admin user. This should only be used for development purposes!!" , "user" , consts . DevInitialUserName , "password" , initialPassword )
initialUser := model . User {
ID : id . String ( ) ,
UserName : consts . DevInitialUserName ,
Name : consts . DevInitialName ,
Email : "" ,
Password : initialPassword ,
IsAdmin : true ,
}
2020-03-01 02:01:09 +01:00
err := ds . User ( nil ) . Put ( & initialUser )
2020-02-08 20:50:33 +01:00
if err != nil {
log . Error ( "Could not create initial admin user" , "user" , initialUser , err )
}
}
return err
}
2020-01-20 21:17:43 +01:00
func createJWTSecret ( ds model . DataStore ) error {
2020-01-27 15:41:33 +01:00
_ , err := ds . Property ( nil ) . Get ( consts . JWTSecretKey )
2020-01-20 21:17:43 +01:00
if err == nil {
return nil
}
jwtSecret , _ := uuid . NewRandom ( )
log . Warn ( "Creating JWT secret, used for encrypting UI sessions" )
2020-01-27 15:41:33 +01:00
err = ds . Property ( nil ) . Put ( consts . JWTSecretKey , jwtSecret . String ( ) )
2020-01-20 21:17:43 +01:00
if err != nil {
log . Error ( "Could not save JWT secret in DB" , err )
}
return err
}
2020-03-01 02:01:09 +01:00
func createDefaultTranscodings ( ds model . DataStore ) error {
repo := ds . Transcoding ( nil )
for _ , d := range consts . DefaultTranscodings {
var j [ ] byte
var err error
if j , err = json . Marshal ( d ) ; err != nil {
return err
}
var t model . Transcoding
if err = json . Unmarshal ( j , & t ) ; err != nil {
return err
}
log . Info ( "Creating default transcoding config" , "name" , t . Name )
if err = repo . Put ( & t ) ; err != nil {
return err
}
}
return nil
}