diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 5cce6baa10..f2c8bf9633 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -1939,6 +1939,17 @@ func ValidateSecret(secret *api.Secret) field.ErrorList { if err := json.Unmarshal(dockercfgBytes, &map[string]interface{}{}); err != nil { allErrs = append(allErrs, field.Invalid(dataPath.Key(api.DockerConfigKey), "", err.Error())) } + case api.SecretTypeDockerConfigJson: + dockerConfigJsonBytes, exists := secret.Data[api.DockerConfigJsonKey] + if !exists { + allErrs = append(allErrs, field.Required(dataPath.Key(api.DockerConfigJsonKey), "")) + break + } + + // make sure that the content is well-formed json. + if err := json.Unmarshal(dockerConfigJsonBytes, &map[string]interface{}{}); err != nil { + allErrs = append(allErrs, field.Invalid(dataPath.Key(api.DockerConfigJsonKey), "", err.Error())) + } default: // no-op diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index f3ca9d02ea..c33432599a 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -3988,25 +3988,44 @@ func TestValidateDockerConfigSecret(t *testing.T) { }, } } + validDockerSecret2 := func() api.Secret { + return api.Secret{ + ObjectMeta: api.ObjectMeta{Name: "foo", Namespace: "bar"}, + Type: api.SecretTypeDockerConfigJson, + Data: map[string][]byte{ + api.DockerConfigJsonKey: []byte(`{"auths":{"https://index.docker.io/v1/": {"auth": "Y2x1ZWRyb29sZXIwMDAxOnBhc3N3b3Jk","email": "fake@example.com"}}}`), + }, + } + } var ( - missingDockerConfigKey = validDockerSecret() - emptyDockerConfigKey = validDockerSecret() - invalidDockerConfigKey = validDockerSecret() + missingDockerConfigKey = validDockerSecret() + emptyDockerConfigKey = validDockerSecret() + invalidDockerConfigKey = validDockerSecret() + missingDockerConfigKey2 = validDockerSecret2() + emptyDockerConfigKey2 = validDockerSecret2() + invalidDockerConfigKey2 = validDockerSecret2() ) delete(missingDockerConfigKey.Data, api.DockerConfigKey) emptyDockerConfigKey.Data[api.DockerConfigKey] = []byte("") invalidDockerConfigKey.Data[api.DockerConfigKey] = []byte("bad") + delete(missingDockerConfigKey2.Data, api.DockerConfigJsonKey) + emptyDockerConfigKey2.Data[api.DockerConfigJsonKey] = []byte("") + invalidDockerConfigKey2.Data[api.DockerConfigJsonKey] = []byte("bad") tests := map[string]struct { secret api.Secret valid bool }{ - "valid": {validDockerSecret(), true}, - "missing dockercfg": {missingDockerConfigKey, false}, - "empty dockercfg": {emptyDockerConfigKey, false}, - "invalid dockercfg": {invalidDockerConfigKey, false}, + "valid dockercfg": {validDockerSecret(), true}, + "missing dockercfg": {missingDockerConfigKey, false}, + "empty dockercfg": {emptyDockerConfigKey, false}, + "invalid dockercfg": {invalidDockerConfigKey, false}, + "valid config.json": {validDockerSecret2(), true}, + "missing config.json": {missingDockerConfigKey2, false}, + "empty config.json": {emptyDockerConfigKey2, false}, + "invalid config.json": {invalidDockerConfigKey2, false}, } for name, tc := range tests {