You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							709 lines
						
					
					
						
							19 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							709 lines
						
					
					
						
							19 KiB
						
					
					
				| package s3api | |
| 
 | |
| import ( | |
| 	"bytes" | |
| 	"encoding/json" | |
| 	"github.com/aws/aws-sdk-go/aws" | |
| 	"github.com/aws/aws-sdk-go/service/s3" | |
| 	"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" | |
| 	"github.com/seaweedfs/seaweedfs/weed/pb/iam_pb" | |
| 	"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants" | |
| 	"github.com/seaweedfs/seaweedfs/weed/s3api/s3err" | |
| 	"io" | |
| 	"net/http" | |
| 	"testing" | |
| ) | |
| 
 | |
| 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", | |
| 			}, | |
| 		}, | |
| 	}) | |
| } | |
| 
 | |
| func TestGetAccountId(t *testing.T) { | |
| 	req := &http.Request{ | |
| 		Header: make(map[string][]string), | |
| 	} | |
| 	//case1 | |
| 	//accountId: "admin" | |
| 	req.Header.Set(s3_constants.AmzAccountId, s3_constants.AccountAdminId) | |
| 	if GetAccountId(req) != s3_constants.AccountAdminId { | |
| 		t.Fatal("expect accountId: admin") | |
| 	} | |
| 
 | |
| 	//case2 | |
| 	//accountId: "anoymous" | |
| 	req.Header.Set(s3_constants.AmzAccountId, s3_constants.AccountAnonymousId) | |
| 	if GetAccountId(req) != s3_constants.AccountAnonymousId { | |
| 		t.Fatal("expect accountId: anonymous") | |
| 	} | |
| 
 | |
| 	//case3 | |
| 	//accountId is nil => "anonymous" | |
| 	req.Header.Del(s3_constants.AmzAccountId) | |
| 	if GetAccountId(req) != s3_constants.AccountAnonymousId { | |
| 		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, | |
| 						ID:   aws.String(s3_constants.AccountAnonymousId), | |
| 					}, | |
| 					Permission: &s3_constants.PermissionFullControl, | |
| 				}, | |
| 				{ | |
| 					Grantee: &s3.Grantee{ | |
| 						Type: &s3_constants.GrantTypeCanonicalUser, | |
| 						ID:   aws.String(s3_constants.AccountAdminId), | |
| 					}, | |
| 					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 | |
| 		accountId := s3_constants.AccountAnonymousId | |
| 		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" | |
| 
 | |
| 	//case1 | |
| 	//assemble with non-empty grants | |
| 	expectOwner := "accountS" | |
| 	expectGrants := []*s3.Grant{ | |
| 		{ | |
| 			Permission: &s3_constants.PermissionRead, | |
| 			Grantee: &s3.Grantee{ | |
| 				Type: &s3_constants.GrantTypeGroup, | |
| 				ID:   aws.String(s3_constants.AccountAdminId), | |
| 				URI:  &s3_constants.GranteeGroupAllUsers, | |
| 			}, | |
| 		}, | |
| 	} | |
| 	entry := &filer_pb.Entry{} | |
| 	AssembleEntryWithAcp(entry, expectOwner, expectGrants) | |
| 
 | |
| 	resultOwner := GetAcpOwner(entry.Extended, defaultOwner) | |
| 	if resultOwner != expectOwner { | |
| 		t.Fatalf("owner not expect") | |
| 	} | |
| 
 | |
| 	resultGrants := GetAcpGrants(entry.Extended) | |
| 	if !grantsEquals(resultGrants, expectGrants) { | |
| 		t.Fatal("grants not expect") | |
| 	} | |
| 
 | |
| 	//case2 | |
| 	//assemble with empty grants (override) | |
| 	AssembleEntryWithAcp(entry, "", nil) | |
| 	resultOwner = GetAcpOwner(entry.Extended, defaultOwner) | |
| 	if resultOwner != defaultOwner { | |
| 		t.Fatalf("owner not expect") | |
| 	} | |
| 
 | |
| 	resultGrants = GetAcpGrants(entry.Extended) | |
| 	if len(resultGrants) != 0 { | |
| 		t.Fatal("grants not expect") | |
| 	} | |
| 
 | |
| } | |
| 
 | |
| 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{ | |
| 				ID: aws.String(s3_constants.AccountAdminId), | |
| 				//EmailAddress: &s3account.AccountAdmin.EmailAddress, | |
| 			}, | |
| 		}, &s3.Grant{ | |
| 			Permission: &s3_constants.PermissionRead, | |
| 			Grantee: &s3.Grantee{ | |
| 				ID: aws.String(s3_constants.AccountAdminId), | |
| 			}, | |
| 		}): 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, | |
| 				ID:   aws.String(s3_constants.AccountAdminId), | |
| 			}, | |
| 		}, &s3.Grant{ | |
| 			Permission: &s3_constants.PermissionRead, | |
| 			Grantee: &s3.Grantee{ | |
| 				Type: &s3_constants.GrantTypeGroup, | |
| 				ID:   aws.String(s3_constants.AccountAdminId), | |
| 			}, | |
| 		}): true, | |
| 
 | |
| 		GrantEquals(&s3.Grant{ | |
| 			Permission: &s3_constants.PermissionRead, | |
| 			Grantee: &s3.Grantee{ | |
| 				Type: &s3_constants.GrantTypeGroup, | |
| 				ID:   aws.String(s3_constants.AccountAdminId), | |
| 				URI:  &s3_constants.GranteeGroupAllUsers, | |
| 			}, | |
| 		}, &s3.Grant{ | |
| 			Permission: &s3_constants.PermissionRead, | |
| 			Grantee: &s3.Grantee{ | |
| 				Type: &s3_constants.GrantTypeGroup, | |
| 				ID:   aws.String(s3_constants.AccountAdminId), | |
| 			}, | |
| 		}): false, | |
| 
 | |
| 		GrantEquals(&s3.Grant{ | |
| 			Permission: &s3_constants.PermissionRead, | |
| 			Grantee: &s3.Grantee{ | |
| 				Type: &s3_constants.GrantTypeGroup, | |
| 				ID:   aws.String(s3_constants.AccountAdminId), | |
| 				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, | |
| 				ID:   aws.String(s3_constants.AccountAdminId), | |
| 				URI:  &s3_constants.GranteeGroupAllUsers, | |
| 			}, | |
| 		}, | |
| 	} | |
| 	SetAcpGrantsHeader(req, grants) | |
| 
 | |
| 	grantsJson, _ := json.Marshal(grants) | |
| 	if req.Header.Get(s3_constants.ExtAmzAclKey) != string(grantsJson) { | |
| 		t.Fatalf("owner unexpect") | |
| 	} | |
| }
 |