Merge pull request #3933 from amarkdotdev/fix/imagetools-create-descriptor-validation

imagetools: validate descriptor input for create -f
This commit is contained in:
Tõnis Tiigi
2026-07-07 14:23:05 -07:00
committed by GitHub
2 changed files with 49 additions and 3 deletions
+22 -3
View File
@@ -353,11 +353,30 @@ func parseSource(in string) (*imagetools.Source, error) {
return nil, err
}
var s imagetools.Source
if err := json.Unmarshal([]byte(in), &s.Desc); err != nil {
var parsed struct {
SchemaVersion int `json:"schemaVersion"`
ocispecs.Descriptor
}
if err := json.Unmarshal([]byte(in), &parsed); err != nil {
return nil, errors.WithStack(err)
}
return &s, nil
if err := validateDescriptor(parsed.Descriptor, parsed.SchemaVersion); err != nil {
return nil, err
}
return &imagetools.Source{Desc: parsed.Descriptor}, nil
}
func validateDescriptor(desc ocispecs.Descriptor, schemaVersion int) error {
if schemaVersion != 0 {
return errors.Errorf("expected an OCI content descriptor, got a manifest or index (schemaVersion %d)", schemaVersion)
}
if desc.Digest == "" {
return errors.Errorf("invalid descriptor: digest is required")
}
if _, err := digest.Parse(desc.Digest.String()); err != nil {
return errors.Wrap(err, "invalid descriptor digest")
}
return nil
}
func createCmd(dockerCli command.Cli, opts RootOptions) *cobra.Command {
+27
View File
@@ -0,0 +1,27 @@
package commands
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestParseSourceDescriptorValidation(t *testing.T) {
t.Parallel()
_, err := parseSource(`{"schemaVersion":2,"mediaType":"application/vnd.docker.distribution.manifest.list.v2+json","manifests":[]}`)
require.Error(t, err)
require.Contains(t, err.Error(), "expected an OCI content descriptor")
_, err = parseSource(`{"mediaType":"application/vnd.oci.image.manifest.v1+json"}`)
require.Error(t, err)
require.Contains(t, err.Error(), "digest is required")
_, err = parseSource(`{"digest":"not-a-digest","mediaType":"application/vnd.oci.image.manifest.v1+json","size":123}`)
require.Error(t, err)
require.Contains(t, err.Error(), "invalid descriptor digest")
src, err := parseSource(`{"digest":"sha256:0000000000000000000000000000000000000000000000000000000000000000","mediaType":"application/vnd.oci.image.manifest.v1+json","size":123}`)
require.NoError(t, err)
require.Equal(t, "sha256:0000000000000000000000000000000000000000000000000000000000000000", src.Desc.Digest.String())
}