diff --git a/auth/auth.go b/auth/auth.go index 86b56a04..d0f22cd1 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -3,12 +3,11 @@ package auth import ( "net/http" - "github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/users" ) // Auther is the authentication interface. type Auther interface { // Auth is called to authenticate a request. - Auth(*http.Request, *users.Storage, *settings.Settings) (*users.User, error) + Auth(r *http.Request, s *users.Storage, root string) (*users.User, error) } diff --git a/auth/json.go b/auth/json.go index 9bd86fe8..f1d6b2ad 100644 --- a/auth/json.go +++ b/auth/json.go @@ -26,7 +26,7 @@ type JSONAuth struct { } // Auth authenticates the user via a json in content body. -func (a *JSONAuth) Auth(r *http.Request, sto *users.Storage, set *settings.Settings) (*users.User, error) { +func (a *JSONAuth) Auth(r *http.Request, sto *users.Storage, root string) (*users.User, error) { var cred jsonCred if r.Body == nil { @@ -51,7 +51,7 @@ func (a *JSONAuth) Auth(r *http.Request, sto *users.Storage, set *settings.Setti } } - u, err := sto.Get(set.Scope, cred.Username) + u, err := sto.Get(root, cred.Username) if err != nil || !users.CheckPwd(cred.Password, u.Password) { return nil, os.ErrPermission } diff --git a/auth/none.go b/auth/none.go index 76312881..0279c4e8 100644 --- a/auth/none.go +++ b/auth/none.go @@ -11,10 +11,9 @@ import ( const MethodNoAuth settings.AuthMethod = "noauth" // NoAuth is no auth implementation of auther. -type NoAuth struct { -} +type NoAuth struct{} // Auth uses authenticates user 1. -func (a *NoAuth) Auth(r *http.Request, sto *users.Storage, set *settings.Settings) (*users.User, error) { - return sto.Get(set.Scope, 1) +func (a *NoAuth) Auth(r *http.Request, sto *users.Storage, root string) (*users.User, error) { + return sto.Get(root, 1) } diff --git a/auth/proxy.go b/auth/proxy.go index e3176bdd..dc73fb5b 100644 --- a/auth/proxy.go +++ b/auth/proxy.go @@ -18,9 +18,9 @@ type ProxyAuth struct { } // Auth authenticates the user via an HTTP header. -func (a *ProxyAuth) Auth(r *http.Request, sto *users.Storage, set *settings.Settings) (*users.User, error) { +func (a *ProxyAuth) Auth(r *http.Request, sto *users.Storage, root string) (*users.User, error) { username := r.Header.Get(a.Header) - user, err := sto.Get(set.Scope, username) + user, err := sto.Get(root, username) if err == errors.ErrNotExist { return nil, os.ErrPermission } diff --git a/cmd/root.go b/cmd/root.go index 7acb9aa2..5875ae24 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -39,7 +39,7 @@ func init() { vaddP(f, "port", "p", 8080, "port to listen on") vaddP(f, "cert", "t", "", "tls certificate") vaddP(f, "key", "k", "", "tls key") - vaddP(f, "scope", "s", ".", "scope to prepend to a user's scope when it is relative") + vaddP(f, "root", "r", ".", "root to prepend to relative paths") vaddP(f, "baseurl", "b", "", "base url") vadd(f, "username", "admin", "username for the first user when using quick config") vadd(f, "password", "", "hashed password for the first user when using quick config (default \"admin\")") @@ -115,9 +115,9 @@ user created with the credentials from options "username" and "password".`, address := v.GetString("address") cert := v.GetString("cert") key := v.GetString("key") - scope := v.GetString("scope") + root := v.GetString("root") - scope, err := filepath.Abs(scope) + root, err := filepath.Abs(root) checkErr(err) settings, err := d.store.Settings.Get() checkErr(err) @@ -127,7 +127,7 @@ user created with the credentials from options "username" and "password".`, // they are needed during the execution and not only // to start up the server. settings.BaseURL = v.GetString("baseurl") - settings.Scope = scope + settings.Root = root err = d.store.Settings.Save(settings) checkErr(err) @@ -151,7 +151,7 @@ user created with the credentials from options "username" and "password".`, if err := http.Serve(listener, handler); err != nil { log.Fatal(err) } - }, pythonConfig{noDB: true}), + }, pythonConfig{allowNoDB: true}), } func quickSetup(d pythonData) { diff --git a/cmd/users_update.go b/cmd/users_update.go index 09898cd3..375101ef 100644 --- a/cmd/users_update.go +++ b/cmd/users_update.go @@ -21,19 +21,17 @@ var usersUpdateCmd = &cobra.Command{ options you want to change.`, Args: cobra.ExactArgs(1), Run: python(func(cmd *cobra.Command, args []string, d pythonData) { - set, err := d.store.Settings.Get() - checkErr(err) - username, id := parseUsernameOrID(args[0]) password := mustGetString(cmd, "password") newUsername := mustGetString(cmd, "username") + var err error var user *users.User if id != 0 { - user, err = d.store.Users.Get(set.Scope, id) + user, err = d.store.Users.Get("", id) } else { - user, err = d.store.Users.Get(set.Scope, username) + user, err = d.store.Users.Get("", username) } checkErr(err) diff --git a/cmd/utils.go b/cmd/utils.go index daea6687..8eac6407 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -73,7 +73,8 @@ type cobraFunc func(cmd *cobra.Command, args []string) type pythonFunc func(cmd *cobra.Command, args []string, data pythonData) type pythonConfig struct { - noDB bool + noDB bool + allowNoDB bool } type pythonData struct { @@ -91,7 +92,7 @@ func python(fn pythonFunc, cfg pythonConfig) cobraFunc { if os.IsNotExist(err) { data.hadDB = false - if !cfg.noDB { + if !cfg.noDB || !cfg.allowNoDB { log.Fatal(path + " does not exid.store. Please run 'filebrowser config init' fird.store.") } } else if err != nil { diff --git a/http/auth.go b/http/auth.go index 2e01ddf0..0b6a2f6c 100644 --- a/http/auth.go +++ b/http/auth.go @@ -67,7 +67,7 @@ func withUser(fn handleFunc) handleFunc { w.Header().Add("X-Renew-Token", "true") } - d.user, err = d.store.Users.Get(d.settings.Scope, tk.User.ID) + d.user, err = d.store.Users.Get(d.settings.Root, tk.User.ID) if err != nil { return http.StatusInternalServerError, err } @@ -91,7 +91,7 @@ var loginHandler = func(w http.ResponseWriter, r *http.Request, d *data) (int, e return http.StatusInternalServerError, err } - user, err := auther.Auth(r, d.store.Users, d.Settings) + user, err := auther.Auth(r, d.store.Users, d.Settings.Root) if err == os.ErrPermission { return http.StatusForbidden, nil } else if err != nil { diff --git a/http/public.go b/http/public.go index afab24a6..2d734c18 100644 --- a/http/public.go +++ b/http/public.go @@ -13,7 +13,7 @@ var withHashFile = func(fn handleFunc) handleFunc { return errToStatus(err), err } - user, err := d.store.Users.Get(d.settings.Scope, link.UserID) + user, err := d.store.Users.Get(d.settings.Root, link.UserID) if err != nil { return errToStatus(err), err } diff --git a/http/users.go b/http/users.go index ad547435..815a1349 100644 --- a/http/users.go +++ b/http/users.go @@ -61,7 +61,7 @@ func withSelfOrAdmin(fn handleFunc) handleFunc { } var usersGetHandler = withAdmin(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { - users, err := d.store.Users.Gets(d.settings.Scope) + users, err := d.store.Users.Gets(d.settings.Root) if err != nil { return http.StatusInternalServerError, err } @@ -78,7 +78,7 @@ var usersGetHandler = withAdmin(func(w http.ResponseWriter, r *http.Request, d * }) var userGetHandler = withSelfOrAdmin(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { - u, err := d.store.Users.Get(d.settings.Scope, d.raw.(uint)) + u, err := d.store.Users.Get(d.settings.Root, d.raw.(uint)) if err == errors.ErrNotExist { return http.StatusNotFound, err } @@ -147,7 +147,7 @@ var userPutHandler = withSelfOrAdmin(func(w http.ResponseWriter, r *http.Request req.Data.Password, err = users.HashPwd(req.Data.Password) } else { var suser *users.User - suser, err = d.store.Users.Get(d.settings.Scope, d.raw.(uint)) + suser, err = d.store.Users.Get(d.settings.Root, d.raw.(uint)) req.Data.Password = suser.Password } diff --git a/settings/settings.go b/settings/settings.go index 57d4863d..7c4cfb94 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -9,7 +9,7 @@ type AuthMethod string type Settings struct { Key []byte `json:"key"` BaseURL string `json:"baseURL"` - Scope string `json:"scope"` + Root string `json:"root"` Signup bool `json:"signup"` Defaults UserDefaults `json:"defaults"` AuthMethod AuthMethod `json:"authMethod"`