|
1 | 1 | package esti
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "net/http" |
4 | 5 | "strconv"
|
5 | 6 | "testing"
|
6 | 7 |
|
7 | 8 | "github.com/aws/aws-sdk-go/aws"
|
8 | 9 | "github.com/aws/aws-sdk-go/service/s3"
|
9 | 10 | "github.com/stretchr/testify/assert"
|
| 11 | + "github.com/stretchr/testify/require" |
| 12 | + "github.com/treeverse/lakefs/pkg/api" |
| 13 | + "github.com/treeverse/lakefs/pkg/testutil" |
10 | 14 | )
|
11 | 15 |
|
12 | 16 | func TestDeleteObjects(t *testing.T) {
|
@@ -50,3 +54,53 @@ func TestDeleteObjects(t *testing.T) {
|
50 | 54 | assert.NoError(t, err)
|
51 | 55 | assert.Len(t, listOut.Contents, 0)
|
52 | 56 | }
|
| 57 | + |
| 58 | +func TestDeleteObjects_Viewer(t *testing.T) { |
| 59 | + ctx, _, repo := setupTest(t) |
| 60 | + defer tearDownTest(repo) |
| 61 | + |
| 62 | + // setup data |
| 63 | + const filename = "delete-me" |
| 64 | + _, _ = uploadFileRandomData(ctx, t, repo, mainBranch, filename, false) |
| 65 | + |
| 66 | + // setup user with only view rights - create user, add to group, generate credentials |
| 67 | + uid := "del-viewer" |
| 68 | + resCreateUser, err := client.CreateUserWithResponse(ctx, api.CreateUserJSONRequestBody{ |
| 69 | + Id: uid, |
| 70 | + }) |
| 71 | + require.NoError(t, err, "Admin failed while creating user") |
| 72 | + require.Equal(t, http.StatusCreated, resCreateUser.StatusCode(), "Admin unexpectedly failed to create user") |
| 73 | + |
| 74 | + resAssociateUser, err := client.AddGroupMembershipWithResponse(ctx, "Viewers", "del-viewer") |
| 75 | + require.NoError(t, err, "Failed to add user to Viewers group") |
| 76 | + require.Equal(t, http.StatusCreated, resAssociateUser.StatusCode(), "AddGroupMembershipWithResponse unexpectedly status code") |
| 77 | + |
| 78 | + resCreateCreds, err := client.CreateCredentialsWithResponse(ctx, "del-viewer") |
| 79 | + require.NoError(t, err, "Failed to create credentials") |
| 80 | + require.Equal(t, http.StatusCreated, resCreateCreds.StatusCode(), "CreateCredentials unexpectedly status code") |
| 81 | + |
| 82 | + // client with viewer user credentials |
| 83 | + creds := resCreateCreds.JSON201 |
| 84 | + svcViewer := testutil.SetupTestS3Client(creds.AccessKeyId, creds.SecretAccessKey) |
| 85 | + |
| 86 | + // delete objects using viewer |
| 87 | + deleteOut, err := svcViewer.DeleteObjects(&s3.DeleteObjectsInput{ |
| 88 | + Bucket: aws.String(repo), |
| 89 | + Delete: &s3.Delete{ |
| 90 | + Objects: []*s3.ObjectIdentifier{{Key: api.StringPtr(mainBranch + "/" + filename)}}, |
| 91 | + }, |
| 92 | + }) |
| 93 | + // make sure we got an error we fail to delete the file |
| 94 | + assert.NoError(t, err) |
| 95 | + assert.Len(t, deleteOut.Errors, 1, "error we fail to delete") |
| 96 | + assert.Len(t, deleteOut.Deleted, 0, "no file should be deleted") |
| 97 | + |
| 98 | + // verify that viewer can't delete the file |
| 99 | + listOut, err := svc.ListObjects(&s3.ListObjectsInput{ |
| 100 | + Bucket: aws.String(repo), |
| 101 | + Prefix: aws.String(mainBranch + "/"), |
| 102 | + }) |
| 103 | + assert.NoError(t, err) |
| 104 | + assert.Len(t, listOut.Contents, 1, "list should find 'delete-me' file") |
| 105 | + assert.Equal(t, aws.StringValue(listOut.Contents[0].Key), mainBranch+"/"+filename) |
| 106 | +} |
0 commit comments