Files
filebrowser/users/users.go
T

122 lines
2.7 KiB
Go
Raw Normal View History

2019-01-05 22:44:33 +00:00
package users
import (
"path/filepath"
"regexp"
2020-06-01 01:12:36 +02:00
"github.com/spf13/afero"
2019-01-06 13:01:42 +00:00
2020-06-01 01:12:36 +02:00
"github.com/filebrowser/filebrowser/v2/errors"
2019-01-05 22:44:33 +00:00
"github.com/filebrowser/filebrowser/v2/files"
"github.com/filebrowser/filebrowser/v2/rules"
)
// ViewMode describes a view mode.
type ViewMode string
const (
ListViewMode ViewMode = "list"
MosaicViewMode ViewMode = "mosaic"
)
// User describes a user.
type User struct {
ID uint `storm:"id,increment" json:"id"`
Username string `storm:"unique" json:"username"`
Password string `json:"password"`
Scope string `json:"scope"`
Locale string `json:"locale"`
LockPassword bool `json:"lockPassword"`
ViewMode ViewMode `json:"viewMode"`
2020-11-23 19:06:37 +01:00
SingleClick bool `json:"singleClick"`
2019-01-05 22:44:33 +00:00
Perm Permissions `json:"perm"`
Commands []string `json:"commands"`
Sorting files.Sorting `json:"sorting"`
2019-01-08 08:57:24 +00:00
Fs afero.Fs `json:"-" yaml:"-"`
2019-01-05 22:44:33 +00:00
Rules []rules.Rule `json:"rules"`
2020-11-20 18:51:28 +08:00
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
2019-01-05 22:44:33 +00:00
}
// GetRules implements rules.Provider.
func (u *User) GetRules() []rules.Rule {
return u.Rules
}
var checkableFields = []string{
"Username",
"Password",
"Scope",
"ViewMode",
"Commands",
"Sorting",
"Rules",
}
// Clean cleans up a user and verifies if all its fields
// are alright to be saved.
2023-02-16 09:11:12 +01:00
//
2020-06-01 01:12:36 +02:00
//nolint:gocyclo
2019-01-06 13:01:42 +00:00
func (u *User) Clean(baseScope string, fields ...string) error {
2019-01-05 22:44:33 +00:00
if len(fields) == 0 {
fields = checkableFields
}
for _, field := range fields {
switch field {
case "Username":
if u.Username == "" {
return errors.ErrEmptyUsername
}
case "Password":
if u.Password == "" {
return errors.ErrEmptyPassword
}
case "ViewMode":
if u.ViewMode == "" {
u.ViewMode = ListViewMode
}
case "Commands":
if u.Commands == nil {
u.Commands = []string{}
}
case "Sorting":
if u.Sorting.By == "" {
u.Sorting.By = "name"
}
case "Rules":
if u.Rules == nil {
u.Rules = []rules.Rule{}
}
}
}
if u.Fs == nil {
2019-01-06 13:01:42 +00:00
scope := u.Scope
scope = filepath.Join(baseScope, filepath.Join("/", scope)) //nolint:gocritic
2019-01-06 13:01:42 +00:00
u.Fs = afero.NewBasePathFs(afero.NewOsFs(), scope)
2019-01-05 22:44:33 +00:00
}
return nil
}
// FullPath gets the full path for a user's relative path.
func (u *User) FullPath(path string) string {
return afero.FullBaseFsPath(u.Fs.(*afero.BasePathFs), path)
}
// CanExecute checks if an user can execute a specific command.
func (u *User) CanExecute(command string) bool {
if !u.Perm.Execute {
return false
}
for _, cmd := range u.Commands {
if regexp.MustCompile(cmd).MatchString(command) {
return true
}
}
return false
}