diff options
author | wxiaoguang <wxiaoguang@gmail.com> | 2025-06-21 00:27:35 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-21 00:27:35 +0800 |
commit | 719b151058a674ad14909d0bba75a88870727756 (patch) | |
tree | 63faf0e28e554e7c4be1c3ac33d365a8a114e199 /modules | |
parent | 4f32d3281218b34e1ddd1e571abd804e62319ff6 (diff) | |
download | gitea-719b151058a674ad14909d0bba75a88870727756.tar.gz gitea-719b151058a674ad14909d0bba75a88870727756.zip |
Fix OCI manifest parser (#34797)
Do not parse the media type we don't know.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/packages/container/metadata.go | 30 | ||||
-rw-r--r-- | modules/packages/container/metadata_test.go | 6 |
2 files changed, 26 insertions, 10 deletions
diff --git a/modules/packages/container/metadata.go b/modules/packages/container/metadata.go index 2fce7d976a..3ef0684d13 100644 --- a/modules/packages/container/metadata.go +++ b/modules/packages/container/metadata.go @@ -4,7 +4,6 @@ package container import ( - "errors" "fmt" "io" "strings" @@ -72,20 +71,39 @@ type Manifest struct { Size int64 `json:"size"` } +func IsMediaTypeValid(mt string) bool { + return strings.HasPrefix(mt, "application/vnd.docker.") || strings.HasPrefix(mt, "application/vnd.oci.") +} + +func IsMediaTypeImageManifest(mt string) bool { + return strings.EqualFold(mt, oci.MediaTypeImageManifest) || strings.EqualFold(mt, "application/vnd.docker.distribution.manifest.v2+json") +} + +func IsMediaTypeImageIndex(mt string) bool { + return strings.EqualFold(mt, oci.MediaTypeImageIndex) || strings.EqualFold(mt, "application/vnd.docker.distribution.manifest.list.v2+json") +} + // ParseImageConfig parses the metadata of an image config -func ParseImageConfig(mt string, r io.Reader) (*Metadata, error) { - if strings.EqualFold(mt, helm.ConfigMediaType) { +func ParseImageConfig(mediaType string, r io.Reader) (*Metadata, error) { + if strings.EqualFold(mediaType, helm.ConfigMediaType) { return parseHelmConfig(r) } // fallback to OCI Image Config - return parseOCIImageConfig(r) + // FIXME: this fallback is not right, we should strictly check the media type in the future + metadata, err := parseOCIImageConfig(r) + if err != nil { + if !IsMediaTypeImageManifest(mediaType) { + return &Metadata{Platform: "unknown/unknown"}, nil + } + return nil, err + } + return metadata, nil } func parseOCIImageConfig(r io.Reader) (*Metadata, error) { var image oci.Image - // EOF means empty input, still use the default data - if err := json.NewDecoder(r).Decode(&image); err != nil && !errors.Is(err, io.EOF) { + if err := json.NewDecoder(r).Decode(&image); err != nil { return nil, err } diff --git a/modules/packages/container/metadata_test.go b/modules/packages/container/metadata_test.go index 74b0a379c6..0f2d702925 100644 --- a/modules/packages/container/metadata_test.go +++ b/modules/packages/container/metadata_test.go @@ -59,10 +59,8 @@ func TestParseImageConfig(t *testing.T) { assert.ElementsMatch(t, []string{author}, metadata.Authors) assert.Equal(t, projectURL, metadata.ProjectURL) assert.Equal(t, repositoryURL, metadata.RepositoryURL) -} -func TestParseOCIImageConfig(t *testing.T) { - metadata, err := parseOCIImageConfig(strings.NewReader("")) + metadata, err = ParseImageConfig("anything-unknown", strings.NewReader("")) require.NoError(t, err) - assert.Equal(t, &Metadata{Type: TypeOCI, Platform: DefaultPlatform, ImageLayers: []string{}}, metadata) + assert.Equal(t, &Metadata{Platform: "unknown/unknown"}, metadata) } |