Fix perms (#39)

This commit is contained in:
Graham Steffaniak 2023-09-30 12:50:20 -05:00 committed by GitHub
parent 65159848c2
commit 8261511881
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 59 additions and 79 deletions

View File

@ -12,13 +12,11 @@ RUN go get -u golang.org/x/net
RUN go build -ldflags="-w -s" -o filebrowser . RUN go build -ldflags="-w -s" -o filebrowser .
FROM alpine:latest FROM alpine:latest
ARG app="/app/filebrowser"
RUN apk --no-cache add \ RUN apk --no-cache add \
ca-certificates \ ca-certificates \
mailcap mailcap
VOLUME /srv WORKDIR /app
EXPOSE 8080 COPY --from=base $app* ./
WORKDIR / COPY --from=nbuild /app/dist/ ./frontend/dist/
COPY --from=base /app/filebrowser.yaml /filebrowser.yaml
COPY --from=base /app/filebrowser /filebrowser
COPY --from=nbuild /app/dist/ /frontend/dist/
ENTRYPOINT [ "./filebrowser" ] ENTRYPOINT [ "./filebrowser" ]

View File

@ -201,31 +201,31 @@ func (a *HookAuth) SaveUser() (*users.User, error) {
// GetUser returns a User filled with hook values or provided defaults // GetUser returns a User filled with hook values or provided defaults
func (a *HookAuth) GetUser(d *users.User) *users.User { func (a *HookAuth) GetUser(d *users.User) *users.User {
// adds all permissions when user is admin // adds all permissions when user is admin
isAdmin := a.Fields.GetBoolean("user.perm.admin", d.Perm.Admin) isAdmin := d.Perm.Admin
perms := users.Permissions{ perms := users.Permissions{
Admin: isAdmin, Admin: isAdmin,
Execute: isAdmin || a.Fields.GetBoolean("user.perm.execute", d.Perm.Execute), Execute: isAdmin || d.Perm.Execute,
Create: isAdmin || a.Fields.GetBoolean("user.perm.create", d.Perm.Create), Create: isAdmin || d.Perm.Create,
Rename: isAdmin || a.Fields.GetBoolean("user.perm.rename", d.Perm.Rename), Rename: isAdmin || d.Perm.Rename,
Modify: isAdmin || a.Fields.GetBoolean("user.perm.modify", d.Perm.Modify), Modify: isAdmin || d.Perm.Modify,
Delete: isAdmin || a.Fields.GetBoolean("user.perm.delete", d.Perm.Delete), Delete: isAdmin || d.Perm.Delete,
Share: isAdmin || a.Fields.GetBoolean("user.perm.share", d.Perm.Share), Share: isAdmin || d.Perm.Share,
Download: isAdmin || a.Fields.GetBoolean("user.perm.download", d.Perm.Download), Download: isAdmin || d.Perm.Download,
} }
user := users.User{ user := users.User{
ID: d.ID, ID: d.ID,
Username: d.Username, Username: d.Username,
Password: d.Password, Password: d.Password,
Scope: a.Fields.GetString("user.scope", d.Scope), Scope: d.Scope,
Locale: a.Fields.GetString("user.locale", d.Locale), Locale: d.Locale,
ViewMode: d.ViewMode, ViewMode: d.ViewMode,
SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick), SingleClick: d.SingleClick,
Sorting: files.Sorting{ Sorting: files.Sorting{
Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc), Asc: d.Sorting.Asc,
By: a.Fields.GetString("user.sorting.by", d.Sorting.By), By: d.Sorting.By,
}, },
Commands: a.Fields.GetArray("user.commands", d.Commands), Commands: d.Commands,
HideDotfiles: a.Fields.GetBoolean("user.hideDotfiles", d.HideDotfiles), HideDotfiles: d.HideDotfiles,
Perm: perms, Perm: perms,
LockPassword: true, LockPassword: true,
} }

View File

@ -3,7 +3,6 @@ package cmd
import ( import (
"crypto/tls" "crypto/tls"
"flag" "flag"
"io"
"io/fs" "io/fs"
"log" "log"
"net" "net"
@ -17,7 +16,6 @@ import (
"github.com/spf13/afero" "github.com/spf13/afero"
"github.com/spf13/cobra" "github.com/spf13/cobra"
lumberjack "gopkg.in/natefinch/lumberjack.v2"
"github.com/gtsteffaniak/filebrowser/auth" "github.com/gtsteffaniak/filebrowser/auth"
"github.com/gtsteffaniak/filebrowser/diskcache" "github.com/gtsteffaniak/filebrowser/diskcache"
@ -56,7 +54,6 @@ var rootCmd = &cobra.Command{
if serverConfig.NumImageProcessors < 1 { if serverConfig.NumImageProcessors < 1 {
log.Fatal("Image resize workers count could not be < 1") log.Fatal("Image resize workers count could not be < 1")
} }
setupLog(serverConfig.Log)
imgSvc := img.New(serverConfig.NumImageProcessors) imgSvc := img.New(serverConfig.NumImageProcessors)
var fileCache diskcache.Interface = diskcache.NewNoOp() var fileCache diskcache.Interface = diskcache.NewNoOp()
cacheDir := "/tmp" cacheDir := "/tmp"
@ -67,7 +64,7 @@ var rootCmd = &cobra.Command{
fileCache = diskcache.New(afero.NewOsFs(), cacheDir) fileCache = diskcache.New(afero.NewOsFs(), cacheDir)
} }
// initialize indexing and schedule indexing ever n minutes (default 5) // initialize indexing and schedule indexing ever n minutes (default 5)
index.Initialize(serverConfig.IndexingInterval) go index.Initialize(serverConfig.IndexingInterval)
_, err := os.Stat(serverConfig.Root) _, err := os.Stat(serverConfig.Root)
checkErr(err) checkErr(err)
var listener net.Listener var listener net.Listener
@ -120,24 +117,6 @@ func cleanupHandler(listener net.Listener, c chan os.Signal) { //nolint:interfac
os.Exit(0) os.Exit(0)
} }
func setupLog(logMethod string) {
switch logMethod {
case "stdout":
log.SetOutput(os.Stdout)
case "stderr":
log.SetOutput(os.Stderr)
case "":
log.SetOutput(io.Discard)
default:
log.SetOutput(&lumberjack.Logger{
Filename: logMethod,
MaxSize: 100,
MaxAge: 14,
MaxBackups: 10,
})
}
}
func quickSetup(d pythonData) { func quickSetup(d pythonData) {
settings.GlobalConfiguration.Key = generateKey() settings.GlobalConfiguration.Key = generateKey()
if settings.GlobalConfiguration.Auth.Method == "noauth" { if settings.GlobalConfiguration.Auth.Method == "noauth" {
@ -162,6 +141,7 @@ func quickSetup(d pythonData) {
Password: password, Password: password,
LockPassword: false, LockPassword: false,
} }
settings.GlobalConfiguration.UserDefaults.Apply(user)
user.Perm.Admin = true user.Perm.Admin = true
err = d.store.Users.Save(user) err = d.store.Users.Save(user)
checkErr(err) checkErr(err)

View File

@ -5,21 +5,7 @@ server:
auth: auth:
method: noauth method: noauth
signup: true signup: true
frontend: userDefaults:
theme: dark
Users:
admin:
rules:
- regex: false
allow: true
path: test
regexp:
raw: ''
- regex: true
allow: true
path: ''
regexp:
raw: test
scope: "." scope: "."
hideDotfiles: true hideDotfiles: true
singleClick: false singleClick: false
@ -31,3 +17,5 @@ Users:
delete: true delete: true
share: true share: true
download: true download: true
frontend:
theme: dark

View File

@ -80,3 +80,16 @@ func setDefaults() Settings {
}, },
} }
} }
// Apply applies the default options to a user.
func (d *UserDefaults) Apply(u *users.User) {
u.Scope = d.Scope
u.Locale = d.Locale
u.ViewMode = d.ViewMode
u.SingleClick = d.SingleClick
u.Perm = d.Perm
u.Sorting = d.Sorting
u.Commands = d.Commands
u.HideDotfiles = d.HideDotfiles
u.DateFormat = d.DateFormat
}

View File

@ -11,5 +11,6 @@ plugins:
- vue - vue
rules: rules:
vue/multi-word-component-names: off vue/multi-word-component-names: off
vue/no-reserved-component-names: "warn" vue/no-reserved-component-names: warn
vue/no-mutating-props: off vue/no-mutating-props: off
vue/no-deprecated-v-bind-sync: warn

View File

@ -42,7 +42,7 @@
<languages <languages
class="input input--block" class="input input--block"
id="locale" id="locale"
v-model:locale="user.locale" :locale.sync="user.locale"
></languages> ></languages>
</p> </p>
@ -55,13 +55,13 @@
{{ $t("settings.lockPassword") }} {{ $t("settings.lockPassword") }}
</p> </p>
<permissions v-model:perm="user.perm" /> <permissions :perm.sync="user.perm" />
<commands v-if="isExecEnabled" v-model:commands="user.commands" /> <commands v-if="isExecEnabled" :commands.sync="user.commands" />
<div v-if="!isDefault"> <div v-if="!isDefault">
<h3>{{ $t("settings.rules") }}</h3> <h3>{{ $t("settings.rules") }}</h3>
<p class="small">{{ $t("settings.rulesHelp") }}</p> <p class="small">{{ $t("settings.rulesHelp") }}</p>
<rules v-model:rules="user.rules" /> <rules :rules.sync="user.rules" />
</div> </div>
</div> </div>
</template> </template>

View File

@ -29,7 +29,7 @@
<h3>{{ $t("settings.rules") }}</h3> <h3>{{ $t("settings.rules") }}</h3>
<p class="small">{{ $t("settings.globalRules") }}</p> <p class="small">{{ $t("settings.globalRules") }}</p>
<rules v-model:rules="settings.rules" /> <rules :rules.sync="settings.rules" />
<div v-if="isExecEnabled"> <div v-if="isExecEnabled">
<h3>{{ $t("settings.executeOnShell") }}</h3> <h3>{{ $t("settings.executeOnShell") }}</h3>
@ -75,7 +75,7 @@
<label for="theme">{{ $t("settings.themes.title") }}</label> <label for="theme">{{ $t("settings.themes.title") }}</label>
<themes <themes
class="input input--block" class="input input--block"
v-model:theme="settings.frontend.theme" :theme.sync="settings.frontend.theme"
id="theme" id="theme"
></themes> ></themes>
</p> </p>
@ -125,7 +125,7 @@
<user-form <user-form
:isNew="false" :isNew="false"
:isDefault="true" :isDefault="true"
v-model:user="settings.defaults" :user.sync="settings.defaults"
/> />
</div> </div>

View File

@ -22,7 +22,7 @@
<h3>{{ $t("settings.language") }}</h3> <h3>{{ $t("settings.language") }}</h3>
<languages <languages
class="input input--block" class="input input--block"
v-model:locale="locale" :locale.sync="locale"
></languages> ></languages>
</div> </div>

View File

@ -10,8 +10,8 @@
<div class="card-content"> <div class="card-content">
<user-form <user-form
v-model:user="user" :user.sync="user"
v-model:createUserDir="createUserDir" :createUserDir.sync="createUserDir"
:isDefault="false" :isDefault="false"
:isNew="isNew" :isNew="isNew"
/> />