raise an error on attempt to copy s3 object to itself without changing anything (#4838)
This commit is contained in:
parent
1ab00b48d7
commit
433a57da68
@ -575,6 +575,16 @@ class BucketMustHaveLockeEnabled(S3ClientError):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class CopyObjectMustChangeSomething(S3ClientError):
|
||||||
|
code = 400
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__(
|
||||||
|
"InvalidRequest",
|
||||||
|
"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.",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class InvalidFilterRuleName(InvalidArgumentError):
|
class InvalidFilterRuleName(InvalidArgumentError):
|
||||||
code = 400
|
code = 400
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ from moto.s3.exceptions import (
|
|||||||
AccessDeniedByLock,
|
AccessDeniedByLock,
|
||||||
BucketAlreadyExists,
|
BucketAlreadyExists,
|
||||||
BucketNeedsToBeNew,
|
BucketNeedsToBeNew,
|
||||||
|
CopyObjectMustChangeSomething,
|
||||||
MissingBucket,
|
MissingBucket,
|
||||||
InvalidBucketName,
|
InvalidBucketName,
|
||||||
InvalidPart,
|
InvalidPart,
|
||||||
@ -2016,6 +2017,16 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
|
|||||||
kms_key_id=None,
|
kms_key_id=None,
|
||||||
bucket_key_enabled=False,
|
bucket_key_enabled=False,
|
||||||
):
|
):
|
||||||
|
if (
|
||||||
|
src_key.name == dest_key_name
|
||||||
|
and src_key.bucket_name == dest_bucket_name
|
||||||
|
and storage == src_key.storage_class
|
||||||
|
and acl == src_key.acl
|
||||||
|
and encryption == src_key.encryption
|
||||||
|
and kms_key_id == src_key.kms_key_id
|
||||||
|
and bucket_key_enabled == (src_key.bucket_key_enabled or False)
|
||||||
|
):
|
||||||
|
raise CopyObjectMustChangeSomething
|
||||||
|
|
||||||
new_key = self.put_object(
|
new_key = self.put_object(
|
||||||
bucket_name=dest_bucket_name,
|
bucket_name=dest_bucket_name,
|
||||||
|
@ -683,6 +683,28 @@ def test_copy_key_replace_metadata_boto3():
|
|||||||
resp["ETag"].should.equal(initial["ETag"])
|
resp["ETag"].should.equal(initial["ETag"])
|
||||||
|
|
||||||
|
|
||||||
|
@mock_s3
|
||||||
|
def test_copy_key_without_changes_should_error_boto3():
|
||||||
|
client = boto3.client("s3", region_name=DEFAULT_REGION_NAME)
|
||||||
|
bucket_name = "my_bucket"
|
||||||
|
s3 = boto3.resource("s3", region_name=DEFAULT_REGION_NAME)
|
||||||
|
key_name = "my_key"
|
||||||
|
key = s3.Object(bucket_name, key_name)
|
||||||
|
|
||||||
|
s3.create_bucket(Bucket=bucket_name)
|
||||||
|
key.put(Body=b"some value")
|
||||||
|
|
||||||
|
with pytest.raises(ClientError) as e:
|
||||||
|
client.copy_object(
|
||||||
|
Bucket=bucket_name,
|
||||||
|
CopySource="{}/{}".format(bucket_name, key_name),
|
||||||
|
Key=key_name,
|
||||||
|
)
|
||||||
|
e.value.response["Error"]["Message"].should.equal(
|
||||||
|
"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."
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@freeze_time("2012-01-01 12:00:00")
|
@freeze_time("2012-01-01 12:00:00")
|
||||||
@mock_s3
|
@mock_s3
|
||||||
def test_last_modified_boto3():
|
def test_last_modified_boto3():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user