From e7c4261b8676d3712217e8f9237e437a719d46a6 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Mon, 28 Jun 2021 00:41:14 +0800 Subject: [PATCH] add generating secret key utility --- cmd/security.go | 49 +++++++++++++++++++++++++++++++++++++++ ezbookkeeping.go | 1 + pkg/utils/strings.go | 19 +++++++++++++++ pkg/utils/strings_test.go | 5 ++++ 4 files changed, 74 insertions(+) create mode 100644 cmd/security.go diff --git a/cmd/security.go b/cmd/security.go new file mode 100644 index 00000000..0b50c742 --- /dev/null +++ b/cmd/security.go @@ -0,0 +1,49 @@ +package cmd + +import ( + "fmt" + + "github.com/urfave/cli/v2" + + "github.com/mayswind/ezbookkeeping/pkg/utils" +) + +// SecurityUtils represents the security command +var SecurityUtils = &cli.Command{ + Name: "security", + Usage: "ezBookkeeping security utilities", + Subcommands: []*cli.Command{ + { + Name: "gen-secret-key", + Usage: "Generate a random secret key", + Action: genSecretKey, + Flags: []cli.Flag{ + &cli.IntFlag{ + Name: "length", + Aliases: []string{"l"}, + Required: false, + DefaultText: "32", + Usage: "The length of secret key", + }, + }, + }, + }, +} + +func genSecretKey(c *cli.Context) error { + length := c.Int("length") + + if length <= 0 { + length = 32 + } + + secretKey, err := utils.GetRandomNumberOrLetter(length) + + if err != nil { + return err + } + + fmt.Printf("[Secret Key] %s\n", secretKey) + + return nil +} diff --git a/ezbookkeeping.go b/ezbookkeeping.go index 6a8fa6b5..e48b7990 100644 --- a/ezbookkeeping.go +++ b/ezbookkeeping.go @@ -32,6 +32,7 @@ func main() { cmd.WebServer, cmd.Database, cmd.UserData, + cmd.SecurityUtils, }, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/pkg/utils/strings.go b/pkg/utils/strings.go index 71bc1ae0..fce44246 100644 --- a/pkg/utils/strings.go +++ b/pkg/utils/strings.go @@ -17,8 +17,10 @@ import ( const ( availableCharacters = "!#$&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~" + availableNumberAndLetters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" availableNumberAndLowercaseLetters = "0123456789abcdefghijklmnopqrstuvwxyz" availableCharactersLength = len(availableCharacters) + availableNumberAndLettersLength = len(availableNumberAndLetters) availableNumberAndLowercaseLettersLength = len(availableNumberAndLowercaseLetters) ) @@ -90,6 +92,23 @@ func GetRandomString(n int) (string, error) { return string(result), nil } +// GetRandomNumberOrLetter returns a random string which only contains number or letter characters +func GetRandomNumberOrLetter(n int) (string, error) { + var result = make([]byte, n) + + for i := 0; i < n; i++ { + index, err := GetRandomInteger(availableNumberAndLettersLength) + + if err != nil { + return "", err + } + + result[i] = availableNumberAndLetters[index] + } + + return string(result), nil +} + // GetRandomNumberOrLowercaseLetter returns a random string which only contains number or letter characters func GetRandomNumberOrLowercaseLetter(n int) (string, error) { var result = make([]byte, n) diff --git a/pkg/utils/strings_test.go b/pkg/utils/strings_test.go index 45ba0e36..0623387f 100644 --- a/pkg/utils/strings_test.go +++ b/pkg/utils/strings_test.go @@ -78,6 +78,11 @@ func TestGetRandomString(t *testing.T) { assert.Len(t, actualValue, 10) } +func TestGetRandomNumberOrLetter(t *testing.T) { + actualValue, err := GetRandomNumberOrLetter(10) + assert.Equal(t, nil, err) + assert.Len(t, actualValue, 10) +} func TestGetRandomNumberOrLowercaseLetter(t *testing.T) { actualValue, err := GetRandomNumberOrLowercaseLetter(10) assert.Equal(t, nil, err)