184 lines
4.3 KiB
Go
184 lines
4.3 KiB
Go
package importer
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/asdine/storm"
|
|
toml "github.com/pelletier/go-toml"
|
|
yaml "gopkg.in/yaml.v2"
|
|
|
|
"github.com/filebrowser/filebrowser/v2/auth"
|
|
"github.com/filebrowser/filebrowser/v2/settings"
|
|
"github.com/filebrowser/filebrowser/v2/storage"
|
|
"github.com/filebrowser/filebrowser/v2/users"
|
|
)
|
|
|
|
type oldDefs struct {
|
|
Commands []string `json:"commands" yaml:"commands" toml:"commands"`
|
|
Scope string `json:"scope" yaml:"scope" toml:"scope"`
|
|
ViewMode string `json:"viewMode" yaml:"viewMode" toml:"viewMode"`
|
|
Locale string `json:"locale" yaml:"locale" toml:"locale"`
|
|
AllowCommands bool `json:"allowCommands" yaml:"allowCommands" toml:"allowCommands"`
|
|
AllowEdit bool `json:"allowEdit" yaml:"allowEdit" toml:"allowEdit"`
|
|
AllowNew bool `json:"allowNew" yaml:"allowNew" toml:"allowNew"`
|
|
}
|
|
|
|
type oldAuth struct {
|
|
Method string `json:"method" yaml:"method" toml:"method"` // default none proxy
|
|
Header string `json:"header" yaml:"header" toml:"header"`
|
|
}
|
|
|
|
type oldConf struct {
|
|
Port string `json:"port" yaml:"port" toml:"port"`
|
|
BaseURL string `json:"baseURL" yaml:"baseURL" toml:"baseURL"`
|
|
Log string `json:"log" yaml:"log" toml:"log"`
|
|
Address string `json:"address" yaml:"address" toml:"address"`
|
|
Defaults oldDefs `json:"defaults" yaml:"defaults" toml:"defaults"`
|
|
ReCaptcha struct {
|
|
Key string `json:"key" yaml:"key" toml:"key"`
|
|
Secret string `json:"secret" yaml:"secret" toml:"secret"`
|
|
Host string `json:"host" yaml:"host" toml:"host"`
|
|
} `json:"recaptcha" yaml:"recaptcha" toml:"recaptcha"`
|
|
Auth oldAuth `json:"auth" yaml:"auth" toml:"auth"`
|
|
}
|
|
|
|
var defaults = &oldConf{
|
|
Port: "0",
|
|
Log: "stdout",
|
|
Defaults: oldDefs{
|
|
Commands: []string{"git", "svn", "hg"},
|
|
ViewMode: string(users.MosaicViewMode),
|
|
AllowCommands: true,
|
|
AllowEdit: true,
|
|
AllowNew: true,
|
|
Locale: "en",
|
|
},
|
|
Auth: oldAuth{
|
|
Method: "default",
|
|
},
|
|
}
|
|
|
|
func readConf(path string) (*oldConf, error) {
|
|
cfg := &oldConf{}
|
|
if path != "" {
|
|
ext := filepath.Ext(path)
|
|
|
|
fd, err := os.Open(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer fd.Close()
|
|
|
|
switch ext {
|
|
case ".json":
|
|
err = json.NewDecoder(fd).Decode(cfg)
|
|
case ".toml":
|
|
err = toml.NewDecoder(fd).Decode(cfg)
|
|
case ".yaml", ".yml":
|
|
err = yaml.NewDecoder(fd).Decode(cfg)
|
|
default:
|
|
return nil, errors.New("unsupported config extension " + ext)
|
|
}
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
} else {
|
|
cfg = defaults
|
|
path, err := filepath.Abs(".")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
cfg.Defaults.Scope = path
|
|
}
|
|
return cfg, nil
|
|
}
|
|
|
|
func importConf(db *storm.DB, path string, sto *storage.Storage) error {
|
|
cfg, err := readConf(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
commands := map[string][]string{}
|
|
err = db.Get("config", "commands", &commands)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
key := []byte{}
|
|
err = db.Get("config", "key", &key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
s := &settings.Settings{
|
|
Key: key,
|
|
Signup: false,
|
|
Defaults: settings.UserDefaults{
|
|
Scope: cfg.Defaults.Scope,
|
|
Commands: cfg.Defaults.Commands,
|
|
ViewMode: users.ViewMode(cfg.Defaults.ViewMode),
|
|
Locale: cfg.Defaults.Locale,
|
|
Perm: users.Permissions{
|
|
Admin: false,
|
|
Execute: cfg.Defaults.AllowCommands,
|
|
Create: cfg.Defaults.AllowNew,
|
|
Rename: cfg.Defaults.AllowEdit,
|
|
Modify: cfg.Defaults.AllowEdit,
|
|
Delete: cfg.Defaults.AllowEdit,
|
|
Share: true,
|
|
Download: true,
|
|
},
|
|
},
|
|
}
|
|
|
|
server := &settings.Server{
|
|
BaseURL: cfg.BaseURL,
|
|
Port: cfg.Port,
|
|
Address: cfg.Address,
|
|
Log: cfg.Log,
|
|
}
|
|
|
|
var auther auth.Auther
|
|
switch cfg.Auth.Method {
|
|
case "proxy":
|
|
auther = &auth.ProxyAuth{Header: cfg.Auth.Header}
|
|
s.AuthMethod = auth.MethodProxyAuth
|
|
case "none":
|
|
auther = &auth.NoAuth{}
|
|
s.AuthMethod = auth.MethodNoAuth
|
|
default:
|
|
auther = &auth.JSONAuth{
|
|
ReCaptcha: &auth.ReCaptcha{
|
|
Host: cfg.ReCaptcha.Host,
|
|
Key: cfg.ReCaptcha.Key,
|
|
Secret: cfg.ReCaptcha.Secret,
|
|
},
|
|
}
|
|
s.AuthMethod = auth.MethodJSONAuth
|
|
}
|
|
|
|
err = sto.Auth.Save(auther)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = sto.Settings.Save(s)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = sto.Settings.SaveServer(server)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Println("Configuration successfully imported.")
|
|
return nil
|
|
}
|