Add cli tool to generate BCrypt passwords

This commit is contained in:
Christian Claus 2018-04-11 15:22:42 +02:00
parent 2facce8a43
commit d8c458fc6c
5 changed files with 130 additions and 32 deletions

View file

@ -2,10 +2,11 @@ package app
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"log"
"os"
"github.com/fsnotify/fsnotify"
"path/filepath"
)
// Config represents the configuration of the server application.
@ -59,37 +60,9 @@ func ParseConfig() *Config {
}
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
viper.OnConfigChange(cfg.updateConfig)
file, err := os.Open(e.Name)
if err != nil {
fmt.Println("Error reloading config", e.Name)
}
var updatedCfg = &Config{}
viper.ReadConfig(file)
viper.Unmarshal(&updatedCfg)
for k, _ := range cfg.Users {
if updatedCfg.Users[k] == nil {
fmt.Printf("Removed User from configuration: %s\n", k)
cfg.Users[k] = nil
}
}
for k, v := range updatedCfg.Users {
if cfg.Users[k] == nil {
fmt.Printf("Added User to configuration: %s\n", k)
cfg.Users[k] = v
} else {
if cfg.Users[k].Password != v.Password {
fmt.Printf("Updated password of user: %s\n", k)
cfg.Users[k].Password = v.Password
}
}
}
})
cfg.ensureUserDirs()
return cfg
}
@ -102,3 +75,47 @@ func setDefaults() {
viper.SetDefault("Dir", "/tmp")
viper.SetDefault("TLS", nil)
}
func (cfg *Config) updateConfig(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
file, err := os.Open(e.Name)
if err != nil {
fmt.Println("Error reloading config", e.Name)
}
var updatedCfg = &Config{}
viper.ReadConfig(file)
viper.Unmarshal(&updatedCfg)
for username := range cfg.Users {
if updatedCfg.Users[username] == nil {
fmt.Printf("Removed User from configuration: %s\n", username)
cfg.Users[username] = nil
}
}
for username, v := range updatedCfg.Users {
if cfg.Users[username] == nil {
fmt.Printf("Added User to configuration: %s\n", username)
cfg.Users[username] = v
} else {
if cfg.Users[username].Password != v.Password {
fmt.Printf("Updated password of user: %s\n", username)
cfg.Users[username].Password = v.Password
}
}
}
cfg.ensureUserDirs()
}
func (cfg *Config) ensureUserDirs() {
for username := range cfg.Users {
path := filepath.Join(cfg.Dir, username)
if _, err := os.Stat(path); os.IsNotExist(err) {
os.Mkdir(path, os.ModePerm)
fmt.Printf("Created user dir: %s\n", path)
}
}
}

View file

@ -17,9 +17,10 @@ func main() {
BaseDir: config.Dir,
},
LockSystem: webdav.NewMemLS(),
Logger: app.ModificationLogHandler,
}
wdHandler.Logger = app.ModificationLogHandler
a := &app.App{
Config: config,
Handler: wdHandler,

7
cmd/swdcli/main.go Normal file
View file

@ -0,0 +1,7 @@
package main
import "github.com/micromata/swd/cmd/swdcli/subcmd"
func main() {
subcmd.Execute()
}

View file

@ -0,0 +1,51 @@
package subcmd
import (
"fmt"
"github.com/spf13/cobra"
"golang.org/x/crypto/bcrypt"
"golang.org/x/crypto/ssh/terminal"
"log"
"os"
"syscall"
)
var passwdCmd = &cobra.Command{
Use: "passwd",
Short: "Generates a BCrypt hash of a given input string",
Run: func(cmd *cobra.Command, args []string) {
pw1 := readPassword()
pw2 := readPassword()
pw1Str := string(pw1)
pw2Str := string(pw2)
if pw1Str != pw2Str {
fmt.Println("Passwords doesn't match.")
os.Exit(1)
}
pw, err := bcrypt.GenerateFromPassword(pw1, 10)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Hashed Password: %s\n", string(pw))
},
}
func readPassword() []byte {
fmt.Print("Enter password: ")
pw, err := terminal.ReadPassword(int(syscall.Stdin))
if err != nil {
fmt.Printf("An error occurred reading the password: %s\n", err)
os.Exit(1)
}
fmt.Println()
return pw
}
func init() {
RootCmd.AddCommand(passwdCmd)
}

22
cmd/swdcli/subcmd/root.go Normal file
View file

@ -0,0 +1,22 @@
package subcmd
import (
"fmt"
"github.com/spf13/cobra"
"os"
)
// RootCmd represents the base command when called without any subcommands
var RootCmd = &cobra.Command{
Use: "swdcli",
Short: "A cli for the simple webdav server",
}
// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
if err := RootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}