From 739f3adf11ba67e456de975dc01f127ac5be3c37 Mon Sep 17 00:00:00 2001 From: xiekeyang Date: Sun, 18 Sep 2016 18:53:19 +0800 Subject: [PATCH] validate media type of manifest and its descendants migrate from opencontainers/image-spec/pull/273 Signed-off-by: xiekeyang --- cmd/oci-image-validate/main.go | 2 +- image/manifest.go | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/cmd/oci-image-validate/main.go b/cmd/oci-image-validate/main.go index f8849bd..044d146 100644 --- a/cmd/oci-image-validate/main.go +++ b/cmd/oci-image-validate/main.go @@ -149,7 +149,7 @@ func (v *validateCmd) validatePath(name string) error { switch typ { case image.TypeManifest: - return schema.MediaTypeManifest.Validate(f) + return image.ValidateManifestMediaType(f) case image.TypeManifestList: return schema.MediaTypeManifestList.Validate(f) case image.TypeConfig: diff --git a/image/manifest.go b/image/manifest.go index 641e849..c48e021 100644 --- a/image/manifest.go +++ b/image/manifest.go @@ -51,7 +51,7 @@ func findManifest(w walker, d *descriptor) (*manifest, error) { return errors.Wrapf(err, "%s: error reading manifest", path) } - if err := schema.MediaTypeManifest.Validate(bytes.NewReader(buf)); err != nil { + if err := ValidateManifestMediaType(ioutil.NopCloser(bytes.NewReader(buf))); err != nil { return errors.Wrapf(err, "%s: manifest validation failed", path) } @@ -240,3 +240,34 @@ loop: } return nil } + +// ValidateManifestMediaType validate the manifest schema media-type +// and its descendants fields media type, such as config and layers, +// to make sure they match to spec definition, or returns an error if +// the validation failed. +func ValidateManifestMediaType(r io.ReadCloser) error { + header := v1.Manifest{} + defer r.Close() + + buf, err := ioutil.ReadAll(r) + if err != nil { + return errors.Wrapf(err, "error reading the io stream") + } + + err = json.NewDecoder(bytes.NewReader(buf)).Decode(&header) + if err != nil { + return errors.Wrap(err, "manifest format mismatch") + } + + if header.Config.MediaType != string(v1.MediaTypeImageConfig) { + return fmt.Errorf("illegal config mediaType: %s", header.Config.MediaType) + } + + for _, layer := range header.Layers { + if layer.MediaType != string(v1.MediaTypeImageLayer) { + return fmt.Errorf("illegal layer mediaType: %s", layer.MediaType) + } + } + + return schema.MediaTypeManifest.Validate(bytes.NewReader(buf)) +}