diff --git a/cli/ask_credentials.go b/cli/ask_credentials.go new file mode 100644 index 00000000..3755f436 --- /dev/null +++ b/cli/ask_credentials.go @@ -0,0 +1,27 @@ +// Copyright 2018 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package cli + +import ( + "bufio" + "fmt" + "os" + "strings" + + "golang.org/x/crypto/ssh/terminal" +) + +func askCredentials() (string, string) { + reader := bufio.NewReader(os.Stdin) + + fmt.Print("Enter Username: ") + username, _ := reader.ReadString('\n') + + fmt.Print("Enter Password: ") + bytePassword, _ := terminal.ReadPassword(0) + + fmt.Printf("\n") + return strings.TrimSpace(username), strings.TrimSpace(string(bytePassword)) +} diff --git a/cli/cli.go b/cli/cli.go index 67131e60..d3abdcf9 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -21,6 +21,7 @@ func Parse() { flagMigrate := flag.Bool("migrate", false, "Migrate database schema") flagFlushSessions := flag.Bool("flush-sessions", false, "Flush all sessions (disconnect users)") flagCreateAdmin := flag.Bool("create-admin", false, "Create admin user") + flagResetPassword := flag.Bool("reset-password", false, "Reset user password") flag.Parse() cfg := config.NewConfig() @@ -54,5 +55,10 @@ func Parse() { return } + if *flagResetPassword { + resetPassword(store) + return + } + daemon.Run(cfg, store) } diff --git a/cli/create_admin.go b/cli/create_admin.go index 9af8df33..fc6eb6eb 100644 --- a/cli/create_admin.go +++ b/cli/create_admin.go @@ -5,36 +5,18 @@ package cli import ( - "bufio" "fmt" "os" - "strings" "github.com/miniflux/miniflux/model" "github.com/miniflux/miniflux/storage" - - "golang.org/x/crypto/ssh/terminal" ) -func askCredentials() (string, string) { - reader := bufio.NewReader(os.Stdin) - - fmt.Print("Enter Username: ") - username, _ := reader.ReadString('\n') - - fmt.Print("Enter Password: ") - bytePassword, _ := terminal.ReadPassword(0) - - fmt.Printf("\n") - return strings.TrimSpace(username), strings.TrimSpace(string(bytePassword)) -} - func createAdmin(store *storage.Storage) { - user := &model.User{ - Username: os.Getenv("ADMIN_USERNAME"), - Password: os.Getenv("ADMIN_PASSWORD"), - IsAdmin: true, - } + user := model.NewUser() + user.Username = os.Getenv("ADMIN_USERNAME") + user.Password = os.Getenv("ADMIN_PASSWORD") + user.IsAdmin = true if user.Username == "" || user.Password == "" { user.Username, user.Password = askCredentials() diff --git a/cli/reset_password.go b/cli/reset_password.go new file mode 100644 index 00000000..05a9b51f --- /dev/null +++ b/cli/reset_password.go @@ -0,0 +1,39 @@ +// Copyright 2018 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package cli + +import ( + "fmt" + "os" + + "github.com/miniflux/miniflux/storage" +) + +func resetPassword(store *storage.Storage) { + username, password := askCredentials() + user, err := store.UserByUsername(username) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if user == nil { + fmt.Println("User not found!") + os.Exit(1) + } + + user.Password = password + if err := user.ValidatePassword(); err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := store.UpdateUser(user); err != nil { + fmt.Println(err) + os.Exit(1) + } + + fmt.Println("Password changed!") +}