2023-09-25 23:34:12 +08:00
|
|
|
package s3api
|
2022-10-13 11:15:16 +08:00
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
2023-09-25 23:34:12 +08:00
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
2022-10-13 11:15:16 +08:00
|
|
|
"github.com/aws/aws-sdk-go/service/s3"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
2023-09-25 23:34:12 +08:00
|
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/iam_pb"
|
2022-10-13 11:15:16 +08:00
|
|
|
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2023-09-25 23:34:12 +08:00
|
|
|
var accountManager *IdentityAccessManagement
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
accountManager = &IdentityAccessManagement{}
|
|
|
|
_ = accountManager.loadS3ApiConfiguration(&iam_pb.S3ApiConfiguration{
|
|
|
|
Accounts: []*iam_pb.Account{
|
|
|
|
{
|
|
|
|
Id: "accountA",
|
|
|
|
DisplayName: "accountAName",
|
|
|
|
EmailAddress: "accountA@example.com",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Id: "accountB",
|
|
|
|
DisplayName: "accountBName",
|
|
|
|
EmailAddress: "accountB@example.com",
|
|
|
|
},
|
2022-10-13 11:15:16 +08:00
|
|
|
},
|
2023-09-25 23:34:12 +08:00
|
|
|
})
|
|
|
|
}
|
2022-10-13 11:15:16 +08:00
|
|
|
|
|
|
|
func TestGetAccountId(t *testing.T) {
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
//case1
|
|
|
|
//accountId: "admin"
|
2023-09-25 23:34:12 +08:00
|
|
|
req.Header.Set(s3_constants.AmzAccountId, s3_constants.AccountAdminId)
|
|
|
|
if GetAccountId(req) != s3_constants.AccountAdminId {
|
2022-10-13 11:15:16 +08:00
|
|
|
t.Fatal("expect accountId: admin")
|
|
|
|
}
|
|
|
|
|
|
|
|
//case2
|
|
|
|
//accountId: "anoymous"
|
2023-09-25 23:34:12 +08:00
|
|
|
req.Header.Set(s3_constants.AmzAccountId, s3_constants.AccountAnonymousId)
|
|
|
|
if GetAccountId(req) != s3_constants.AccountAnonymousId {
|
2022-10-13 11:15:16 +08:00
|
|
|
t.Fatal("expect accountId: anonymous")
|
|
|
|
}
|
|
|
|
|
|
|
|
//case3
|
|
|
|
//accountId is nil => "anonymous"
|
|
|
|
req.Header.Del(s3_constants.AmzAccountId)
|
2023-09-25 23:34:12 +08:00
|
|
|
if GetAccountId(req) != s3_constants.AccountAnonymousId {
|
2022-10-13 11:15:16 +08:00
|
|
|
t.Fatal("expect accountId: anonymous")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestExtractAcl(t *testing.T) {
|
|
|
|
type Case struct {
|
|
|
|
id int
|
|
|
|
resultErrCode, expectErrCode s3err.ErrorCode
|
|
|
|
resultGrants, expectGrants []*s3.Grant
|
|
|
|
}
|
|
|
|
testCases := make([]*Case, 0)
|
|
|
|
accountAdminId := "admin"
|
|
|
|
{
|
|
|
|
//case1 (good case)
|
|
|
|
//parse acp from request body
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
req.Body = io.NopCloser(bytes.NewReader([]byte(`
|
|
|
|
<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
|
|
|
<Owner>
|
|
|
|
<ID>admin</ID>
|
|
|
|
<DisplayName>admin</DisplayName>
|
|
|
|
</Owner>
|
|
|
|
<AccessControlList>
|
|
|
|
<Grant>
|
|
|
|
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
|
|
|
|
<ID>admin</ID>
|
|
|
|
</Grantee>
|
|
|
|
<Permission>FULL_CONTROL</Permission>
|
|
|
|
</Grant>
|
|
|
|
<Grant>
|
|
|
|
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
|
|
|
|
<URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
|
|
|
|
</Grantee>
|
|
|
|
<Permission>FULL_CONTROL</Permission>
|
|
|
|
</Grant>
|
|
|
|
</AccessControlList>
|
|
|
|
</AccessControlPolicy>
|
|
|
|
`)))
|
|
|
|
objectWriter := "accountA"
|
|
|
|
grants, errCode := ExtractAcl(req, accountManager, s3_constants.OwnershipObjectWriter, accountAdminId, accountAdminId, objectWriter)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
1,
|
|
|
|
errCode, s3err.ErrNone,
|
|
|
|
grants, []*s3.Grant{
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
|
|
|
ID: &accountAdminId,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
//case2 (good case)
|
|
|
|
//parse acp from header (cannedAcl)
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
req.Body = nil
|
|
|
|
req.Header.Set(s3_constants.AmzCannedAcl, s3_constants.CannedAclPrivate)
|
|
|
|
objectWriter := "accountA"
|
|
|
|
grants, errCode := ExtractAcl(req, accountManager, s3_constants.OwnershipObjectWriter, accountAdminId, accountAdminId, objectWriter)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
2,
|
|
|
|
errCode, s3err.ErrNone,
|
|
|
|
grants, []*s3.Grant{
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
|
|
|
ID: &objectWriter,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
//case3 (bad case)
|
|
|
|
//parse acp from request body (content is invalid)
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
req.Body = io.NopCloser(bytes.NewReader([]byte("zdfsaf")))
|
|
|
|
req.Header.Set(s3_constants.AmzCannedAcl, s3_constants.CannedAclPrivate)
|
|
|
|
objectWriter := "accountA"
|
|
|
|
_, errCode := ExtractAcl(req, accountManager, s3_constants.OwnershipObjectWriter, accountAdminId, accountAdminId, objectWriter)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
id: 3,
|
|
|
|
resultErrCode: errCode, expectErrCode: s3err.ErrInvalidRequest,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
//case4 (bad case)
|
|
|
|
//parse acp from header (cannedAcl is invalid)
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
req.Body = nil
|
|
|
|
req.Header.Set(s3_constants.AmzCannedAcl, "dfaksjfk")
|
|
|
|
objectWriter := "accountA"
|
|
|
|
_, errCode := ExtractAcl(req, accountManager, s3_constants.OwnershipObjectWriter, accountAdminId, "", objectWriter)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
id: 4,
|
|
|
|
resultErrCode: errCode, expectErrCode: s3err.ErrInvalidRequest,
|
|
|
|
})
|
|
|
|
|
|
|
|
{
|
|
|
|
//case5 (bad case)
|
|
|
|
//parse acp from request body: owner is inconsistent
|
|
|
|
req.Body = io.NopCloser(bytes.NewReader([]byte(`
|
|
|
|
<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
|
|
|
|
<Owner>
|
|
|
|
<ID>admin</ID>
|
|
|
|
<DisplayName>admin</DisplayName>
|
|
|
|
</Owner>
|
|
|
|
<AccessControlList>
|
|
|
|
<Grant>
|
|
|
|
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
|
|
|
|
<ID>admin</ID>
|
|
|
|
</Grantee>
|
|
|
|
<Permission>FULL_CONTROL</Permission>
|
|
|
|
</Grant>
|
|
|
|
<Grant>
|
|
|
|
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
|
|
|
|
<URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
|
|
|
|
</Grantee>
|
|
|
|
<Permission>FULL_CONTROL</Permission>
|
|
|
|
</Grant>
|
|
|
|
</AccessControlList>
|
|
|
|
</AccessControlPolicy>
|
|
|
|
`)))
|
|
|
|
objectWriter = "accountA"
|
|
|
|
_, errCode := ExtractAcl(req, accountManager, s3_constants.OwnershipObjectWriter, accountAdminId, objectWriter, objectWriter)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
id: 5,
|
|
|
|
resultErrCode: errCode, expectErrCode: s3err.ErrAccessDenied,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, tc := range testCases {
|
|
|
|
if tc.resultErrCode != tc.expectErrCode {
|
|
|
|
t.Fatalf("case[%d]: errorCode not expect", tc.id)
|
|
|
|
}
|
|
|
|
if !grantsEquals(tc.resultGrants, tc.expectGrants) {
|
|
|
|
t.Fatalf("case[%d]: grants not expect", tc.id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseAndValidateAclHeaders(t *testing.T) {
|
|
|
|
type Case struct {
|
|
|
|
id int
|
|
|
|
resultOwner, expectOwner string
|
|
|
|
resultErrCode, expectErrCode s3err.ErrorCode
|
|
|
|
resultGrants, expectGrants []*s3.Grant
|
|
|
|
}
|
|
|
|
testCases := make([]*Case, 0)
|
|
|
|
bucketOwner := "admin"
|
|
|
|
|
|
|
|
{
|
|
|
|
//case1 (good case)
|
|
|
|
//parse custom acl
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
objectWriter := "accountA"
|
|
|
|
req.Header.Set(s3_constants.AmzAclFullControl, `uri="http://acs.amazonaws.com/groups/global/AllUsers", id="anonymous", emailAddress="admin@example.com"`)
|
|
|
|
ownerId, grants, errCode := ParseAndValidateAclHeaders(req, accountManager, s3_constants.OwnershipObjectWriter, bucketOwner, objectWriter, false)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
1,
|
|
|
|
ownerId, objectWriter,
|
|
|
|
errCode, s3err.ErrNone,
|
|
|
|
grants, []*s3.Grant{
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAnonymousId),
|
2022-10-13 11:15:16 +08:00
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
2022-10-13 11:15:16 +08:00
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
{
|
|
|
|
//case2 (good case)
|
|
|
|
//parse canned acl (ownership=ObjectWriter)
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
objectWriter := "accountA"
|
|
|
|
req.Header.Set(s3_constants.AmzCannedAcl, s3_constants.CannedAclBucketOwnerFullControl)
|
|
|
|
ownerId, grants, errCode := ParseAndValidateAclHeaders(req, accountManager, s3_constants.OwnershipObjectWriter, bucketOwner, objectWriter, false)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
2,
|
|
|
|
ownerId, objectWriter,
|
|
|
|
errCode, s3err.ErrNone,
|
|
|
|
grants, []*s3.Grant{
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
|
|
|
ID: &objectWriter,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
|
|
|
ID: &bucketOwner,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
{
|
|
|
|
//case3 (good case)
|
|
|
|
//parse canned acl (ownership=OwnershipBucketOwnerPreferred)
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
objectWriter := "accountA"
|
|
|
|
req.Header.Set(s3_constants.AmzCannedAcl, s3_constants.CannedAclBucketOwnerFullControl)
|
|
|
|
ownerId, grants, errCode := ParseAndValidateAclHeaders(req, accountManager, s3_constants.OwnershipBucketOwnerPreferred, bucketOwner, objectWriter, false)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
3,
|
|
|
|
ownerId, bucketOwner,
|
|
|
|
errCode, s3err.ErrNone,
|
|
|
|
grants, []*s3.Grant{
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
|
|
|
ID: &bucketOwner,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
{
|
|
|
|
//case4 (bad case)
|
|
|
|
//parse custom acl (grantee id not exists)
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
objectWriter := "accountA"
|
|
|
|
req.Header.Set(s3_constants.AmzAclFullControl, `uri="http://acs.amazonaws.com/groups/global/AllUsers", id="notExistsAccount", emailAddress="admin@example.com"`)
|
|
|
|
_, _, errCode := ParseAndValidateAclHeaders(req, accountManager, s3_constants.OwnershipObjectWriter, bucketOwner, objectWriter, false)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
id: 4,
|
|
|
|
resultErrCode: errCode, expectErrCode: s3err.ErrInvalidRequest,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
//case5 (bad case)
|
|
|
|
//parse custom acl (invalid format)
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
objectWriter := "accountA"
|
|
|
|
req.Header.Set(s3_constants.AmzAclFullControl, `uri="http:sfasf"`)
|
|
|
|
_, _, errCode := ParseAndValidateAclHeaders(req, accountManager, s3_constants.OwnershipObjectWriter, bucketOwner, objectWriter, false)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
id: 5,
|
|
|
|
resultErrCode: errCode, expectErrCode: s3err.ErrInvalidRequest,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
//case6 (bad case)
|
|
|
|
//parse canned acl (invalid value)
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
objectWriter := "accountA"
|
|
|
|
req.Header.Set(s3_constants.AmzCannedAcl, `uri="http:sfasf"`)
|
|
|
|
_, _, errCode := ParseAndValidateAclHeaders(req, accountManager, s3_constants.OwnershipObjectWriter, bucketOwner, objectWriter, false)
|
|
|
|
testCases = append(testCases, &Case{
|
|
|
|
id: 5,
|
|
|
|
resultErrCode: errCode, expectErrCode: s3err.ErrInvalidRequest,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, tc := range testCases {
|
|
|
|
if tc.expectErrCode != tc.resultErrCode {
|
|
|
|
t.Errorf("case[%d]: errCode unexpect", tc.id)
|
|
|
|
}
|
|
|
|
if tc.resultOwner != tc.expectOwner {
|
|
|
|
t.Errorf("case[%d]: ownerId unexpect", tc.id)
|
|
|
|
}
|
|
|
|
if !grantsEquals(tc.resultGrants, tc.expectGrants) {
|
|
|
|
t.Fatalf("case[%d]: grants not expect", tc.id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func grantsEquals(a, b []*s3.Grant) bool {
|
|
|
|
if len(a) != len(b) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
for i, grant := range a {
|
|
|
|
if !GrantEquals(grant, b[i]) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDetermineReqGrants(t *testing.T) {
|
|
|
|
{
|
|
|
|
//case1: request account is anonymous
|
2023-09-25 23:34:12 +08:00
|
|
|
accountId := s3_constants.AccountAnonymousId
|
2022-10-13 11:15:16 +08:00
|
|
|
reqPermission := s3_constants.PermissionRead
|
|
|
|
|
|
|
|
resultGrants := DetermineReqGrants(accountId, reqPermission)
|
|
|
|
expectGrants := []*s3.Grant{
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
Permission: &reqPermission,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
|
|
|
ID: &accountId,
|
|
|
|
},
|
|
|
|
Permission: &reqPermission,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
|
|
|
ID: &accountId,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
if !grantsEquals(resultGrants, expectGrants) {
|
|
|
|
t.Fatalf("grants not expect")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
//case2: request account is not anonymous (Iam authed)
|
|
|
|
accountId := "accountX"
|
|
|
|
reqPermission := s3_constants.PermissionRead
|
|
|
|
|
|
|
|
resultGrants := DetermineReqGrants(accountId, reqPermission)
|
|
|
|
expectGrants := []*s3.Grant{
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
Permission: &reqPermission,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
|
|
|
ID: &accountId,
|
|
|
|
},
|
|
|
|
Permission: &reqPermission,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeCanonicalUser,
|
|
|
|
ID: &accountId,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAuthenticatedUsers,
|
|
|
|
},
|
|
|
|
Permission: &reqPermission,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAuthenticatedUsers,
|
|
|
|
},
|
|
|
|
Permission: &s3_constants.PermissionFullControl,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
if !grantsEquals(resultGrants, expectGrants) {
|
|
|
|
t.Fatalf("grants not expect")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestAssembleEntryWithAcp(t *testing.T) {
|
|
|
|
defaultOwner := "admin"
|
2022-10-14 13:50:44 +08:00
|
|
|
|
|
|
|
//case1
|
|
|
|
//assemble with non-empty grants
|
|
|
|
expectOwner := "accountS"
|
|
|
|
expectGrants := []*s3.Grant{
|
|
|
|
{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
2022-10-14 13:50:44 +08:00
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
2022-10-13 11:15:16 +08:00
|
|
|
},
|
2022-10-14 13:50:44 +08:00
|
|
|
},
|
|
|
|
}
|
|
|
|
entry := &filer_pb.Entry{}
|
|
|
|
AssembleEntryWithAcp(entry, expectOwner, expectGrants)
|
2022-10-13 11:15:16 +08:00
|
|
|
|
2022-10-14 13:50:44 +08:00
|
|
|
resultOwner := GetAcpOwner(entry.Extended, defaultOwner)
|
|
|
|
if resultOwner != expectOwner {
|
|
|
|
t.Fatalf("owner not expect")
|
|
|
|
}
|
2022-10-13 11:15:16 +08:00
|
|
|
|
2022-10-14 13:50:44 +08:00
|
|
|
resultGrants := GetAcpGrants(entry.Extended)
|
|
|
|
if !grantsEquals(resultGrants, expectGrants) {
|
|
|
|
t.Fatal("grants not expect")
|
2022-10-13 11:15:16 +08:00
|
|
|
}
|
|
|
|
|
2022-10-14 13:50:44 +08:00
|
|
|
//case2
|
|
|
|
//assemble with empty grants (override)
|
|
|
|
AssembleEntryWithAcp(entry, "", nil)
|
|
|
|
resultOwner = GetAcpOwner(entry.Extended, defaultOwner)
|
|
|
|
if resultOwner != defaultOwner {
|
|
|
|
t.Fatalf("owner not expect")
|
|
|
|
}
|
2022-10-13 11:15:16 +08:00
|
|
|
|
2022-10-14 13:50:44 +08:00
|
|
|
resultGrants = GetAcpGrants(entry.Extended)
|
|
|
|
if len(resultGrants) != 0 {
|
|
|
|
t.Fatal("grants not expect")
|
2022-10-13 11:15:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGrantEquals(t *testing.T) {
|
|
|
|
testCases := map[bool]bool{
|
|
|
|
GrantEquals(nil, nil): true,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{}, nil): false,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{}, &s3.Grant{}): true,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
}, &s3.Grant{}): false,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
}): true,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{},
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{},
|
|
|
|
}): true,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
},
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{},
|
|
|
|
}): false,
|
|
|
|
|
|
|
|
//type not present, compare other fields of grant is meaningless
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
|
|
|
//EmailAddress: &s3account.AccountAdmin.EmailAddress,
|
2022-10-13 11:15:16 +08:00
|
|
|
},
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
2022-10-13 11:15:16 +08:00
|
|
|
},
|
|
|
|
}): true,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
},
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
},
|
|
|
|
}): true,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
}): true,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionWrite,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
}): false,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
2022-10-13 11:15:16 +08:00
|
|
|
},
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
2022-10-13 11:15:16 +08:00
|
|
|
},
|
|
|
|
}): true,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
2022-10-13 11:15:16 +08:00
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
2022-10-13 11:15:16 +08:00
|
|
|
},
|
|
|
|
}): false,
|
|
|
|
|
|
|
|
GrantEquals(&s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
2022-10-13 11:15:16 +08:00
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
}, &s3.Grant{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
}): true,
|
|
|
|
}
|
|
|
|
|
|
|
|
for tc, expect := range testCases {
|
|
|
|
if tc != expect {
|
|
|
|
t.Fatal("TestGrantEquals not expect!")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSetAcpOwnerHeader(t *testing.T) {
|
|
|
|
ownerId := "accountZ"
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
SetAcpOwnerHeader(req, ownerId)
|
|
|
|
|
|
|
|
if req.Header.Get(s3_constants.ExtAmzOwnerKey) != ownerId {
|
|
|
|
t.Fatalf("owner unexpect")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSetAcpGrantsHeader(t *testing.T) {
|
|
|
|
req := &http.Request{
|
|
|
|
Header: make(map[string][]string),
|
|
|
|
}
|
|
|
|
grants := []*s3.Grant{
|
|
|
|
{
|
|
|
|
Permission: &s3_constants.PermissionRead,
|
|
|
|
Grantee: &s3.Grantee{
|
|
|
|
Type: &s3_constants.GrantTypeGroup,
|
2023-09-25 23:34:12 +08:00
|
|
|
ID: aws.String(s3_constants.AccountAdminId),
|
2022-10-13 11:15:16 +08:00
|
|
|
URI: &s3_constants.GranteeGroupAllUsers,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
SetAcpGrantsHeader(req, grants)
|
|
|
|
|
|
|
|
grantsJson, _ := json.Marshal(grants)
|
|
|
|
if req.Header.Get(s3_constants.ExtAmzAclKey) != string(grantsJson) {
|
|
|
|
t.Fatalf("owner unexpect")
|
|
|
|
}
|
|
|
|
}
|