Merge pull request #3933 from amarkdotdev/fix/imagetools-create-descriptor-validation
imagetools: validate descriptor input for create -f
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
Reference in New Issue
Block a user