2015-02-15 09:48:15 +01:00
/ *
2015-07-25 02:51:40 +02:00
* Minio Cloud Storage , ( C ) 2015 Minio , Inc .
2015-02-15 09:48:15 +01:00
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
2016-08-19 01:23:42 +02:00
package cmd
2015-02-11 12:23:15 +01:00
import (
"encoding/xml"
"net/http"
)
2015-09-19 09:52:01 +02:00
// APIError structure
type APIError struct {
2015-02-11 12:23:15 +01:00
Code string
Description string
2015-03-06 06:07:19 +01:00
HTTPStatusCode int
2015-02-11 12:23:15 +01:00
}
2015-09-19 09:52:01 +02:00
// APIErrorResponse - error response format
type APIErrorResponse struct {
2015-12-10 00:38:40 +01:00
XMLName xml . Name ` xml:"Error" json:"-" `
Code string
Message string
Key string
BucketName string
Resource string
RequestID string ` xml:"RequestId" `
HostID string ` xml:"HostId" `
2015-02-11 12:23:15 +01:00
}
2016-03-10 11:24:52 +01:00
// APIErrorCode type of error status.
type APIErrorCode int
2015-04-23 01:28:13 +02:00
// Error codes, non exhaustive list - http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html
2015-02-11 12:23:15 +01:00
const (
2016-03-10 11:24:52 +01:00
ErrNone APIErrorCode = iota
ErrAccessDenied
ErrBadDigest
ErrEntityTooSmall
ErrEntityTooLarge
ErrIncompleteBody
ErrInternalError
ErrInvalidAccessKeyID
ErrInvalidBucketName
ErrInvalidDigest
ErrInvalidRange
2017-03-04 01:32:04 +01:00
ErrInvalidCopyPartRange
ErrInvalidCopyPartRangeSource
2016-03-10 11:24:52 +01:00
ErrInvalidMaxKeys
ErrInvalidMaxUploads
ErrInvalidMaxParts
ErrInvalidPartNumberMarker
ErrInvalidRequestBody
ErrInvalidCopySource
2016-12-27 01:29:26 +01:00
ErrInvalidMetadataDirective
2016-03-10 11:24:52 +01:00
ErrInvalidCopyDest
ErrInvalidPolicyDocument
2016-10-21 01:09:55 +02:00
ErrInvalidObjectState
2016-03-10 11:24:52 +01:00
ErrMalformedXML
ErrMissingContentLength
ErrMissingContentMD5
ErrMissingRequestBodyError
ErrNoSuchBucket
ErrNoSuchBucketPolicy
ErrNoSuchKey
ErrNoSuchUpload
ErrNotImplemented
2016-06-28 10:18:18 +02:00
ErrPreconditionFailed
2016-03-10 11:24:52 +01:00
ErrRequestTimeTooSkewed
ErrSignatureDoesNotMatch
ErrMethodNotAllowed
ErrInvalidPart
ErrInvalidPartOrder
ErrAuthorizationHeaderMalformed
ErrMalformedPOSTRequest
2017-02-09 21:37:32 +01:00
ErrPOSTFileRequired
2016-03-10 11:24:52 +01:00
ErrSignatureVersionNotSupported
ErrBucketNotEmpty
ErrAllAccessDisabled
ErrMalformedPolicy
2016-03-31 05:04:51 +02:00
ErrMissingFields
ErrMissingCredTag
ErrCredMalformed
ErrInvalidRegion
ErrInvalidService
ErrInvalidRequestVersion
ErrMissingSignTag
ErrMissingSignHeadersTag
ErrPolicyAlreadyExpired
ErrMalformedDate
2016-08-09 18:13:15 +02:00
ErrMalformedPresignedDate
ErrMalformedCredentialDate
ErrMalformedCredentialRegion
2016-03-31 05:04:51 +02:00
ErrMalformedExpires
2016-08-09 18:13:15 +02:00
ErrNegativeExpires
2016-03-31 05:04:51 +02:00
ErrAuthHeaderEmpty
ErrExpiredPresignRequest
2016-09-10 09:38:07 +02:00
ErrRequestNotReadyYet
2016-08-09 18:13:15 +02:00
ErrUnsignedHeaders
2016-03-31 05:04:51 +02:00
ErrMissingDateHeader
ErrInvalidQuerySignatureAlgo
ErrInvalidQueryParams
2016-05-03 12:19:04 +02:00
ErrBucketAlreadyOwnedByYou
2017-01-04 08:39:22 +01:00
ErrInvalidDuration
2017-04-27 20:26:00 +02:00
ErrNotSupported
2017-05-08 23:53:47 +02:00
ErrBucketAlreadyExists
2017-08-23 01:53:35 +02:00
ErrMetadataTooLarge
2017-09-13 01:14:41 +02:00
ErrUnsupportedMetadata
2016-03-10 11:24:52 +01:00
// Add new error codes here.
2016-04-21 02:23:23 +02:00
2016-07-24 07:51:12 +02:00
// Bucket notification related errors.
ErrEventNotification
ErrARNNotification
ErrRegionNotification
ErrOverlappingFilterNotification
2016-07-26 02:53:55 +02:00
ErrFilterNameInvalid
ErrFilterNamePrefix
ErrFilterNameSuffix
2016-08-18 21:00:01 +02:00
ErrFilterValueInvalid
2016-08-24 03:42:30 +02:00
ErrOverlappingConfigs
2017-08-24 00:58:02 +02:00
ErrUnsupportedNotification
2016-07-24 07:51:12 +02:00
2016-07-05 10:04:50 +02:00
// S3 extended errors.
ErrContentSHA256Mismatch
2016-07-20 21:40:20 +02:00
2016-07-05 10:04:50 +02:00
// Add new extended error codes here.
2016-05-08 21:36:16 +02:00
// Minio extended errors.
2016-05-06 05:24:29 +02:00
ErrReadQuorum
ErrWriteQuorum
2016-05-08 21:36:16 +02:00
ErrStorageFull
ErrObjectExistsAsDirectory
2016-06-09 10:53:56 +02:00
ErrPolicyNesting
2016-07-10 02:11:08 +02:00
ErrInvalidObjectName
2017-04-25 03:13:46 +02:00
ErrInvalidResourceName
2016-08-11 03:47:49 +02:00
ErrServerNotInitialized
2017-08-31 20:29:22 +02:00
ErrOperationTimedOut
2016-07-05 10:04:50 +02:00
// Add new extended error codes here.
// Please open a https://github.com/minio/minio/issues before adding
// new error codes here.
2017-01-17 23:25:59 +01:00
ErrAdminInvalidAccessKey
ErrAdminInvalidSecretKey
2017-02-27 20:40:27 +01:00
ErrAdminConfigNoQuorum
2017-09-07 20:16:13 +02:00
ErrAdminCredentialsMismatch
2017-06-01 05:33:13 +02:00
ErrInsecureClientRequest
2015-04-23 01:28:13 +02:00
)
2016-03-10 11:24:52 +01:00
// error code to APIError structure, these fields carry respective
// descriptions for all the error responses.
var errorCodeResponse = map [ APIErrorCode ] APIError {
ErrInvalidCopyDest : {
2016-02-27 12:04:52 +01:00
Code : "InvalidRequest" ,
2016-12-27 01:29:26 +01:00
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." ,
2016-02-27 12:04:52 +01:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidCopySource : {
2016-02-27 12:04:52 +01:00
Code : "InvalidArgument" ,
Description : "Copy Source must mention the source bucket and key: sourcebucket/sourcekey." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-12-27 01:29:26 +01:00
ErrInvalidMetadataDirective : {
Code : "InvalidArgument" ,
Description : "Unknown metadata directive." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidRequestBody : {
2016-02-27 12:04:52 +01:00
Code : "InvalidArgument" ,
Description : "Body shouldn't be set for this request." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidMaxUploads : {
2015-07-17 02:22:45 +02:00
Code : "InvalidArgument" ,
2016-07-05 10:06:30 +02:00
Description : "Argument max-uploads must be an integer between 0 and 2147483647" ,
2015-07-17 02:22:45 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidMaxKeys : {
2015-07-17 02:22:45 +02:00
Code : "InvalidArgument" ,
2016-07-05 10:06:30 +02:00
Description : "Argument maxKeys must be an integer between 0 and 2147483647" ,
2015-07-17 02:22:45 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidMaxParts : {
2015-07-17 02:22:45 +02:00
Code : "InvalidArgument" ,
2016-07-05 10:06:30 +02:00
Description : "Argument max-parts must be an integer between 0 and 2147483647" ,
2015-07-17 02:22:45 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidPartNumberMarker : {
2015-07-17 02:22:45 +02:00
Code : "InvalidArgument" ,
2015-09-18 23:48:01 +02:00
Description : "Argument partNumberMarker must be an integer." ,
2015-07-17 02:22:45 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidPolicyDocument : {
accessPolicy: Implement Put, Get, Delete access policy.
This patch implements Get,Put,Delete bucket policies
Supporting - http://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html
Currently supports following actions.
"*": true,
"s3:*": true,
"s3:GetObject": true,
"s3:ListBucket": true,
"s3:PutObject": true,
"s3:CreateBucket": true,
"s3:GetBucketLocation": true,
"s3:DeleteBucket": true,
"s3:DeleteObject": true,
"s3:AbortMultipartUpload": true,
"s3:ListBucketMultipartUploads": true,
"s3:ListMultipartUploadParts": true,
following conditions for "StringEquals" and "StringNotEquals"
"s3:prefix", "s3:max-keys"
2016-02-04 01:46:56 +01:00
Code : "InvalidPolicyDocument" ,
Description : "The content of the form does not meet the conditions specified in the policy document." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrAccessDenied : {
2015-02-11 12:23:15 +01:00
Code : "AccessDenied" ,
2015-09-18 23:48:01 +02:00
Description : "Access Denied." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusForbidden ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrBadDigest : {
2015-02-11 12:23:15 +01:00
Code : "BadDigest" ,
2016-03-06 01:43:48 +01:00
Description : "The Content-Md5 you specified did not match what we received." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusBadRequest ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrEntityTooSmall : {
2015-02-11 12:23:15 +01:00
Code : "EntityTooSmall" ,
Description : "Your proposed upload is smaller than the minimum allowed object size." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusBadRequest ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrEntityTooLarge : {
2015-02-11 12:23:15 +01:00
Code : "EntityTooLarge" ,
Description : "Your proposed upload exceeds the maximum allowed object size." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusBadRequest ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrIncompleteBody : {
2015-02-11 12:23:15 +01:00
Code : "IncompleteBody" ,
2015-09-18 23:48:01 +02:00
Description : "You did not provide the number of bytes specified by the Content-Length HTTP header." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusBadRequest ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrInternalError : {
2015-02-11 12:23:15 +01:00
Code : "InternalError" ,
Description : "We encountered an internal error, please try again." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusInternalServerError ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidAccessKeyID : {
2017-05-24 05:07:52 +02:00
Code : "InvalidAccessKeyId" ,
2015-03-06 06:07:19 +01:00
Description : "The access key ID you provided does not exist in our records." ,
HTTPStatusCode : http . StatusForbidden ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidBucketName : {
2015-02-11 12:23:15 +01:00
Code : "InvalidBucketName" ,
Description : "The specified bucket is not valid." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusBadRequest ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidDigest : {
2015-02-11 12:23:15 +01:00
Code : "InvalidDigest" ,
2016-03-06 01:43:48 +01:00
Description : "The Content-Md5 you specified is not valid." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusBadRequest ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidRange : {
2015-02-11 12:23:15 +01:00
Code : "InvalidRange" ,
2016-07-05 10:06:30 +02:00
Description : "The requested range is not satisfiable" ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusRequestedRangeNotSatisfiable ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrMalformedXML : {
2015-02-11 12:23:15 +01:00
Code : "MalformedXML" ,
Description : "The XML you provided was not well-formed or did not validate against our published schema." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusBadRequest ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrMissingContentLength : {
2015-02-11 12:23:15 +01:00
Code : "MissingContentLength" ,
Description : "You must provide the Content-Length HTTP header." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusLengthRequired ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrMissingContentMD5 : {
2016-03-06 01:43:48 +01:00
Code : "MissingContentMD5" ,
Description : "Missing required header for this request: Content-Md5." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrMissingRequestBodyError : {
2015-02-11 12:23:15 +01:00
Code : "MissingRequestBodyError" ,
Description : "Request body is empty." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusLengthRequired ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrNoSuchBucket : {
2015-02-11 12:23:15 +01:00
Code : "NoSuchBucket" ,
2016-07-05 10:06:30 +02:00
Description : "The specified bucket does not exist" ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusNotFound ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrNoSuchBucketPolicy : {
accessPolicy: Implement Put, Get, Delete access policy.
This patch implements Get,Put,Delete bucket policies
Supporting - http://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html
Currently supports following actions.
"*": true,
"s3:*": true,
"s3:GetObject": true,
"s3:ListBucket": true,
"s3:PutObject": true,
"s3:CreateBucket": true,
"s3:GetBucketLocation": true,
"s3:DeleteBucket": true,
"s3:DeleteObject": true,
"s3:AbortMultipartUpload": true,
"s3:ListBucketMultipartUploads": true,
"s3:ListMultipartUploadParts": true,
following conditions for "StringEquals" and "StringNotEquals"
"s3:prefix", "s3:max-keys"
2016-02-04 01:46:56 +01:00
Code : "NoSuchBucketPolicy" ,
2016-09-06 11:18:02 +02:00
Description : "The bucket policy does not exist" ,
accessPolicy: Implement Put, Get, Delete access policy.
This patch implements Get,Put,Delete bucket policies
Supporting - http://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html
Currently supports following actions.
"*": true,
"s3:*": true,
"s3:GetObject": true,
"s3:ListBucket": true,
"s3:PutObject": true,
"s3:CreateBucket": true,
"s3:GetBucketLocation": true,
"s3:DeleteBucket": true,
"s3:DeleteObject": true,
"s3:AbortMultipartUpload": true,
"s3:ListBucketMultipartUploads": true,
"s3:ListMultipartUploadParts": true,
following conditions for "StringEquals" and "StringNotEquals"
"s3:prefix", "s3:max-keys"
2016-02-04 01:46:56 +01:00
HTTPStatusCode : http . StatusNotFound ,
} ,
2016-03-10 11:24:52 +01:00
ErrNoSuchKey : {
2015-02-11 12:23:15 +01:00
Code : "NoSuchKey" ,
Description : "The specified key does not exist." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusNotFound ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrNoSuchUpload : {
2015-02-11 12:23:15 +01:00
Code : "NoSuchUpload" ,
2016-07-23 02:05:40 +02:00
Description : "The specified multipart upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusNotFound ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrNotImplemented : {
2015-02-11 12:23:15 +01:00
Code : "NotImplemented" ,
2016-07-05 10:06:30 +02:00
Description : "A header you provided implies functionality that is not implemented" ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusNotImplemented ,
2015-02-11 12:23:15 +01:00
} ,
2016-06-28 10:18:18 +02:00
ErrPreconditionFailed : {
Code : "PreconditionFailed" ,
2016-07-09 21:13:40 +02:00
Description : "At least one of the pre-conditions you specified did not hold" ,
2016-06-28 10:18:18 +02:00
HTTPStatusCode : http . StatusPreconditionFailed ,
} ,
2016-03-10 11:24:52 +01:00
ErrRequestTimeTooSkewed : {
2015-02-11 12:23:15 +01:00
Code : "RequestTimeTooSkewed" ,
Description : "The difference between the request time and the server's time is too large." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusForbidden ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrSignatureDoesNotMatch : {
2015-02-11 12:23:15 +01:00
Code : "SignatureDoesNotMatch" ,
2016-06-21 21:10:18 +02:00
Description : "The request signature we calculated does not match the signature you provided. Check your key and signing method." ,
2015-03-06 06:07:19 +01:00
HTTPStatusCode : http . StatusForbidden ,
2015-02-11 12:23:15 +01:00
} ,
2016-03-10 11:24:52 +01:00
ErrMethodNotAllowed : {
2015-04-27 12:54:49 +02:00
Code : "MethodNotAllowed" ,
Description : "The specified method is not allowed against this resource." ,
HTTPStatusCode : http . StatusMethodNotAllowed ,
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidPart : {
2015-05-08 07:43:19 +02:00
Code : "InvalidPart" ,
2017-06-17 20:20:39 +02:00
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." ,
2015-05-08 07:43:19 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrInvalidPartOrder : {
2015-05-08 11:02:51 +02:00
Code : "InvalidPartOrder" ,
Description : "The list of parts was not in ascending order. The parts list must be specified in order by part number." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-10-21 01:09:55 +02:00
ErrInvalidObjectState : {
Code : "InvalidObjectState" ,
Description : "The operation is not valid for the current state of the object." ,
HTTPStatusCode : http . StatusForbidden ,
} ,
2016-03-10 11:24:52 +01:00
ErrAuthorizationHeaderMalformed : {
2015-09-18 23:48:01 +02:00
Code : "AuthorizationHeaderMalformed" ,
2015-11-23 22:39:57 +01:00
Description : "The authorization header is malformed; the region is wrong; expecting 'us-east-1'." ,
2015-09-18 23:48:01 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrMalformedPOSTRequest : {
2015-10-02 08:51:17 +02:00
Code : "MalformedPOSTRequest" ,
Description : "The body of your POST request is not well-formed multipart/form-data." ,
HTTPStatusCode : http . StatusBadRequest ,
2015-12-10 00:38:40 +01:00
} ,
2017-02-09 21:37:32 +01:00
ErrPOSTFileRequired : {
Code : "InvalidArgument" ,
Description : "POST requires exactly one file upload per request." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
ErrSignatureVersionNotSupported : {
2015-12-10 00:38:40 +01:00
Code : "InvalidRequest" ,
Description : "The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256." ,
HTTPStatusCode : http . StatusBadRequest ,
2015-10-02 08:51:17 +02:00
} ,
2016-03-10 11:24:52 +01:00
ErrBucketNotEmpty : {
2015-10-16 20:26:01 +02:00
Code : "BucketNotEmpty" ,
2016-09-06 11:18:02 +02:00
Description : "The bucket you tried to delete is not empty" ,
2015-10-16 20:26:01 +02:00
HTTPStatusCode : http . StatusConflict ,
} ,
2017-05-12 02:33:01 +02:00
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 ,
} ,
2016-03-10 11:24:52 +01:00
ErrAllAccessDisabled : {
2016-02-17 03:50:36 +01:00
Code : "AllAccessDisabled" ,
Description : "All access to this bucket has been disabled." ,
HTTPStatusCode : http . StatusForbidden ,
} ,
2016-03-10 11:24:52 +01:00
ErrMalformedPolicy : {
accessPolicy: Implement Put, Get, Delete access policy.
This patch implements Get,Put,Delete bucket policies
Supporting - http://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html
Currently supports following actions.
"*": true,
"s3:*": true,
"s3:GetObject": true,
"s3:ListBucket": true,
"s3:PutObject": true,
"s3:CreateBucket": true,
"s3:GetBucketLocation": true,
"s3:DeleteBucket": true,
"s3:DeleteObject": true,
"s3:AbortMultipartUpload": true,
"s3:ListBucketMultipartUploads": true,
"s3:ListMultipartUploadParts": true,
following conditions for "StringEquals" and "StringNotEquals"
"s3:prefix", "s3:max-keys"
2016-02-04 01:46:56 +01:00
Code : "MalformedPolicy" ,
2016-03-31 05:04:51 +02:00
Description : "Policy has invalid resource." ,
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 : {
2016-08-09 18:13:15 +02:00
Code : "AuthorizationQueryParametersError" ,
Description : "Error parsing the X-Amz-Credential parameter; the Credential is mal-formed; expecting \"<YOUR-AKID>/YYYYMMDD/REGION/SERVICE/aws4_request\"." ,
2016-03-31 05:04:51 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrMalformedDate : {
Code : "MalformedDate" ,
Description : "Invalid date format header, expected to be in ISO8601, RFC1123 or RFC1123Z time format." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-08-09 18:13:15 +02:00
ErrMalformedPresignedDate : {
Code : "AuthorizationQueryParametersError" ,
Description : "X-Amz-Date must be in the ISO8601 Long Format \"yyyyMMdd'T'HHmmss'Z'\"" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
// FIXME: Should contain the invalid param set as seen in https://github.com/minio/minio/issues/2385.
// right Description: "Error parsing the X-Amz-Credential parameter; incorrect date format \"%s\". This date in the credential must be in the format \"yyyyMMdd\".",
// Need changes to make sure variable messages can be constructed.
ErrMalformedCredentialDate : {
Code : "AuthorizationQueryParametersError" ,
Description : "Error parsing the X-Amz-Credential parameter; incorrect date format \"%s\". This date in the credential must be in the format \"yyyyMMdd\"." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
// FIXME: Should contain the invalid param set as seen in https://github.com/minio/minio/issues/2385.
// right Description: "Error parsing the X-Amz-Credential parameter; the region 'us-east-' is wrong; expecting 'us-east-1'".
// Need changes to make sure variable messages can be constructed.
ErrMalformedCredentialRegion : {
Code : "AuthorizationQueryParametersError" ,
Description : "Error parsing the X-Amz-Credential parameter; the region is wrong;" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-31 05:04:51 +02:00
ErrInvalidRegion : {
Code : "InvalidRegion" ,
Description : "Region does not match." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-08-09 18:13:15 +02:00
// FIXME: Should contain the invalid param set as seen in https://github.com/minio/minio/issues/2385.
// right Description: "Error parsing the X-Amz-Credential parameter; incorrect service \"s4\". This endpoint belongs to \"s3\".".
// Need changes to make sure variable messages can be constructed.
2016-03-31 05:04:51 +02:00
ErrInvalidService : {
2016-08-09 18:13:15 +02:00
Code : "AuthorizationQueryParametersError" ,
Description : "Error parsing the X-Amz-Credential parameter; incorrect service. This endpoint belongs to \"s3\"." ,
2016-03-31 05:04:51 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-08-09 18:13:15 +02:00
// FIXME: Should contain the invalid param set as seen in https://github.com/minio/minio/issues/2385.
// Description: "Error parsing the X-Amz-Credential parameter; incorrect terminal "aws4_reque". This endpoint uses "aws4_request".
// Need changes to make sure variable messages can be constructed.
2016-03-31 05:04:51 +02:00
ErrInvalidRequestVersion : {
2016-08-09 18:13:15 +02:00
Code : "AuthorizationQueryParametersError" ,
Description : "Error parsing the X-Amz-Credential parameter; incorrect terminal. This endpoint uses \"aws4_request\"." ,
2016-03-31 05:04:51 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrMissingSignTag : {
Code : "AccessDenied" ,
Description : "Signature header missing Signature field." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrMissingSignHeadersTag : {
Code : "InvalidArgument" ,
Description : "Signature header missing SignedHeaders field." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrPolicyAlreadyExpired : {
Code : "AccessDenied" ,
Description : "Invalid according to Policy: Policy expired." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrMalformedExpires : {
2016-08-09 18:13:15 +02:00
Code : "AuthorizationQueryParametersError" ,
Description : "X-Amz-Expires should be a number" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrNegativeExpires : {
Code : "AuthorizationQueryParametersError" ,
Description : "X-Amz-Expires must be non-negative" ,
2016-03-31 05:04:51 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrAuthHeaderEmpty : {
Code : "InvalidArgument" ,
Description : "Authorization header is invalid -- one and only one ' ' (space) required." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrMissingDateHeader : {
Code : "AccessDenied" ,
Description : "AWS authentication requires a valid Date or x-amz-date header" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrInvalidQuerySignatureAlgo : {
Code : "AuthorizationQueryParametersError" ,
Description : "X-Amz-Algorithm only supports \"AWS4-HMAC-SHA256\"." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrExpiredPresignRequest : {
Code : "AccessDenied" ,
2016-08-09 18:13:15 +02:00
Description : "Request has expired" ,
2016-09-06 11:18:02 +02:00
HTTPStatusCode : http . StatusForbidden ,
2016-08-09 18:13:15 +02:00
} ,
2016-09-10 09:38:07 +02:00
ErrRequestNotReadyYet : {
Code : "AccessDenied" ,
Description : "Request is not valid yet" ,
HTTPStatusCode : http . StatusForbidden ,
} ,
2016-08-21 08:10:08 +02:00
// FIXME: Actual XML error response also contains the header which missed in list of signed header parameters.
2016-08-09 18:13:15 +02:00
ErrUnsignedHeaders : {
Code : "AccessDenied" ,
Description : "There were headers present in the request which were not signed" ,
2016-03-31 05:04:51 +02:00
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." ,
accessPolicy: Implement Put, Get, Delete access policy.
This patch implements Get,Put,Delete bucket policies
Supporting - http://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html
Currently supports following actions.
"*": true,
"s3:*": true,
"s3:GetObject": true,
"s3:ListBucket": true,
"s3:PutObject": true,
"s3:CreateBucket": true,
"s3:GetBucketLocation": true,
"s3:DeleteBucket": true,
"s3:DeleteObject": true,
"s3:AbortMultipartUpload": true,
"s3:ListBucketMultipartUploads": true,
"s3:ListMultipartUploadParts": true,
following conditions for "StringEquals" and "StringNotEquals"
"s3:prefix", "s3:max-keys"
2016-02-04 01:46:56 +01:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-05-03 12:19:04 +02:00
ErrBucketAlreadyOwnedByYou : {
Code : "BucketAlreadyOwnedByYou" ,
Description : "Your previous request to create the named bucket succeeded and you already own it." ,
HTTPStatusCode : http . StatusConflict ,
} ,
2017-01-04 08:39:22 +01:00
ErrInvalidDuration : {
Code : "InvalidDuration" ,
2017-02-01 20:17:30 +01:00
Description : "Duration provided in the request is invalid." ,
2017-01-04 08:39:22 +01:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-07-05 10:04:50 +02:00
2016-07-24 07:51:12 +02:00
/// Bucket notification related errors.
ErrEventNotification : {
Code : "InvalidArgument" ,
Description : "A specified event is not supported for notifications." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrARNNotification : {
Code : "InvalidArgument" ,
Description : "A specified destination ARN does not exist or is not well-formed. Verify the destination ARN." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrRegionNotification : {
Code : "InvalidArgument" ,
Description : "A specified destination is in a different region than the bucket. You must use a destination that resides in the same region as the bucket." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrOverlappingFilterNotification : {
Code : "InvalidArgument" ,
Description : "An object key name filtering rule defined with overlapping prefixes, overlapping suffixes, or overlapping combinations of prefixes and suffixes for the same event types." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-07-26 02:53:55 +02:00
ErrFilterNameInvalid : {
Code : "InvalidArgument" ,
Description : "filter rule name must be either prefix or suffix" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrFilterNamePrefix : {
Code : "InvalidArgument" ,
Description : "Cannot specify more than one prefix rule in a filter." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrFilterNameSuffix : {
Code : "InvalidArgument" ,
Description : "Cannot specify more than one suffix rule in a filter." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-08-18 21:00:01 +02:00
ErrFilterValueInvalid : {
2016-07-26 02:53:55 +02:00
Code : "InvalidArgument" ,
2016-08-18 21:00:01 +02:00
Description : "Size of filter rule value cannot exceed 1024 bytes in UTF-8 representation" ,
2016-07-26 02:53:55 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-08-24 03:42:30 +02:00
ErrOverlappingConfigs : {
Code : "InvalidArgument" ,
Description : "Configurations overlap. Configurations on the same bucket cannot share a common event type." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2017-08-24 00:58:02 +02:00
ErrUnsupportedNotification : {
Code : "UnsupportedNotification" ,
Description : "Minio server does not support Topic or Cloud Function based notifications." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2017-03-04 01:32:04 +01:00
ErrInvalidCopyPartRange : {
Code : "InvalidArgument" ,
Description : "The x-amz-copy-source-range value must be of the form bytes=first-last where first and last are the zero-based offsets of the first and last bytes to copy" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrInvalidCopyPartRangeSource : {
Code : "InvalidArgument" ,
Description : "Range specified is not valid for source object" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-07-24 07:51:12 +02:00
2016-07-05 10:04:50 +02:00
/// S3 extensions.
ErrContentSHA256Mismatch : {
Code : "XAmzContentSHA256Mismatch" ,
Description : "The provided 'x-amz-content-sha256' header does not match what was computed." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-05-08 21:36:16 +02:00
/// Minio extensions.
ErrStorageFull : {
Code : "XMinioStorageFull" ,
2017-09-03 22:53:03 +02:00
Description : "Storage backend has reached its minimum free disk threshold. Please delete a few objects to proceed." ,
2016-05-08 21:36:16 +02:00
HTTPStatusCode : http . StatusInternalServerError ,
} ,
ErrObjectExistsAsDirectory : {
Code : "XMinioObjectExistsAsDirectory" ,
Description : "Object name already exists as a directory." ,
HTTPStatusCode : http . StatusConflict ,
} ,
ErrReadQuorum : {
Code : "XMinioReadQuorum" ,
Description : "Multiple disk failures, unable to reconstruct data." ,
HTTPStatusCode : http . StatusServiceUnavailable ,
} ,
ErrWriteQuorum : {
Code : "XMinioWriteQuorum" ,
Description : "Multiple disks failures, unable to write data." ,
HTTPStatusCode : http . StatusServiceUnavailable ,
} ,
2016-06-09 10:53:56 +02:00
ErrPolicyNesting : {
Code : "XMinioPolicyNesting" ,
2016-11-24 02:31:11 +01:00
Description : "New bucket policy conflicts with an existing policy. Please try again with new prefix." ,
2016-06-09 10:53:56 +02:00
HTTPStatusCode : http . StatusConflict ,
} ,
2016-07-10 02:11:08 +02:00
ErrInvalidObjectName : {
Code : "XMinioInvalidObjectName" ,
2017-04-25 03:13:46 +02:00
Description : "Object name contains unsupported characters." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrInvalidResourceName : {
Code : "XMinioInvalidResourceName" ,
Description : "Resource name contains bad components such as \"..\" or \".\"." ,
2016-07-10 02:11:08 +02:00
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-08-11 03:47:49 +02:00
ErrServerNotInitialized : {
Code : "XMinioServerNotInitialized" ,
Description : "Server not initialized, please try again." ,
HTTPStatusCode : http . StatusServiceUnavailable ,
} ,
2017-01-17 23:25:59 +01:00
ErrAdminInvalidAccessKey : {
Code : "XMinioAdminInvalidAccessKey" ,
Description : "The access key is invalid." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrAdminInvalidSecretKey : {
Code : "XMinioAdminInvalidSecretKey" ,
Description : "The secret key is invalid." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2017-02-27 20:40:27 +01:00
ErrAdminConfigNoQuorum : {
Code : "XMinioAdminConfigNoQuorum" ,
Description : "Configuration update failed because server quorum was not met" ,
HTTPStatusCode : http . StatusServiceUnavailable ,
} ,
2017-09-07 20:16:13 +02:00
ErrAdminCredentialsMismatch : {
Code : "XMinioAdminCredentialsMismatch" ,
Description : "Credentials in config mismatch with server environment variables" ,
HTTPStatusCode : http . StatusServiceUnavailable ,
} ,
2017-06-01 05:33:13 +02:00
ErrInsecureClientRequest : {
Code : "XMinioInsecureClientRequest" ,
Description : "Cannot respond to plain-text request from TLS-encrypted server" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2017-08-31 20:29:22 +02:00
ErrOperationTimedOut : {
Code : "XMinioServerTimedOut" ,
Description : "A timeout occurred while trying to lock a resource" ,
HTTPStatusCode : http . StatusRequestTimeout ,
} ,
2017-08-23 01:53:35 +02:00
ErrMetadataTooLarge : {
Code : "InvalidArgument" ,
Description : "Your metadata headers exceed the maximum allowed metadata size." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2017-09-13 01:14:41 +02:00
ErrUnsupportedMetadata : {
Code : "InvalidArgument" ,
Description : "Your metadata headers are not supported." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2016-03-10 11:24:52 +01:00
// Add your error structure here.
2015-02-11 12:23:15 +01:00
}
2016-05-06 05:24:29 +02:00
// toAPIErrorCode - Converts embedded errors. Convenience
// function written to handle all cases where we have known types of
// errors returned by underlying layers.
func toAPIErrorCode ( err error ) ( apiErr APIErrorCode ) {
if err == nil {
return ErrNone
}
2016-11-21 22:51:05 +01:00
2016-08-25 18:39:01 +02:00
err = errorCause ( err )
2016-05-06 05:24:29 +02:00
// Verify if the underlying error is signature mismatch.
2016-07-05 10:04:50 +02:00
switch err {
case errSignatureMismatch :
apiErr = ErrSignatureDoesNotMatch
case errContentSHA256Mismatch :
apiErr = ErrContentSHA256Mismatch
2017-01-31 00:44:42 +01:00
case errDataTooLarge :
apiErr = ErrEntityTooLarge
case errDataTooSmall :
apiErr = ErrEntityTooSmall
2017-02-07 21:51:43 +01:00
case errInvalidAccessKeyLength :
apiErr = ErrAdminInvalidAccessKey
case errInvalidSecretKeyLength :
apiErr = ErrAdminInvalidSecretKey
2016-07-05 10:04:50 +02:00
}
2016-11-21 22:51:05 +01:00
2016-07-05 10:04:50 +02:00
if apiErr != ErrNone {
// If there was a match in the above switch case.
return apiErr
2016-05-06 05:24:29 +02:00
}
2016-11-21 22:51:05 +01:00
2016-05-06 05:24:29 +02:00
switch err . ( type ) {
case StorageFull :
apiErr = ErrStorageFull
case BadDigest :
apiErr = ErrBadDigest
2017-05-06 03:49:08 +02:00
case AllAccessDisabled :
apiErr = ErrAllAccessDisabled
2016-05-06 05:24:29 +02:00
case IncompleteBody :
apiErr = ErrIncompleteBody
2016-05-08 21:36:16 +02:00
case ObjectExistsAsDirectory :
apiErr = ErrObjectExistsAsDirectory
2016-10-21 01:09:55 +02:00
case PrefixAccessDenied :
apiErr = ErrAccessDenied
2016-05-06 05:24:29 +02:00
case BucketNameInvalid :
apiErr = ErrInvalidBucketName
case BucketNotFound :
apiErr = ErrNoSuchBucket
2017-04-27 20:26:00 +02:00
case BucketAlreadyOwnedByYou :
apiErr = ErrBucketAlreadyOwnedByYou
2016-05-06 05:24:29 +02:00
case BucketNotEmpty :
apiErr = ErrBucketNotEmpty
2017-05-08 23:53:47 +02:00
case BucketAlreadyExists :
apiErr = ErrBucketAlreadyExists
2016-05-06 05:24:29 +02:00
case BucketExists :
apiErr = ErrBucketAlreadyOwnedByYou
case ObjectNotFound :
apiErr = ErrNoSuchKey
case ObjectNameInvalid :
2016-07-10 02:11:08 +02:00
apiErr = ErrInvalidObjectName
2016-05-06 05:24:29 +02:00
case InvalidUploadID :
apiErr = ErrNoSuchUpload
case InvalidPart :
apiErr = ErrInvalidPart
case InsufficientWriteQuorum :
apiErr = ErrWriteQuorum
case InsufficientReadQuorum :
apiErr = ErrReadQuorum
2016-09-15 10:44:19 +02:00
case UnsupportedDelimiter :
apiErr = ErrNotImplemented
case InvalidMarkerPrefixCombination :
apiErr = ErrNotImplemented
case InvalidUploadIDKeyCombination :
apiErr = ErrNotImplemented
case MalformedUploadID :
apiErr = ErrNoSuchUpload
2016-05-08 21:06:05 +02:00
case PartTooSmall :
apiErr = ErrEntityTooSmall
2017-05-11 01:52:38 +02:00
case SignatureDoesNotMatch :
apiErr = ErrSignatureDoesNotMatch
2016-10-03 00:51:49 +02:00
case SHA256Mismatch :
apiErr = ErrContentSHA256Mismatch
2016-10-22 18:05:01 +02:00
case ObjectTooLarge :
apiErr = ErrEntityTooLarge
2016-11-21 13:15:26 +01:00
case ObjectTooSmall :
apiErr = ErrEntityTooSmall
2017-04-27 20:26:00 +02:00
case NotSupported :
apiErr = ErrNotSupported
2017-03-16 20:21:58 +01:00
case NotImplemented :
apiErr = ErrNotImplemented
2017-04-27 20:26:00 +02:00
case PolicyNotFound :
apiErr = ErrNoSuchBucketPolicy
2017-07-13 01:42:14 +02:00
case PartTooBig :
apiErr = ErrEntityTooLarge
2017-09-13 01:14:41 +02:00
case UnsupportedMetadata :
apiErr = ErrUnsupportedMetadata
2016-05-06 05:24:29 +02:00
default :
apiErr = ErrInternalError
}
2016-11-21 22:51:05 +01:00
2016-05-06 05:24:29 +02:00
return apiErr
}
2016-03-10 11:24:52 +01:00
// getAPIError provides API Error for input API error code.
func getAPIError ( code APIErrorCode ) APIError {
2015-02-11 12:23:15 +01:00
return errorCodeResponse [ code ]
}
2015-02-24 01:46:48 +01:00
// getErrorResponse gets in standard error and resource value and
// provides a encodable populated response values
2016-03-10 11:24:52 +01:00
func getAPIErrorResponse ( err APIError , resource string ) APIErrorResponse {
2017-01-18 21:24:34 +01:00
return APIErrorResponse {
Code : err . Code ,
Message : err . Description ,
Resource : resource ,
RequestID : "3L137" ,
HostID : "3L137" ,
2015-02-12 07:00:45 +01:00
}
2015-02-11 12:23:15 +01:00
}