|
|
|
@ -91,31 +91,11 @@ func (api objectAPIHandlers) GetObjectHandler(w http.ResponseWriter, r *http.Req |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch getRequestAuthType(r) { |
|
|
|
|
default: |
|
|
|
|
// For all unknown auth types return error.
|
|
|
|
|
writeErrorResponse(w, r, ErrAccessDenied, r.URL.Path) |
|
|
|
|
if s3Error := checkRequestAuthType(r, bucket, "s3:GetObject", serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
case authTypeAnonymous: |
|
|
|
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html
|
|
|
|
|
if s3Error := enforceBucketPolicy(bucket, "s3:GetObject", r.URL); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresignedV2, authTypeSignedV2: |
|
|
|
|
// Signature V2 validation.
|
|
|
|
|
if s3Error := isReqAuthenticatedV2(r); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresigned, authTypeSigned: |
|
|
|
|
if s3Error := isReqAuthenticated(r, serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
objInfo, err := objectAPI.GetObjectInfo(bucket, object) |
|
|
|
|
if err != nil { |
|
|
|
|
errorIf(err, "Unable to fetch object info.") |
|
|
|
@ -210,30 +190,9 @@ func (api objectAPIHandlers) HeadObjectHandler(w http.ResponseWriter, r *http.Re |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch getRequestAuthType(r) { |
|
|
|
|
default: |
|
|
|
|
// For all unknown auth types return error.
|
|
|
|
|
writeErrorResponse(w, r, ErrAccessDenied, r.URL.Path) |
|
|
|
|
if s3Error := checkRequestAuthType(r, bucket, "s3:GetObject", serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
case authTypeAnonymous: |
|
|
|
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html
|
|
|
|
|
if s3Error := enforceBucketPolicy(bucket, "s3:GetObject", r.URL); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresignedV2, authTypeSignedV2: |
|
|
|
|
// Signature V2 validation.
|
|
|
|
|
if s3Error := isReqAuthenticatedV2(r); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresigned, authTypeSigned: |
|
|
|
|
if s3Error := isReqAuthenticated(r, serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
objInfo, err := objectAPI.GetObjectInfo(bucket, object) |
|
|
|
@ -274,30 +233,9 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch getRequestAuthType(r) { |
|
|
|
|
default: |
|
|
|
|
// For all unknown auth types return error.
|
|
|
|
|
writeErrorResponse(w, r, ErrAccessDenied, r.URL.Path) |
|
|
|
|
if s3Error := checkRequestAuthType(r, bucket, "s3:PutObject", serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
case authTypeAnonymous: |
|
|
|
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html
|
|
|
|
|
if s3Error := enforceBucketPolicy(bucket, "s3:PutObject", r.URL); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresignedV2, authTypeSignedV2: |
|
|
|
|
// Signature V2 validation.
|
|
|
|
|
if s3Error := isReqAuthenticatedV2(r); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresigned, authTypeSigned: |
|
|
|
|
if s3Error := isReqAuthenticated(r, serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO: Reject requests where body/payload is present, for now we don't even read it.
|
|
|
|
@ -539,30 +477,9 @@ func (api objectAPIHandlers) NewMultipartUploadHandler(w http.ResponseWriter, r |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch getRequestAuthType(r) { |
|
|
|
|
default: |
|
|
|
|
// For all unknown auth types return error.
|
|
|
|
|
writeErrorResponse(w, r, ErrAccessDenied, r.URL.Path) |
|
|
|
|
if s3Error := checkRequestAuthType(r, bucket, "s3:PutObject", serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
case authTypeAnonymous: |
|
|
|
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html
|
|
|
|
|
if s3Error := enforceBucketPolicy(bucket, "s3:PutObject", r.URL); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresignedV2, authTypeSignedV2: |
|
|
|
|
// Signature V2 validation.
|
|
|
|
|
if s3Error := isReqAuthenticatedV2(r); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresigned, authTypeSigned: |
|
|
|
|
if s3Error := isReqAuthenticated(r, serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Extract metadata that needs to be saved.
|
|
|
|
@ -711,30 +628,9 @@ func (api objectAPIHandlers) AbortMultipartUploadHandler(w http.ResponseWriter, |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch getRequestAuthType(r) { |
|
|
|
|
default: |
|
|
|
|
// For all unknown auth types return error.
|
|
|
|
|
writeErrorResponse(w, r, ErrAccessDenied, r.URL.Path) |
|
|
|
|
if s3Error := checkRequestAuthType(r, bucket, "s3:AbortMultipartUpload", serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
case authTypeAnonymous: |
|
|
|
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html
|
|
|
|
|
if s3Error := enforceBucketPolicy(bucket, "s3:AbortMultipartUpload", r.URL); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresignedV2, authTypeSignedV2: |
|
|
|
|
// Signature V2 validation.
|
|
|
|
|
if s3Error := isReqAuthenticatedV2(r); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresigned, authTypeSigned: |
|
|
|
|
if s3Error := isReqAuthenticated(r, serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uploadID, _, _, _ := getObjectResources(r.URL.Query()) |
|
|
|
@ -758,30 +654,9 @@ func (api objectAPIHandlers) ListObjectPartsHandler(w http.ResponseWriter, r *ht |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch getRequestAuthType(r) { |
|
|
|
|
default: |
|
|
|
|
// For all unknown auth types return error.
|
|
|
|
|
writeErrorResponse(w, r, ErrAccessDenied, r.URL.Path) |
|
|
|
|
if s3Error := checkRequestAuthType(r, bucket, "s3:ListMultipartUploadParts", serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
case authTypeAnonymous: |
|
|
|
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html
|
|
|
|
|
if s3Error := enforceBucketPolicy(bucket, "s3:ListMultipartUploadParts", r.URL); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresignedV2, authTypeSignedV2: |
|
|
|
|
// Signature V2 validation.
|
|
|
|
|
if s3Error := isReqAuthenticatedV2(r); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresigned, authTypeSigned: |
|
|
|
|
if s3Error := isReqAuthenticated(r, serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uploadID, partNumberMarker, maxParts, _ := getObjectResources(r.URL.Query()) |
|
|
|
@ -819,35 +694,15 @@ func (api objectAPIHandlers) CompleteMultipartUploadHandler(w http.ResponseWrite |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if s3Error := checkRequestAuthType(r, bucket, "s3:PutObject", serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Get upload id.
|
|
|
|
|
uploadID, _, _, _ := getObjectResources(r.URL.Query()) |
|
|
|
|
|
|
|
|
|
var md5Sum string |
|
|
|
|
switch getRequestAuthType(r) { |
|
|
|
|
default: |
|
|
|
|
// For all unknown auth types return error.
|
|
|
|
|
writeErrorResponse(w, r, ErrAccessDenied, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
case authTypeAnonymous: |
|
|
|
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html
|
|
|
|
|
if s3Error := enforceBucketPolicy(bucket, "s3:PutObject", r.URL); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresignedV2, authTypeSignedV2: |
|
|
|
|
// Signature V2 validation.
|
|
|
|
|
if s3Error := isReqAuthenticatedV2(r); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresigned, authTypeSigned: |
|
|
|
|
if s3Error := isReqAuthenticated(r, serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
completeMultipartBytes, err := ioutil.ReadAll(r.Body) |
|
|
|
|
if err != nil { |
|
|
|
|
errorIf(err, "Unable to complete multipart upload.") |
|
|
|
@ -941,31 +796,11 @@ func (api objectAPIHandlers) DeleteObjectHandler(w http.ResponseWriter, r *http. |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch getRequestAuthType(r) { |
|
|
|
|
default: |
|
|
|
|
// For all unknown auth types return error.
|
|
|
|
|
writeErrorResponse(w, r, ErrAccessDenied, r.URL.Path) |
|
|
|
|
if s3Error := checkRequestAuthType(r, bucket, "s3:DeleteObject", serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
case authTypeAnonymous: |
|
|
|
|
// http://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html
|
|
|
|
|
if s3Error := enforceBucketPolicy(bucket, "s3:DeleteObject", r.URL); s3Error != ErrNone { |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypePresignedV2, authTypeSignedV2: |
|
|
|
|
// Signature V2 validation.
|
|
|
|
|
if s3Error := isReqAuthenticatedV2(r); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
case authTypeSigned, authTypePresigned: |
|
|
|
|
if s3Error := isReqAuthenticated(r, serverConfig.GetRegion()); s3Error != ErrNone { |
|
|
|
|
errorIf(errSignatureMismatch, dumpRequest(r)) |
|
|
|
|
writeErrorResponse(w, r, s3Error, r.URL.Path) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html
|
|
|
|
|
/// Ignore delete object errors, since we are suppposed to reply
|
|
|
|
|
/// only 204.
|
|
|
|
|