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 @@
|