updated
This commit is contained in:
parent
db80387cf6
commit
43bf5b6f51
|
@ -155,14 +155,14 @@ func (a *HookAuth) SaveUser() (*users.User, error) {
|
||||||
d := &users.User{
|
d := &users.User{
|
||||||
Username: a.Cred.Username,
|
Username: a.Cred.Username,
|
||||||
Password: pass,
|
Password: pass,
|
||||||
Scope: a.Settings.Defaults.Scope,
|
Scope: a.Settings.UserDefaults.Scope,
|
||||||
Locale: a.Settings.Defaults.Locale,
|
Locale: a.Settings.UserDefaults.Locale,
|
||||||
ViewMode: a.Settings.Defaults.ViewMode,
|
ViewMode: a.Settings.UserDefaults.ViewMode,
|
||||||
SingleClick: a.Settings.Defaults.SingleClick,
|
SingleClick: a.Settings.UserDefaults.SingleClick,
|
||||||
Sorting: a.Settings.Defaults.Sorting,
|
Sorting: a.Settings.UserDefaults.Sorting,
|
||||||
Perm: a.Settings.Defaults.Perm,
|
Perm: a.Settings.UserDefaults.Perm,
|
||||||
Commands: a.Settings.Defaults.Commands,
|
Commands: a.Settings.UserDefaults.Commands,
|
||||||
HideDotfiles: a.Settings.Defaults.HideDotfiles,
|
HideDotfiles: a.Settings.UserDefaults.HideDotfiles,
|
||||||
}
|
}
|
||||||
u = a.GetUser(d)
|
u = a.GetUser(d)
|
||||||
|
|
||||||
|
@ -219,7 +219,7 @@ func (a *HookAuth) GetUser(d *users.User) *users.User {
|
||||||
Password: d.Password,
|
Password: d.Password,
|
||||||
Scope: a.Fields.GetString("user.scope", d.Scope),
|
Scope: a.Fields.GetString("user.scope", d.Scope),
|
||||||
Locale: a.Fields.GetString("user.locale", d.Locale),
|
Locale: a.Fields.GetString("user.locale", d.Locale),
|
||||||
ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))),
|
ViewMode: d.ViewMode,
|
||||||
SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick),
|
SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick),
|
||||||
Sorting: files.Sorting{
|
Sorting: files.Sorting{
|
||||||
Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc),
|
Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc),
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Execute executes the commands.
|
|
||||||
func Execute() {
|
|
||||||
if err := rootCmd.Execute(); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rootCmd.AddCommand(cmdsCmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
var cmdsCmd = &cobra.Command{
|
|
||||||
Use: "cmds",
|
|
||||||
Short: "Command runner management utility",
|
|
||||||
Long: `Command runner management utility.`,
|
|
||||||
Args: cobra.NoArgs,
|
|
||||||
}
|
|
||||||
|
|
||||||
func printEvents(m map[string][]string) {
|
|
||||||
for evt, cmds := range m {
|
|
||||||
for i, cmd := range cmds {
|
|
||||||
fmt.Printf("%s(%d): %s\n", evt, i, cmd)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
cmdsCmd.AddCommand(cmdsAddCmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
var cmdsAddCmd = &cobra.Command{
|
|
||||||
Use: "add <event> <command>",
|
|
||||||
Short: "Add a command to run on a specific event",
|
|
||||||
Long: `Add a command to run on a specific event.`,
|
|
||||||
Args: cobra.MinimumNArgs(2), //nolint:gomnd
|
|
||||||
Run: python(func(cmd *cobra.Command, args []string, d pythonData) {
|
|
||||||
s, err := d.store.Settings.Get()
|
|
||||||
checkErr(err)
|
|
||||||
command := strings.Join(args[1:], " ")
|
|
||||||
s.Commands[args[0]] = append(s.Commands[args[0]], command)
|
|
||||||
err = d.store.Settings.Save(s)
|
|
||||||
checkErr(err)
|
|
||||||
printEvents(s.Commands)
|
|
||||||
}, pythonConfig{}),
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
cmdsCmd.AddCommand(cmdsLsCmd)
|
|
||||||
cmdsLsCmd.Flags().StringP("event", "e", "", "event name, without 'before' or 'after'")
|
|
||||||
}
|
|
||||||
|
|
||||||
var cmdsLsCmd = &cobra.Command{
|
|
||||||
Use: "ls",
|
|
||||||
Short: "List all commands for each event",
|
|
||||||
Long: `List all commands for each event.`,
|
|
||||||
Args: cobra.NoArgs,
|
|
||||||
Run: python(func(cmd *cobra.Command, args []string, d pythonData) {
|
|
||||||
s, err := d.store.Settings.Get()
|
|
||||||
checkErr(err)
|
|
||||||
evt := mustGetString(cmd.Flags(), "event")
|
|
||||||
|
|
||||||
if evt == "" {
|
|
||||||
printEvents(s.Commands)
|
|
||||||
} else {
|
|
||||||
show := map[string][]string{}
|
|
||||||
show["before_"+evt] = s.Commands["before_"+evt]
|
|
||||||
show["after_"+evt] = s.Commands["after_"+evt]
|
|
||||||
printEvents(show)
|
|
||||||
}
|
|
||||||
}, pythonConfig{}),
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
cmdsCmd.AddCommand(cmdsRmCmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
var cmdsRmCmd = &cobra.Command{
|
|
||||||
Use: "rm <event> <index> [index_end]",
|
|
||||||
Short: "Removes a command from an event hooker",
|
|
||||||
Long: `Removes a command from an event hooker. The provided index
|
|
||||||
is the same that's printed when you run 'cmds ls'. Note
|
|
||||||
that after each removal/addition, the index of the
|
|
||||||
commands change. So be careful when removing them after each
|
|
||||||
other.
|
|
||||||
|
|
||||||
You can also specify an optional parameter (index_end) so
|
|
||||||
you can remove all commands from 'index' to 'index_end',
|
|
||||||
including 'index_end'.`,
|
|
||||||
Args: func(cmd *cobra.Command, args []string) error {
|
|
||||||
if err := cobra.RangeArgs(2, 3)(cmd, args); err != nil { //nolint:gomnd
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, arg := range args[1:] {
|
|
||||||
if _, err := strconv.Atoi(arg); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
Run: python(func(cmd *cobra.Command, args []string, d pythonData) {
|
|
||||||
s, err := d.store.Settings.Get()
|
|
||||||
checkErr(err)
|
|
||||||
evt := args[0]
|
|
||||||
|
|
||||||
i, err := strconv.Atoi(args[1])
|
|
||||||
checkErr(err)
|
|
||||||
f := i
|
|
||||||
if len(args) == 3 { //nolint:gomnd
|
|
||||||
f, err = strconv.Atoi(args[2])
|
|
||||||
checkErr(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
s.Commands[evt] = append(s.Commands[evt][:i], s.Commands[evt][f+1:]...)
|
|
||||||
err = d.store.Settings.Save(s)
|
|
||||||
checkErr(err)
|
|
||||||
printEvents(s.Commands)
|
|
||||||
}, pythonConfig{}),
|
|
||||||
}
|
|
|
@ -138,23 +138,23 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
|
||||||
fmt.Fprintf(w, "\tTLS Key:\t%s\n", ser.TLSKey)
|
fmt.Fprintf(w, "\tTLS Key:\t%s\n", ser.TLSKey)
|
||||||
fmt.Fprintf(w, "\tExec Enabled:\t%t\n", ser.EnableExec)
|
fmt.Fprintf(w, "\tExec Enabled:\t%t\n", ser.EnableExec)
|
||||||
fmt.Fprintln(w, "\nDefaults:")
|
fmt.Fprintln(w, "\nDefaults:")
|
||||||
fmt.Fprintf(w, "\tScope:\t%s\n", set.Defaults.Scope)
|
fmt.Fprintf(w, "\tScope:\t%s\n", set.UserDefaults.Scope)
|
||||||
fmt.Fprintf(w, "\tLocale:\t%s\n", set.Defaults.Locale)
|
fmt.Fprintf(w, "\tLocale:\t%s\n", set.UserDefaults.Locale)
|
||||||
fmt.Fprintf(w, "\tView mode:\t%s\n", set.Defaults.ViewMode)
|
fmt.Fprintf(w, "\tView mode:\t%s\n", set.UserDefaults.ViewMode)
|
||||||
fmt.Fprintf(w, "\tSingle Click:\t%t\n", set.Defaults.SingleClick)
|
fmt.Fprintf(w, "\tSingle Click:\t%t\n", set.UserDefaults.SingleClick)
|
||||||
fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " "))
|
fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.UserDefaults.Commands, " "))
|
||||||
fmt.Fprintf(w, "\tSorting:\n")
|
fmt.Fprintf(w, "\tSorting:\n")
|
||||||
fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By)
|
fmt.Fprintf(w, "\t\tBy:\t%s\n", set.UserDefaults.Sorting.By)
|
||||||
fmt.Fprintf(w, "\t\tAsc:\t%t\n", set.Defaults.Sorting.Asc)
|
fmt.Fprintf(w, "\t\tAsc:\t%t\n", set.UserDefaults.Sorting.Asc)
|
||||||
fmt.Fprintf(w, "\tPermissions:\n")
|
fmt.Fprintf(w, "\tPermissions:\n")
|
||||||
fmt.Fprintf(w, "\t\tAdmin:\t%t\n", set.Defaults.Perm.Admin)
|
fmt.Fprintf(w, "\t\tAdmin:\t%t\n", set.UserDefaults.Perm.Admin)
|
||||||
fmt.Fprintf(w, "\t\tExecute:\t%t\n", set.Defaults.Perm.Execute)
|
fmt.Fprintf(w, "\t\tExecute:\t%t\n", set.UserDefaults.Perm.Execute)
|
||||||
fmt.Fprintf(w, "\t\tCreate:\t%t\n", set.Defaults.Perm.Create)
|
fmt.Fprintf(w, "\t\tCreate:\t%t\n", set.UserDefaults.Perm.Create)
|
||||||
fmt.Fprintf(w, "\t\tRename:\t%t\n", set.Defaults.Perm.Rename)
|
fmt.Fprintf(w, "\t\tRename:\t%t\n", set.UserDefaults.Perm.Rename)
|
||||||
fmt.Fprintf(w, "\t\tModify:\t%t\n", set.Defaults.Perm.Modify)
|
fmt.Fprintf(w, "\t\tModify:\t%t\n", set.UserDefaults.Perm.Modify)
|
||||||
fmt.Fprintf(w, "\t\tDelete:\t%t\n", set.Defaults.Perm.Delete)
|
fmt.Fprintf(w, "\t\tDelete:\t%t\n", set.UserDefaults.Perm.Delete)
|
||||||
fmt.Fprintf(w, "\t\tShare:\t%t\n", set.Defaults.Perm.Share)
|
fmt.Fprintf(w, "\t\tShare:\t%t\n", set.UserDefaults.Perm.Share)
|
||||||
fmt.Fprintf(w, "\t\tDownload:\t%t\n", set.Defaults.Perm.Download)
|
fmt.Fprintf(w, "\t\tDownload:\t%t\n", set.UserDefaults.Perm.Download)
|
||||||
w.Flush()
|
w.Flush()
|
||||||
|
|
||||||
b, err := json.MarshalIndent(auther, "", " ")
|
b, err := json.MarshalIndent(auther, "", " ")
|
||||||
|
|
|
@ -59,7 +59,7 @@ you want to change. Other options will remain unchanged.`,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
getUserDefaults(flags, &set.Defaults, false)
|
getUserDefaults(flags, &set.UserDefaults, false)
|
||||||
|
|
||||||
// read the defaults
|
// read the defaults
|
||||||
_, auther := getAuthentication()
|
_, auther := getAuthentication()
|
||||||
|
|
|
@ -209,7 +209,7 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) {
|
||||||
Signup: false,
|
Signup: false,
|
||||||
CreateUserDir: false,
|
CreateUserDir: false,
|
||||||
UserHomeBasePath: settings.DefaultUsersHomeBasePath,
|
UserHomeBasePath: settings.DefaultUsersHomeBasePath,
|
||||||
Defaults: settings.UserDefaults{
|
UserDefaults: settings.UserDefaults{
|
||||||
Scope: ".",
|
Scope: ".",
|
||||||
Locale: "en",
|
Locale: "en",
|
||||||
SingleClick: false,
|
SingleClick: false,
|
||||||
|
@ -268,7 +268,7 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) {
|
||||||
LockPassword: false,
|
LockPassword: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
set.Defaults.Apply(user)
|
set.UserDefaults.Apply(user)
|
||||||
user.Perm.Admin = true
|
user.Perm.Admin = true
|
||||||
|
|
||||||
err = d.store.Users.Save(user)
|
err = d.store.Users.Save(user)
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
|
|
||||||
"github.com/gtsteffaniak/filebrowser/storage/bolt/importer"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rootCmd.AddCommand(upgradeCmd)
|
|
||||||
|
|
||||||
upgradeCmd.Flags().String("old.database", "", "")
|
|
||||||
upgradeCmd.Flags().String("old.config", "", "")
|
|
||||||
_ = upgradeCmd.MarkFlagRequired("old.database")
|
|
||||||
}
|
|
||||||
|
|
||||||
var upgradeCmd = &cobra.Command{
|
|
||||||
Use: "upgrade",
|
|
||||||
Short: "Upgrades an old configuration",
|
|
||||||
Long: `Upgrades an old configuration. This command DOES NOT
|
|
||||||
import share links because they are incompatible with
|
|
||||||
this version.`,
|
|
||||||
Args: cobra.NoArgs,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
flags := cmd.Flags()
|
|
||||||
oldDB := mustGetString(flags, "old.database")
|
|
||||||
oldConf := mustGetString(flags, "old.config")
|
|
||||||
err := importer.Import(oldDB, oldConf, getParam(flags, "database"))
|
|
||||||
checkErr(err)
|
|
||||||
},
|
|
||||||
}
|
|
|
@ -79,8 +79,8 @@ func addUserFlags(flags *pflag.FlagSet) {
|
||||||
flags.Bool("singleClick", false, "use single clicks only")
|
flags.Bool("singleClick", false, "use single clicks only")
|
||||||
}
|
}
|
||||||
|
|
||||||
func getViewMode(flags *pflag.FlagSet) users.ViewMode {
|
func getViewMode(flags *pflag.FlagSet) string {
|
||||||
viewMode := users.ViewMode(mustGetString(flags, "viewMode"))
|
viewMode := settings.GlobalConfiguration.UserDefaults.ViewMode
|
||||||
if viewMode != users.ListViewMode && viewMode != users.MosaicViewMode {
|
if viewMode != users.ListViewMode && viewMode != users.MosaicViewMode {
|
||||||
checkErr(errors.New("view mode must be \"" + string(users.ListViewMode) + "\" or \"" + string(users.MosaicViewMode) + "\""))
|
checkErr(errors.New("view mode must be \"" + string(users.ListViewMode) + "\" or \"" + string(users.MosaicViewMode) + "\""))
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ var usersAddCmd = &cobra.Command{
|
||||||
Run: python(func(cmd *cobra.Command, args []string, d pythonData) {
|
Run: python(func(cmd *cobra.Command, args []string, d pythonData) {
|
||||||
s, err := d.store.Settings.Get()
|
s, err := d.store.Settings.Get()
|
||||||
checkErr(err)
|
checkErr(err)
|
||||||
getUserDefaults(cmd.Flags(), &s.Defaults, false)
|
getUserDefaults(cmd.Flags(), &s.UserDefaults, false)
|
||||||
|
|
||||||
password, err := users.HashPwd(args[1])
|
password, err := users.HashPwd(args[1])
|
||||||
checkErr(err)
|
checkErr(err)
|
||||||
|
@ -30,7 +30,7 @@ var usersAddCmd = &cobra.Command{
|
||||||
LockPassword: mustGetBool(cmd.Flags(), "lockPassword"),
|
LockPassword: mustGetBool(cmd.Flags(), "lockPassword"),
|
||||||
}
|
}
|
||||||
|
|
||||||
s.Defaults.Apply(user)
|
s.UserDefaults.Apply(user)
|
||||||
|
|
||||||
servSettings, err := d.store.Settings.GetServer()
|
servSettings, err := d.store.Settings.GetServer()
|
||||||
checkErr(err)
|
checkErr(err)
|
||||||
|
|
|
@ -22,7 +22,7 @@ const (
|
||||||
type userInfo struct {
|
type userInfo struct {
|
||||||
ID uint `json:"id"`
|
ID uint `json:"id"`
|
||||||
Locale string `json:"locale"`
|
Locale string `json:"locale"`
|
||||||
ViewMode users.ViewMode `json:"viewMode"`
|
ViewMode string `json:"viewMode"`
|
||||||
SingleClick bool `json:"singleClick"`
|
SingleClick bool `json:"singleClick"`
|
||||||
Perm users.Permissions `json:"perm"`
|
Perm users.Permissions `json:"perm"`
|
||||||
Commands []string `json:"commands"`
|
Commands []string `json:"commands"`
|
||||||
|
@ -145,7 +145,7 @@ var signupHandler = func(w http.ResponseWriter, r *http.Request, d *data) (int,
|
||||||
Username: info.Username,
|
Username: info.Username,
|
||||||
}
|
}
|
||||||
|
|
||||||
d.settings.Defaults.Apply(user)
|
d.settings.UserDefaults.Apply(user)
|
||||||
|
|
||||||
pwd, err := users.HashPwd(info.Password)
|
pwd, err := users.HashPwd(info.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -24,7 +24,7 @@ var settingsGetHandler = withAdmin(func(w http.ResponseWriter, r *http.Request,
|
||||||
Signup: d.settings.Signup,
|
Signup: d.settings.Signup,
|
||||||
CreateUserDir: d.settings.CreateUserDir,
|
CreateUserDir: d.settings.CreateUserDir,
|
||||||
UserHomeBasePath: d.settings.UserHomeBasePath,
|
UserHomeBasePath: d.settings.UserHomeBasePath,
|
||||||
Defaults: d.settings.Defaults,
|
Defaults: d.settings.UserDefaults,
|
||||||
Rules: d.settings.Rules,
|
Rules: d.settings.Rules,
|
||||||
Frontend: d.settings.Frontend,
|
Frontend: d.settings.Frontend,
|
||||||
Shell: d.settings.Shell,
|
Shell: d.settings.Shell,
|
||||||
|
@ -44,7 +44,7 @@ var settingsPutHandler = withAdmin(func(w http.ResponseWriter, r *http.Request,
|
||||||
d.settings.Signup = req.Signup
|
d.settings.Signup = req.Signup
|
||||||
d.settings.CreateUserDir = req.CreateUserDir
|
d.settings.CreateUserDir = req.CreateUserDir
|
||||||
d.settings.UserHomeBasePath = req.UserHomeBasePath
|
d.settings.UserHomeBasePath = req.UserHomeBasePath
|
||||||
d.settings.Defaults = req.Defaults
|
d.settings.UserDefaults = req.Defaults
|
||||||
d.settings.Rules = req.Rules
|
d.settings.Rules = req.Rules
|
||||||
d.settings.Frontend = req.Frontend
|
d.settings.Frontend = req.Frontend
|
||||||
d.settings.Shell = req.Shell
|
d.settings.Shell = req.Shell
|
||||||
|
|
|
@ -50,16 +50,16 @@ func (s *Storage) Save(set *Settings) error {
|
||||||
return errors.ErrEmptyKey
|
return errors.ErrEmptyKey
|
||||||
}
|
}
|
||||||
|
|
||||||
if set.Defaults.Locale == "" {
|
if set.UserDefaults.Locale == "" {
|
||||||
set.Defaults.Locale = "en"
|
set.UserDefaults.Locale = "en"
|
||||||
}
|
}
|
||||||
|
|
||||||
if set.Defaults.Commands == nil {
|
if set.UserDefaults.Commands == nil {
|
||||||
set.Defaults.Commands = []string{}
|
set.UserDefaults.Commands = []string{}
|
||||||
}
|
}
|
||||||
|
|
||||||
if set.Defaults.ViewMode == "" {
|
if set.UserDefaults.ViewMode == "" {
|
||||||
set.Defaults.ViewMode = users.MosaicViewMode
|
set.UserDefaults.ViewMode = users.MosaicViewMode
|
||||||
}
|
}
|
||||||
|
|
||||||
if set.Rules == nil {
|
if set.Rules == nil {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package settings
|
package settings
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gtsteffaniak/filebrowser/files"
|
|
||||||
"github.com/gtsteffaniak/filebrowser/rules"
|
"github.com/gtsteffaniak/filebrowser/rules"
|
||||||
"github.com/gtsteffaniak/filebrowser/users"
|
"github.com/gtsteffaniak/filebrowser/users"
|
||||||
)
|
)
|
||||||
|
@ -24,20 +23,17 @@ type Settings struct {
|
||||||
Signup bool `json:"signup"`
|
Signup bool `json:"signup"`
|
||||||
CreateUserDir bool `json:"createUserDir"`
|
CreateUserDir bool `json:"createUserDir"`
|
||||||
UserHomeBasePath string `json:"userHomeBasePath"`
|
UserHomeBasePath string `json:"userHomeBasePath"`
|
||||||
Defaults UserDefaults `json:"defaults"`
|
|
||||||
Commands map[string][]string `json:"commands"`
|
Commands map[string][]string `json:"commands"`
|
||||||
Shell []string `json:"shell"`
|
Shell []string `json:"shell"`
|
||||||
Rules []rules.Rule `json:"rules"`
|
Rules []rules.Rule `json:"rules"`
|
||||||
Server Server `json:"server"`
|
Server Server `json:"server"`
|
||||||
Auth Auth `json:"auth"`
|
Auth Auth `json:"auth"`
|
||||||
|
|
||||||
Frontend Frontend `json:"frontend"`
|
Frontend Frontend `json:"frontend"`
|
||||||
|
|
||||||
UserDefaults UserDefaults `json:"userDefaults"`
|
UserDefaults UserDefaults `json:"userDefaults"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Auth struct {
|
type Auth struct {
|
||||||
Recaptcha Recaptcha
|
Recaptcha Recaptcha `json:"recaptcha"`
|
||||||
Header string `json:"header"`
|
Header string `json:"header"`
|
||||||
Method string `json:"method"`
|
Method string `json:"method"`
|
||||||
Command string `json:"command"`
|
Command string `json:"command"`
|
||||||
|
@ -46,9 +42,9 @@ type Auth struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Recaptcha struct {
|
type Recaptcha struct {
|
||||||
Host string
|
Host string `json:"host"`
|
||||||
Key string
|
Key string `json:"key"`
|
||||||
Secret string
|
Secret string `json:"secret"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
|
@ -68,7 +64,7 @@ type Server struct {
|
||||||
Log string `json:"log"`
|
Log string `json:"log"`
|
||||||
Database string `json:"database"`
|
Database string `json:"database"`
|
||||||
Root string `json:"root"`
|
Root string `json:"root"`
|
||||||
EnablePreviewResize bool `json:"disable-preview-resize"`
|
EnablePreviewResize bool `json:"enablePreviewResize"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Frontend struct {
|
type Frontend struct {
|
||||||
|
@ -85,53 +81,23 @@ type Frontend struct {
|
||||||
type UserDefaults struct {
|
type UserDefaults struct {
|
||||||
Scope string `json:"scope"`
|
Scope string `json:"scope"`
|
||||||
Locale string `json:"locale"`
|
Locale string `json:"locale"`
|
||||||
ViewMode users.ViewMode `json:"viewMode"`
|
ViewMode string `json:"viewMode"`
|
||||||
SingleClick bool `json:"singleClick"`
|
SingleClick bool `json:"singleClick"`
|
||||||
Sorting files.Sorting `json:"sorting"`
|
Sorting struct {
|
||||||
Perm users.Permissions `json:"perm"`
|
By string `json:"by"`
|
||||||
|
Asc bool `json:"asc"`
|
||||||
|
} `json:"sorting"`
|
||||||
|
Perm struct {
|
||||||
|
Admin bool `json:"admin"`
|
||||||
|
Execute bool `json:"execute"`
|
||||||
|
Create bool `json:"create"`
|
||||||
|
Rename bool `json:"rename"`
|
||||||
|
Modify bool `json:"modify"`
|
||||||
|
Delete bool `json:"delete"`
|
||||||
|
Share bool `json:"share"`
|
||||||
|
Download bool `json:"download"`
|
||||||
|
} `json:"perm"`
|
||||||
Commands []string `json:"commands"`
|
Commands []string `json:"commands"`
|
||||||
HideDotfiles bool `json:"hideDotfiles"`
|
HideDotfiles bool `json:"hideDotfiles"`
|
||||||
DateFormat bool `json:"dateFormat"`
|
DateFormat bool `json:"dateFormat"`
|
||||||
}
|
}
|
||||||
|
|
||||||
//{
|
|
||||||
// "server":{
|
|
||||||
// "port":8080,
|
|
||||||
// "baseURL":"",
|
|
||||||
// "address":"",
|
|
||||||
// "log":"stdout",
|
|
||||||
// "database":"./database.db",
|
|
||||||
// "root":"/srv",
|
|
||||||
// "disable-thumbnails":false,
|
|
||||||
// "disable-preview-resize":false,
|
|
||||||
// "disable-exec":false,
|
|
||||||
// "disable-type-detection-by-header":false
|
|
||||||
// },
|
|
||||||
// "auth":{
|
|
||||||
// "header":"",
|
|
||||||
// "method":"",
|
|
||||||
// "command":"",
|
|
||||||
// "signup":false,
|
|
||||||
// "shell":""
|
|
||||||
// },
|
|
||||||
// "branding":{
|
|
||||||
// "name":"",
|
|
||||||
// "color":"",
|
|
||||||
// "files":"",
|
|
||||||
// "disableExternal":"",
|
|
||||||
// "disableUsedPercentage":""
|
|
||||||
// },
|
|
||||||
// "permissions":{
|
|
||||||
// "Admin":false,
|
|
||||||
// "Execute":true,
|
|
||||||
// "Create":true,
|
|
||||||
// "Rename":true,
|
|
||||||
// "Modify":true,
|
|
||||||
// "Delete":true,
|
|
||||||
// "Share":true,
|
|
||||||
// "Download":true
|
|
||||||
// },
|
|
||||||
// "commands":{},
|
|
||||||
// "shell":{},
|
|
||||||
// "rules":{}
|
|
||||||
// }
|
|
||||||
|
|
|
@ -1,187 +0,0 @@
|
||||||
package importer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/asdine/storm/v3"
|
|
||||||
"github.com/pelletier/go-toml/v2"
|
|
||||||
"gopkg.in/yaml.v2"
|
|
||||||
|
|
||||||
"github.com/gtsteffaniak/filebrowser/auth"
|
|
||||||
"github.com/gtsteffaniak/filebrowser/settings"
|
|
||||||
"github.com/gtsteffaniak/filebrowser/storage"
|
|
||||||
"github.com/gtsteffaniak/filebrowser/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"`
|
|
||||||
Command string `json:"command" yaml:"command" toml:"command"`
|
|
||||||
}
|
|
||||||
|
|
||||||
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: 8080,
|
|
||||||
Address: cfg.Address,
|
|
||||||
Log: cfg.Log,
|
|
||||||
}
|
|
||||||
fmt.Println("config.go", server)
|
|
||||||
var auther auth.Auther
|
|
||||||
switch cfg.Auth.Method {
|
|
||||||
case "proxy":
|
|
||||||
auther = &auth.ProxyAuth{Header: cfg.Auth.Header}
|
|
||||||
s.Auth.Method = "proxy"
|
|
||||||
case "hook":
|
|
||||||
auther = &auth.HookAuth{Command: cfg.Auth.Command}
|
|
||||||
s.Auth.Method = "hoook"
|
|
||||||
case "none":
|
|
||||||
auther = &auth.NoAuth{}
|
|
||||||
s.Auth.Method = "noauth"
|
|
||||||
default:
|
|
||||||
auther = &auth.JSONAuth{
|
|
||||||
ReCaptcha: &auth.ReCaptcha{
|
|
||||||
Host: cfg.ReCaptcha.Host,
|
|
||||||
Key: cfg.ReCaptcha.Key,
|
|
||||||
Secret: cfg.ReCaptcha.Secret,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
s.Auth.Method = "password"
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
package importer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/asdine/storm/v3"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/gtsteffaniak/filebrowser/storage/bolt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Import imports an old configuration to a newer database.
|
|
||||||
func Import(oldDBPath, oldConf, newDBPath string) error {
|
|
||||||
log.Println(oldDBPath, oldConf, newDBPath)
|
|
||||||
oldDB, err := storm.Open(oldDBPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer oldDB.Close()
|
|
||||||
|
|
||||||
newDB, err := storm.Open(newDBPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer newDB.Close()
|
|
||||||
|
|
||||||
sto, err := bolt.NewStorage(newDB)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = importUsers(oldDB, sto)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = importConf(oldDB, oldConf, sto)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
|
@ -1,114 +0,0 @@
|
||||||
package importer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/asdine/storm/v3"
|
|
||||||
bolt "go.etcd.io/bbolt"
|
|
||||||
|
|
||||||
"github.com/gtsteffaniak/filebrowser/rules"
|
|
||||||
"github.com/gtsteffaniak/filebrowser/storage"
|
|
||||||
"github.com/gtsteffaniak/filebrowser/users"
|
|
||||||
)
|
|
||||||
|
|
||||||
type oldUser struct {
|
|
||||||
ID int `storm:"id,increment"`
|
|
||||||
Admin bool `json:"admin"`
|
|
||||||
AllowCommands bool `json:"allowCommands"` // Execute commands
|
|
||||||
AllowEdit bool `json:"allowEdit"` // Edit/rename files
|
|
||||||
AllowNew bool `json:"allowNew"` // Create files and folders
|
|
||||||
AllowPublish bool `json:"allowPublish"` // Publish content (to use with static gen)
|
|
||||||
LockPassword bool `json:"lockPassword"`
|
|
||||||
Commands []string `json:"commands"`
|
|
||||||
Locale string `json:"locale"`
|
|
||||||
Password string `json:"password"`
|
|
||||||
Rules []*rules.Rule `json:"rules"`
|
|
||||||
Scope string `json:"filesystem"`
|
|
||||||
Username string `json:"username" storm:"index,unique"`
|
|
||||||
ViewMode string `json:"viewMode"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func readOldUsers(db *storm.DB) ([]*oldUser, error) {
|
|
||||||
var oldUsers []*oldUser
|
|
||||||
err := db.Bolt.View(func(tx *bolt.Tx) error {
|
|
||||||
return tx.Bucket([]byte("User")).ForEach(func(k []byte, v []byte) error {
|
|
||||||
if len(v) > 0 && string(v)[0] == '{' {
|
|
||||||
user := &oldUser{}
|
|
||||||
err := json.Unmarshal(v, user)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
oldUsers = append(oldUsers, user)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
return oldUsers, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertUsersToNew(old []*oldUser) ([]*users.User, error) {
|
|
||||||
list := []*users.User{}
|
|
||||||
|
|
||||||
for _, oldUser := range old {
|
|
||||||
user := &users.User{
|
|
||||||
Username: oldUser.Username,
|
|
||||||
Password: oldUser.Password,
|
|
||||||
Scope: oldUser.Scope,
|
|
||||||
Locale: oldUser.Locale,
|
|
||||||
LockPassword: oldUser.LockPassword,
|
|
||||||
ViewMode: users.ViewMode(oldUser.ViewMode),
|
|
||||||
Commands: oldUser.Commands,
|
|
||||||
Rules: []rules.Rule{},
|
|
||||||
Perm: users.Permissions{
|
|
||||||
Admin: oldUser.Admin,
|
|
||||||
Execute: oldUser.AllowCommands,
|
|
||||||
Create: oldUser.AllowNew,
|
|
||||||
Rename: oldUser.AllowEdit,
|
|
||||||
Modify: oldUser.AllowEdit,
|
|
||||||
Delete: oldUser.AllowEdit,
|
|
||||||
Share: true,
|
|
||||||
Download: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, rule := range oldUser.Rules {
|
|
||||||
user.Rules = append(user.Rules, *rule)
|
|
||||||
}
|
|
||||||
|
|
||||||
err := user.Clean("")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
list = append(list, user)
|
|
||||||
}
|
|
||||||
|
|
||||||
return list, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func importUsers(old *storm.DB, sto *storage.Storage) error {
|
|
||||||
oldUsers, err := readOldUsers(old)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
newUsers, err := convertUsersToNew(oldUsers)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, user := range newUsers {
|
|
||||||
err = sto.Users.Save(user)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("%d users successfully imported into the new DB.\n", len(newUsers))
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -11,12 +11,9 @@ import (
|
||||||
"github.com/gtsteffaniak/filebrowser/rules"
|
"github.com/gtsteffaniak/filebrowser/rules"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ViewMode describes a view mode.
|
var (
|
||||||
type ViewMode string
|
ListViewMode = "list"
|
||||||
|
MosaicViewMode = "mosaic"
|
||||||
const (
|
|
||||||
ListViewMode ViewMode = "list"
|
|
||||||
MosaicViewMode ViewMode = "mosaic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// User describes a user.
|
// User describes a user.
|
||||||
|
@ -27,7 +24,7 @@ type User struct {
|
||||||
Scope string `json:"scope"`
|
Scope string `json:"scope"`
|
||||||
Locale string `json:"locale"`
|
Locale string `json:"locale"`
|
||||||
LockPassword bool `json:"lockPassword"`
|
LockPassword bool `json:"lockPassword"`
|
||||||
ViewMode ViewMode `json:"viewMode"`
|
ViewMode string `json:"viewMode"`
|
||||||
SingleClick bool `json:"singleClick"`
|
SingleClick bool `json:"singleClick"`
|
||||||
Perm Permissions `json:"perm"`
|
Perm Permissions `json:"perm"`
|
||||||
Commands []string `json:"commands"`
|
Commands []string `json:"commands"`
|
||||||
|
|
Loading…
Reference in New Issue