github.com/yimialmonte/fabric@v2.1.1+incompatible/core/container/externalbuilder/tar_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package externalbuilder_test 8 9 import ( 10 "io/ioutil" 11 "os" 12 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 16 "github.com/hyperledger/fabric/core/container/externalbuilder" 17 ) 18 19 var _ = Describe("Tar", func() { 20 Describe("Untar", func() { 21 var ( 22 dst string 23 ) 24 25 BeforeEach(func() { 26 var err error 27 dst, err = ioutil.TempDir("", "untar-test") 28 Expect(err).NotTo(HaveOccurred()) 29 }) 30 31 AfterEach(func() { 32 os.RemoveAll(dst) 33 }) 34 35 It("extracts a tar.gz to a destination", func() { 36 file, err := os.Open("testdata/normal_archive.tar.gz") 37 Expect(err).NotTo(HaveOccurred()) 38 defer file.Close() 39 err = externalbuilder.Untar(file, dst) 40 Expect(err).NotTo(HaveOccurred()) 41 }) 42 43 Context("when the archive conains an odd file type", func() { 44 It("returns an error", func() { 45 file, err := os.Open("testdata/archive_with_symlink.tar.gz") 46 defer file.Close() 47 Expect(err).NotTo(HaveOccurred()) 48 err = externalbuilder.Untar(file, dst) 49 Expect(err).To(MatchError("invalid file type '50' contained in archive for file 'c.file'")) 50 }) 51 }) 52 53 Context("when the archive contains absolute paths", func() { 54 It("returns an error", func() { 55 file, err := os.Open("testdata/archive_with_absolute.tar.gz") 56 Expect(err).NotTo(HaveOccurred()) 57 defer file.Close() 58 err = externalbuilder.Untar(file, dst) 59 Expect(err).To(MatchError("tar contains the absolute or escaping path '/home/yellickj/go/src/github.com/hyperledger/fabric/core/chaincode/externalbuilders/testdata/a/test.file'")) 60 }) 61 }) 62 63 Context("when the file's directory cannot be created", func() { 64 BeforeEach(func() { 65 ioutil.WriteFile(dst+"/a", []byte("test"), 0700) 66 }) 67 68 It("returns an error", func() { 69 file, err := os.Open("testdata/normal_archive.tar.gz") 70 Expect(err).NotTo(HaveOccurred()) 71 defer file.Close() 72 err = externalbuilder.Untar(file, dst) 73 Expect(err).To(MatchError(ContainSubstring("could not create directory 'a'"))) 74 }) 75 }) 76 77 Context("when the empty directory cannot be created", func() { 78 BeforeEach(func() { 79 ioutil.WriteFile(dst+"/d", []byte("test"), 0700) 80 }) 81 82 It("returns an error", func() { 83 file, err := os.Open("testdata/normal_archive.tar.gz") 84 Expect(err).NotTo(HaveOccurred()) 85 defer file.Close() 86 err = externalbuilder.Untar(file, dst) 87 Expect(err).To(MatchError(ContainSubstring("could not create directory 'd/'"))) 88 }) 89 }) 90 }) 91 92 Describe("ValidPath()", func() { 93 It("validates that a path is relative and a child", func() { 94 Expect(externalbuilder.ValidPath("a/simple/path")).To(BeTrue()) 95 Expect(externalbuilder.ValidPath("../path/to/parent")).To(BeFalse()) 96 Expect(externalbuilder.ValidPath("a/path/../with/intermediates")).To(BeTrue()) 97 Expect(externalbuilder.ValidPath("a/path/../../../with/toomanyintermediates")).To(BeFalse()) 98 Expect(externalbuilder.ValidPath("a/path/with/trailing/../..")).To(BeTrue()) 99 Expect(externalbuilder.ValidPath("a/path/with/toomanytrailing/../../../../..")).To(BeFalse()) 100 Expect(externalbuilder.ValidPath("..")).To(BeFalse()) 101 Expect(externalbuilder.ValidPath("../other")).To(BeFalse()) 102 Expect(externalbuilder.ValidPath("...")).To(BeTrue()) 103 Expect(externalbuilder.ValidPath("..foo")).To(BeTrue()) 104 Expect(externalbuilder.ValidPath("/an/absolute/path")).To(BeFalse()) 105 }) 106 }) 107 108 })