Skip to content

Commit

Permalink
validate media type of manifest and its descendants
Browse files Browse the repository at this point in the history
migrate from opencontainers/image-spec/pull/273

Signed-off-by: xiekeyang <xiekeyang@huawei.com>
  • Loading branch information
xiekeyang committed Sep 20, 2016
1 parent 721ba58 commit 739f3ad
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
2 changes: 1 addition & 1 deletion cmd/oci-image-validate/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
33 changes: 32 additions & 1 deletion image/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down Expand Up @@ -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))
}

0 comments on commit 739f3ad

Please sign in to comment.