// Package main is the APG command line client that makes use of the apg-go library package main import ( "flag" "fmt" "os" "github.com/wneessen/apg-go" ) func main() { c := apg.NewConfig() // Configure and parse the CLI flags // See usage() for flag details var ms string var co, hr, lc, nu, sp, uc bool flag.BoolVar(&lc, "L", false, "") flag.BoolVar(&uc, "U", false, "") flag.BoolVar(&nu, "N", false, "") flag.BoolVar(&sp, "S", false, "") flag.BoolVar(&co, "C", false, "") flag.BoolVar(&hr, "H", false, "") flag.Int64Var(&c.MinLength, "m", c.MinLength, "") flag.Int64Var(&c.MaxLength, "x", c.MaxLength, "") flag.StringVar(&ms, "M", "", "") flag.Int64Var(&c.NumberPass, "n", c.NumberPass, "") flag.Usage = usage flag.Parse() // Old style character modes if hr { c.Mode = apg.MaskToggleMode(c.Mode, apg.ModeHumanReadable) } if lc { c.Mode = apg.MaskToggleMode(c.Mode, apg.ModeLowerCase) } if uc { c.Mode = apg.MaskToggleMode(c.Mode, apg.ModeUpperCase) } if nu { c.Mode = apg.MaskToggleMode(c.Mode, apg.ModeNumber) } if sp { c.Mode = apg.MaskToggleMode(c.Mode, apg.ModeSpecial) } if co { c.Mode = apg.MaskSetMode(c.Mode, apg.ModeLowerCase|apg.ModeNumber| apg.ModeSpecial|apg.ModeUpperCase) c.Mode = apg.MaskClearMode(c.Mode, apg.ModeHumanReadable) } // New style character modes (has higher priority than the old style modes) if ms != "" { c.Mode = apg.ModesFromFlags(ms) } for _, m := range []apg.Mode{apg.ModeHumanReadable, apg.ModeLowerCase, apg.ModeNumber, apg.ModeSpecial, apg.ModeUpperCase} { fmt.Printf("%s: %t\n", m, apg.MaskHasMode(c.Mode, m)) } /* g := apg.New(c) rb, err := g.RandomBytes(c.MinLength) if err != nil { fmt.Println("ERROR", err) os.Exit(1) } fmt.Printf("Random: %#v\n", rb) */ } // usage is used by the flag package to display the CLI usage message func usage() { // Usage text const ut = `apg-go // A "Automated Password Generator"-clone Copyleft (c) 2021-2023 Winni Neessen apg [-a ] [-m ] [-x ] [-L] [-U] [-N] [-S] [-H] [-C] [-l] [-M mode] [-E char_string] [-n num_of_pass] [-v] [-h] [-t] Options: -a ALGORITH Choose the password generation algorithm (Default: 1) - 0: pronounceable password generation (koremutake syllables) - 1: random password generation according to password modes/flags -m LENGTH Minimum length of the password to be generated (Default: 12) -x LENGTH Maximum length of the password to be generated (Default: 20) -n NUMBER Amount of password to be generated (Default: 6) -E CHARS List of characters to be excluded in the generated password -M [LUNSHClunshc] New style password parameters - Note: new-style flags have higher priority than any of the old-style flags -L Toggle lower case characters in passwords (Default: on) -U Toggle upper case characters in passwords (Default: on) -N Toggle numeric characters in passwords (Default: on) -S Toggle special characters in passwords (Default: off) -H Avoid ambiguous characters in passwords (i. e.: 1, l, I, O, 0) (Default: off) -C Enable complex password mode (implies -L -U -N -S and disables -H) - Note: this flag has higher priority than the other old-style flags -l Spell generated passwords in phonetic alphabet (Default: off) -p Check the HIBP database if the generated passwords was found in a leak before (Default: off) - Note: this feature requires internet connectivity -h Show this help text -v Show version string ` _, _ = os.Stderr.WriteString(ut) }