Compare commits
10 Commits
v2.0.0-rc.
...
v2.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e706391934 | ||
|
|
58ff28f84d | ||
|
|
74a1ecbb89 | ||
|
|
5fa1711a30 | ||
|
|
4bc6a23143 | ||
|
|
b578e2196a | ||
|
|
866375141f | ||
|
|
a3b9807717 | ||
|
|
d47774c828 | ||
|
|
bc4ac5eb9b |
@@ -40,7 +40,7 @@ The path must be for a json or yaml file.`,
|
||||
checkErr(err)
|
||||
key = settings.Key
|
||||
} else {
|
||||
key = generateRandomBytes(64)
|
||||
key = generateKey()
|
||||
}
|
||||
|
||||
file := settingsFile{}
|
||||
|
||||
@@ -29,7 +29,7 @@ override the options.`,
|
||||
authMethod, auther := getAuthentication(flags)
|
||||
|
||||
s := &settings.Settings{
|
||||
Key: generateRandomBytes(64), // 256 bit
|
||||
Key: generateKey(),
|
||||
Signup: mustGetBool(flags, "signup"),
|
||||
Shell: strings.Split(strings.TrimSpace(mustGetString(flags, "shell")), " "),
|
||||
AuthMethod: authMethod,
|
||||
|
||||
@@ -215,7 +215,7 @@ func setupLog(logMethod string) {
|
||||
|
||||
func quickSetup(flags *pflag.FlagSet, d pythonData) {
|
||||
set := &settings.Settings{
|
||||
Key: generateRandomBytes(64), // 256 bit
|
||||
Key: generateKey(),
|
||||
Signup: false,
|
||||
Defaults: settings.UserDefaults{
|
||||
Scope: ".",
|
||||
|
||||
44
cmd/utils.go
44
cmd/utils.go
@@ -1,7 +1,6 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
@@ -10,6 +9,7 @@ import (
|
||||
"path/filepath"
|
||||
|
||||
"github.com/asdine/storm"
|
||||
"github.com/filebrowser/filebrowser/v2/settings"
|
||||
"github.com/filebrowser/filebrowser/v2/storage"
|
||||
"github.com/filebrowser/filebrowser/v2/storage/bolt"
|
||||
"github.com/spf13/cobra"
|
||||
@@ -41,12 +41,10 @@ func mustGetUint(flags *pflag.FlagSet, flag string) uint {
|
||||
return b
|
||||
}
|
||||
|
||||
func generateRandomBytes(n int) []byte {
|
||||
b := make([]byte, n)
|
||||
_, err := rand.Read(b)
|
||||
func generateKey() []byte {
|
||||
k, err := settings.GenerateKey()
|
||||
checkErr(err)
|
||||
// Note that err == nil only if we read len(b) bytes.
|
||||
return b
|
||||
return k
|
||||
}
|
||||
|
||||
type cobraFunc func(cmd *cobra.Command, args []string)
|
||||
@@ -62,29 +60,43 @@ type pythonData struct {
|
||||
store *storage.Storage
|
||||
}
|
||||
|
||||
func dbExists(path string) (bool, error) {
|
||||
stat, err := os.Stat(path)
|
||||
|
||||
if os.IsNotExist(err) {
|
||||
return false, nil
|
||||
} else if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if stat.Size() == 0 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func python(fn pythonFunc, cfg pythonConfig) cobraFunc {
|
||||
return func(cmd *cobra.Command, args []string) {
|
||||
data := pythonData{hadDB: true}
|
||||
|
||||
path := getParam(cmd.Flags(), "database")
|
||||
_, err := os.Stat(path)
|
||||
exists, err := dbExists(path)
|
||||
|
||||
if os.IsNotExist(err) {
|
||||
data.hadDB = false
|
||||
|
||||
if !cfg.noDB && !cfg.allowNoDB {
|
||||
log.Fatal(path + " does not exist. Please run 'filebrowser config init' first.")
|
||||
}
|
||||
} else if err != nil {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
} else if err == nil && cfg.noDB {
|
||||
} else if exists && cfg.noDB {
|
||||
log.Fatal(path + " already exists")
|
||||
} else if !exists && !cfg.noDB && !cfg.allowNoDB {
|
||||
log.Fatal(path + " does not exist. Please run 'filebrowser config init' first.")
|
||||
}
|
||||
|
||||
data.hadDB = exists
|
||||
db, err := storm.Open(path)
|
||||
checkErr(err)
|
||||
defer db.Close()
|
||||
data.store = bolt.NewStorage(db)
|
||||
data.store, err = bolt.NewStorage(db)
|
||||
checkErr(err)
|
||||
fn(cmd, args, data)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,9 +64,5 @@ func handle(fn handleFunc, prefix string, storage *storage.Storage, server *sett
|
||||
}
|
||||
})
|
||||
|
||||
if prefix == "" {
|
||||
return handler
|
||||
}
|
||||
|
||||
return http.StripPrefix(prefix, handler)
|
||||
}
|
||||
|
||||
@@ -14,8 +14,9 @@ type modifyRequest struct {
|
||||
}
|
||||
|
||||
func NewHandler(storage *storage.Storage, server *settings.Server) (http.Handler, error) {
|
||||
r := mux.NewRouter()
|
||||
server.Clean()
|
||||
|
||||
r := mux.NewRouter()
|
||||
index, static := getStaticHandlers(storage, server)
|
||||
|
||||
monkey := func(fn handleFunc, prefix string) http.Handler {
|
||||
@@ -59,5 +60,5 @@ func NewHandler(storage *storage.Storage, server *settings.Server) (http.Handler
|
||||
public.PathPrefix("/dl").Handler(monkey(publicDlHandler, "/api/public/dl/")).Methods("GET")
|
||||
public.PathPrefix("/share").Handler(monkey(publicShareHandler, "/api/public/share/")).Methods("GET")
|
||||
|
||||
return r, nil
|
||||
return http.StripPrefix(server.BaseURL, r), nil
|
||||
}
|
||||
|
||||
@@ -18,16 +18,23 @@ type searchOptions struct {
|
||||
func Search(fs afero.Fs, scope, query string, checker rules.Checker, found func(path string, f os.FileInfo) error) error {
|
||||
search := parseSearch(query)
|
||||
|
||||
return afero.Walk(fs, scope, func(path string, f os.FileInfo, err error) error {
|
||||
path = strings.TrimPrefix(path, "/")
|
||||
path = strings.Replace(path, "\\", "/", -1)
|
||||
scope = strings.Replace(scope, "\\", "/", -1)
|
||||
scope = strings.TrimPrefix(scope, "/")
|
||||
scope = strings.TrimSuffix(scope, "/")
|
||||
scope = "/" + scope + "/"
|
||||
|
||||
if !checker.Check(path) {
|
||||
return afero.Walk(fs, scope, func(originalPath string, f os.FileInfo, err error) error {
|
||||
originalPath = strings.Replace(originalPath, "\\", "/", -1)
|
||||
originalPath = strings.TrimPrefix(originalPath, "/")
|
||||
originalPath = "/" + originalPath
|
||||
path := originalPath
|
||||
|
||||
if path == scope {
|
||||
return nil
|
||||
}
|
||||
|
||||
if !search.CaseSensitive {
|
||||
path = strings.ToLower(path)
|
||||
if !checker.Check(path) {
|
||||
return nil
|
||||
}
|
||||
|
||||
if !search.CaseSensitive {
|
||||
@@ -52,7 +59,7 @@ func Search(fs afero.Fs, scope, query string, checker rules.Checker, found func(
|
||||
if len(search.Terms) > 0 {
|
||||
for _, term := range search.Terms {
|
||||
if strings.Contains(path, term) {
|
||||
return found(strings.TrimPrefix(path, scope), f)
|
||||
return found(strings.TrimPrefix(originalPath, scope), f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
package settings
|
||||
|
||||
import "github.com/filebrowser/filebrowser/v2/rules"
|
||||
import (
|
||||
"crypto/rand"
|
||||
"strings"
|
||||
|
||||
"github.com/filebrowser/filebrowser/v2/rules"
|
||||
)
|
||||
|
||||
// AuthMethod describes an authentication method.
|
||||
type AuthMethod string
|
||||
@@ -17,6 +22,11 @@ type Settings struct {
|
||||
Rules []rules.Rule `json:"rules"`
|
||||
}
|
||||
|
||||
// GetRules implements rules.Provider.
|
||||
func (s *Settings) GetRules() []rules.Rule {
|
||||
return s.Rules
|
||||
}
|
||||
|
||||
// Server specific settings.
|
||||
type Server struct {
|
||||
Root string `json:"root"`
|
||||
@@ -28,7 +38,19 @@ type Server struct {
|
||||
Log string `json:"log"`
|
||||
}
|
||||
|
||||
// GetRules implements rules.Provider.
|
||||
func (s *Settings) GetRules() []rules.Rule {
|
||||
return s.Rules
|
||||
// Clean cleans any variables that might need cleaning.
|
||||
func (s *Server) Clean() {
|
||||
s.BaseURL = strings.TrimSuffix(s.BaseURL, "/")
|
||||
}
|
||||
|
||||
// GenerateKey generates a key of 256 bits.
|
||||
func GenerateKey() ([]byte, error) {
|
||||
b := make([]byte, 64)
|
||||
_, err := rand.Read(b)
|
||||
// Note that err == nil only if we read len(b) bytes.
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return b, nil
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package settings
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/filebrowser/filebrowser/v2/errors"
|
||||
"github.com/filebrowser/filebrowser/v2/rules"
|
||||
"github.com/filebrowser/filebrowser/v2/users"
|
||||
@@ -94,6 +92,6 @@ func (s *Storage) GetServer() (*Server, error) {
|
||||
|
||||
// SaveServer wraps StorageBackend.SaveServer and adds some verification.
|
||||
func (s *Storage) SaveServer(ser *Server) error {
|
||||
ser.BaseURL = strings.TrimSuffix(ser.BaseURL, "/")
|
||||
ser.Clean()
|
||||
return s.back.SaveServer(ser)
|
||||
}
|
||||
|
||||
@@ -10,16 +10,21 @@ import (
|
||||
)
|
||||
|
||||
// NewStorage creates a storage.Storage based on Bolt DB.
|
||||
func NewStorage(db *storm.DB) *storage.Storage {
|
||||
func NewStorage(db *storm.DB) (*storage.Storage, error) {
|
||||
users := users.NewStorage(usersBackend{db: db})
|
||||
share := share.NewStorage(shareBackend{db: db})
|
||||
settings := settings.NewStorage(settingsBackend{db: db})
|
||||
auth := auth.NewStorage(authBackend{db: db}, users)
|
||||
|
||||
err := save(db, "version", 2)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &storage.Storage{
|
||||
Auth: auth,
|
||||
Users: users,
|
||||
Share: share,
|
||||
Settings: settings,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -99,7 +99,6 @@ func readConf(path string) (*oldConf, error) {
|
||||
}
|
||||
|
||||
func importConf(db *storm.DB, path string, sto *storage.Storage) error {
|
||||
|
||||
cfg, err := readConf(path)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -19,7 +19,10 @@ func Import(oldDB, oldConf, newDB string) error {
|
||||
}
|
||||
defer new.Close()
|
||||
|
||||
sto := bolt.NewStorage(new)
|
||||
sto, err := bolt.NewStorage(new)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = importUsers(old, sto)
|
||||
if err != nil {
|
||||
|
||||
@@ -2,5 +2,5 @@ package version
|
||||
|
||||
const (
|
||||
// Version is the current File Browser version.
|
||||
Version = "v2.0.0-rc.1"
|
||||
Version = "v2.0.0"
|
||||
)
|
||||
|
||||
@@ -132,7 +132,7 @@ pushRicebox () {
|
||||
git clone git@github.com:filebrowser/caddy caddy
|
||||
cd caddy
|
||||
cp ../http/rice-box.go ./
|
||||
sed -i 's/package lib/package caddy/g' ./rice-box.go
|
||||
sed -i 's/package http/package caddy/g' ./rice-box.go
|
||||
git checkout -b update-rice-box origin/master
|
||||
git config --local user.name "Filebrowser Bot"
|
||||
git config --local user.email "FilebrowserBot@users.noreply.github.com"
|
||||
|
||||
Reference in New Issue
Block a user