package commands import ( "fmt" "os" "github.com/spf13/pflag" "github.com/authelia/authelia/v4/internal/utils" ) func recoverErr(i any) error { switch v := i.(type) { case nil: return nil case string: return fmt.Errorf("recovered panic: %s", v) case error: return fmt.Errorf("recovered panic: %w", v) default: return fmt.Errorf("recovered panic with unknown type: %v", v) } } func configFilterExisting(configs []string) (finalConfigs []string) { var err error for _, c := range configs { if _, err = os.Stat(c); err == nil || !os.IsNotExist(err) { finalConfigs = append(finalConfigs, c) } } return finalConfigs } func flagsGetRandomCharacters(flags *pflag.FlagSet, flagNameLength, flagNameCharSet, flagNameCharacters string) (r string, err error) { var ( n int charset string ) if n, err = flags.GetInt(flagNameLength); err != nil { return "", err } if n < 1 { return "", fmt.Errorf("flag --%s with value '%d' is invalid: must be at least 1", flagNameLength, n) } useCharSet, useCharacters := flags.Changed(flagNameCharSet), flags.Changed(flagNameCharacters) if useCharSet && useCharacters { return "", fmt.Errorf("flag --%s and flag --%s are mutually exclusive, only one may be used", flagNameCharSet, flagNameCharacters) } switch { case useCharSet, !useCharSet && !useCharacters: var c string if c, err = flags.GetString(flagNameCharSet); err != nil { return "", err } switch c { case "ascii": charset = utils.CharSetASCII case "alphanumeric": charset = utils.CharSetAlphaNumeric case "alphabetic": charset = utils.CharSetAlphabetic case "numeric-hex": charset = utils.CharSetNumericHex case "numeric": charset = utils.CharSetNumeric default: return "", fmt.Errorf("flag '--%s' with value '%s' is invalid, must be one of 'ascii', 'alphanumeric', 'alphabetic', 'numeric', or 'numeric-hex'", flagNameCharSet, c) } case useCharacters: if charset, err = flags.GetString(flagNameCharacters); err != nil { return "", err } } return utils.RandomString(n, charset, true), nil }