From 846f72ebbcf78b7d714d144e7e4317e09502a4eb Mon Sep 17 00:00:00 2001 From: Yeicor <4929005+Yeicor@users.noreply.github.com> Date: Sat, 4 Nov 2023 19:07:25 +0100 Subject: [PATCH] feat: add default share duration setting for one-click shares --- auth/hook.go | 47 +++++++++++++---------- cmd/root.go | 8 ++-- cmd/users.go | 12 +++++- cmd/users_update.go | 18 +++++---- cmd/utils.go | 6 +++ frontend/src/components/prompts/Share.vue | 23 +++++++++-- frontend/src/css/dashboard.css | 6 +-- frontend/src/i18n/en.json | 2 + frontend/src/views/settings/Profile.vue | 25 ++++++++++++ http/auth.go | 40 ++++++++++--------- settings/defaults.go | 22 ++++++----- storage/bolt/importer/conf.go | 10 +++-- storage/bolt/importer/users.go | 19 ++++----- users/users.go | 32 +++++++-------- 14 files changed, 177 insertions(+), 93 deletions(-) diff --git a/auth/hook.go b/auth/hook.go index 3e57560e..b07acd87 100644 --- a/auth/hook.go +++ b/auth/hook.go @@ -7,6 +7,7 @@ import ( "net/http" "os" "os/exec" + "strconv" "strings" "github.com/filebrowser/filebrowser/v2/errors" @@ -156,16 +157,18 @@ func (a *HookAuth) SaveUser() (*users.User, error) { // create user with the provided credentials d := &users.User{ - Username: a.Cred.Username, - Password: pass, - Scope: a.Settings.Defaults.Scope, - Locale: a.Settings.Defaults.Locale, - ViewMode: a.Settings.Defaults.ViewMode, - SingleClick: a.Settings.Defaults.SingleClick, - Sorting: a.Settings.Defaults.Sorting, - Perm: a.Settings.Defaults.Perm, - Commands: a.Settings.Defaults.Commands, - HideDotfiles: a.Settings.Defaults.HideDotfiles, + Username: a.Cred.Username, + Password: pass, + Scope: a.Settings.Defaults.Scope, + Locale: a.Settings.Defaults.Locale, + DefaultShareDurationTime: a.Settings.Defaults.DefaultShareDurationTime, + DefaultShareDurationUnit: a.Settings.Defaults.DefaultShareDurationUnit, + ViewMode: a.Settings.Defaults.ViewMode, + SingleClick: a.Settings.Defaults.SingleClick, + Sorting: a.Settings.Defaults.Sorting, + Perm: a.Settings.Defaults.Perm, + Commands: a.Settings.Defaults.Commands, + HideDotfiles: a.Settings.Defaults.HideDotfiles, } u = a.GetUser(d) @@ -216,22 +219,26 @@ func (a *HookAuth) GetUser(d *users.User) *users.User { Share: isAdmin || a.Fields.GetBoolean("user.perm.share", d.Perm.Share), Download: isAdmin || a.Fields.GetBoolean("user.perm.download", d.Perm.Download), } + defaultShareDurationTime, _ := strconv.Atoi( + a.Fields.GetString("user.defaultShareDurationTime", strconv.Itoa(d.DefaultShareDurationTime))) user := users.User{ - ID: d.ID, - Username: d.Username, - Password: d.Password, - Scope: a.Fields.GetString("user.scope", d.Scope), - Locale: a.Fields.GetString("user.locale", d.Locale), - ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))), - SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick), + ID: d.ID, + Username: d.Username, + Password: d.Password, + Scope: a.Fields.GetString("user.scope", d.Scope), + Locale: a.Fields.GetString("user.locale", d.Locale), + DefaultShareDurationTime: defaultShareDurationTime, + DefaultShareDurationUnit: a.Fields.GetString("user.defaultShareDurationUnit", d.DefaultShareDurationUnit), + LockPassword: true, + ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))), + SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick), + Perm: perms, + Commands: a.Fields.GetArray("user.commands", d.Commands), Sorting: files.Sorting{ Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc), By: a.Fields.GetString("user.sorting.by", d.Sorting.By), }, - Commands: a.Fields.GetArray("user.commands", d.Commands), HideDotfiles: a.Fields.GetBoolean("user.hideDotfiles", d.HideDotfiles), - Perm: perms, - LockPassword: true, } return &user diff --git a/cmd/root.go b/cmd/root.go index dc8b57e8..2201efe1 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -318,9 +318,11 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) { CreateUserDir: false, UserHomeBasePath: settings.DefaultUsersHomeBasePath, Defaults: settings.UserDefaults{ - Scope: ".", - Locale: "en", - SingleClick: false, + Scope: ".", + Locale: "en", + DefaultShareDurationTime: -1, + DefaultShareDurationUnit: "hours", + SingleClick: false, Perm: users.Permissions{ Admin: false, Execute: true, diff --git a/cmd/users.go b/cmd/users.go index 894a162c..7fcab22a 100644 --- a/cmd/users.go +++ b/cmd/users.go @@ -27,14 +27,16 @@ var usersCmd = &cobra.Command{ func printUsers(usrs []*users.User) { w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) //nolint:gomnd - fmt.Fprintln(w, "ID\tUsername\tScope\tLocale\tV. Mode\tS.Click\tAdmin\tExecute\tCreate\tRename\tModify\tDelete\tShare\tDownload\tPwd Lock") + fmt.Fprintln(w, "ID\tUsername\tScope\tLocale\tDefShare\tV. Mode\tS.Click\tAdmin\tExecute\tCreate\tRename\tModify\tDelete\tShare\tDownload\tPwd Lock") for _, u := range usrs { - fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n", + fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%d%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n", u.ID, u.Username, u.Scope, u.Locale, + u.DefaultShareDurationTime, + u.DefaultShareDurationUnit, u.ViewMode, u.SingleClick, u.Perm.Admin, @@ -75,6 +77,8 @@ func addUserFlags(flags *pflag.FlagSet) { flags.StringSlice("commands", nil, "a list of the commands a user can execute") flags.String("scope", ".", "scope for users") flags.String("locale", "en", "locale for users") + flags.Int("defaultShareDurationTime", -1, "default share duration time for users (-1 disables it and 0 makes it permanent)") + flags.String("defaultShareDurationUnit", "hours", "default share duration unit for users") flags.String("viewMode", string(users.ListViewMode), "view mode for users") flags.Bool("singleClick", false, "use single clicks only") } @@ -95,6 +99,10 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all defaults.Scope = mustGetString(flags, flag.Name) case "locale": defaults.Locale = mustGetString(flags, flag.Name) + case "defaultShareDurationTime": + defaults.DefaultShareDurationTime = mustGetInt(flags, flag.Name) + case "defaultShareDurationUnit": + defaults.DefaultShareDurationUnit = mustGetString(flags, flag.Name) case "viewMode": defaults.ViewMode = getViewMode(flags) case "singleClick": diff --git a/cmd/users_update.go b/cmd/users_update.go index 822bb6dc..273ee22c 100644 --- a/cmd/users_update.go +++ b/cmd/users_update.go @@ -41,17 +41,21 @@ options you want to change.`, checkErr(err) defaults := settings.UserDefaults{ - Scope: user.Scope, - Locale: user.Locale, - ViewMode: user.ViewMode, - SingleClick: user.SingleClick, - Perm: user.Perm, - Sorting: user.Sorting, - Commands: user.Commands, + Scope: user.Scope, + Locale: user.Locale, + DefaultShareDurationTime: user.DefaultShareDurationTime, + DefaultShareDurationUnit: user.DefaultShareDurationUnit, + ViewMode: user.ViewMode, + SingleClick: user.SingleClick, + Perm: user.Perm, + Sorting: user.Sorting, + Commands: user.Commands, } getUserDefaults(flags, &defaults, false) user.Scope = defaults.Scope user.Locale = defaults.Locale + user.DefaultShareDurationTime = defaults.DefaultShareDurationTime + user.DefaultShareDurationUnit = defaults.DefaultShareDurationUnit user.ViewMode = defaults.ViewMode user.SingleClick = defaults.SingleClick user.Perm = defaults.Perm diff --git a/cmd/utils.go b/cmd/utils.go index 2bd9e760..859ef8ab 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -43,6 +43,12 @@ func mustGetUint(flags *pflag.FlagSet, flag string) uint { return b } +func mustGetInt(flags *pflag.FlagSet, flag string) int { + b, err := flags.GetInt(flag) + checkErr(err) + return b +} + func generateKey() []byte { k, err := settings.GenerateKey() checkErr(err) diff --git a/frontend/src/components/prompts/Share.vue b/frontend/src/components/prompts/Share.vue index c0c3c083..784b44f0 100644 --- a/frontend/src/components/prompts/Share.vue +++ b/frontend/src/components/prompts/Share.vue @@ -24,6 +24,7 @@