158 lines
3.2 KiB
Go
158 lines
3.2 KiB
Go
package storage
|
|
|
|
import (
|
|
"github.com/spf13/viper"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
isNewKey bool
|
|
key Key
|
|
)
|
|
|
|
func configure() {
|
|
|
|
log.I.Ln("initializing storage")
|
|
|
|
configureKey()
|
|
configureDirPath()
|
|
configureFile()
|
|
}
|
|
|
|
func configureKey() {
|
|
|
|
log.I.Ln("looking for encryption key")
|
|
|
|
var err error
|
|
|
|
if viper.GetString(storeKeyFlag) != "" {
|
|
|
|
log.I.Ln("found key")
|
|
|
|
key.Decode(viper.GetString(storeKeyFlag))
|
|
|
|
return
|
|
}
|
|
|
|
log.I.Ln("no key found, checking for keyfile")
|
|
|
|
if viper.GetString(storeKeyFileFlag) != "" {
|
|
|
|
var fileInfo os.FileInfo
|
|
|
|
if fileInfo, err = os.Stat(viper.GetString(storeKeyFileFlag)); err != nil {
|
|
startupErrors <- err
|
|
return
|
|
}
|
|
|
|
if fileInfo.Mode() != 0600 {
|
|
log.W.Ln("keyfile permissions are too open:", fileInfo.Mode())
|
|
log.W.Ln("It is recommended that you change them to 0600")
|
|
}
|
|
|
|
var keyBytes []byte
|
|
|
|
if keyBytes, err = os.ReadFile(viper.GetString(storeKeyFileFlag)); err != nil {
|
|
startupErrors <- err
|
|
return
|
|
}
|
|
|
|
key.Decode(string(keyBytes))
|
|
|
|
return
|
|
}
|
|
|
|
log.I.Ln("no keyfile found, generating a new key")
|
|
|
|
isNewKey = true
|
|
|
|
if key, err = KeyGen(); err != nil {
|
|
startupErrors <- err
|
|
return
|
|
}
|
|
|
|
log.W.Ln("")
|
|
log.W.Ln("--------------------------------------------------------")
|
|
log.W.Ln("--")
|
|
log.W.Ln("-- WARNING: The following key will be used to store")
|
|
log.W.Ln("-- your database securely, please ensure that you make")
|
|
log.W.Ln("-- a copy and store it in a secure place before using")
|
|
log.W.Ln("-- this software in a production environment.")
|
|
log.W.Ln("--")
|
|
log.W.Ln("--")
|
|
log.W.Ln("-- Failure to store this key properly will result in")
|
|
log.W.Ln("-- no longer being able to decrypt this database.")
|
|
log.W.Ln("--")
|
|
log.W.Ln("--")
|
|
log.W.Ln("-- It is recommended to use the following to generate")
|
|
log.W.Ln("-- your key:")
|
|
log.W.Ln("--")
|
|
log.W.Ln("-- indra seed keygen")
|
|
log.W.Ln("--")
|
|
log.W.Ln("-- OR")
|
|
log.W.Ln("--")
|
|
log.W.Ln("-- indra seed keygen --keyfile=/path/to/keyfile")
|
|
log.W.Ln("--")
|
|
log.W.Ln("--")
|
|
log.W.Ln("-- YOU HAVE BEEN WARNED!")
|
|
log.W.Ln("--")
|
|
log.W.Ln("-------------------------------------------------------")
|
|
log.W.Ln("-- KEY:", key.Encode(), "--")
|
|
log.W.Ln("-------------------------------------------------------")
|
|
log.W.Ln("")
|
|
|
|
viper.Set(storeKeyFlag, key.Encode())
|
|
}
|
|
|
|
func configureDirPath() {
|
|
|
|
var err error
|
|
|
|
if viper.GetString(storeFilePathFlag) == "" {
|
|
viper.Set(storeFilePathFlag, viper.GetString("data-dir")+"/"+fileName)
|
|
}
|
|
|
|
err = os.MkdirAll(
|
|
strings.TrimSuffix(viper.GetString(storeFilePathFlag), "/"+fileName),
|
|
0755,
|
|
)
|
|
|
|
if err != nil {
|
|
startupErrors <- err
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
func configureFile() {
|
|
|
|
log.I.Ln("using storage db path:")
|
|
log.I.Ln("-", viper.GetString(storeFilePathFlag))
|
|
|
|
var err error
|
|
|
|
if _, err = os.Stat(viper.GetString(storeFilePathFlag)); err != nil {
|
|
|
|
log.I.Ln("none found, creating a new one")
|
|
|
|
//file, err := os.OpenFile(viper.GetString(storeFilePathFlag), os.O_WRONLY, 0666)
|
|
//
|
|
//if err != nil && os.IsPermission(err) {
|
|
// startupErrors <- err
|
|
// return
|
|
//}
|
|
//
|
|
//file.Close()
|
|
//
|
|
//os.Remove(viper.GetString(storeFilePathFlag))
|
|
|
|
return
|
|
}
|
|
|
|
if isNewKey {
|
|
log.F.Ln("new key generated for an existing database. Check your configuration. Exiting!")
|
|
os.Exit(1)
|
|
}
|
|
}
|