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.
 | 
							// Populate payload again to handle it in HTTP handler.
 | 
				
			||||||
		r.Body = ioutil.NopCloser(bytes.NewReader(payload))
 | 
							r.Body = ioutil.NopCloser(bytes.NewReader(payload))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if cred.AccessKey != "" {
 | 
				
			||||||
 | 
							logger.GetReqInfo(ctx).AccessKey = cred.AccessKey
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if action != policy.ListAllMyBucketsAction && cred.AccessKey == "" {
 | 
						if action != policy.ListAllMyBucketsAction && cred.AccessKey == "" {
 | 
				
			||||||
		// Anonymous checks are not meant for ListBuckets action
 | 
							// 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
 | 
					// isPutActionAllowed - check if PUT operation is allowed on the resource, this
 | 
				
			||||||
// call verifies bucket policies and IAM policies, supports multi user
 | 
					// call verifies bucket policies and IAM policies, supports multi user
 | 
				
			||||||
// checks etc.
 | 
					// 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 cred auth.Credentials
 | 
				
			||||||
	var owner bool
 | 
						var owner bool
 | 
				
			||||||
	switch atype {
 | 
						switch atype {
 | 
				
			||||||
| 
						 | 
					@ -637,6 +640,10 @@ func isPutActionAllowed(atype authType, bucketName, objectName string, r *http.R
 | 
				
			||||||
		return s3Err
 | 
							return s3Err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if cred.AccessKey != "" {
 | 
				
			||||||
 | 
							logger.GetReqInfo(ctx).AccessKey = cred.AccessKey
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Do not check for PutObjectRetentionAction permission,
 | 
						// Do not check for PutObjectRetentionAction permission,
 | 
				
			||||||
	// if mode and retain until date are not set.
 | 
						// if mode and retain until date are not set.
 | 
				
			||||||
	// Can happen when bucket has default lock config set
 | 
						// Can happen when bucket has default lock config set
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -383,6 +383,10 @@ func (api objectAPIHandlers) DeleteMultipleObjectsHandler(w http.ResponseWriter,
 | 
				
			||||||
		return
 | 
							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.
 | 
						// Before proceeding validate if bucket exists.
 | 
				
			||||||
	_, err := objectAPI.GetBucketInfo(ctx, bucket)
 | 
						_, err := objectAPI.GetBucketInfo(ctx, bucket)
 | 
				
			||||||
	if err != nil {
 | 
						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.
 | 
					// 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 {
 | 
					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 false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return mustReplicater(ctx, r, bucket, object, meta, replStatus)
 | 
						return mustReplicater(ctx, r, bucket, object, meta, replStatus)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,6 +43,7 @@ type ReqInfo struct {
 | 
				
			||||||
	API          string   // API name - GetObject PutObject NewMultipartUpload etc.
 | 
						API          string   // API name - GetObject PutObject NewMultipartUpload etc.
 | 
				
			||||||
	BucketName   string   // Bucket name
 | 
						BucketName   string   // Bucket name
 | 
				
			||||||
	ObjectName   string   // Object name
 | 
						ObjectName   string   // Object name
 | 
				
			||||||
 | 
						AccessKey    string   // Access Key
 | 
				
			||||||
	tags         []KeyVal // Any additional info not accommodated by above fields
 | 
						tags         []KeyVal // Any additional info not accommodated by above fields
 | 
				
			||||||
	sync.RWMutex
 | 
						sync.RWMutex
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1159,8 +1159,8 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re
 | 
				
			||||||
	srcInfo.UserDefined = filterReplicationStatusMetadata(srcInfo.UserDefined)
 | 
						srcInfo.UserDefined = filterReplicationStatusMetadata(srcInfo.UserDefined)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	srcInfo.UserDefined = objectlock.FilterObjectLockMetadata(srcInfo.UserDefined, true, true)
 | 
						srcInfo.UserDefined = objectlock.FilterObjectLockMetadata(srcInfo.UserDefined, true, true)
 | 
				
			||||||
	retPerms := isPutActionAllowed(getRequestAuthType(r), dstBucket, dstObject, r, iampolicy.PutObjectRetentionAction)
 | 
						retPerms := isPutActionAllowed(ctx, getRequestAuthType(r), dstBucket, dstObject, r, iampolicy.PutObjectRetentionAction)
 | 
				
			||||||
	holdPerms := isPutActionAllowed(getRequestAuthType(r), dstBucket, dstObject, r, iampolicy.PutObjectLegalHoldAction)
 | 
						holdPerms := isPutActionAllowed(ctx, getRequestAuthType(r), dstBucket, dstObject, r, iampolicy.PutObjectLegalHoldAction)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	getObjectInfo := objectAPI.GetObjectInfo
 | 
						getObjectInfo := objectAPI.GetObjectInfo
 | 
				
			||||||
	if api.CacheAPI() != nil {
 | 
						if api.CacheAPI() != nil {
 | 
				
			||||||
| 
						 | 
					@ -1403,7 +1403,7 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req
 | 
				
			||||||
	reader = r.Body
 | 
						reader = r.Body
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check if put is allowed
 | 
						// 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))
 | 
							writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Err), r.URL, guessIsBrowserReq(r))
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1488,8 +1488,8 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req
 | 
				
			||||||
		putObject = api.CacheAPI().PutObject
 | 
							putObject = api.CacheAPI().PutObject
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	retPerms := isPutActionAllowed(getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectRetentionAction)
 | 
						retPerms := isPutActionAllowed(ctx, getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectRetentionAction)
 | 
				
			||||||
	holdPerms := isPutActionAllowed(getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectLegalHoldAction)
 | 
						holdPerms := isPutActionAllowed(ctx, getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectLegalHoldAction)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	getObjectInfo := objectAPI.GetObjectInfo
 | 
						getObjectInfo := objectAPI.GetObjectInfo
 | 
				
			||||||
	if api.CacheAPI() != nil {
 | 
						if api.CacheAPI() != nil {
 | 
				
			||||||
| 
						 | 
					@ -1512,7 +1512,7 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req
 | 
				
			||||||
		metadata[xhttp.AmzBucketReplicationStatus] = replication.Pending.String()
 | 
							metadata[xhttp.AmzBucketReplicationStatus] = replication.Pending.String()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if r.Header.Get(xhttp.AmzBucketReplicationStatus) == replication.Replica.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))
 | 
								writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Err), r.URL, guessIsBrowserReq(r))
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -1668,8 +1668,8 @@ func (api objectAPIHandlers) NewMultipartUploadHandler(w http.ResponseWriter, r
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	retPerms := isPutActionAllowed(getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectRetentionAction)
 | 
						retPerms := isPutActionAllowed(ctx, getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectRetentionAction)
 | 
				
			||||||
	holdPerms := isPutActionAllowed(getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectLegalHoldAction)
 | 
						holdPerms := isPutActionAllowed(ctx, getRequestAuthType(r), bucket, object, r, iampolicy.PutObjectLegalHoldAction)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	getObjectInfo := objectAPI.GetObjectInfo
 | 
						getObjectInfo := objectAPI.GetObjectInfo
 | 
				
			||||||
	if api.CacheAPI() != nil {
 | 
						if api.CacheAPI() != nil {
 | 
				
			||||||
| 
						 | 
					@ -2134,7 +2134,7 @@ func (api objectAPIHandlers) PutObjectPartHandler(w http.ResponseWriter, r *http
 | 
				
			||||||
		s3Error   APIErrorCode
 | 
							s3Error   APIErrorCode
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	reader = r.Body
 | 
						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))
 | 
							writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL, guessIsBrowserReq(r))
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue