|
|
@ -79,35 +79,36 @@ func (api objectAPIHandlers) GetObjectHandler(w http.ResponseWriter, r *http.Req |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if s3Error := checkRequestAuthType(ctx, r, policy.GetObjectAction, bucket, object); s3Error != ErrNone { |
|
|
|
|
|
|
|
writeErrorResponse(w, s3Error, r.URL) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getObjectInfo := objectAPI.GetObjectInfo |
|
|
|
getObjectInfo := objectAPI.GetObjectInfo |
|
|
|
if api.CacheAPI() != nil { |
|
|
|
if api.CacheAPI() != nil { |
|
|
|
getObjectInfo = api.CacheAPI().GetObjectInfo |
|
|
|
getObjectInfo = api.CacheAPI().GetObjectInfo |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
objInfo, err := getObjectInfo(ctx, bucket, object) |
|
|
|
if s3Error := checkRequestAuthType(ctx, r, policy.GetObjectAction, bucket, object); s3Error != ErrNone { |
|
|
|
if err != nil { |
|
|
|
if getRequestAuthType(r) == authTypeAnonymous { |
|
|
|
apiErr := toAPIErrorCode(err) |
|
|
|
|
|
|
|
if apiErr == ErrNoSuchKey && getRequestAuthType(r) == authTypeAnonymous { |
|
|
|
|
|
|
|
// As per "Permission" section in https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html
|
|
|
|
// As per "Permission" section in https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html
|
|
|
|
// If the object you request does not exist, the error Amazon S3 returns depends on whether you also have the s3:ListBucket permission.
|
|
|
|
// If the object you request does not exist, the error Amazon S3 returns depends on whether you also have the s3:ListBucket permission.
|
|
|
|
// * If you have the s3:ListBucket permission on the bucket, Amazon S3 will return an HTTP status code 404 ("no such key") error.
|
|
|
|
// * If you have the s3:ListBucket permission on the bucket, Amazon S3 will return an HTTP status code 404 ("no such key") error.
|
|
|
|
// * if you don’t have the s3:ListBucket permission, Amazon S3 will return an HTTP status code 403 ("access denied") error.`
|
|
|
|
// * if you don’t have the s3:ListBucket permission, Amazon S3 will return an HTTP status code 403 ("access denied") error.`
|
|
|
|
if !globalPolicySys.IsAllowed(policy.Args{ |
|
|
|
if globalPolicySys.IsAllowed(policy.Args{ |
|
|
|
Action: policy.ListBucketAction, |
|
|
|
Action: policy.ListBucketAction, |
|
|
|
BucketName: bucket, |
|
|
|
BucketName: bucket, |
|
|
|
ConditionValues: getConditionValues(r, ""), |
|
|
|
ConditionValues: getConditionValues(r, ""), |
|
|
|
IsOwner: false, |
|
|
|
IsOwner: false, |
|
|
|
}) { |
|
|
|
}) { |
|
|
|
apiErr = ErrAccessDenied |
|
|
|
_, err := getObjectInfo(ctx, bucket, object) |
|
|
|
|
|
|
|
if toAPIErrorCode(err) == ErrNoSuchKey { |
|
|
|
|
|
|
|
s3Error = ErrNoSuchKey |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
writeErrorResponse(w, s3Error, r.URL) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
writeErrorResponse(w, apiErr, r.URL) |
|
|
|
objInfo, err := getObjectInfo(ctx, bucket, object) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
writeErrorResponse(w, toAPIErrorCode(err), r.URL) |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -227,35 +228,36 @@ func (api objectAPIHandlers) HeadObjectHandler(w http.ResponseWriter, r *http.Re |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if s3Error := checkRequestAuthType(ctx, r, policy.GetObjectAction, bucket, object); s3Error != ErrNone { |
|
|
|
|
|
|
|
writeErrorResponseHeadersOnly(w, s3Error) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getObjectInfo := objectAPI.GetObjectInfo |
|
|
|
getObjectInfo := objectAPI.GetObjectInfo |
|
|
|
if api.CacheAPI() != nil { |
|
|
|
if api.CacheAPI() != nil { |
|
|
|
getObjectInfo = api.CacheAPI().GetObjectInfo |
|
|
|
getObjectInfo = api.CacheAPI().GetObjectInfo |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
objInfo, err := getObjectInfo(ctx, bucket, object) |
|
|
|
if s3Error := checkRequestAuthType(ctx, r, policy.GetObjectAction, bucket, object); s3Error != ErrNone { |
|
|
|
if err != nil { |
|
|
|
if getRequestAuthType(r) == authTypeAnonymous { |
|
|
|
apiErr := toAPIErrorCode(err) |
|
|
|
|
|
|
|
if apiErr == ErrNoSuchKey && getRequestAuthType(r) == authTypeAnonymous { |
|
|
|
|
|
|
|
// As per "Permission" section in https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html
|
|
|
|
// As per "Permission" section in https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectHEAD.html
|
|
|
|
// If the object you request does not exist, the error Amazon S3 returns depends on whether you also have the s3:ListBucket permission.
|
|
|
|
// If the object you request does not exist, the error Amazon S3 returns depends on whether you also have the s3:ListBucket permission.
|
|
|
|
// * If you have the s3:ListBucket permission on the bucket, Amazon S3 will return an HTTP status code 404 ("no such key") error.
|
|
|
|
// * If you have the s3:ListBucket permission on the bucket, Amazon S3 will return an HTTP status code 404 ("no such key") error.
|
|
|
|
// * if you don’t have the s3:ListBucket permission, Amazon S3 will return an HTTP status code 403 ("access denied") error.`
|
|
|
|
// * if you don’t have the s3:ListBucket permission, Amazon S3 will return an HTTP status code 403 ("access denied") error.`
|
|
|
|
if !globalPolicySys.IsAllowed(policy.Args{ |
|
|
|
if globalPolicySys.IsAllowed(policy.Args{ |
|
|
|
Action: policy.ListBucketAction, |
|
|
|
Action: policy.ListBucketAction, |
|
|
|
BucketName: bucket, |
|
|
|
BucketName: bucket, |
|
|
|
ConditionValues: getConditionValues(r, ""), |
|
|
|
ConditionValues: getConditionValues(r, ""), |
|
|
|
IsOwner: false, |
|
|
|
IsOwner: false, |
|
|
|
}) { |
|
|
|
}) { |
|
|
|
apiErr = ErrAccessDenied |
|
|
|
_, err := getObjectInfo(ctx, bucket, object) |
|
|
|
|
|
|
|
if toAPIErrorCode(err) == ErrNoSuchKey { |
|
|
|
|
|
|
|
s3Error = ErrNoSuchKey |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
writeErrorResponseHeadersOnly(w, s3Error) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
writeErrorResponseHeadersOnly(w, apiErr) |
|
|
|
objInfo, err := getObjectInfo(ctx, bucket, object) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
writeErrorResponseHeadersOnly(w, toAPIErrorCode(err)) |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|