Files
filebrowser/cmd/config.go
T

246 lines
8.0 KiB
Go
Raw Normal View History

2019-01-05 22:44:33 +00:00
package cmd
import (
"encoding/json"
nerrors "errors"
"fmt"
"os"
"strings"
"text/tabwriter"
2020-06-01 01:12:36 +02:00
"github.com/spf13/cobra"
"github.com/spf13/pflag"
2019-01-05 22:44:33 +00:00
"github.com/filebrowser/filebrowser/v2/auth"
"github.com/filebrowser/filebrowser/v2/errors"
"github.com/filebrowser/filebrowser/v2/settings"
)
func init() {
rootCmd.AddCommand(configCmd)
}
var configCmd = &cobra.Command{
2019-02-15 12:54:44 +01:00
Use: "config",
Short: "Configuration management utility",
Long: `Configuration management utility.`,
Args: cobra.NoArgs,
2019-01-05 22:44:33 +00:00
}
2019-01-08 10:50:37 +00:00
func addConfigFlags(flags *pflag.FlagSet) {
2019-01-08 14:07:55 +00:00
addServerFlags(flags)
2019-01-08 10:50:37 +00:00
addUserFlags(flags)
flags.BoolP("signup", "s", false, "allow users to signup")
flags.Bool("create-user-dir", false, "generate user's home directory automatically")
flags.Uint("minimum-password-length", settings.DefaultMinimumPasswordLength, "minimum password length for new users")
2019-01-08 10:50:37 +00:00
flags.String("shell", "", "shell command to which other commands should be appended")
2019-01-05 22:44:33 +00:00
2019-01-08 10:50:37 +00:00
flags.String("auth.method", string(auth.MethodJSONAuth), "authentication type")
flags.String("auth.header", "", "HTTP header for auth.method=proxy")
2021-09-13 13:47:06 +00:00
flags.String("auth.command", "", "command for auth.method=hook")
2019-01-05 22:44:33 +00:00
2019-01-08 10:50:37 +00:00
flags.String("recaptcha.host", "https://www.google.com", "use another host for ReCAPTCHA. recaptcha.net might be useful in China")
flags.String("recaptcha.key", "", "ReCaptcha site key")
flags.String("recaptcha.secret", "", "ReCaptcha secret")
2019-01-05 22:44:33 +00:00
2019-01-08 10:50:37 +00:00
flags.String("branding.name", "", "replace 'File Browser' by this name")
2023-12-28 10:52:40 +02:00
flags.String("branding.theme", "", "set the theme")
flags.String("branding.color", "", "set the theme color")
2019-01-08 10:50:37 +00:00
flags.String("branding.files", "", "path to directory with images and custom styles")
flags.Bool("branding.disableExternal", false, "disable external links such as GitHub links")
flags.Bool("branding.disableUsedPercentage", false, "disable used disk percentage graph")
// NB: these are string so they can be presented as octal in the help text
// as that's the conventional representation for modes in Unix.
flags.String("file-mode", fmt.Sprintf("%O", settings.DefaultFileMode), "Mode bits that new files are created with")
flags.String("dir-mode", fmt.Sprintf("%O", settings.DefaultDirMode), "Mode bits that new directories are created with")
2019-01-05 22:44:33 +00:00
}
func getAuthMethod(flags *pflag.FlagSet, defaults ...interface{}) (settings.AuthMethod, map[string]interface{}, error) {
methodStr, err := getString(flags, "auth.method")
if err != nil {
return "", nil, err
}
method := settings.AuthMethod(methodStr)
2019-05-20 04:55:36 +03:00
2019-05-19 22:03:26 +03:00
var defaultAuther map[string]interface{}
2019-05-20 04:55:36 +03:00
if len(defaults) > 0 {
if hasAuth := defaults[0]; hasAuth != true {
for _, arg := range defaults {
switch def := arg.(type) {
case *settings.Settings:
2020-06-01 01:12:36 +02:00
method = def.AuthMethod
2019-05-20 04:55:36 +03:00
case auth.Auther:
ms, err := json.Marshal(def)
if err != nil {
return "", nil, err
}
2020-06-01 01:12:36 +02:00
err = json.Unmarshal(ms, &defaultAuther)
if err != nil {
return "", nil, err
}
2019-05-20 04:55:36 +03:00
}
}
2019-05-19 22:03:26 +03:00
}
}
2019-01-05 22:44:33 +00:00
return method, defaultAuther, nil
}
2019-05-19 22:03:26 +03:00
func getProxyAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) {
header, err := getString(flags, "auth.header")
if err != nil {
return nil, err
}
2019-05-19 22:03:26 +03:00
if header == "" {
header = defaultAuther["header"].(string)
2019-01-05 22:44:33 +00:00
}
if header == "" {
return nil, nerrors.New("you must set the flag 'auth.header' for method 'proxy'")
2019-01-05 22:44:33 +00:00
}
return &auth.ProxyAuth{Header: header}, nil
}
func getNoAuth() auth.Auther {
return &auth.NoAuth{}
}
2019-01-05 22:44:33 +00:00
func getJSONAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) {
jsonAuth := &auth.JSONAuth{}
host, err := getString(flags, "recaptcha.host")
if err != nil {
return nil, err
}
key, err := getString(flags, "recaptcha.key")
if err != nil {
return nil, err
}
secret, err := getString(flags, "recaptcha.secret")
if err != nil {
return nil, err
}
if key == "" {
if kmap, ok := defaultAuther["recaptcha"].(map[string]interface{}); ok {
key = kmap["key"].(string)
2019-05-19 22:03:26 +03:00
}
}
2019-05-19 22:03:26 +03:00
if secret == "" {
if smap, ok := defaultAuther["recaptcha"].(map[string]interface{}); ok {
secret = smap["secret"].(string)
2019-05-19 17:31:25 +03:00
}
}
2019-05-19 17:31:25 +03:00
if key != "" && secret != "" {
jsonAuth.ReCaptcha = &auth.ReCaptcha{
Host: host,
Key: key,
Secret: secret,
2019-01-05 22:44:33 +00:00
}
}
return jsonAuth, nil
}
2019-01-05 22:44:33 +00:00
func getHookAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) {
command, err := getString(flags, "auth.command")
if err != nil {
return nil, err
}
2021-09-13 13:47:06 +00:00
if command == "" {
command = defaultAuther["command"].(string)
}
2021-09-13 13:47:06 +00:00
if command == "" {
return nil, nerrors.New("you must set the flag 'auth.command' for method 'hook'")
}
return &auth.HookAuth{Command: command}, nil
}
2021-09-13 13:47:06 +00:00
func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings.AuthMethod, auth.Auther, error) {
method, defaultAuther, err := getAuthMethod(flags, defaults...)
if err != nil {
return "", nil, err
2021-09-13 13:47:06 +00:00
}
var auther auth.Auther
switch method {
case auth.MethodProxyAuth:
auther, err = getProxyAuth(flags, defaultAuther)
case auth.MethodNoAuth:
auther = getNoAuth()
case auth.MethodJSONAuth:
auther, err = getJSONAuth(flags, defaultAuther)
case auth.MethodHookAuth:
auther, err = getHookAuth(flags, defaultAuther)
default:
return "", nil, errors.ErrInvalidAuthMethod
2019-01-05 22:44:33 +00:00
}
if err != nil {
return "", nil, err
}
return method, auther, nil
2019-01-05 22:44:33 +00:00
}
func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Auther) error {
2024-04-01 18:24:06 +02:00
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
2019-01-05 22:44:33 +00:00
2019-01-08 14:07:55 +00:00
fmt.Fprintf(w, "Sign up:\t%t\n", set.Signup)
fmt.Fprintf(w, "Create User Dir:\t%t\n", set.CreateUserDir)
fmt.Fprintf(w, "Minimum Password Length:\t%d\n", set.MinimumPasswordLength)
2019-01-08 14:07:55 +00:00
fmt.Fprintf(w, "Auth method:\t%s\n", set.AuthMethod)
fmt.Fprintf(w, "Shell:\t%s\t\n", strings.Join(set.Shell, " "))
2019-01-05 22:44:33 +00:00
fmt.Fprintln(w, "\nBranding:")
2019-01-08 14:07:55 +00:00
fmt.Fprintf(w, "\tName:\t%s\n", set.Branding.Name)
fmt.Fprintf(w, "\tFiles override:\t%s\n", set.Branding.Files)
fmt.Fprintf(w, "\tDisable external links:\t%t\n", set.Branding.DisableExternal)
fmt.Fprintf(w, "\tDisable used disk percentage graph:\t%t\n", set.Branding.DisableUsedPercentage)
fmt.Fprintf(w, "\tColor:\t%s\n", set.Branding.Color)
2023-12-28 10:52:40 +02:00
fmt.Fprintf(w, "\tTheme:\t%s\n", set.Branding.Theme)
2019-01-08 14:07:55 +00:00
fmt.Fprintln(w, "\nServer:")
fmt.Fprintf(w, "\tLog:\t%s\n", ser.Log)
fmt.Fprintf(w, "\tPort:\t%s\n", ser.Port)
fmt.Fprintf(w, "\tBase URL:\t%s\n", ser.BaseURL)
fmt.Fprintf(w, "\tRoot:\t%s\n", ser.Root)
2019-05-17 11:48:06 +01:00
fmt.Fprintf(w, "\tSocket:\t%s\n", ser.Socket)
2019-01-08 14:07:55 +00:00
fmt.Fprintf(w, "\tAddress:\t%s\n", ser.Address)
fmt.Fprintf(w, "\tTLS Cert:\t%s\n", ser.TLSCert)
fmt.Fprintf(w, "\tTLS Key:\t%s\n", ser.TLSKey)
2020-10-01 08:45:24 -06:00
fmt.Fprintf(w, "\tExec Enabled:\t%t\n", ser.EnableExec)
2019-01-05 22:44:33 +00:00
fmt.Fprintln(w, "\nDefaults:")
2019-01-08 14:07:55 +00:00
fmt.Fprintf(w, "\tScope:\t%s\n", set.Defaults.Scope)
fmt.Fprintf(w, "\tLocale:\t%s\n", set.Defaults.Locale)
fmt.Fprintf(w, "\tView mode:\t%s\n", set.Defaults.ViewMode)
2020-11-23 19:06:37 +01:00
fmt.Fprintf(w, "\tSingle Click:\t%t\n", set.Defaults.SingleClick)
fmt.Fprintf(w, "\tFile Creation Mode:\t%O\n", set.FileMode)
fmt.Fprintf(w, "\tDirectory Creation Mode:\t%O\n", set.DirMode)
2019-01-08 14:07:55 +00:00
fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " "))
fmt.Fprintf(w, "\tAce editor syntax highlighting theme:\t%s\n", set.Defaults.AceEditorTheme)
2019-01-05 22:44:33 +00:00
fmt.Fprintf(w, "\tSorting:\n")
2019-01-08 14:07:55 +00:00
fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By)
fmt.Fprintf(w, "\t\tAsc:\t%t\n", set.Defaults.Sorting.Asc)
2019-01-05 22:44:33 +00:00
fmt.Fprintf(w, "\tPermissions:\n")
2019-01-08 14:07:55 +00:00
fmt.Fprintf(w, "\t\tAdmin:\t%t\n", set.Defaults.Perm.Admin)
fmt.Fprintf(w, "\t\tExecute:\t%t\n", set.Defaults.Perm.Execute)
fmt.Fprintf(w, "\t\tCreate:\t%t\n", set.Defaults.Perm.Create)
fmt.Fprintf(w, "\t\tRename:\t%t\n", set.Defaults.Perm.Rename)
fmt.Fprintf(w, "\t\tModify:\t%t\n", set.Defaults.Perm.Modify)
fmt.Fprintf(w, "\t\tDelete:\t%t\n", set.Defaults.Perm.Delete)
fmt.Fprintf(w, "\t\tShare:\t%t\n", set.Defaults.Perm.Share)
fmt.Fprintf(w, "\t\tDownload:\t%t\n", set.Defaults.Perm.Download)
2019-01-05 22:44:33 +00:00
w.Flush()
b, err := json.MarshalIndent(auther, "", " ")
if err != nil {
return err
}
2019-01-05 22:44:33 +00:00
fmt.Printf("\nAuther configuration (raw):\n\n%s\n\n", string(b))
return nil
2019-01-05 22:44:33 +00:00
}