filebrowser/backend/storage/storage.go

135 lines
3.5 KiB
Go
Raw Permalink Normal View History

package storage
import (
2024-10-07 22:44:53 +00:00
"fmt"
"os"
"path/filepath"
2025-02-16 14:07:38 +00:00
storm "github.com/asdine/storm/v3"
2024-12-17 00:01:55 +00:00
"github.com/gtsteffaniak/filebrowser/backend/auth"
"github.com/gtsteffaniak/filebrowser/backend/errors"
"github.com/gtsteffaniak/filebrowser/backend/files"
2025-01-21 14:02:43 +00:00
"github.com/gtsteffaniak/filebrowser/backend/logger"
2024-12-17 00:01:55 +00:00
"github.com/gtsteffaniak/filebrowser/backend/settings"
"github.com/gtsteffaniak/filebrowser/backend/share"
"github.com/gtsteffaniak/filebrowser/backend/storage/bolt"
"github.com/gtsteffaniak/filebrowser/backend/users"
"github.com/gtsteffaniak/filebrowser/backend/utils"
)
2020-05-31 23:12:36 +00:00
// Storage is a storage powered by a Backend which makes the necessary
// verifications when fetching and saving data to ensure consistency.
type Storage struct {
2024-11-21 00:15:30 +00:00
Users *users.Storage
Share *share.Storage
Auth *auth.Storage
Settings *settings.Storage
}
2024-10-07 22:44:53 +00:00
var store *Storage
func InitializeDb(path string) (*Storage, bool, error) {
exists, err := dbExists(path)
if err != nil {
panic(err)
}
db, err := storm.Open(path)
utils.CheckErr(fmt.Sprintf("storm.Open path %v", path), err)
authStore, userStore, shareStore, settingsStore, err := bolt.NewStorage(db)
if err != nil {
return nil, exists, err
}
err = bolt.Save(db, "version", 2) //nolint:gomnd
if err != nil {
return nil, exists, err
}
store = &Storage{
Auth: authStore,
Users: userStore,
Share: shareStore,
Settings: settingsStore,
}
if !exists {
quickSetup(store)
}
return store, exists, err
}
func dbExists(path string) (bool, error) {
stat, err := os.Stat(path)
if err == nil {
return stat.Size() != 0, nil
}
if os.IsNotExist(err) {
d := filepath.Dir(path)
_, err = os.Stat(d)
if os.IsNotExist(err) {
if err := os.MkdirAll(d, 0700); err != nil { //nolint:govet,gomnd
return false, err
}
return false, nil
}
}
return false, err
}
func quickSetup(store *Storage) {
settings.Config.Auth.Key = utils.GenerateKey()
err := store.Settings.Save(&settings.Config)
utils.CheckErr("store.Settings.Save", err)
err = store.Settings.SaveServer(&settings.Config.Server)
utils.CheckErr("store.Settings.SaveServer", err)
2024-11-21 00:15:30 +00:00
user := settings.ApplyUserDefaults(users.User{})
2024-10-07 22:44:53 +00:00
user.Username = settings.Config.Auth.AdminUsername
user.Password = settings.Config.Auth.AdminPassword
user.Perm.Admin = true
user.Scope = "./"
user.DarkMode = true
user.ViewMode = "normal"
user.LockPassword = false
user.Perm = settings.AdminPerms()
err = store.Users.Save(&user)
utils.CheckErr("store.Users.Save", err)
}
// create new user
func CreateUser(userInfo users.User, asAdmin bool) error {
// must have username or password to create
if userInfo.Username == "" || userInfo.Password == "" {
return errors.ErrInvalidRequestParams
}
2024-11-21 00:15:30 +00:00
newUser := settings.ApplyUserDefaults(userInfo)
2024-10-07 22:44:53 +00:00
if asAdmin {
newUser.Perm = settings.AdminPerms()
}
// create new home directory
2025-01-05 19:05:33 +00:00
userHome, err := settings.Config.MakeUserDir(newUser.Username, newUser.Scope, files.RootPaths["default"])
2024-10-07 22:44:53 +00:00
if err != nil {
2025-01-21 14:02:43 +00:00
logger.Error(fmt.Sprintf("create user: failed to mkdir user home dir: [%s]", userHome))
2024-10-07 22:44:53 +00:00
return err
}
newUser.Scope = userHome
2025-01-21 14:02:43 +00:00
logger.Debug(fmt.Sprintf("user: %s, home dir: [%s].", newUser.Username, userHome))
2025-02-01 13:10:46 +00:00
// todo: fix this, requries index path to be set
2025-01-05 19:05:33 +00:00
idx := files.GetIndex("default")
2025-02-01 13:10:46 +00:00
if idx == nil {
idx = files.GetIndex("default")
}
2025-01-05 19:05:33 +00:00
_, _, err = idx.GetRealPath(newUser.Scope)
2024-10-07 22:44:53 +00:00
if err != nil {
2025-01-21 14:02:43 +00:00
logger.Error(fmt.Sprintf("user path is not valid: %v", newUser.Scope))
2024-10-07 22:44:53 +00:00
return nil
}
err = store.Users.Save(&newUser)
if err != nil {
return err
}
return nil
}