From 517929c3644e73a7531469fc8257e80bd35638e7 Mon Sep 17 00:00:00 2001 From: Ambrose Chua Date: Mon, 17 Jul 2017 17:31:25 +0800 Subject: [PATCH] Improved CLI --- pw/pw.go | 18 ++++++----- pword.go | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 101 insertions(+), 10 deletions(-) diff --git a/pw/pw.go b/pw/pw.go index 8d70479..38df220 100644 --- a/pw/pw.go +++ b/pw/pw.go @@ -3,8 +3,6 @@ package pw //go:generate go run words_generate.go import ( - "log" - "strings" "crypto/rand" "math/big" @@ -37,16 +35,20 @@ func NewGenerator(m Mode, s Strength) Generator { } } -func (g Generator) Next() string { +func (g Generator) Next() (string, error) { n := int(g.Strength) s := []string{} for i := 0; i < n; i++ { - s = append(s, g.GenerateWord()); + w, err := g.GenerateWord() + if err != nil { + return "", err + } + s = append(s, w) } - return strings.Join(s, " ") + return strings.Join(s, " "), nil } -func (g Generator) GenerateWord() string { +func (g Generator) GenerateWord() (string, error) { var wordsList []string if g.Mode == ModeShort { wordsList = WordsShort @@ -58,7 +60,7 @@ func (g Generator) GenerateWord() string { c := len(wordsList) i, err := rand.Int(rand.Reader, big.NewInt(int64(c))) if err != nil { - log.Fatal(err) + return "", err } - return wordsList[i.Int64()] + return wordsList[i.Int64()], nil } diff --git a/pword.go b/pword.go index afbd977..25d962f 100644 --- a/pword.go +++ b/pword.go @@ -2,11 +2,100 @@ package main import ( "fmt" + "os" + "strconv" "github.com/serverwentdown/pword/pw" + + "github.com/urfave/cli" ) func main() { - g := pw.NewGenerator(pw.ModeShort, pw.StrengthOnline) - fmt.Println(g.Next()) + app := cli.NewApp() + + app.Name = "pword" + app.Usage = "generate secure passwords" + app.Version = "0.1.0" + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "count, c", + Value: "auto", + Usage: "Generates `NUM` passwords for you to choose from", + }, + cli.BoolFlag{ + Name: "1", + Usage: "Equivalent to --count 1", + }, + cli.BoolFlag{ + Name: "stronger", + Usage: "Chooses from a list of 7,776 words instead", + }, + } + + app.Commands = []cli.Command{ + { + Name: "online", + Usage: "Generates passwords for use on websites", + Action: func(c *cli.Context) error { + return generate(c, pw.StrengthOnline) + }, + }, + { + Name: "offline", + Usage: "Generates passwords for use offline (laptops, encrypted drives)", + Action: func(c *cli.Context) error { + return generate(c, pw.StrengthOffline) + }, + }, + { + Name: "crypto", + Usage: "Generates extremely secure passwords", + Action: func(c *cli.Context) error { + return generate(c, pw.StrengthCrypto) + }, + }, + { + Name: "recall", + Usage: "Utility with autocomplete to help you recall passwords", + Action: func(c *cli.Context) error { + return recall(c) + }, + }, + } + + app.Run(os.Args) +} + +func generate(c *cli.Context, strength pw.Strength) error { + count := int(strength) + countString := c.GlobalString("count") + countParsed, err := strconv.ParseUint(countString, 10, 64) + if err == nil { + count = int(countParsed) + } + if c.GlobalBool("1") { + count = 1 + } + + mode := pw.ModeShort + if c.GlobalBool("stronger") { + mode = pw.ModeLong + } + + g := pw.NewGenerator(mode, strength) + + for i := 0; i < count; i++ { + pw, err := g.Next() + if err != nil { + return err + } + fmt.Println(pw) + } + + return nil +} + +func recall(c *cli.Context) error { + return nil }