fix: rename global scope as root and fix root md

License: MIT
Signed-off-by: Henrique Dias <hacdias@gmail.com>

Former-commit-id: 856c18bc9cf98a27b6cbea923b231e0aaf279190 [formerly 201c1a0294947930a7d0706af72ce719a8cc3b98] [formerly 0253e57e2994023e798f6fb0ae76f9c21d18fd69 [formerly 33a58c999a8e2ae49e52117451e99b57b2cde7b9]]
Former-commit-id: e7d88b22207125c29ea85a5a539653a54584999c [formerly 77cb1e0172cdf7195cc25d557e5028a9250d655c]
Former-commit-id: 64288f5a475a82d5f88c91347a09aea67ebb169d
This commit is contained in:
Henrique Dias 2019-01-07 20:34:44 +00:00
parent 77e1fe83db
commit 5a83d6736b
11 changed files with 26 additions and 29 deletions

View File

@ -3,12 +3,11 @@ package auth
import ( import (
"net/http" "net/http"
"github.com/filebrowser/filebrowser/v2/settings"
"github.com/filebrowser/filebrowser/v2/users" "github.com/filebrowser/filebrowser/v2/users"
) )
// Auther is the authentication interface. // Auther is the authentication interface.
type Auther interface { type Auther interface {
// Auth is called to authenticate a request. // 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)
} }

View File

@ -26,7 +26,7 @@ type JSONAuth struct {
} }
// Auth authenticates the user via a json in content body. // 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 var cred jsonCred
if r.Body == nil { 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) { if err != nil || !users.CheckPwd(cred.Password, u.Password) {
return nil, os.ErrPermission return nil, os.ErrPermission
} }

View File

@ -11,10 +11,9 @@ import (
const MethodNoAuth settings.AuthMethod = "noauth" const MethodNoAuth settings.AuthMethod = "noauth"
// NoAuth is no auth implementation of auther. // NoAuth is no auth implementation of auther.
type NoAuth struct { type NoAuth struct{}
}
// Auth uses authenticates user 1. // Auth uses authenticates user 1.
func (a *NoAuth) Auth(r *http.Request, sto *users.Storage, set *settings.Settings) (*users.User, error) { func (a *NoAuth) Auth(r *http.Request, sto *users.Storage, root string) (*users.User, error) {
return sto.Get(set.Scope, 1) return sto.Get(root, 1)
} }

View File

@ -18,9 +18,9 @@ type ProxyAuth struct {
} }
// Auth authenticates the user via an HTTP header. // 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) username := r.Header.Get(a.Header)
user, err := sto.Get(set.Scope, username) user, err := sto.Get(root, username)
if err == errors.ErrNotExist { if err == errors.ErrNotExist {
return nil, os.ErrPermission return nil, os.ErrPermission
} }

View File

@ -39,7 +39,7 @@ func init() {
vaddP(f, "port", "p", 8080, "port to listen on") vaddP(f, "port", "p", 8080, "port to listen on")
vaddP(f, "cert", "t", "", "tls certificate") vaddP(f, "cert", "t", "", "tls certificate")
vaddP(f, "key", "k", "", "tls key") 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") vaddP(f, "baseurl", "b", "", "base url")
vadd(f, "username", "admin", "username for the first user when using quick config") 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\")") 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") address := v.GetString("address")
cert := v.GetString("cert") cert := v.GetString("cert")
key := v.GetString("key") key := v.GetString("key")
scope := v.GetString("scope") root := v.GetString("root")
scope, err := filepath.Abs(scope) root, err := filepath.Abs(root)
checkErr(err) checkErr(err)
settings, err := d.store.Settings.Get() settings, err := d.store.Settings.Get()
checkErr(err) 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 // they are needed during the execution and not only
// to start up the server. // to start up the server.
settings.BaseURL = v.GetString("baseurl") settings.BaseURL = v.GetString("baseurl")
settings.Scope = scope settings.Root = root
err = d.store.Settings.Save(settings) err = d.store.Settings.Save(settings)
checkErr(err) checkErr(err)
@ -151,7 +151,7 @@ user created with the credentials from options "username" and "password".`,
if err := http.Serve(listener, handler); err != nil { if err := http.Serve(listener, handler); err != nil {
log.Fatal(err) log.Fatal(err)
} }
}, pythonConfig{noDB: true}), }, pythonConfig{allowNoDB: true}),
} }
func quickSetup(d pythonData) { func quickSetup(d pythonData) {

View File

@ -21,19 +21,17 @@ var usersUpdateCmd = &cobra.Command{
options you want to change.`, options you want to change.`,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
Run: python(func(cmd *cobra.Command, args []string, d pythonData) { Run: python(func(cmd *cobra.Command, args []string, d pythonData) {
set, err := d.store.Settings.Get()
checkErr(err)
username, id := parseUsernameOrID(args[0]) username, id := parseUsernameOrID(args[0])
password := mustGetString(cmd, "password") password := mustGetString(cmd, "password")
newUsername := mustGetString(cmd, "username") newUsername := mustGetString(cmd, "username")
var err error
var user *users.User var user *users.User
if id != 0 { if id != 0 {
user, err = d.store.Users.Get(set.Scope, id) user, err = d.store.Users.Get("", id)
} else { } else {
user, err = d.store.Users.Get(set.Scope, username) user, err = d.store.Users.Get("", username)
} }
checkErr(err) checkErr(err)

View File

@ -74,6 +74,7 @@ type pythonFunc func(cmd *cobra.Command, args []string, data pythonData)
type pythonConfig struct { type pythonConfig struct {
noDB bool noDB bool
allowNoDB bool
} }
type pythonData struct { type pythonData struct {
@ -91,7 +92,7 @@ func python(fn pythonFunc, cfg pythonConfig) cobraFunc {
if os.IsNotExist(err) { if os.IsNotExist(err) {
data.hadDB = false 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.") log.Fatal(path + " does not exid.store. Please run 'filebrowser config init' fird.store.")
} }
} else if err != nil { } else if err != nil {

View File

@ -67,7 +67,7 @@ func withUser(fn handleFunc) handleFunc {
w.Header().Add("X-Renew-Token", "true") 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 { if err != nil {
return http.StatusInternalServerError, err 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 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 { if err == os.ErrPermission {
return http.StatusForbidden, nil return http.StatusForbidden, nil
} else if err != nil { } else if err != nil {

View File

@ -13,7 +13,7 @@ var withHashFile = func(fn handleFunc) handleFunc {
return errToStatus(err), err 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 { if err != nil {
return errToStatus(err), err return errToStatus(err), err
} }

View File

@ -61,7 +61,7 @@ func withSelfOrAdmin(fn handleFunc) handleFunc {
} }
var usersGetHandler = withAdmin(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { 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 { if err != nil {
return http.StatusInternalServerError, err 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) { 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 { if err == errors.ErrNotExist {
return http.StatusNotFound, err 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) req.Data.Password, err = users.HashPwd(req.Data.Password)
} else { } else {
var suser *users.User 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 req.Data.Password = suser.Password
} }

View File

@ -9,7 +9,7 @@ type AuthMethod string
type Settings struct { type Settings struct {
Key []byte `json:"key"` Key []byte `json:"key"`
BaseURL string `json:"baseURL"` BaseURL string `json:"baseURL"`
Scope string `json:"scope"` Root string `json:"root"`
Signup bool `json:"signup"` Signup bool `json:"signup"`
Defaults UserDefaults `json:"defaults"` Defaults UserDefaults `json:"defaults"`
AuthMethod AuthMethod `json:"authMethod"` AuthMethod AuthMethod `json:"authMethod"`