Skip to content

Commit 81182bf

Browse files
authored
Merge pull request from GHSA-28q9-9c3g-v3f9
* S3 gateway delete-objects should block unauthorized access * Test delete objects without credentials should fail * Add missing func
1 parent e7b5350 commit 81182bf

File tree

2 files changed

+64
-4
lines changed

2 files changed

+64
-4
lines changed

esti/delete_objects_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package esti
22

33
import (
4+
"net/http"
45
"strconv"
56
"testing"
67

78
"github.com/aws/aws-sdk-go/aws"
89
"github.com/aws/aws-sdk-go/service/s3"
910
"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"
1014
)
1115

1216
func TestDeleteObjects(t *testing.T) {
@@ -50,3 +54,53 @@ func TestDeleteObjects(t *testing.T) {
5054
assert.NoError(t, err)
5155
assert.Len(t, listOut.Contents, 0)
5256
}
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+
}

pkg/testutil/setup.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,13 @@ func SetupTestingEnv(params *SetupTestingEnvParams) (logging.Logger, api.ClientW
104104
logger.WithError(err).Fatal("could not initialize API client with security provider")
105105
}
106106

107+
key := viper.GetString("access_key_id")
108+
secret := viper.GetString("secret_access_key")
109+
svc := SetupTestS3Client(key, secret)
110+
return logger, client, svc
111+
}
112+
113+
func SetupTestS3Client(key, secret string) *s3.S3 {
107114
s3Endpoint := viper.GetString("s3_endpoint")
108115
awsSession := session.Must(session.NewSession())
109116
svc := s3.New(awsSession,
@@ -114,11 +121,10 @@ func SetupTestingEnv(params *SetupTestingEnvParams) (logging.Logger, api.ClientW
114121
WithCredentials(credentials.NewCredentials(
115122
&credentials.StaticProvider{
116123
Value: credentials.Value{
117-
AccessKeyID: viper.GetString("access_key_id"),
118-
SecretAccessKey: viper.GetString("secret_access_key"),
124+
AccessKeyID: key,
125+
SecretAccessKey: secret,
119126
}})))
120-
121-
return logger, client, svc
127+
return svc
122128
}
123129

124130
// ParseEndpointURL parses the given endpoint string

0 commit comments

Comments
 (0)