initial commit

This commit is contained in:
Graham Steffaniak 2023-08-05 07:32:43 -05:00
parent fb5cee52c4
commit 3dd3e01f4c
16 changed files with 153 additions and 97 deletions

View File

@ -1,8 +1,11 @@
{ {
"port": 8080, "server":{
"baseURL": "", "port": 8080,
"address": "", "baseURL": "",
"log": "stdout", "address": "",
"database": "./database.db", "log": "stdout",
"root": "/srv" "database": "./database.db",
"root": "/srv"
}
} }

View File

@ -16,7 +16,7 @@ import (
) )
// MethodHookAuth is used to identify hook auth. // MethodHookAuth is used to identify hook auth.
const MethodHookAuth settings.AuthMethod = "hook" const MethodHookAuth = "hook"
type hookCred struct { type hookCred struct {
Password string `json:"password"` Password string `json:"password"`

View File

@ -12,7 +12,7 @@ import (
) )
// MethodJSONAuth is used to identify json auth. // MethodJSONAuth is used to identify json auth.
const MethodJSONAuth settings.AuthMethod = "json" const MethodJSONAuth = "json"
type jsonCred struct { type jsonCred struct {
Password string `json:"password"` Password string `json:"password"`

View File

@ -8,7 +8,7 @@ import (
) )
// MethodNoAuth is used to identify no auth. // MethodNoAuth is used to identify no auth.
const MethodNoAuth settings.AuthMethod = "noauth" const MethodNoAuth = "noauth"
// NoAuth is no auth implementation of auther. // NoAuth is no auth implementation of auther.
type NoAuth struct{} type NoAuth struct{}

View File

@ -10,7 +10,7 @@ import (
) )
// MethodProxyAuth is used to identify no auth. // MethodProxyAuth is used to identify no auth.
const MethodProxyAuth settings.AuthMethod = "proxy" const MethodProxyAuth = "proxy"
// ProxyAuth is a proxy implementation of an auther. // ProxyAuth is a proxy implementation of an auther.
type ProxyAuth struct { type ProxyAuth struct {

View File

@ -1,13 +1,12 @@
package auth package auth
import ( import (
"github.com/gtsteffaniak/filebrowser/settings"
"github.com/gtsteffaniak/filebrowser/users" "github.com/gtsteffaniak/filebrowser/users"
) )
// StorageBackend is a storage backend for auth storage. // StorageBackend is a storage backend for auth storage.
type StorageBackend interface { type StorageBackend interface {
Get(settings.AuthMethod) (Auther, error) Get(string) (Auther, error)
Save(Auther) error Save(Auther) error
} }
@ -23,7 +22,7 @@ func NewStorage(back StorageBackend, userStore *users.Storage) *Storage {
} }
// Get wraps a StorageBackend.Get. // Get wraps a StorageBackend.Get.
func (s *Storage) Get(t settings.AuthMethod) (Auther, error) { func (s *Storage) Get(t string) (Auther, error) {
return s.back.Get(t) return s.back.Get(t)
} }

View File

@ -49,8 +49,8 @@ func addConfigFlags(flags *pflag.FlagSet) {
} }
//nolint:gocyclo //nolint:gocyclo
func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings.AuthMethod, auth.Auther) { func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (string, auth.Auther) {
method := settings.AuthMethod(mustGetString(flags, "auth.method")) method := mustGetString(flags, "auth.method")
var defaultAuther map[string]interface{} var defaultAuther map[string]interface{}
if len(defaults) > 0 { if len(defaults) > 0 {

View File

@ -1,11 +0,0 @@
package settings
// Branding contains the branding settings of the app.
type Branding struct {
Name string `json:"name"`
DisableExternal bool `json:"disableExternal"`
DisableUsedPercentage bool `json:"disableUsedPercentage"`
Files string `json:"files"`
Theme string `json:"theme"`
Color string `json:"color"`
}

View File

@ -1,33 +0,0 @@
package settings
import (
"github.com/gtsteffaniak/filebrowser/files"
"github.com/gtsteffaniak/filebrowser/users"
)
// UserDefaults is a type that holds the default values
// for some fields on User.
type UserDefaults struct {
Scope string `json:"scope"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Sorting files.Sorting `json:"sorting"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
}
// 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

@ -13,41 +13,12 @@ const DefaultUsersHomeBasePath = "/users"
type AuthMethod string type AuthMethod string
// Settings contain the main settings of the application. // Settings contain the main settings of the application.
type Settings struct {
Key []byte `json:"key"`
Signup bool `json:"signup"`
CreateUserDir bool `json:"createUserDir"`
UserHomeBasePath string `json:"userHomeBasePath"`
Defaults UserDefaults `json:"defaults"`
AuthMethod AuthMethod `json:"authMethod"`
Branding Branding `json:"branding"`
Commands map[string][]string `json:"commands"`
Shell []string `json:"shell"`
Rules []rules.Rule `json:"rules"`
}
// GetRules implements rules.Provider. // GetRules implements rules.Provider.
func (s *Settings) GetRules() []rules.Rule { func (s *Settings) GetRules() []rules.Rule {
return s.Rules return s.Rules
} }
// Server specific settings. // Server specific settings
type Server struct {
Root string `json:"root"`
BaseURL string `json:"baseURL"`
Socket string `json:"socket"`
TLSKey string `json:"tlsKey"`
TLSCert string `json:"tlsCert"`
Port string `json:"port"`
Address string `json:"address"`
Log string `json:"log"`
EnableThumbnails bool `json:"enableThumbnails"`
ResizePreview bool `json:"resizePreview"`
EnableExec bool `json:"enableExec"`
TypeDetectionByHeader bool `json:"typeDetectionByHeader"`
AuthHook string `json:"authHook"`
}
// Clean cleans any variables that might need cleaning. // Clean cleans any variables that might need cleaning.
func (s *Server) Clean() { func (s *Server) Clean() {
s.BaseURL = strings.TrimSuffix(s.BaseURL, "/") s.BaseURL = strings.TrimSuffix(s.BaseURL, "/")

127
backend/settings/structs.go Normal file
View File

@ -0,0 +1,127 @@
package settings
import (
"github.com/gtsteffaniak/filebrowser/files"
"github.com/gtsteffaniak/filebrowser/rules"
"github.com/gtsteffaniak/filebrowser/users"
)
// 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
}
type Settings struct {
Key []byte `json:"key"`
Signup bool `json:"signup"`
CreateUserDir bool `json:"createUserDir"`
UserHomeBasePath string `json:"userHomeBasePath"`
Defaults UserDefaults `json:"defaults"`
Commands map[string][]string `json:"commands"`
Shell []string `json:"shell"`
Rules []rules.Rule `json:"rules"`
Server Server `json:"server"`
AuthMethod string `json:"authMethod"`
Auth struct {
Header string `json:"header"`
Method string `json:"method"`
Command string `json:"command"`
Signup bool `json:"signup"`
Shell string `json:"shell"`
} `json:"auth"`
Branding Branding `json:"branding"`
UserDefaults UserDefaults `json:"userDefaults"`
}
type Server struct {
Socket string `json:"socket"`
TLSKey string `json:"tlsKey"`
TLSCert string `json:"tlsCert"`
EnableThumbnails bool `json:"enableThumbnails"`
ResizePreview bool `json:"resizePreview"`
EnableExec bool `json:"enableExec"`
TypeDetectionByHeader bool `json:"typeDetectionByHeader"`
AuthHook string `json:"authHook"`
Port string `json:"port"`
BaseURL string `json:"baseURL"`
Address string `json:"address"`
Log string `json:"log"`
Database string `json:"database"`
Root string `json:"root"`
EnablePreviewResize bool `json:"disable-preview-resize"`
}
type Branding struct {
Name string `json:"name"`
DisableExternal bool `json:"disableExternal"`
DisableUsedPercentage bool `json:"disableUsedPercentage"`
Files string `json:"files"`
Theme string `json:"theme"`
Color string `json:"color"`
}
// UserDefaults is a type that holds the default values
// for some fields on User.
type UserDefaults struct {
Scope string `json:"scope"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Sorting files.Sorting `json:"sorting"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
}
//{
// "server":{
// "port":8080,
// "baseURL":"",
// "address":"",
// "log":"stdout",
// "database":"./database.db",
// "root":"/srv",
// "disable-thumbnails":false,
// "disable-preview-resize":false,
// "disable-exec":false,
// "disable-type-detection-by-header":false
// },
// "auth":{
// "header":"",
// "method":"",
// "command":"",
// "signup":false,
// "shell":""
// },
// "branding":{
// "name":"",
// "color":"",
// "files":"",
// "disableExternal":"",
// "disableUsedPercentage":""
// },
// "permissions":{
// "Admin":false,
// "Execute":true,
// "Create":true,
// "Rename":true,
// "Modify":true,
// "Delete":true,
// "Share":true,
// "Download":true
// },
// "commands":{},
// "shell":{},
// "rules":{}
// }

View File

@ -5,14 +5,13 @@ import (
"github.com/gtsteffaniak/filebrowser/auth" "github.com/gtsteffaniak/filebrowser/auth"
"github.com/gtsteffaniak/filebrowser/errors" "github.com/gtsteffaniak/filebrowser/errors"
"github.com/gtsteffaniak/filebrowser/settings"
) )
type authBackend struct { type authBackend struct {
db *storm.DB db *storm.DB
} }
func (s authBackend) Get(t settings.AuthMethod) (auth.Auther, error) { func (s authBackend) Get(t string) (auth.Auther, error) {
var auther auth.Auther var auther auth.Auther
switch t { switch t {

View File

@ -149,13 +149,13 @@ func importConf(db *storm.DB, path string, sto *storage.Storage) error {
switch cfg.Auth.Method { switch cfg.Auth.Method {
case "proxy": case "proxy":
auther = &auth.ProxyAuth{Header: cfg.Auth.Header} auther = &auth.ProxyAuth{Header: cfg.Auth.Header}
s.AuthMethod = auth.MethodProxyAuth s.AuthMethod = string(auth.MethodProxyAuth)
case "hook": case "hook":
auther = &auth.HookAuth{Command: cfg.Auth.Command} auther = &auth.HookAuth{Command: cfg.Auth.Command}
s.AuthMethod = auth.MethodHookAuth s.AuthMethod = string(auth.MethodHookAuth)
case "none": case "none":
auther = &auth.NoAuth{} auther = &auth.NoAuth{}
s.AuthMethod = auth.MethodNoAuth s.AuthMethod = string(auth.MethodNoAuth)
default: default:
auther = &auth.JSONAuth{ auther = &auth.JSONAuth{
ReCaptcha: &auth.ReCaptcha{ ReCaptcha: &auth.ReCaptcha{
@ -164,7 +164,7 @@ func importConf(db *storm.DB, path string, sto *storage.Storage) error {
Secret: cfg.ReCaptcha.Secret, Secret: cfg.ReCaptcha.Secret,
}, },
} }
s.AuthMethod = auth.MethodJSONAuth s.AuthMethod = string(auth.MethodJSONAuth)
} }
err = sto.Auth.Save(auther) err = sto.Auth.Save(auther)

View File

@ -2,7 +2,7 @@ package version
var ( var (
// Version is the current File Browser version. // Version is the current File Browser version.
Version = "(0.1.3)" Version = "(0.1.4)"
// CommitSHA is the commmit sha. // CommitSHA is the commmit sha.
CommitSHA = "(unknown)" CommitSHA = "(unknown)"
) )

View File

@ -125,6 +125,7 @@ main {
.breadcrumbs a { .breadcrumbs a {
color: inherit; color: inherit;
transition: 0.1s ease-in; transition: 0.1s ease-in;
display: flex;
border-radius: 0.125em; border-radius: 0.125em;
} }

View File

@ -160,7 +160,7 @@ body.rtl #listing {
width: 100%; width: 100%;
margin: 0; margin: 0;
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid rgba(0, 0, 0, 0.1);
padding: 1em; padding: 0;
border-top: 0; border-top: 0;
} }