Fix perms (#39)
This commit is contained in:
parent
65159848c2
commit
8261511881
10
Dockerfile
10
Dockerfile
|
@ -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" ]
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -5,29 +5,17 @@ server:
|
||||||
auth:
|
auth:
|
||||||
method: noauth
|
method: noauth
|
||||||
signup: true
|
signup: true
|
||||||
|
userDefaults:
|
||||||
|
scope: "."
|
||||||
|
hideDotfiles: true
|
||||||
|
singleClick: false
|
||||||
|
permissions:
|
||||||
|
admin: false
|
||||||
|
create: true
|
||||||
|
rename: true
|
||||||
|
modify: true
|
||||||
|
delete: true
|
||||||
|
share: true
|
||||||
|
download: true
|
||||||
frontend:
|
frontend:
|
||||||
theme: dark
|
theme: dark
|
||||||
Users:
|
|
||||||
admin:
|
|
||||||
rules:
|
|
||||||
- regex: false
|
|
||||||
allow: true
|
|
||||||
path: test
|
|
||||||
regexp:
|
|
||||||
raw: ''
|
|
||||||
- regex: true
|
|
||||||
allow: true
|
|
||||||
path: ''
|
|
||||||
regexp:
|
|
||||||
raw: test
|
|
||||||
scope: "."
|
|
||||||
hideDotfiles: true
|
|
||||||
singleClick: false
|
|
||||||
permissions:
|
|
||||||
admin: false
|
|
||||||
create: true
|
|
||||||
rename: true
|
|
||||||
modify: true
|
|
||||||
delete: true
|
|
||||||
share: true
|
|
||||||
download: true
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
/>
|
/>
|
||||||
|
|
Loading…
Reference in New Issue