diff options
author | Zuul <zuul@review.openstack.org> | 2018-10-17 07:07:13 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2018-10-17 07:07:13 +0000 |
commit | ab2abfe3ae64562d8b855217fe5c3629e4cdad59 (patch) | |
tree | 6e91ec7ce132a3c2c15208c8c2613f8d8a754fa9 /swift/common/middleware/s3api/s3request.py | |
parent | 9d9395b782eaec5c0ba5d23245f1514af128e854 (diff) | |
parent | 78c9fd9f93df75af4b9ca6500d27422963dc89c4 (diff) | |
download | swift-ab2abfe3ae64562d8b855217fe5c3629e4cdad59.tar.gz |
Merge "Change PUT bucket conflict error"
Diffstat (limited to 'swift/common/middleware/s3api/s3request.py')
-rw-r--r-- | swift/common/middleware/s3api/s3request.py | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/swift/common/middleware/s3api/s3request.py b/swift/common/middleware/s3api/s3request.py index 36862da68..ee76781f0 100644 --- a/swift/common/middleware/s3api/s3request.py +++ b/swift/common/middleware/s3api/s3request.py @@ -24,7 +24,7 @@ import six from six.moves.urllib.parse import quote, unquote, parse_qsl import string -from swift.common.utils import split_path +from swift.common.utils import split_path, json from swift.common import swob from swift.common.http import HTTP_OK, HTTP_CREATED, HTTP_ACCEPTED, \ HTTP_NO_CONTENT, HTTP_UNAUTHORIZED, HTTP_FORBIDDEN, HTTP_NOT_FOUND, \ @@ -44,7 +44,7 @@ from swift.common.middleware.s3api.controllers import ServiceController, \ UploadController, UploadsController, VersioningController, \ UnsupportedController, S3AclController, BucketController from swift.common.middleware.s3api.s3response import AccessDenied, \ - InvalidArgument, InvalidDigest, \ + InvalidArgument, InvalidDigest, BucketAlreadyOwnedByYou, \ RequestTimeTooSkewed, S3Response, SignatureDoesNotMatch, \ BucketAlreadyExists, BucketNotEmpty, EntityTooLarge, \ InternalError, NoSuchBucket, NoSuchKey, PreconditionFailed, InvalidRange, \ @@ -1156,6 +1156,20 @@ class S3Request(swob.Request): return code_map[method] + def _bucket_put_accepted_error(self, container, app): + sw_req = self.to_swift_req('HEAD', container, None) + info = get_container_info(sw_req.environ, app) + sysmeta = info.get('sysmeta', {}) + try: + acl = json.loads(sysmeta.get('s3api-acl', + sysmeta.get('swift3-acl', '{}'))) + owner = acl.get('Owner') + except (ValueError, TypeError, KeyError): + owner = None + if owner is None or owner == self.user_id: + raise BucketAlreadyOwnedByYou(container) + raise BucketAlreadyExists(container) + def _swift_error_codes(self, method, container, obj, env, app): """ Returns a dict from expected Swift error codes to the corresponding S3 @@ -1177,7 +1191,8 @@ class S3Request(swob.Request): HTTP_NOT_FOUND: (NoSuchBucket, container), }, 'PUT': { - HTTP_ACCEPTED: (BucketAlreadyExists, container), + HTTP_ACCEPTED: (self._bucket_put_accepted_error, container, + app), }, 'POST': { HTTP_NOT_FOUND: (NoSuchBucket, container), |