Skip to content

Commit 25d57fc

Browse files
committed
Update until v2.53.1
1 parent 793233d commit 25d57fc

96 files changed

Lines changed: 2786 additions & 865 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
## Multistage build: First stage fetches dependencies
2-
FROM alpine:3.22 AS fetcher
2+
FROM alpine:3.23 AS fetcher
33

44
# install and copy ca-certificates, mailcap, and tini-static; download JSON.sh
55
RUN apk update && \

Dockerfile.s6

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM ghcr.io/linuxserver/baseimage-alpine:3.22
1+
FROM ghcr.io/linuxserver/baseimage-alpine:3.23
22

33
RUN apk update && \
44
apk --no-cache add ca-certificates mailcap jq libcap

auth/hook.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"slices"
1212
"strings"
1313

14-
fbErrors "github.com/thevickypedia/filebrowser/v2/errors"
14+
fberrors "github.com/thevickypedia/filebrowser/v2/errors"
1515
"github.com/thevickypedia/filebrowser/v2/files"
1616
"github.com/thevickypedia/filebrowser/v2/settings"
1717
"github.com/thevickypedia/filebrowser/v2/users"
@@ -146,7 +146,7 @@ func (a *HookAuth) GetValues(s string) {
146146
// SaveUser updates the existing user or creates a new one when not found
147147
func (a *HookAuth) SaveUser() (*users.User, error) {
148148
u, err := a.Users.Get(a.Server.Root, a.Cred.Username)
149-
if err != nil && !errors.Is(err, fbErrors.ErrNotExist) {
149+
if err != nil && !errors.Is(err, fberrors.ErrNotExist) {
150150
return nil, err
151151
}
152152

auth/proxy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"errors"
55
"net/http"
66

7-
fbErrors "github.com/thevickypedia/filebrowser/v2/errors"
7+
fberrors "github.com/thevickypedia/filebrowser/v2/errors"
88
"github.com/thevickypedia/filebrowser/v2/settings"
99
"github.com/thevickypedia/filebrowser/v2/users"
1010
)
@@ -21,7 +21,7 @@ type ProxyAuth struct {
2121
func (a ProxyAuth) Auth(r *http.Request, usr users.Store, setting *settings.Settings, srv *settings.Server) (*users.User, error) {
2222
username := r.Header.Get(a.Header)
2323
user, err := usr.Get(srv.Root, username)
24-
if errors.Is(err, fbErrors.ErrNotExist) {
24+
if errors.Is(err, fberrors.ErrNotExist) {
2525
return a.createUser(usr, setting, srv, username)
2626
}
2727
return user, err

cmd/config.go

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package cmd
22

33
import (
44
"encoding/json"
5-
nerrors "errors"
5+
"errors"
66
"fmt"
77
"os"
88
"strings"
@@ -12,7 +12,7 @@ import (
1212
"github.com/spf13/pflag"
1313

1414
"github.com/thevickypedia/filebrowser/v2/auth"
15-
"github.com/thevickypedia/filebrowser/v2/errors"
15+
fberrors "github.com/thevickypedia/filebrowser/v2/errors"
1616
"github.com/thevickypedia/filebrowser/v2/settings"
1717
)
1818

@@ -30,17 +30,22 @@ var configCmd = &cobra.Command{
3030
func addConfigFlags(flags *pflag.FlagSet) {
3131
addServerFlags(flags)
3232
addUserFlags(flags)
33+
3334
flags.BoolP("signup", "s", false, "allow users to signup")
3435
flags.Bool("hideLoginButton", false, "hide login button from public pages")
3536
flags.Bool("createUserDir", false, "generate user's home directory automatically")
3637
flags.Uint("minimumPasswordLength", settings.DefaultMinimumPasswordLength, "minimum password length for new users")
3738
flags.String("shell", "", "shell command to which other commands should be appended")
3839

40+
// NB: these are string so they can be presented as octal in the help text
41+
// as that's the conventional representation for modes in Unix.
42+
flags.String("fileMode", fmt.Sprintf("%O", settings.DefaultFileMode), "mode bits that new files are created with")
43+
flags.String("dirMode", fmt.Sprintf("%O", settings.DefaultDirMode), "mode bits that new directories are created with")
44+
3945
flags.String("auth.method", string(auth.MethodJSONAuth), "authentication type")
4046
flags.String("auth.header", "", "HTTP header for auth.method=proxy")
4147
flags.String("auth.command", "", "command for auth.method=hook")
42-
43-
flags.String("authenticatorToken", "", "OTP shared secret (leave blank to disable)")
48+
flags.String("auth.logoutPage", "", "url of custom logout page")
4449

4550
flags.String("recaptcha.host", "https://www.google.com", "use another host for ReCAPTCHA. recaptcha.net might be useful in China")
4651
flags.String("recaptcha.key", "", "ReCaptcha site key")
@@ -52,10 +57,6 @@ func addConfigFlags(flags *pflag.FlagSet) {
5257
flags.String("branding.files", "", "path to directory with images and custom styles")
5358
flags.Bool("branding.disableExternal", false, "disable external links such as GitHub links")
5459
flags.Bool("branding.disableUsedPercentage", false, "disable used disk percentage graph")
55-
// NB: these are string so they can be presented as octal in the help text
56-
// as that's the conventional representation for modes in Unix.
57-
flags.String("fileMode", fmt.Sprintf("%O", settings.DefaultFileMode), "mode bits that new files are created with")
58-
flags.String("dirMode", fmt.Sprintf("%O", settings.DefaultDirMode), "mode bits that new directories are created with")
5960

6061
flags.Uint64("tus.chunkSize", settings.DefaultTusChunkSize, "the tus chunk size")
6162
flags.Uint16("tus.retryCount", settings.DefaultTusRetryCount, "the tus retry count")
@@ -98,12 +99,12 @@ func getProxyAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (a
9899
return nil, err
99100
}
100101

101-
if header == "" {
102+
if header == "" && defaultAuther != nil {
102103
header = defaultAuther["header"].(string)
103104
}
104105

105106
if header == "" {
106-
return nil, nerrors.New("you must set the flag 'auth.header' for method 'proxy'")
107+
return nil, errors.New("you must set the flag 'auth.header' for method 'proxy'")
107108
}
108109

109110
return &auth.ProxyAuth{Header: header}, nil
@@ -115,27 +116,16 @@ func getNoAuth() auth.Auther {
115116

116117
func getJSONAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) {
117118
jsonAuth := &auth.JSONAuth{}
118-
authenticationToken, err := flags.GetString("authenticatorToken")
119-
if err != nil {
120-
return nil, err
121-
}
122-
123-
if authenticationToken == "" {
124-
if atok, ok := defaultAuther["authenticatorToken"].(string); ok {
125-
authenticationToken = atok
126-
}
127-
}
128-
129-
jsonAuth.AuthenticatorToken = authenticationToken
130-
131119
host, err := flags.GetString("recaptcha.host")
132120
if err != nil {
133121
return nil, err
134122
}
123+
135124
key, err := flags.GetString("recaptcha.key")
136125
if err != nil {
137126
return nil, err
138127
}
128+
139129
secret, err := flags.GetString("recaptcha.secret")
140130
if err != nil {
141131
return nil, err
@@ -173,7 +163,7 @@ func getHookAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (au
173163
}
174164

175165
if command == "" {
176-
return nil, nerrors.New("you must set the flag 'auth.command' for method 'hook'")
166+
return nil, errors.New("you must set the flag 'auth.command' for method 'hook'")
177167
}
178168

179169
return &auth.HookAuth{Command: command}, nil
@@ -196,7 +186,7 @@ func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings.
196186
case auth.MethodHookAuth:
197187
auther, err = getHookAuth(flags, defaultAuther)
198188
default:
199-
return "", nil, errors.ErrInvalidAuthMethod
189+
return "", nil, fberrors.ErrInvalidAuthMethod
200190
}
201191

202192
if err != nil {
@@ -212,6 +202,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
212202
fmt.Fprintf(w, "Sign up:\t%t\n", set.Signup)
213203
fmt.Fprintf(w, "Hide Login Button:\t%t\n", set.HideLoginButton)
214204
fmt.Fprintf(w, "Create User Dir:\t%t\n", set.CreateUserDir)
205+
fmt.Fprintf(w, "Logout Page:\t%s\n", set.LogoutPage)
215206
fmt.Fprintf(w, "Minimum Password Length:\t%d\n", set.MinimumPasswordLength)
216207
fmt.Fprintf(w, "Auth Method:\t%s\n", set.AuthMethod)
217208
fmt.Fprintf(w, "Shell:\t%s\t\n", strings.Join(set.Shell, " "))
@@ -253,9 +244,11 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
253244
fmt.Fprintf(w, "\tDirectory Creation Mode:\t%O\n", set.DirMode)
254245
fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " "))
255246
fmt.Fprintf(w, "\tAce editor syntax highlighting theme:\t%s\n", set.Defaults.AceEditorTheme)
247+
256248
fmt.Fprintf(w, "\tSorting:\n")
257249
fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By)
258250
fmt.Fprintf(w, "\t\tAsc:\t%t\n", set.Defaults.Sorting.Asc)
251+
259252
fmt.Fprintf(w, "\tPermissions:\n")
260253
fmt.Fprintf(w, "\t\tAdmin:\t%t\n", set.Defaults.Perm.Admin)
261254
fmt.Fprintf(w, "\t\tExecute:\t%t\n", set.Defaults.Perm.Execute)
@@ -265,6 +258,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
265258
fmt.Fprintf(w, "\t\tDelete:\t%t\n", set.Defaults.Perm.Delete)
266259
fmt.Fprintf(w, "\t\tShare:\t%t\n", set.Defaults.Perm.Share)
267260
fmt.Fprintf(w, "\t\tDownload:\t%t\n", set.Defaults.Perm.Download)
261+
268262
w.Flush()
269263

270264
b, err := json.MarshalIndent(auther, "", " ")
@@ -314,6 +308,9 @@ func getSettings(flags *pflag.FlagSet, set *settings.Settings, ser *settings.Ser
314308
case "disableTypeDetectionByHeader":
315309
ser.TypeDetectionByHeader, err = flags.GetBool(flag.Name)
316310
ser.TypeDetectionByHeader = !ser.TypeDetectionByHeader
311+
case "disableImageResolutionCalc":
312+
ser.ImageResolutionCal, err = flags.GetBool(flag.Name)
313+
ser.ImageResolutionCal = !ser.ImageResolutionCal
317314

318315
// Settings flags from [addConfigFlags]
319316
case "signup":
@@ -336,6 +333,8 @@ func getSettings(flags *pflag.FlagSet, set *settings.Settings, ser *settings.Ser
336333
set.DirMode, err = getAndParseFileMode(flags, flag.Name)
337334
case "auth.method":
338335
hasAuth = true
336+
case "auth.logoutPage":
337+
set.LogoutPage, err = flags.GetString(flag.Name)
339338
case "branding.name":
340339
set.Branding.Name, err = flags.GetString(flag.Name)
341340
case "branding.theme":
@@ -365,7 +364,7 @@ func getSettings(flags *pflag.FlagSet, set *settings.Settings, ser *settings.Ser
365364
flags.Visit(visit)
366365
}
367366

368-
err := nerrors.Join(errs...)
367+
err := errors.Join(errs...)
369368
if err != nil {
370369
return nil, err
371370
}

cmd/config_import.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ The path must be for a json or yaml file.`,
5353
return err
5454
}
5555

56+
if file.Settings == nil || file.Server == nil {
57+
return errors.New("invalid configuration file: 'settings' or 'server' fields are missing. Please ensure you are importing a file generated by the 'config export' command")
58+
}
59+
5660
file.Settings.Key = key
5761
err = st.Settings.Save(file.Settings)
5862
if err != nil {

cmd/root.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ func addServerFlags(flags *pflag.FlagSet) {
108108
flags.Bool("disablePreviewResize", false, "disable resize of image previews")
109109
flags.Bool("disableExec", true, "disables Command Runner feature")
110110
flags.Bool("disableTypeDetectionByHeader", false, "disables type detection by reading file headers")
111+
flags.Bool("disableImageResolutionCalc", false, "disables image resolution calculation by reading image files")
111112
}
112113

113114
var rootCmd = &cobra.Command{
@@ -135,6 +136,11 @@ file named .filebrowser.{json, toml, yaml, yml} in the following directories:
135136
- $HOME/
136137
- /etc/filebrowser/
137138
139+
**Note:** Only the options listed below can be set via the config file or
140+
environment variables. Other configuration options live exclusively in the
141+
database and so they must be set by the "config set" or "config
142+
import" commands.
143+
138144
The precedence of the configuration values are as follows:
139145
140146
- Flags
@@ -229,22 +235,13 @@ user created with the credentials from options "username" and "password".`,
229235
defer listener.Close()
230236

231237
log.Println("Listening on", listener.Addr().String())
232-
refreshAllowedOrigins(server)
233-
refreshCondition := server.RefreshAllowedOrigins != 0 && (server.AllowPrivateIP || server.AllowPublicIP)
234-
var done chan bool
235-
if refreshCondition {
236-
done = startBackgroundTask(server)
237-
}
238238
srv := &http.Server{
239239
Handler: handler,
240240
ReadHeaderTimeout: 60 * time.Second,
241241
}
242242

243243
go func() {
244244
if err := srv.Serve(listener); !errors.Is(err, http.ErrServerClosed) {
245-
if refreshCondition {
246-
done <- true
247-
}
248245
log.Fatalf("HTTP server error: %v", err)
249246
}
250247

@@ -340,6 +337,10 @@ func getServerSettings(v *viper.Viper, st *storage.Storage) (*settings.Server, e
340337
server.TypeDetectionByHeader = !v.GetBool("disableTypeDetectionByHeader")
341338
}
342339

340+
if v.IsSet("disableImageResolutionCalc") {
341+
server.ImageResolutionCal = !v.GetBool("disableImageResolutionCalc")
342+
}
343+
343344
if v.IsSet("disableExec") {
344345
server.EnableExec = !v.GetBool("disableExec")
345346
}
@@ -448,6 +449,7 @@ func quickSetup(v *viper.Viper, s *storage.Storage) error {
448449
ResizePreview: !v.GetBool("disablePreviewResize"),
449450
EnableExec: !v.GetBool("disableExec"),
450451
TypeDetectionByHeader: !v.GetBool("disableTypeDetectionByHeader"),
452+
ImageResolutionCal: !v.GetBool("disableImageResolutionCalc"),
451453
}
452454

453455
err = s.Settings.SaveServer(ser)

errors/errors.go

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
1-
package errors
1+
package fberrors
22

33
import (
44
"errors"
55
"fmt"
66
)
77

88
var (
9-
ErrEmptyKey = errors.New("empty key")
10-
ErrExist = errors.New("the resource already exists")
11-
ErrNotExist = errors.New("the resource does not exist")
12-
ErrEmptyPassword = errors.New("password is empty")
13-
ErrEasyPassword = errors.New("password is too easy")
14-
ErrEmptyUsername = errors.New("username is empty")
15-
ErrEmptyRequest = errors.New("empty request")
16-
ErrScopeIsRelative = errors.New("scope is a relative path")
17-
ErrInvalidDataType = errors.New("invalid data type")
18-
ErrIsDirectory = errors.New("file is directory")
19-
ErrInvalidOption = errors.New("invalid option")
20-
ErrInvalidAuthMethod = errors.New("invalid auth method")
21-
ErrPermissionDenied = errors.New("permission denied")
22-
ErrInvalidRequestParams = errors.New("invalid request params")
23-
ErrSourceIsParent = errors.New("source is parent")
24-
ErrRootUserDeletion = errors.New("user with id 1 can't be deleted")
9+
ErrEmptyKey = errors.New("empty key")
10+
ErrExist = errors.New("the resource already exists")
11+
ErrNotExist = errors.New("the resource does not exist")
12+
ErrEmptyPassword = errors.New("password is empty")
13+
ErrEasyPassword = errors.New("password is too easy")
14+
ErrEmptyUsername = errors.New("username is empty")
15+
ErrEmptyRequest = errors.New("empty request")
16+
ErrScopeIsRelative = errors.New("scope is a relative path")
17+
ErrInvalidDataType = errors.New("invalid data type")
18+
ErrIsDirectory = errors.New("file is directory")
19+
ErrInvalidOption = errors.New("invalid option")
20+
ErrInvalidAuthMethod = errors.New("invalid auth method")
21+
ErrPermissionDenied = errors.New("permission denied")
22+
ErrInvalidRequestParams = errors.New("invalid request params")
23+
ErrSourceIsParent = errors.New("source is parent")
24+
ErrRootUserDeletion = errors.New("user with id 1 can't be deleted")
25+
ErrCurrentPasswordIncorrect = errors.New("the current password is incorrect")
2526
)
2627

2728
type ErrShortPassword struct {

0 commit comments

Comments
 (0)