zotregistry.io/zot@v1.4.4-0.20231124084042-02a8ed785457/pkg/storage/local/local_elevated_test.go (about) 1 //go:build needprivileges 2 // +build needprivileges 3 4 package local_test 5 6 import ( 7 "bytes" 8 _ "crypto/sha256" 9 "os" 10 "os/exec" 11 "path" 12 "strings" 13 "testing" 14 15 godigest "github.com/opencontainers/go-digest" 16 "github.com/rs/zerolog" 17 . "github.com/smartystreets/goconvey/convey" 18 19 "zotregistry.io/zot/pkg/extensions/monitoring" 20 "zotregistry.io/zot/pkg/log" 21 "zotregistry.io/zot/pkg/storage" 22 "zotregistry.io/zot/pkg/storage/cache" 23 "zotregistry.io/zot/pkg/storage/local" 24 ) 25 26 func TestElevatedPrivilegesInvalidDedupe(t *testing.T) { 27 Convey("Invalid dedupe scenarios", t, func() { 28 dir := t.TempDir() 29 30 log := log.Logger{Logger: zerolog.New(os.Stdout)} 31 metrics := monitoring.NewMetricsServer(false, log) 32 33 cacheDriver, _ := storage.Create("boltdb", cache.BoltDBDriverParameters{ 34 RootDir: dir, 35 Name: "cache", 36 UseRelPaths: true, 37 }, log) 38 imgStore := local.NewImageStore(dir, true, true, log, metrics, nil, cacheDriver) 39 40 upload, err := imgStore.NewBlobUpload("dedupe1") 41 So(err, ShouldBeNil) 42 So(upload, ShouldNotBeEmpty) 43 44 content := []byte("test-data3") 45 buf := bytes.NewBuffer(content) 46 buflen := buf.Len() 47 digest := godigest.FromBytes(content) 48 blob, err := imgStore.PutBlobChunkStreamed("dedupe1", upload, buf) 49 So(err, ShouldBeNil) 50 So(blob, ShouldEqual, buflen) 51 52 blobDigest1 := strings.Split(digest.String(), ":")[1] 53 So(blobDigest1, ShouldNotBeEmpty) 54 55 err = imgStore.FinishBlobUpload("dedupe1", upload, buf, digest) 56 So(err, ShouldBeNil) 57 So(blob, ShouldEqual, buflen) 58 59 // Create a file at the same place where FinishBlobUpload will create 60 err = imgStore.InitRepo("dedupe2") 61 So(err, ShouldBeNil) 62 63 err = os.MkdirAll(path.Join(dir, "dedupe2", "blobs/sha256"), 0o755) 64 if err != nil { 65 panic(err) 66 } 67 68 err = os.WriteFile(path.Join(dir, "dedupe2", "blobs/sha256", blobDigest1), content, 0o755) //nolint: gosec 69 if err != nil { 70 panic(err) 71 } 72 73 upload, err = imgStore.NewBlobUpload("dedupe2") 74 So(err, ShouldBeNil) 75 So(upload, ShouldNotBeEmpty) 76 77 content = []byte("test-data3") 78 buf = bytes.NewBuffer(content) 79 buflen = buf.Len() 80 digest = godigest.FromBytes(content) 81 blob, err = imgStore.PutBlobChunkStreamed("dedupe2", upload, buf) 82 So(err, ShouldBeNil) 83 So(blob, ShouldEqual, buflen) 84 85 cmd := exec.Command("chattr", "+i", path.Join(dir, "dedupe2", "blobs/sha256", blobDigest1)) //nolint: gosec 86 _, err = cmd.Output() 87 if err != nil { 88 panic(err) 89 } 90 91 err = imgStore.FinishBlobUpload("dedupe2", upload, buf, digest) 92 So(err, ShouldNotBeNil) 93 So(blob, ShouldEqual, buflen) 94 95 cmd = exec.Command("chattr", "-i", path.Join(dir, "dedupe2", "blobs/sha256", blobDigest1)) //nolint: gosec 96 _, err = cmd.Output() 97 if err != nil { 98 panic(err) 99 } 100 101 err = imgStore.FinishBlobUpload("dedupe2", upload, buf, digest) 102 So(err, ShouldBeNil) 103 So(blob, ShouldEqual, buflen) 104 }) 105 }