|
@@ -45,6 +45,7 @@ const (
|
|
|
errNoSpec = "no config spec provided"
|
|
errNoSpec = "no config spec provided"
|
|
|
errParseSpec = "unable to parse spec: %w"
|
|
errParseSpec = "unable to parse spec: %w"
|
|
|
errGetToken = "unable to get authorization token: %w"
|
|
errGetToken = "unable to get authorization token: %w"
|
|
|
|
|
+ errSecretKey = "secretKeys must be non-empty and unique"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
type generateFunc func(
|
|
type generateFunc func(
|
|
@@ -93,29 +94,44 @@ func (g *Generator) generate(jsonSpec *apiextensions.JSON, passGen generateFunc)
|
|
|
if res.Spec.Symbols != nil {
|
|
if res.Spec.Symbols != nil {
|
|
|
symbols = *res.Spec.Symbols
|
|
symbols = *res.Spec.Symbols
|
|
|
}
|
|
}
|
|
|
- pass, err := passGen(
|
|
|
|
|
- passLen,
|
|
|
|
|
- symbols,
|
|
|
|
|
- symbolCharacters,
|
|
|
|
|
- digits,
|
|
|
|
|
- res.Spec.NoUpper,
|
|
|
|
|
- res.Spec.AllowRepeat,
|
|
|
|
|
- )
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return nil, nil, err
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- // Apply encoding
|
|
|
|
|
encoding := "raw"
|
|
encoding := "raw"
|
|
|
if res.Spec.Encoding != nil {
|
|
if res.Spec.Encoding != nil {
|
|
|
encoding = *res.Spec.Encoding
|
|
encoding = *res.Spec.Encoding
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- encodedPass := encodePassword([]byte(pass), encoding)
|
|
|
|
|
|
|
+ keys := res.Spec.SecretKeys
|
|
|
|
|
+ if len(keys) == 0 {
|
|
|
|
|
+ keys = []string{"password"}
|
|
|
|
|
+ }
|
|
|
|
|
+ seen := make(map[string]struct{}, len(keys))
|
|
|
|
|
+ for _, key := range keys {
|
|
|
|
|
+ if key == "" {
|
|
|
|
|
+ return nil, nil, errors.New(errSecretKey)
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, ok := seen[key]; ok {
|
|
|
|
|
+ return nil, nil, errors.New(errSecretKey)
|
|
|
|
|
+ }
|
|
|
|
|
+ seen[key] = struct{}{}
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- return map[string][]byte{
|
|
|
|
|
- "password": encodedPass,
|
|
|
|
|
- }, nil, nil
|
|
|
|
|
|
|
+ passwords := make(map[string][]byte, len(keys))
|
|
|
|
|
+ for _, key := range keys {
|
|
|
|
|
+ pass, err := passGen(
|
|
|
|
|
+ passLen,
|
|
|
|
|
+ symbols,
|
|
|
|
|
+ symbolCharacters,
|
|
|
|
|
+ digits,
|
|
|
|
|
+ res.Spec.NoUpper,
|
|
|
|
|
+ res.Spec.AllowRepeat,
|
|
|
|
|
+ )
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return nil, nil, err
|
|
|
|
|
+ }
|
|
|
|
|
+ passwords[key] = encodePassword([]byte(pass), encoding)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return passwords, nil, nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func generateSafePassword(
|
|
func generateSafePassword(
|
|
@@ -166,7 +182,6 @@ func parseSpec(data []byte) (*genv1alpha1.Password, error) {
|
|
|
return &spec, err
|
|
return &spec, err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
// NewGenerator creates a new Generator instance.
|
|
// NewGenerator creates a new Generator instance.
|
|
|
func NewGenerator() genv1alpha1.Generator {
|
|
func NewGenerator() genv1alpha1.Generator {
|
|
|
return &Generator{}
|
|
return &Generator{}
|