89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
package setup
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"git.pcux.cn/xuans/Smail/config"
|
|
"git.pcux.cn/xuans/Smail/db"
|
|
"git.pcux.cn/xuans/Smail/models"
|
|
"git.pcux.cn/xuans/Smail/services/auth"
|
|
"git.pcux.cn/xuans/Smail/utils/array"
|
|
"git.pcux.cn/xuans/Smail/utils/context"
|
|
"git.pcux.cn/xuans/Smail/utils/errors"
|
|
"git.pcux.cn/xuans/Smail/utils/validation"
|
|
)
|
|
|
|
func GetDatabaseSettings(ctx *context.Context) (string, string, error) {
|
|
configData, err := config.ReadConfig()
|
|
if err != nil {
|
|
return "", "", errors.Wrap(err)
|
|
}
|
|
if configData.DbType == "" && configData.DbDSN == "" {
|
|
return config.DBTypeSQLite, config.ROOT_PATH + "./config/smail.db", nil
|
|
}
|
|
return configData.DbType, configData.DbDSN, nil
|
|
}
|
|
|
|
func GetAdminPassword(ctx *context.Context) (string, error) {
|
|
users := []*models.User{}
|
|
if err := db.Instance.Find(&users); err != nil {
|
|
return "", errors.Wrap(err)
|
|
}
|
|
if len(users) > 0 {
|
|
return users[0].Account, nil
|
|
}
|
|
return "", nil
|
|
}
|
|
|
|
var adminSetupMutex sync.Mutex
|
|
|
|
func SetAdminPassword(ctx *context.Context, account, pwd string) error {
|
|
adminSetupMutex.Lock()
|
|
defer adminSetupMutex.Unlock()
|
|
|
|
account, err := validation.NormalizeAccount(account)
|
|
if err != nil {
|
|
return errors.Wrap(err)
|
|
}
|
|
count, err := db.Instance.Count(new(models.User))
|
|
if err != nil {
|
|
return errors.Wrap(err)
|
|
}
|
|
if count != 0 {
|
|
return errors.New("administrator already exists")
|
|
}
|
|
user := models.User{Account: account, Name: "admin", IsAdmin: 1, SessionVersion: 1}
|
|
if err := auth.SetPassword(&user, pwd); err != nil {
|
|
return errors.Wrap(err)
|
|
}
|
|
if _, err := db.Instance.Insert(&user); err != nil {
|
|
return errors.Wrap(err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func SetDatabaseSettings(ctx *context.Context, dbType, dbDSN string) error {
|
|
configData, err := config.ReadConfig()
|
|
if err != nil {
|
|
return errors.Wrap(err)
|
|
}
|
|
if !array.InArray(dbType, config.DBTypes) {
|
|
return errors.New("dbtype error")
|
|
}
|
|
if dbDSN == "" {
|
|
return errors.New("DSN error")
|
|
}
|
|
configData.DbType = dbType
|
|
configData.DbDSN = dbDSN
|
|
if err = config.WriteConfig(configData); err != nil {
|
|
return errors.Wrap(err)
|
|
}
|
|
if err = config.Init(); err != nil {
|
|
return errors.Wrap(err)
|
|
}
|
|
if err = db.Init(""); err != nil {
|
|
return errors.Wrap(err)
|
|
}
|
|
return nil
|
|
}
|