github.com/antevens/oras@v0.8.1/pkg/oras/push_opts_test.go (about)

     1  package oras
     2  
     3  import (
     4  	"testing"
     5  
     6  	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
     7  	"github.com/stretchr/testify/suite"
     8  )
     9  
    10  type PushOptsSuite struct {
    11  	suite.Suite
    12  }
    13  
    14  func (suite *PushOptsSuite) TestValidateNameAsPath() {
    15  	var err error
    16  
    17  	// valid path
    18  	err = ValidateNameAsPath(descFromName("hello.txt"))
    19  	suite.NoError(err, "valid path")
    20  	err = ValidateNameAsPath(descFromName("foo/bar"))
    21  	suite.NoError(err, "valid path with multiple sub-directories")
    22  
    23  	// no empty name
    24  	err = ValidateNameAsPath(descFromName(""))
    25  	suite.Error(err, "empty path")
    26  
    27  	// path should be clean
    28  	err = ValidateNameAsPath(descFromName("./hello.txt"))
    29  	suite.Error(err, "dirty path")
    30  	err = ValidateNameAsPath(descFromName("foo/../bar"))
    31  	suite.Error(err, "dirty path")
    32  
    33  	// path should be slash-separated
    34  	err = ValidateNameAsPath(descFromName("foo\\bar"))
    35  	suite.Error(err, "path not slash separated")
    36  
    37  	// disallow absolute path
    38  	err = ValidateNameAsPath(descFromName("/foo/bar"))
    39  	suite.Error(err, "unix: absolute path disallowed")
    40  	err = ValidateNameAsPath(descFromName("C:\\foo\\bar"))
    41  	suite.Error(err, "windows: absolute path disallowed")
    42  	err = ValidateNameAsPath(descFromName("C:/foo/bar"))
    43  	suite.Error(err, "windows: absolute path disallowed")
    44  
    45  	// disallow path traversal
    46  	err = ValidateNameAsPath(descFromName(".."))
    47  	suite.Error(err, "path traversal disallowed")
    48  	err = ValidateNameAsPath(descFromName("../bar"))
    49  	suite.Error(err, "path traversal disallowed")
    50  	err = ValidateNameAsPath(descFromName("foo/../../bar"))
    51  	suite.Error(err, "path traversal disallowed")
    52  }
    53  
    54  func TestPushOptsSuite(t *testing.T) {
    55  	suite.Run(t, new(PushOptsSuite))
    56  }
    57  
    58  func descFromName(name string) ocispec.Descriptor {
    59  	return ocispec.Descriptor{
    60  		Annotations: map[string]string{
    61  			ocispec.AnnotationTitle: name,
    62  		},
    63  	}
    64  }