From a80ecbfe84486487c868c90fc28d14ab337524d3 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 31 Jan 2020 00:11:08 -0800 Subject: s3: add s3 copy fix https://github.com/chrislusf/seaweedfs/issues/1190 --- weed/s3api/s3api_errors.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'weed/s3api/s3api_errors.go') diff --git a/weed/s3api/s3api_errors.go b/weed/s3api/s3api_errors.go index 7ba55ed28..96f8d9fd6 100644 --- a/weed/s3api/s3api_errors.go +++ b/weed/s3api/s3api_errors.go @@ -41,6 +41,8 @@ const ( ErrInvalidPartNumberMarker ErrInvalidPart ErrInternalError + ErrInvalidCopyDest + ErrInvalidCopySource ErrNotImplemented ) @@ -118,6 +120,18 @@ var errorCodeResponse = map[ErrorCode]APIError{ Description: "One or more of the specified parts could not be found. The part may not have been uploaded, or the specified entity tag may not match the part's entity tag.", HTTPStatusCode: http.StatusBadRequest, }, + + ErrInvalidCopyDest: { + Code: "InvalidRequest", + Description: "This copy request is illegal because it is trying to copy an object to itself without changing the object's metadata, storage class, website redirect location or encryption attributes.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrInvalidCopySource: { + Code: "InvalidArgument", + Description: "Copy Source must mention the source bucket and key: sourcebucket/sourcekey.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrNotImplemented: { Code: "NotImplemented", Description: "A header you provided implies functionality that is not implemented", -- cgit v1.2.3 From 9ed364f053ff3a5c8675d33358a4cc7f63a79985 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 9 Feb 2020 14:30:02 -0800 Subject: support acl --- weed/s3api/s3api_errors.go | 139 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) (limited to 'weed/s3api/s3api_errors.go') diff --git a/weed/s3api/s3api_errors.go b/weed/s3api/s3api_errors.go index 96f8d9fd6..e4f551ac7 100644 --- a/weed/s3api/s3api_errors.go +++ b/weed/s3api/s3api_errors.go @@ -27,6 +27,7 @@ type ErrorCode int // Error codes, see full list at http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html const ( ErrNone ErrorCode = iota + ErrAccessDenied ErrMethodNotAllowed ErrBucketNotEmpty ErrBucketAlreadyExists @@ -43,12 +44,39 @@ const ( ErrInternalError ErrInvalidCopyDest ErrInvalidCopySource + ErrAuthHeaderEmpty + ErrSignatureVersionNotSupported + ErrMissingFields + ErrMissingCredTag + ErrCredMalformed + ErrMalformedDate + ErrMalformedPresignedDate + ErrMalformedCredentialDate + ErrMissingSignHeadersTag + ErrMissingSignTag + ErrUnsignedHeaders + ErrInvalidQueryParams + ErrInvalidQuerySignatureAlgo + ErrExpiredPresignRequest + ErrMalformedExpires + ErrNegativeExpires + ErrMaximumExpires + ErrSignatureDoesNotMatch + ErrContentSHA256Mismatch + ErrInvalidAccessKeyID + ErrRequestNotReadyYet + ErrMissingDateHeader ErrNotImplemented ) // error code to APIError structure, these fields carry respective // descriptions for all the error responses. var errorCodeResponse = map[ErrorCode]APIError{ + ErrAccessDenied: { + Code: "AccessDenied", + Description: "Access Denied.", + HTTPStatusCode: http.StatusForbidden, + }, ErrMethodNotAllowed: { Code: "MethodNotAllowed", Description: "The specified method is not allowed against this resource.", @@ -132,6 +160,117 @@ var errorCodeResponse = map[ErrorCode]APIError{ HTTPStatusCode: http.StatusBadRequest, }, + ErrAuthHeaderEmpty: { + Code: "InvalidArgument", + Description: "Authorization header is invalid -- one and only one ' ' (space) required.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrSignatureVersionNotSupported: { + Code: "InvalidRequest", + Description: "The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrMissingFields: { + Code: "MissingFields", + Description: "Missing fields in request.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrMissingCredTag: { + Code: "InvalidRequest", + Description: "Missing Credential field for this request.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrCredMalformed: { + Code: "AuthorizationQueryParametersError", + Description: "Error parsing the X-Amz-Credential parameter; the Credential is mal-formed; expecting \"/YYYYMMDD/REGION/SERVICE/aws4_request\".", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrMalformedDate: { + Code: "MalformedDate", + Description: "Invalid date format header, expected to be in ISO8601, RFC1123 or RFC1123Z time format.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrMalformedPresignedDate: { + Code: "AuthorizationQueryParametersError", + Description: "X-Amz-Date must be in the ISO8601 Long Format \"yyyyMMdd'T'HHmmss'Z'\"", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrMissingSignHeadersTag: { + Code: "InvalidArgument", + Description: "Signature header missing SignedHeaders field.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrMissingSignTag: { + Code: "AccessDenied", + Description: "Signature header missing Signature field.", + HTTPStatusCode: http.StatusBadRequest, + }, + + ErrUnsignedHeaders: { + Code: "AccessDenied", + Description: "There were headers present in the request which were not signed", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrInvalidQueryParams: { + Code: "AuthorizationQueryParametersError", + Description: "Query-string authentication version 4 requires the X-Amz-Algorithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders, and X-Amz-Expires parameters.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrInvalidQuerySignatureAlgo: { + Code: "AuthorizationQueryParametersError", + Description: "X-Amz-Algorithm only supports \"AWS4-HMAC-SHA256\".", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrExpiredPresignRequest: { + Code: "AccessDenied", + Description: "Request has expired", + HTTPStatusCode: http.StatusForbidden, + }, + ErrMalformedExpires: { + Code: "AuthorizationQueryParametersError", + Description: "X-Amz-Expires should be a number", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrNegativeExpires: { + Code: "AuthorizationQueryParametersError", + Description: "X-Amz-Expires must be non-negative", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrMaximumExpires: { + Code: "AuthorizationQueryParametersError", + Description: "X-Amz-Expires must be less than a week (in seconds); that is, the given X-Amz-Expires must be less than 604800 seconds", + HTTPStatusCode: http.StatusBadRequest, + }, + + ErrInvalidAccessKeyID: { + Code: "InvalidAccessKeyId", + Description: "The access key ID you provided does not exist in our records.", + HTTPStatusCode: http.StatusForbidden, + }, + + ErrRequestNotReadyYet: { + Code: "AccessDenied", + Description: "Request is not valid yet", + HTTPStatusCode: http.StatusForbidden, + }, + + ErrSignatureDoesNotMatch: { + Code: "SignatureDoesNotMatch", + Description: "The request signature we calculated does not match the signature you provided. Check your key and signing method.", + HTTPStatusCode: http.StatusForbidden, + }, + + ErrContentSHA256Mismatch: { + Code: "XAmzContentSHA256Mismatch", + Description: "The provided 'x-amz-content-sha256' header does not match what was computed.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrMissingDateHeader: { + Code: "AccessDenied", + Description: "AWS authentication requires a valid Date or x-amz-date header", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrNotImplemented: { Code: "NotImplemented", Description: "A header you provided implies functionality that is not implemented", -- cgit v1.2.3 From b90ad6f452381f5064c37b639588fb46377a7b15 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 9 Feb 2020 16:02:05 -0800 Subject: add v2 support --- weed/s3api/s3api_errors.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'weed/s3api/s3api_errors.go') diff --git a/weed/s3api/s3api_errors.go b/weed/s3api/s3api_errors.go index e4f551ac7..e0f89c2b0 100644 --- a/weed/s3api/s3api_errors.go +++ b/weed/s3api/s3api_errors.go @@ -66,6 +66,7 @@ const ( ErrInvalidAccessKeyID ErrRequestNotReadyYet ErrMissingDateHeader + ErrInvalidRequest ErrNotImplemented ) @@ -270,7 +271,11 @@ var errorCodeResponse = map[ErrorCode]APIError{ Description: "AWS authentication requires a valid Date or x-amz-date header", HTTPStatusCode: http.StatusBadRequest, }, - + ErrInvalidRequest: { + Code: "InvalidRequest", + Description: "Invalid Request", + HTTPStatusCode: http.StatusBadRequest, + }, ErrNotImplemented: { Code: "NotImplemented", Description: "A header you provided implies functionality that is not implemented", -- cgit v1.2.3 From bc38b72a20bd79bf67ee1770e20dcd538285cedf Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 25 Feb 2020 14:38:36 -0800 Subject: s3: implemented DeleteMultipleObjects --- weed/s3api/s3api_errors.go | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'weed/s3api/s3api_errors.go') diff --git a/weed/s3api/s3api_errors.go b/weed/s3api/s3api_errors.go index e0f89c2b0..3f97c73cb 100644 --- a/weed/s3api/s3api_errors.go +++ b/weed/s3api/s3api_errors.go @@ -49,6 +49,7 @@ const ( ErrMissingFields ErrMissingCredTag ErrCredMalformed + ErrMalformedXML ErrMalformedDate ErrMalformedPresignedDate ErrMalformedCredentialDate @@ -161,6 +162,12 @@ var errorCodeResponse = map[ErrorCode]APIError{ HTTPStatusCode: http.StatusBadRequest, }, + ErrMalformedXML: { + Code: "MalformedXML", + Description: "The XML you provided was not well-formed or did not validate against our published schema.", + HTTPStatusCode: http.StatusBadRequest, + }, + ErrAuthHeaderEmpty: { Code: "InvalidArgument", Description: "Authorization header is invalid -- one and only one ' ' (space) required.", -- cgit v1.2.3 From fafc41a27fd3c5f6a4244729f94b68d690ec2482 Mon Sep 17 00:00:00 2001 From: Rinat Shigapov Date: Thu, 11 Jun 2020 17:53:15 +0300 Subject: return xml encoded NotFound status code for s3 delete --- weed/s3api/s3api_errors.go | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'weed/s3api/s3api_errors.go') diff --git a/weed/s3api/s3api_errors.go b/weed/s3api/s3api_errors.go index 3f97c73cb..ff411f276 100644 --- a/weed/s3api/s3api_errors.go +++ b/weed/s3api/s3api_errors.go @@ -33,6 +33,7 @@ const ( ErrBucketAlreadyExists ErrBucketAlreadyOwnedByYou ErrNoSuchBucket + ErrNoSuchKey ErrNoSuchUpload ErrInvalidBucketName ErrInvalidDigest @@ -134,6 +135,11 @@ var errorCodeResponse = map[ErrorCode]APIError{ Description: "The specified bucket does not exist", HTTPStatusCode: http.StatusNotFound, }, + ErrNoSuchKey: { + Code: "NoSuchKey", + Description: "The specified key does not exist.", + HTTPStatusCode: http.StatusNotFound, + }, ErrNoSuchUpload: { Code: "NoSuchUpload", Description: "The specified multipart upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.", -- cgit v1.2.3 From 5b40a2690a9e24eb3911bbb8cf2454180887f90d Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 19 Sep 2020 14:09:58 -0700 Subject: refactoring --- weed/s3api/s3api_errors.go | 302 --------------------------------------------- 1 file changed, 302 deletions(-) delete mode 100644 weed/s3api/s3api_errors.go (limited to 'weed/s3api/s3api_errors.go') diff --git a/weed/s3api/s3api_errors.go b/weed/s3api/s3api_errors.go deleted file mode 100644 index ff411f276..000000000 --- a/weed/s3api/s3api_errors.go +++ /dev/null @@ -1,302 +0,0 @@ -package s3api - -import ( - "encoding/xml" - "net/http" -) - -// APIError structure -type APIError struct { - Code string - Description string - HTTPStatusCode int -} - -// RESTErrorResponse - error response format -type RESTErrorResponse struct { - XMLName xml.Name `xml:"Error" json:"-"` - Code string `xml:"Code" json:"Code"` - Message string `xml:"Message" json:"Message"` - Resource string `xml:"Resource" json:"Resource"` - RequestID string `xml:"RequestId" json:"RequestId"` -} - -// ErrorCode type of error status. -type ErrorCode int - -// Error codes, see full list at http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html -const ( - ErrNone ErrorCode = iota - ErrAccessDenied - ErrMethodNotAllowed - ErrBucketNotEmpty - ErrBucketAlreadyExists - ErrBucketAlreadyOwnedByYou - ErrNoSuchBucket - ErrNoSuchKey - ErrNoSuchUpload - ErrInvalidBucketName - ErrInvalidDigest - ErrInvalidMaxKeys - ErrInvalidMaxUploads - ErrInvalidMaxParts - ErrInvalidPartNumberMarker - ErrInvalidPart - ErrInternalError - ErrInvalidCopyDest - ErrInvalidCopySource - ErrAuthHeaderEmpty - ErrSignatureVersionNotSupported - ErrMissingFields - ErrMissingCredTag - ErrCredMalformed - ErrMalformedXML - ErrMalformedDate - ErrMalformedPresignedDate - ErrMalformedCredentialDate - ErrMissingSignHeadersTag - ErrMissingSignTag - ErrUnsignedHeaders - ErrInvalidQueryParams - ErrInvalidQuerySignatureAlgo - ErrExpiredPresignRequest - ErrMalformedExpires - ErrNegativeExpires - ErrMaximumExpires - ErrSignatureDoesNotMatch - ErrContentSHA256Mismatch - ErrInvalidAccessKeyID - ErrRequestNotReadyYet - ErrMissingDateHeader - ErrInvalidRequest - ErrNotImplemented -) - -// error code to APIError structure, these fields carry respective -// descriptions for all the error responses. -var errorCodeResponse = map[ErrorCode]APIError{ - ErrAccessDenied: { - Code: "AccessDenied", - Description: "Access Denied.", - HTTPStatusCode: http.StatusForbidden, - }, - ErrMethodNotAllowed: { - Code: "MethodNotAllowed", - Description: "The specified method is not allowed against this resource.", - HTTPStatusCode: http.StatusMethodNotAllowed, - }, - ErrBucketNotEmpty: { - Code: "BucketNotEmpty", - Description: "The bucket you tried to delete is not empty", - HTTPStatusCode: http.StatusConflict, - }, - ErrBucketAlreadyExists: { - Code: "BucketAlreadyExists", - Description: "The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.", - HTTPStatusCode: http.StatusConflict, - }, - ErrBucketAlreadyOwnedByYou: { - Code: "BucketAlreadyOwnedByYou", - Description: "Your previous request to create the named bucket succeeded and you already own it.", - HTTPStatusCode: http.StatusConflict, - }, - ErrInvalidBucketName: { - Code: "InvalidBucketName", - Description: "The specified bucket is not valid.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrInvalidDigest: { - Code: "InvalidDigest", - Description: "The Content-Md5 you specified is not valid.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrInvalidMaxUploads: { - Code: "InvalidArgument", - Description: "Argument max-uploads must be an integer between 0 and 2147483647", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrInvalidMaxKeys: { - Code: "InvalidArgument", - Description: "Argument maxKeys must be an integer between 0 and 2147483647", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrInvalidMaxParts: { - Code: "InvalidArgument", - Description: "Argument max-parts must be an integer between 0 and 2147483647", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrInvalidPartNumberMarker: { - Code: "InvalidArgument", - Description: "Argument partNumberMarker must be an integer.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrNoSuchBucket: { - Code: "NoSuchBucket", - Description: "The specified bucket does not exist", - HTTPStatusCode: http.StatusNotFound, - }, - ErrNoSuchKey: { - Code: "NoSuchKey", - Description: "The specified key does not exist.", - HTTPStatusCode: http.StatusNotFound, - }, - ErrNoSuchUpload: { - Code: "NoSuchUpload", - Description: "The specified multipart upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.", - HTTPStatusCode: http.StatusNotFound, - }, - ErrInternalError: { - Code: "InternalError", - Description: "We encountered an internal error, please try again.", - HTTPStatusCode: http.StatusInternalServerError, - }, - - ErrInvalidPart: { - Code: "InvalidPart", - Description: "One or more of the specified parts could not be found. The part may not have been uploaded, or the specified entity tag may not match the part's entity tag.", - HTTPStatusCode: http.StatusBadRequest, - }, - - ErrInvalidCopyDest: { - Code: "InvalidRequest", - Description: "This copy request is illegal because it is trying to copy an object to itself without changing the object's metadata, storage class, website redirect location or encryption attributes.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrInvalidCopySource: { - Code: "InvalidArgument", - Description: "Copy Source must mention the source bucket and key: sourcebucket/sourcekey.", - HTTPStatusCode: http.StatusBadRequest, - }, - - ErrMalformedXML: { - Code: "MalformedXML", - Description: "The XML you provided was not well-formed or did not validate against our published schema.", - HTTPStatusCode: http.StatusBadRequest, - }, - - ErrAuthHeaderEmpty: { - Code: "InvalidArgument", - Description: "Authorization header is invalid -- one and only one ' ' (space) required.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrSignatureVersionNotSupported: { - Code: "InvalidRequest", - Description: "The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrMissingFields: { - Code: "MissingFields", - Description: "Missing fields in request.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrMissingCredTag: { - Code: "InvalidRequest", - Description: "Missing Credential field for this request.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrCredMalformed: { - Code: "AuthorizationQueryParametersError", - Description: "Error parsing the X-Amz-Credential parameter; the Credential is mal-formed; expecting \"/YYYYMMDD/REGION/SERVICE/aws4_request\".", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrMalformedDate: { - Code: "MalformedDate", - Description: "Invalid date format header, expected to be in ISO8601, RFC1123 or RFC1123Z time format.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrMalformedPresignedDate: { - Code: "AuthorizationQueryParametersError", - Description: "X-Amz-Date must be in the ISO8601 Long Format \"yyyyMMdd'T'HHmmss'Z'\"", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrMissingSignHeadersTag: { - Code: "InvalidArgument", - Description: "Signature header missing SignedHeaders field.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrMissingSignTag: { - Code: "AccessDenied", - Description: "Signature header missing Signature field.", - HTTPStatusCode: http.StatusBadRequest, - }, - - ErrUnsignedHeaders: { - Code: "AccessDenied", - Description: "There were headers present in the request which were not signed", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrInvalidQueryParams: { - Code: "AuthorizationQueryParametersError", - Description: "Query-string authentication version 4 requires the X-Amz-Algorithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders, and X-Amz-Expires parameters.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrInvalidQuerySignatureAlgo: { - Code: "AuthorizationQueryParametersError", - Description: "X-Amz-Algorithm only supports \"AWS4-HMAC-SHA256\".", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrExpiredPresignRequest: { - Code: "AccessDenied", - Description: "Request has expired", - HTTPStatusCode: http.StatusForbidden, - }, - ErrMalformedExpires: { - Code: "AuthorizationQueryParametersError", - Description: "X-Amz-Expires should be a number", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrNegativeExpires: { - Code: "AuthorizationQueryParametersError", - Description: "X-Amz-Expires must be non-negative", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrMaximumExpires: { - Code: "AuthorizationQueryParametersError", - Description: "X-Amz-Expires must be less than a week (in seconds); that is, the given X-Amz-Expires must be less than 604800 seconds", - HTTPStatusCode: http.StatusBadRequest, - }, - - ErrInvalidAccessKeyID: { - Code: "InvalidAccessKeyId", - Description: "The access key ID you provided does not exist in our records.", - HTTPStatusCode: http.StatusForbidden, - }, - - ErrRequestNotReadyYet: { - Code: "AccessDenied", - Description: "Request is not valid yet", - HTTPStatusCode: http.StatusForbidden, - }, - - ErrSignatureDoesNotMatch: { - Code: "SignatureDoesNotMatch", - Description: "The request signature we calculated does not match the signature you provided. Check your key and signing method.", - HTTPStatusCode: http.StatusForbidden, - }, - - ErrContentSHA256Mismatch: { - Code: "XAmzContentSHA256Mismatch", - Description: "The provided 'x-amz-content-sha256' header does not match what was computed.", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrMissingDateHeader: { - Code: "AccessDenied", - Description: "AWS authentication requires a valid Date or x-amz-date header", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrInvalidRequest: { - Code: "InvalidRequest", - Description: "Invalid Request", - HTTPStatusCode: http.StatusBadRequest, - }, - ErrNotImplemented: { - Code: "NotImplemented", - Description: "A header you provided implies functionality that is not implemented", - HTTPStatusCode: http.StatusNotImplemented, - }, -} - -// getAPIError provides API Error for input API error code. -func getAPIError(code ErrorCode) APIError { - return errorCodeResponse[code] -} -- cgit v1.2.3