2019-01-05 22:44:33 +00:00
package cmd
import (
"errors"
"fmt"
"os"
2019-01-06 13:21:31 +00:00
"strconv"
2019-01-05 22:44:33 +00:00
"text/tabwriter"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
2020-06-01 01:12:36 +02:00
"github.com/filebrowser/filebrowser/v2/settings"
"github.com/filebrowser/filebrowser/v2/users"
2019-01-05 22:44:33 +00:00
)
func init () {
rootCmd . AddCommand ( usersCmd )
}
var usersCmd = & cobra . Command {
2019-02-15 12:54:44 +01:00
Use : "users" ,
Short : "Users management utility" ,
Long : `Users management utility.` ,
Args : cobra . NoArgs ,
2019-01-05 22:44:33 +00:00
}
2020-06-01 01:12:36 +02:00
func printUsers ( usrs [] * users . User ) {
2024-04-01 18:24:06 +02:00
w := tabwriter . NewWriter ( os . Stdout , 0 , 0 , 2 , ' ' , 0 )
2026-01-24 08:39:25 -05:00
fmt . Fprintln ( w , "ID\tUsername\tScope\tLocale\tV. Mode\tS.Click\tRed. After C/M\tAdmin\tExecute\tCreate\tRename\tModify\tDelete\tShare\tDownload\tPwd Lock" )
2019-01-05 22:44:33 +00:00
2020-06-01 01:12:36 +02:00
for _ , u := range usrs {
2026-01-10 20:27:54 +11:00
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%t\t\n" ,
2020-06-01 01:12:36 +02:00
u . ID ,
u . Username ,
u . Scope ,
u . Locale ,
u . ViewMode ,
2020-11-23 19:06:37 +01:00
u . SingleClick ,
2026-01-10 20:27:54 +11:00
u . RedirectAfterCopyMove ,
2020-06-01 01:12:36 +02:00
u . Perm . Admin ,
u . Perm . Execute ,
u . Perm . Create ,
u . Perm . Rename ,
u . Perm . Modify ,
u . Perm . Delete ,
u . Perm . Share ,
u . Perm . Download ,
u . LockPassword ,
2019-01-05 22:44:33 +00:00
)
}
w . Flush ()
}
2020-06-01 01:12:36 +02:00
func parseUsernameOrID ( arg string ) ( username string , id uint ) {
2023-02-16 09:11:12 +01:00
id64 , err := strconv . ParseUint ( arg , 10 , 64 )
2019-01-06 13:21:31 +00:00
if err != nil {
return arg , 0
2019-01-05 22:44:33 +00:00
}
2020-06-01 01:12:36 +02:00
return "" , uint ( id64 )
2019-01-05 22:44:33 +00:00
}
2019-01-08 10:50:37 +00:00
func addUserFlags ( flags * pflag . FlagSet ) {
flags . Bool ( "perm.admin" , false , "admin perm for users" )
flags . Bool ( "perm.execute" , true , "execute perm for users" )
flags . Bool ( "perm.create" , true , "create perm for users" )
flags . Bool ( "perm.rename" , true , "rename perm for users" )
flags . Bool ( "perm.modify" , true , "modify perm for users" )
flags . Bool ( "perm.delete" , true , "delete perm for users" )
flags . Bool ( "perm.share" , true , "share perm for users" )
flags . Bool ( "perm.download" , true , "download perm for users" )
flags . String ( "sorting.by" , "name" , "sorting mode (name, size or modified)" )
flags . Bool ( "sorting.asc" , false , "sorting by ascending order" )
flags . Bool ( "lockPassword" , false , "lock password" )
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 . String ( "viewMode" , string ( users . ListViewMode ), "view mode for users" )
2020-11-23 19:06:37 +01:00
flags . Bool ( "singleClick" , false , "use single clicks only" )
2026-01-10 20:27:54 +11:00
flags . Bool ( "redirectAfterCopyMove" , false , "redirect to destination after copy/move" )
2025-08-09 13:42:42 +08:00
flags . Bool ( "dateFormat" , false , "use date format (true for absolute time, false for relative)" )
flags . Bool ( "hideDotfiles" , false , "hide dotfiles" )
2025-09-25 16:47:00 +02:00
flags . String ( "aceEditorTheme" , "" , "ace editor's syntax highlighting theme for users" )
2019-01-05 22:44:33 +00:00
}
2025-11-17 08:45:43 +01:00
func getAndParseViewMode ( flags * pflag . FlagSet ) ( users . ViewMode , error ) {
viewModeStr , err := flags . GetString ( "viewMode" )
2025-07-22 11:55:21 +05:30
if err != nil {
return "" , err
}
2025-11-17 08:45:43 +01:00
2025-07-22 11:55:21 +05:30
viewMode := users . ViewMode ( viewModeStr )
2019-01-05 22:44:33 +00:00
if viewMode != users . ListViewMode && viewMode != users . MosaicViewMode {
2025-07-22 11:55:21 +05:30
return "" , errors . New ( "view mode must be \"" + string ( users . ListViewMode ) + "\" or \"" + string ( users . MosaicViewMode ) + "\"" )
2019-01-05 22:44:33 +00:00
}
2025-11-17 08:45:43 +01:00
2025-07-22 11:55:21 +05:30
return viewMode , nil
2019-01-05 22:44:33 +00:00
}
2025-07-22 11:55:21 +05:30
func getUserDefaults ( flags * pflag . FlagSet , defaults * settings . UserDefaults , all bool ) error {
2025-11-17 08:45:43 +01:00
errs := [] error {}
2019-01-05 22:44:33 +00:00
visit := func ( flag * pflag . Flag ) {
2025-07-22 11:55:21 +05:30
var err error
2019-01-05 22:44:33 +00:00
switch flag . Name {
case "scope" :
2025-11-17 08:45:43 +01:00
defaults . Scope , err = flags . GetString ( flag . Name )
2019-01-05 22:44:33 +00:00
case "locale" :
2025-11-17 08:45:43 +01:00
defaults . Locale , err = flags . GetString ( flag . Name )
2019-01-05 22:44:33 +00:00
case "viewMode" :
2025-11-17 08:45:43 +01:00
defaults . ViewMode , err = getAndParseViewMode ( flags )
2020-11-23 19:06:37 +01:00
case "singleClick" :
2025-11-17 08:45:43 +01:00
defaults . SingleClick , err = flags . GetBool ( flag . Name )
2026-01-10 20:27:54 +11:00
case "redirectAfterCopyMove" :
defaults . RedirectAfterCopyMove , err = flags . GetBool ( flag . Name )
2025-09-25 16:47:00 +02:00
case "aceEditorTheme" :
2025-11-17 08:45:43 +01:00
defaults . AceEditorTheme , err = flags . GetString ( flag . Name )
2019-01-05 22:44:33 +00:00
case "perm.admin" :
2025-11-17 08:45:43 +01:00
defaults . Perm . Admin , err = flags . GetBool ( flag . Name )
2019-01-05 22:44:33 +00:00
case "perm.execute" :
2025-11-17 08:45:43 +01:00
defaults . Perm . Execute , err = flags . GetBool ( flag . Name )
2019-01-05 22:44:33 +00:00
case "perm.create" :
2025-11-17 08:45:43 +01:00
defaults . Perm . Create , err = flags . GetBool ( flag . Name )
2019-01-05 22:44:33 +00:00
case "perm.rename" :
2025-11-17 08:45:43 +01:00
defaults . Perm . Rename , err = flags . GetBool ( flag . Name )
2019-01-05 22:44:33 +00:00
case "perm.modify" :
2025-11-17 08:45:43 +01:00
defaults . Perm . Modify , err = flags . GetBool ( flag . Name )
2019-01-05 22:44:33 +00:00
case "perm.delete" :
2025-11-17 08:45:43 +01:00
defaults . Perm . Delete , err = flags . GetBool ( flag . Name )
2019-01-05 22:44:33 +00:00
case "perm.share" :
2025-11-17 08:45:43 +01:00
defaults . Perm . Share , err = flags . GetBool ( flag . Name )
2019-01-05 22:44:33 +00:00
case "perm.download" :
2025-11-17 08:45:43 +01:00
defaults . Perm . Download , err = flags . GetBool ( flag . Name )
2019-01-05 22:44:33 +00:00
case "commands" :
2025-07-22 11:55:21 +05:30
defaults . Commands , err = flags . GetStringSlice ( flag . Name )
2019-01-05 22:44:33 +00:00
case "sorting.by" :
2025-11-17 08:45:43 +01:00
defaults . Sorting . By , err = flags . GetString ( flag . Name )
2019-01-05 22:44:33 +00:00
case "sorting.asc" :
2025-11-17 08:45:43 +01:00
defaults . Sorting . Asc , err = flags . GetBool ( flag . Name )
2025-11-15 08:50:22 +01:00
case "hideDotfiles" :
2025-11-17 08:45:43 +01:00
defaults . HideDotfiles , err = flags . GetBool ( flag . Name )
2025-07-22 11:55:21 +05:30
}
2025-11-17 08:45:43 +01:00
2025-07-22 11:55:21 +05:30
if err != nil {
2025-11-17 08:45:43 +01:00
errs = append ( errs , err )
2019-01-05 22:44:33 +00:00
}
}
if all {
2019-01-08 14:07:55 +00:00
flags . VisitAll ( visit )
2019-01-05 22:44:33 +00:00
} else {
2019-01-08 14:07:55 +00:00
flags . Visit ( visit )
2019-01-05 22:44:33 +00:00
}
2025-11-17 08:45:43 +01:00
return errors . Join ( errs ... )
2019-01-05 22:44:33 +00:00
}