mirror of https://github.com/minio/minio.git
				
				
				
			Context based AccessKey passing (#10615)
A new field called AccessKey is added to the ReqInfo struct and populated. Because ReqInfo is added to the context, this allows the AccessKey to be accessed from 3rd-party code, such as a custom ObjectLayer. Co-authored-by: Harshavardhana <harsha@minio.io> Co-authored-by: Kaloyan Raev <kaloyan@storj.io>
This commit is contained in:
		
							parent
							
								
									3b88a646ec
								
							
						
					
					
						commit
						4a1efabda4
					
				|  | @ -333,6 +333,9 @@ func checkRequestAuthTypeToAccessKey(ctx context.Context, r *http.Request, actio | |||
| 		// Populate payload again to handle it in HTTP handler.
 | ||||
| 		r.Body = ioutil.NopCloser(bytes.NewReader(payload)) | ||||
| 	} | ||||
| 	if cred.AccessKey != "" { | ||||
| 		logger.GetReqInfo(ctx).AccessKey = cred.AccessKey | ||||
| 	} | ||||
| 
 | ||||
| 	if action != policy.ListAllMyBucketsAction && cred.AccessKey == "" { | ||||
| 		// Anonymous checks are not meant for ListBuckets action
 | ||||
|  | @ -616,7 +619,7 @@ func isPutRetentionAllowed(bucketName, objectName string, retDays int, retDate t | |||
| // isPutActionAllowed - check if PUT operation is allowed on the resource, this
 | ||||
| // call verifies bucket policies and IAM policies, supports multi user
 | ||||
| // checks etc.
 | ||||
| func isPutActionAllowed(atype authType, bucketName, objectName string, r *http.Request, action iampolicy.Action) (s3Err APIErrorCode) { | ||||
| func isPutActionAllowed(ctx context.Context, atype authType, bucketName, objectName string, r *http.Request, action iampolicy.Action) (s3Err APIErrorCode) { | ||||
| 	var cred auth.Credentials | ||||
| 	var owner bool | ||||
| 	switch atype { | ||||
|  | @ -637,6 +640,10 @@ func isPutActionAllowed(atype authType, bucketName, objectName string, r *http.R | |||
| 		return s3Err | ||||
| 	} | ||||
| 
 | ||||
| 	if cred.AccessKey != "" { | ||||
| 		logger.GetReqInfo(ctx).AccessKey = cred.AccessKey | ||||
| 	} | ||||
| 
 | ||||
| 	// Do not check for PutObjectRetentionAction permission,
 | ||||
| 	// if mode and retain until date are not set.
 | ||||
| 	// Can happen when bucket has default lock config set
 | ||||
|  |  | |||
|  | @ -383,6 +383,10 @@ func (api objectAPIHandlers) DeleteMultipleObjectsHandler(w http.ResponseWriter, | |||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// Call checkRequestAuthType to populate ReqInfo.AccessKey before GetBucketInfo()
 | ||||
| 	// Ignore errors here to preserve the S3 error behavior of GetBucketInfo()
 | ||||
| 	checkRequestAuthType(ctx, r, policy.DeleteObjectAction, bucket, "") | ||||
| 
 | ||||
| 	// Before proceeding validate if bucket exists.
 | ||||
| 	_, err := objectAPI.GetBucketInfo(ctx, bucket) | ||||
| 	if err != nil { | ||||
|  |  | |||
|  | @ -88,7 +88,7 @@ func mustReplicateWeb(ctx context.Context, r *http.Request, bucket, object strin | |||
| 
 | ||||
| // mustReplicate returns true if object meets replication criteria.
 | ||||
| func mustReplicate(ctx context.Context, r *http.Request, bucket, object string, meta map[string]string, replStatus string) bool { | ||||
| 	if s3Err := isPutActionAllowed(getRequestAuthType(r), bucket, "", r, iampolicy.GetReplicationConfigurationAction); s3Err != ErrNone { | ||||
| 	if s3Err := isPutActionAllowed(ctx, getRequestAuthType(r), bucket, "", r, iampolicy.GetReplicationConfigurationAction); s3Err != ErrNone { | ||||
| 		return false | ||||
| 	} | ||||
| 	return mustReplicater(ctx, r, bucket, object, meta, replStatus) | ||||
|  |  | |||
|  | @ -43,6 +43,7 @@ type ReqInfo struct { | |||
| 	API          string   // API name - GetObject PutObject NewMultipartUpload etc.
 | ||||
| 	BucketName   string   // Bucket name
 | ||||
| 	ObjectName   string   // Object name
 | ||||
| 	AccessKey    string   // Access Key
 | ||||
| 	tags         []KeyVal // Any additional info not accommodated by above fields
 | ||||
| 	sync.RWMutex | ||||
| } | ||||
|  |  | |||
|  | @ -1159,8 +1159,8 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re | |||
| 	srcInfo.UserDefined = filterReplicationStatusMetadata(srcInfo.UserDefined) | ||||
| 
 | ||||
| 	srcInfo.UserDefined = objectlock.FilterObjectLockMetadata(srcInfo.UserDefined, true, true) | ||||
| 	retPerms := isPutActionAllowed(getRequestAuthType(r), dstBucket, dstObject, r, iampolicy.PutObjectRetentionAction) | ||||
| 	holdPerms := isPutActionAllowed(getRequestAuthType(r), dstBucket, dstObject, r, iampolicy.PutObjectLegalHoldAction) | ||||
| 	retPerms := isPutActionAllowed(ctx, getRequestAuthType(r), dstBucket, dstObject, r, iampolicy.PutObjectRetentionAction) | ||||
| 	holdPerms := isPutActionAllowed(ctx, getRequestAuthType(r), dstBucket, dstObject, r, iampolicy.PutObjectLegalHoldAction) | ||||
| 
 | ||||
| 	getObjectInfo := objectAPI.GetObjectInfo | ||||
| 	if api.CacheAPI() != nil { | ||||
|  | @ -1403,7 +1403,7 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req | |||
| 	reader = r.Body | ||||
| 
 | ||||
| 	// Check if put is allowed
 | ||||
| 	if s3Err = isPutActionAllowed(rAuthType, bucket, object, r, iampolicy.PutObjectAction); s3Err != ErrNone { | ||||
| 	if s3Err = isPutActionAllowed(ctx, rAuthType, bucket, object, r, iampolicy.PutObjectAction); s3Err != ErrNone { | ||||
| 		writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Err), r.URL, guessIsBrowserReq(r)) | ||||
| 		return | ||||
| 	} | ||||
|  | @ -1488,8 +1488,8 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req | |||
| 		putObject = api.CacheAPI().PutObject | ||||
| 	} | ||||
| 
 | ||||
| 	retPerms := isPutActionAllowed(getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectRetentionAction) | ||||
| 	holdPerms := isPutActionAllowed(getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectLegalHoldAction) | ||||
| 	retPerms := isPutActionAllowed(ctx, getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectRetentionAction) | ||||
| 	holdPerms := isPutActionAllowed(ctx, getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectLegalHoldAction) | ||||
| 
 | ||||
| 	getObjectInfo := objectAPI.GetObjectInfo | ||||
| 	if api.CacheAPI() != nil { | ||||
|  | @ -1512,7 +1512,7 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req | |||
| 		metadata[xhttp.AmzBucketReplicationStatus] = replication.Pending.String() | ||||
| 	} | ||||
| 	if r.Header.Get(xhttp.AmzBucketReplicationStatus) == replication.Replica.String() { | ||||
| 		if s3Err = isPutActionAllowed(getRequestAuthType(r), bucket, object, r, iampolicy.ReplicateObjectAction); s3Err != ErrNone { | ||||
| 		if s3Err = isPutActionAllowed(ctx, getRequestAuthType(r), bucket, object, r, iampolicy.ReplicateObjectAction); s3Err != ErrNone { | ||||
| 			writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Err), r.URL, guessIsBrowserReq(r)) | ||||
| 			return | ||||
| 		} | ||||
|  | @ -1668,8 +1668,8 @@ func (api objectAPIHandlers) NewMultipartUploadHandler(w http.ResponseWriter, r | |||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	retPerms := isPutActionAllowed(getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectRetentionAction) | ||||
| 	holdPerms := isPutActionAllowed(getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectLegalHoldAction) | ||||
| 	retPerms := isPutActionAllowed(ctx, getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectRetentionAction) | ||||
| 	holdPerms := isPutActionAllowed(ctx, getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectLegalHoldAction) | ||||
| 
 | ||||
| 	getObjectInfo := objectAPI.GetObjectInfo | ||||
| 	if api.CacheAPI() != nil { | ||||
|  | @ -2134,7 +2134,7 @@ func (api objectAPIHandlers) PutObjectPartHandler(w http.ResponseWriter, r *http | |||
| 		s3Error   APIErrorCode | ||||
| 	) | ||||
| 	reader = r.Body | ||||
| 	if s3Error = isPutActionAllowed(rAuthType, bucket, object, r, iampolicy.PutObjectAction); s3Error != ErrNone { | ||||
| 	if s3Error = isPutActionAllowed(ctx, rAuthType, bucket, object, r, iampolicy.PutObjectAction); s3Error != ErrNone { | ||||
| 		writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL, guessIsBrowserReq(r)) | ||||
| 		return | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue