refactor(commands): include rfc3986 charset (#4328)

This includes the RFC3986 unreserved charset as an option, and allows the '-upper' and '-lower' suffix for alphabetic inclusive charsets.
pull/4329/head
James Elliott 2022-11-04 11:32:49 +11:00 committed by GitHub
parent a7d01c5211
commit 500410fac3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 59 additions and 26 deletions

View File

@ -43,8 +43,8 @@ authelia crypto hash generate --help
--password string manually supply the password rather than using the terminal prompt --password string manually supply the password rather than using the terminal prompt
--random uses a randomly generated password --random uses a randomly generated password
--random.characters string sets the explicit characters for the random string --random.characters string sets the explicit characters for the random string
--random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', and 'numeric-hex' (default "alphanumeric") --random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', 'numeric-hex', and 'rfc3986' (default "alphanumeric")
--random.length int when using a randomly generated password it configures the length (default 72) --random.length int sets the character length for the random string (default 72)
``` ```
### SEE ALSO ### SEE ALSO

View File

@ -53,8 +53,8 @@ authelia crypto hash generate argon2 --help
--password string manually supply the password rather than using the terminal prompt --password string manually supply the password rather than using the terminal prompt
--random uses a randomly generated password --random uses a randomly generated password
--random.characters string sets the explicit characters for the random string --random.characters string sets the explicit characters for the random string
--random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', and 'numeric-hex' (default "alphanumeric") --random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', 'numeric-hex', and 'rfc3986' (default "alphanumeric")
--random.length int when using a randomly generated password it configures the length (default 72) --random.length int sets the character length for the random string (default 72)
``` ```
### SEE ALSO ### SEE ALSO

View File

@ -48,8 +48,8 @@ authelia crypto hash generate bcrypt --help
--password string manually supply the password rather than using the terminal prompt --password string manually supply the password rather than using the terminal prompt
--random uses a randomly generated password --random uses a randomly generated password
--random.characters string sets the explicit characters for the random string --random.characters string sets the explicit characters for the random string
--random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', and 'numeric-hex' (default "alphanumeric") --random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', 'numeric-hex', and 'rfc3986' (default "alphanumeric")
--random.length int when using a randomly generated password it configures the length (default 72) --random.length int sets the character length for the random string (default 72)
``` ```
### SEE ALSO ### SEE ALSO

View File

@ -49,8 +49,8 @@ authelia crypto hash generate pbkdf2 --help
--password string manually supply the password rather than using the terminal prompt --password string manually supply the password rather than using the terminal prompt
--random uses a randomly generated password --random uses a randomly generated password
--random.characters string sets the explicit characters for the random string --random.characters string sets the explicit characters for the random string
--random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', and 'numeric-hex' (default "alphanumeric") --random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', 'numeric-hex', and 'rfc3986' (default "alphanumeric")
--random.length int when using a randomly generated password it configures the length (default 72) --random.length int sets the character length for the random string (default 72)
``` ```
### SEE ALSO ### SEE ALSO

View File

@ -51,8 +51,8 @@ authelia crypto hash generate scrypt --help
--password string manually supply the password rather than using the terminal prompt --password string manually supply the password rather than using the terminal prompt
--random uses a randomly generated password --random uses a randomly generated password
--random.characters string sets the explicit characters for the random string --random.characters string sets the explicit characters for the random string
--random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', and 'numeric-hex' (default "alphanumeric") --random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', 'numeric-hex', and 'rfc3986' (default "alphanumeric")
--random.length int when using a randomly generated password it configures the length (default 72) --random.length int sets the character length for the random string (default 72)
``` ```
### SEE ALSO ### SEE ALSO

View File

@ -49,8 +49,8 @@ authelia crypto hash generate sha2crypt --help
--password string manually supply the password rather than using the terminal prompt --password string manually supply the password rather than using the terminal prompt
--random uses a randomly generated password --random uses a randomly generated password
--random.characters string sets the explicit characters for the random string --random.characters string sets the explicit characters for the random string
--random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', and 'numeric-hex' (default "alphanumeric") --random.charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', 'numeric-hex', and 'rfc3986' (default "alphanumeric")
--random.length int when using a randomly generated password it configures the length (default 72) --random.length int sets the character length for the random string (default 72)
``` ```
### SEE ALSO ### SEE ALSO

View File

@ -43,10 +43,10 @@ authelia crypto rand --characters 0123456789ABCDEF
### Options ### Options
``` ```
--characters string Sets the explicit characters for the random string --characters string sets the explicit characters for the random string
-c, --charset string Sets the charset for the random string, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', and 'numeric-hex' (default "alphanumeric") -c, --charset string sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', 'numeric-hex', and 'rfc3986' (default "alphanumeric")
-h, --help help for rand -h, --help help for rand
-n, --length int Sets the length of the random output (default 72) -n, --length int sets the character length for the random string (default 72)
``` ```
### SEE ALSO ### SEE ALSO

View File

@ -548,8 +548,12 @@ const (
cmdFlagNameConfig = "config" cmdFlagNameConfig = "config"
cmdFlagNameCharSet = "charset" cmdFlagNameCharSet = "charset"
cmdFlagValueCharSet = "alphanumeric"
cmdFlagUsageCharset = "sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', 'numeric-hex', and 'rfc3986'"
cmdFlagNameCharacters = "characters" cmdFlagNameCharacters = "characters"
cmdFlagUsageCharacters = "sets the explicit characters for the random string"
cmdFlagNameLength = "length" cmdFlagNameLength = "length"
cmdFlagUsageLength = "sets the character length for the random string"
) )
const ( const (

View File

@ -60,9 +60,9 @@ func newCryptoRandCmd() (cmd *cobra.Command) {
DisableAutoGenTag: true, DisableAutoGenTag: true,
} }
cmd.Flags().StringP(cmdFlagNameCharSet, "c", "alphanumeric", "Sets the charset for the random string, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', and 'numeric-hex'") cmd.Flags().StringP(cmdFlagNameCharSet, "c", cmdFlagValueCharSet, cmdFlagUsageCharset)
cmd.Flags().String(cmdFlagNameCharacters, "", "Sets the explicit characters for the random string") cmd.Flags().String(cmdFlagNameCharacters, "", cmdFlagUsageCharacters)
cmd.Flags().IntP(cmdFlagNameLength, "n", 72, "Sets the length of the random output") cmd.Flags().IntP(cmdFlagNameLength, "n", 72, cmdFlagUsageLength)
return cmd return cmd
} }

