2019-01-08 16:57:24 +08:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
2019-01-08 22:07:55 +08:00
|
|
|
"path/filepath"
|
2019-01-08 16:57:24 +08:00
|
|
|
"reflect"
|
|
|
|
|
2020-06-01 07:12:36 +08:00
|
|
|
"github.com/spf13/cobra"
|
|
|
|
|
2019-01-08 16:57:24 +08:00
|
|
|
"github.com/filebrowser/filebrowser/v2/auth"
|
|
|
|
"github.com/filebrowser/filebrowser/v2/settings"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
configCmd.AddCommand(configImportCmd)
|
|
|
|
}
|
|
|
|
|
|
|
|
type settingsFile struct {
|
|
|
|
Settings *settings.Settings `json:"settings"`
|
2019-01-08 22:07:55 +08:00
|
|
|
Server *settings.Server `json:"server"`
|
2019-01-08 16:57:24 +08:00
|
|
|
Auther interface{} `json:"auther"`
|
|
|
|
}
|
|
|
|
|
|
|
|
var configImportCmd = &cobra.Command{
|
2019-01-09 00:37:02 +08:00
|
|
|
Use: "import <path>",
|
2019-01-09 00:09:25 +08:00
|
|
|
Short: "Import a configuration file",
|
|
|
|
Long: `Import a configuration file. This will replace all the existing
|
2019-01-08 16:57:24 +08:00
|
|
|
configuration. Can be used with or without unexisting databases.
|
2019-01-09 00:37:02 +08:00
|
|
|
|
2019-01-08 16:57:24 +08:00
|
|
|
If used with a nonexisting database, a key will be generated
|
|
|
|
automatically. Otherwise the key will be kept the same as in the
|
2019-01-09 00:37:02 +08:00
|
|
|
database.
|
|
|
|
|
|
|
|
The path must be for a json or yaml file.`,
|
2019-01-08 16:57:24 +08:00
|
|
|
Args: jsonYamlArg,
|
2024-04-02 00:24:06 +08:00
|
|
|
Run: python(func(_ *cobra.Command, args []string, d pythonData) {
|
2019-01-08 16:57:24 +08:00
|
|
|
var key []byte
|
|
|
|
if d.hadDB {
|
|
|
|
settings, err := d.store.Settings.Get()
|
|
|
|
checkErr(err)
|
|
|
|
key = settings.Key
|
|
|
|
} else {
|
2019-01-12 04:25:39 +08:00
|
|
|
key = generateKey()
|
2019-01-08 16:57:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
file := settingsFile{}
|
|
|
|
err := unmarshal(args[0], &file)
|
|
|
|
checkErr(err)
|
|
|
|
|
|
|
|
file.Settings.Key = key
|
|
|
|
err = d.store.Settings.Save(file.Settings)
|
|
|
|
checkErr(err)
|
|
|
|
|
2019-01-08 22:07:55 +08:00
|
|
|
err = d.store.Settings.SaveServer(file.Server)
|
|
|
|
checkErr(err)
|
|
|
|
|
|
|
|
var rawAuther interface{}
|
2020-06-01 07:12:36 +08:00
|
|
|
if filepath.Ext(args[0]) != ".json" { //nolint:goconst
|
2019-01-08 22:07:55 +08:00
|
|
|
rawAuther = cleanUpInterfaceMap(file.Auther.(map[interface{}]interface{}))
|
|
|
|
} else {
|
|
|
|
rawAuther = file.Auther
|
|
|
|
}
|
2019-01-08 16:57:24 +08:00
|
|
|
|
|
|
|
var auther auth.Auther
|
|
|
|
switch file.Settings.AuthMethod {
|
|
|
|
case auth.MethodJSONAuth:
|
2019-01-08 22:07:55 +08:00
|
|
|
auther = getAuther(auth.JSONAuth{}, rawAuther).(*auth.JSONAuth)
|
2019-01-08 16:57:24 +08:00
|
|
|
case auth.MethodNoAuth:
|
2019-01-08 22:07:55 +08:00
|
|
|
auther = getAuther(auth.NoAuth{}, rawAuther).(*auth.NoAuth)
|
2019-01-08 16:57:24 +08:00
|
|
|
case auth.MethodProxyAuth:
|
2019-01-08 22:07:55 +08:00
|
|
|
auther = getAuther(auth.ProxyAuth{}, rawAuther).(*auth.ProxyAuth)
|
2021-09-13 21:47:06 +08:00
|
|
|
case auth.MethodHookAuth:
|
|
|
|
auther = getAuther(&auth.HookAuth{}, rawAuther).(*auth.HookAuth)
|
2019-01-08 16:57:24 +08:00
|
|
|
default:
|
|
|
|
checkErr(errors.New("invalid auth method"))
|
|
|
|
}
|
|
|
|
|
|
|
|
err = d.store.Auth.Save(auther)
|
|
|
|
checkErr(err)
|
2019-01-08 22:07:55 +08:00
|
|
|
|
|
|
|
printSettings(file.Server, file.Settings, auther)
|
2019-01-08 16:57:24 +08:00
|
|
|
}, pythonConfig{allowNoDB: true}),
|
|
|
|
}
|
|
|
|
|
|
|
|
func getAuther(sample auth.Auther, data interface{}) interface{} {
|
|
|
|
authType := reflect.TypeOf(sample)
|
|
|
|
auther := reflect.New(authType).Interface()
|
|
|
|
bytes, err := json.Marshal(data)
|
|
|
|
checkErr(err)
|
|
|
|
err = json.Unmarshal(bytes, &auther)
|
|
|
|
checkErr(err)
|
|
|
|
return auther
|
|
|
|
}
|