diff --git a/Makefile b/Makefile index 41a5d3d..066525b 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ -EXECPATH = ./build/dist +EXEC_PATH = ./build/dist +BUILD_CMD = go build -o $(EXEC_PATH) -ldflags="-s -w" lint: golangci-lint run @@ -7,13 +8,16 @@ dev: air build: - go build -ldflags="-s -w" -o $(EXECPATH) . + $(BUILD_CMD) ./cmd/cli run: build - $(EXECPATH) new + $(EXEC_PATH) new -run-web: - go run main.go --web=t +build-web: + $(BUILD_CMD) ./cmd/server + +run-web: build-web + $(EXEC_PATH) web: cd client && npm run start @@ -21,4 +25,7 @@ web: test: go test -json -count=1 ./... -coverpkg=./... -coverprofile coverage.out -covermode=atomic | gotestfmt && go tool cover -html coverage.out && rm coverage.out -.PHONY: lint run dev run-web test build +clean: + rm -rf ./build/ + +.PHONY: lint run dev run-web test build build-web clean web diff --git a/api/server.go b/api/server.go index c00afb4..aa8c671 100644 --- a/api/server.go +++ b/api/server.go @@ -12,13 +12,11 @@ type Server struct { Router *chi.Mux } -func NewServer() *Server { +func New() *Server { s := &Server{Router: chi.NewRouter()} s.Router.Use(middleware.Logger) s.Router.Use(cors.Handler(cors.Options{ - // AllowedOrigins: []string{"https://foo.com"}, // Use this to allow specific origin hosts - AllowedOrigins: []string{"https://*", "http://*"}, - // AllowOriginFunc: func(r *http.Request, origin string) bool { return true }, + AllowedOrigins: []string{"https://*", "http://*"}, AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"}, ExposedHeaders: []string{"Link"}, @@ -29,6 +27,7 @@ func NewServer() *Server { return s } +// ServeHTTP implements Handler for Server func (s Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { s.Router.ServeHTTP(w, r) } diff --git a/cmd/new.go b/app/new.go similarity index 70% rename from cmd/new.go rename to app/new.go index dd38872..3973e81 100644 --- a/cmd/new.go +++ b/app/new.go @@ -1,4 +1,4 @@ -package cmd +package app import ( "log" @@ -9,9 +9,16 @@ import ( "github.com/rjNemo/go-pass-gen/passgen" ) +var ( + // length of the generated password. + length int + // withNumbers is set to true if the new password must contain numbers. + withNumbers bool +) + func init() { - newPasswordCommand.Flags().IntVarP(&Length, "length", "l", 6, "password length") - newPasswordCommand.Flags().BoolVarP(&WithNumbers, "numbers", "n", false, "password should contain numbers") + newPasswordCommand.Flags().IntVarP(&length, "length", "l", 6, "password length") + newPasswordCommand.Flags().BoolVarP(&withNumbers, "numbers", "n", false, "password should contain numbers") rootCommand.AddCommand(newPasswordCommand) } @@ -20,7 +27,7 @@ var newPasswordCommand = &cobra.Command{Use: "new", Short: "New Password", Long: "Create a secure password", Run: func(cmd *cobra.Command, args []string) { - opts := passgen.Options{Length: Length, WithNumbers: WithNumbers} + opts := passgen.Options{Length: length, WithNumbers: withNumbers} pg := passgen.New(opts.SetDefaults()) password := pg.NewPassword() display(password) diff --git a/cmd/root.go b/app/root.go similarity index 87% rename from cmd/root.go rename to app/root.go index 893e1f8..a240be2 100644 --- a/cmd/root.go +++ b/app/root.go @@ -1,5 +1,5 @@ -// Package cmd defines the command-line interface to passgen -package cmd +// Package app defines the command-line interface to passgen +package app import ( "log" diff --git a/cmd/cli/main.go b/cmd/cli/main.go new file mode 100644 index 0000000..0a1990d --- /dev/null +++ b/cmd/cli/main.go @@ -0,0 +1,9 @@ +package main + +import ( + "github.com/rjNemo/go-pass-gen/app" +) + +func main() { + app.Execute() +} diff --git a/cmd/flags.go b/cmd/flags.go deleted file mode 100644 index 90bb2e6..0000000 --- a/cmd/flags.go +++ /dev/null @@ -1,8 +0,0 @@ -package cmd - -var ( - // Length of the generated password. - Length int - // WithNumbers is set to true if the new password must contain numbers. - WithNumbers bool -) diff --git a/cmd/server/main.go b/cmd/server/main.go new file mode 100644 index 0000000..09f84f5 --- /dev/null +++ b/cmd/server/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "log" + + "github.com/rjNemo/go-pass-gen/api" +) + +const port = ":8080" + +func main() { + log.Printf("Start passgen server on http://localhost%s\n", port) + log.Fatal(api.New().Start(port)) +} diff --git a/main.go b/main.go deleted file mode 100644 index f9ee862..0000000 --- a/main.go +++ /dev/null @@ -1,28 +0,0 @@ -package main - -import ( - "flag" - "log" - - "github.com/rjNemo/go-pass-gen/api" - "github.com/rjNemo/go-pass-gen/cmd" -) - -func main() { - web := flag.Bool("web", false, "") - flag.Parse() - - if *web { - serveWeb() - return - } - cli() -} - -func cli() { - cmd.Execute() -} - -func serveWeb() { - log.Fatal(api.NewServer().Start(":8080")) -} diff --git a/passgen/constants.go b/passgen/constants.go deleted file mode 100644 index 14aea04..0000000 --- a/passgen/constants.go +++ /dev/null @@ -1,10 +0,0 @@ -package passgen - -const ( - // LOWERCASE characters if latin alphabet - LOWERCASE string = "abcdefghijklmnopqrstuvwxyz" - // UPPERCASE characters if latin alphabet - UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - // NUMBERS arabic - NUMBERS = "0123456789" -) diff --git a/passgen/passgen.go b/passgen/passgen.go index e795530..d8dfaf0 100644 --- a/passgen/passgen.go +++ b/passgen/passgen.go @@ -5,6 +5,17 @@ import ( "math/rand" ) +const ( + // lowercase characters in latin alphabet + lowercase string = "abcdefghijklmnopqrstuvwxyz" + + // uppercase characters in latin alphabet + uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + // numbers arabic + numbers = "0123456789" +) + // PasswordGenerator handles passwords creation. type PasswordGenerator struct { characters []rune @@ -35,9 +46,9 @@ func (p PasswordGenerator) generatePassword(length int) string { // shuffleCharacters randomizes the characters. func (p PasswordGenerator) shuffleCharacters(withNumbers bool) []rune { - letters := []rune(UPPERCASE + LOWERCASE) + letters := []rune(uppercase + lowercase) if withNumbers { - letters = append(letters, []rune(NUMBERS)...) + letters = append(letters, []rune(numbers)...) } rand.Shuffle(len(letters), func(i, j int) { letters[i], letters[j] = letters[j], letters[i] }) return letters diff --git a/passgen/passgen_test.go b/passgen/passgen_test.go index a25bc6e..6be68d2 100644 --- a/passgen/passgen_test.go +++ b/passgen/passgen_test.go @@ -34,10 +34,10 @@ func TestGeneratePasswordWithLettersAndNumbers(t *testing.T) { pg := passgen.New(opts) if password := pg.NewPassword(); !containNumbers(password) { - t.Errorf("Expected password to contain NUMBERS, got %q", password) + t.Errorf("Expected password to contain numbers, got %q", password) } } func containNumbers(str string) bool { - return strings.ContainsAny(str, passgen.NUMBERS) + return strings.ContainsAny(str, "0123456789") }