View File

@ -497,9 +497,9 @@ func cmdFlagPassword(cmd *cobra.Command, noConfirm bool) {
func cmdFlagRandomPassword(cmd *cobra.Command) { func cmdFlagRandomPassword(cmd *cobra.Command) {
cmd.PersistentFlags().Bool(cmdFlagNameRandom, false, "uses a randomly generated password") cmd.PersistentFlags().Bool(cmdFlagNameRandom, false, "uses a randomly generated password")
cmd.PersistentFlags().Int(cmdFlagNameRandomLength, 72, "when using a randomly generated password it configures the length") cmd.PersistentFlags().String(cmdFlagNameRandomCharSet, cmdFlagValueCharSet, cmdFlagUsageCharset)
cmd.PersistentFlags().String(cmdFlagNameRandomCharSet, "alphanumeric", "sets the charset for the random password, options are 'ascii', 'alphanumeric', 'alphabetic', 'numeric', and 'numeric-hex'") cmd.PersistentFlags().String(cmdFlagNameRandomCharacters, "", cmdFlagUsageCharacters)
cmd.PersistentFlags().String(cmdFlagNameRandomCharacters, "", "sets the explicit characters for the random string") cmd.PersistentFlags().Int(cmdFlagNameRandomLength, 72, cmdFlagUsageLength)
} }
func cmdFlagIterations(cmd *cobra.Command, value int) { func cmdFlagIterations(cmd *cobra.Command, value int) {

View File

@ -34,6 +34,7 @@ func configFilterExisting(configs []string) (finalConfigs []string) {
return finalConfigs return finalConfigs
} }
//nolint:gocyclo
func flagsGetRandomCharacters(flags *pflag.FlagSet, flagNameLength, flagNameCharSet, flagNameCharacters string) (r string, err error) { func flagsGetRandomCharacters(flags *pflag.FlagSet, flagNameLength, flagNameCharSet, flagNameCharacters string) (r string, err error) {
var ( var (
n int n int
@ -67,14 +68,28 @@ func flagsGetRandomCharacters(flags *pflag.FlagSet, flagNameLength, flagNameChar
charset = utils.CharSetASCII charset = utils.CharSetASCII
case "alphanumeric": case "alphanumeric":
charset = utils.CharSetAlphaNumeric charset = utils.CharSetAlphaNumeric
case "alphanumeric-lower":
charset = utils.CharSetAlphabeticLower + utils.CharSetNumeric
case "alphanumeric-upper":
charset = utils.CharSetAlphabeticUpper + utils.CharSetNumeric
case "alphabetic": case "alphabetic":
charset = utils.CharSetAlphabetic charset = utils.CharSetAlphabetic
case "alphabetic-lower":
charset = utils.CharSetAlphabeticLower
case "alphabetic-upper":
charset = utils.CharSetAlphabeticUpper
case "numeric-hex": case "numeric-hex":
charset = utils.CharSetNumericHex charset = utils.CharSetNumericHex
case "numeric": case "numeric":
charset = utils.CharSetNumeric charset = utils.CharSetNumeric
case "rfc3986":
charset = utils.CharSetRFC3986Unreserved
case "rfc3986-lower":
charset = utils.CharSetAlphabeticLower + utils.CharSetNumeric + utils.CharSetSymbolicRFC3986Unreserved
case "rfc3986-upper":
charset = utils.CharSetAlphabeticUpper + utils.CharSetNumeric + utils.CharSetSymbolicRFC3986Unreserved
default: default:
return "", fmt.Errorf("flag '--%s' with value '%s' is invalid, must be one of 'ascii', 'alphanumeric', 'alphabetic', 'numeric', or 'numeric-hex'", flagNameCharSet, c) return "", fmt.Errorf("flag '--%s' with value '%s' is invalid, must be one of 'ascii', 'alphanumeric', 'alphabetic', 'numeric', 'numeric-hex', or 'rfc3986'", flagNameCharSet, c)
} }
case useCharacters: case useCharacters:
if charset, err = flags.GetString(flagNameCharacters); err != nil { if charset, err = flags.GetString(flagNameCharacters); err != nil {

View File

@ -111,8 +111,14 @@ const (
) )
const ( const (
// CharSetAlphabeticLower are literally just valid alphabetic lowercase printable ASCII chars.
CharSetAlphabeticLower = "abcdefghijklmnopqrstuvwxyz"
// CharSetAlphabeticUpper are literally just valid alphabetic uppercase printable ASCII chars.
CharSetAlphabeticUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// CharSetAlphabetic are literally just valid alphabetic printable ASCII chars. // CharSetAlphabetic are literally just valid alphabetic printable ASCII chars.
CharSetAlphabetic = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" CharSetAlphabetic = CharSetAlphabeticLower + CharSetAlphabeticUpper
// CharSetNumeric are literally just valid numeric chars. // CharSetNumeric are literally just valid numeric chars.
CharSetNumeric = "0123456789" CharSetNumeric = "0123456789"
@ -123,11 +129,19 @@ const (
// CharSetSymbolic are literally just valid symbolic printable ASCII chars. // CharSetSymbolic are literally just valid symbolic printable ASCII chars.
CharSetSymbolic = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" CharSetSymbolic = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
// CharSetSymbolicRFC3986Unreserved are RFC3986 unreserved symbol characters.
// See https://www.rfc-editor.org/rfc/rfc3986#section-2.3.
CharSetSymbolicRFC3986Unreserved = "-._~"
// CharSetAlphaNumeric are literally just valid alphanumeric printable ASCII chars. // CharSetAlphaNumeric are literally just valid alphanumeric printable ASCII chars.
CharSetAlphaNumeric = CharSetAlphabetic + CharSetNumeric CharSetAlphaNumeric = CharSetAlphabetic + CharSetNumeric
// CharSetASCII are literally just valid printable ASCII chars. // CharSetASCII are literally just valid printable ASCII chars.
CharSetASCII = CharSetAlphabetic + CharSetNumeric + CharSetSymbolic CharSetASCII = CharSetAlphabetic + CharSetNumeric + CharSetSymbolic
// CharSetRFC3986Unreserved are RFC3986 unreserved characters.
// See https://www.rfc-editor.org/rfc/rfc3986#section-2.3.
CharSetRFC3986Unreserved = CharSetAlphabetic + CharSetSymbolicRFC3986Unreserved
) )
var htmlEscaper = strings.NewReplacer( var htmlEscaper = strings.NewReplacer(