Skip to content

Commit f392404

Browse files
committed
Update delete objects xml escape.
1 parent 708db2f commit f392404

File tree

4 files changed

+101
-17
lines changed

4 files changed

+101
-17
lines changed

oss2/utils.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,3 +803,24 @@ def to_str(pos):
803803
return str(pos)
804804

805805
return to_str(start) + '-' + to_str(last)
806+
807+
def xml_escape(key):
808+
if key is None:
809+
return None
810+
811+
new_key = ""
812+
escape_keys = {
813+
'\r' : '
',
814+
'\'' :'"',
815+
'&' : '&',
816+
'<' : '&lt;',
817+
'>' : '&gt;'
818+
}
819+
820+
for i in range(0, len(key)):
821+
if escape_keys.get(key[i]) is not None:
822+
new_key += escape_keys.get(key[i])
823+
else:
824+
new_key += key[i]
825+
826+
return new_key

oss2/xml_utils.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -711,34 +711,37 @@ def to_complete_upload_request(parts):
711711

712712
return _node_to_string(root)
713713

714-
715714
def to_batch_delete_objects_request(keys, quiet):
716-
root_node = ElementTree.Element('Delete')
717-
718-
_add_text_child(root_node, 'Quiet', str(quiet).lower())
715+
xml_body = '''<?xml version="1.0" encoding="UTF-8"?>'''
716+
xml_body += "<Delete>"
717+
xml_body += "<Quiet>" + str(quiet).lower() + "</Quiet>"
719718

720719
for key in keys:
721-
object_node = ElementTree.SubElement(root_node, 'Object')
722-
_add_text_child(object_node, 'Key', key)
723-
724-
return _node_to_string(root_node)
720+
new_key = utils.xml_escape(to_unicode(key))
721+
object_body = "<Object>" + "<Key>" + new_key + "</Key>" + "</Object>"
722+
xml_body += object_body
725723

726-
def to_batch_delete_objects_version_request(objectVersions, quiet):
724+
xml_body += "</Delete>"
727725

728-
root_node = ElementTree.Element('Delete')
726+
return xml_body
729727

730-
_add_text_child(root_node, 'Quiet', str(quiet).lower())
728+
def to_batch_delete_objects_version_request(objectVersions, quiet):
729+
xml_body = '''<?xml version="1.0" encoding="UTF-8"?>'''
730+
xml_body += "<Delete>"
731+
xml_body += "<Quiet>" + str(quiet).lower() + "</Quiet>"
731732

732733
objectVersionList = objectVersions.object_version_list
733-
734734
for ver in objectVersionList:
735-
object_node = ElementTree.SubElement(root_node, 'Object')
736-
_add_text_child(object_node, 'Key', ver.key)
737-
if ver.versionid != '':
738-
_add_text_child(object_node, 'VersionId', ver.versionid)
735+
new_key = utils.xml_escape(to_unicode(ver.key))
736+
object_body = "<Object>"
737+
object_body += "<Key>" + new_key + "</Key>"
738+
object_body += "<VersionId>" + ver.versionid + "</VersionId>"
739+
object_body += "</Object>"
740+
xml_body += object_body
739741

740-
return _node_to_string(root_node)
742+
xml_body += "</Delete>"
741743

744+
return xml_body
742745

743746
def to_put_bucket_config(bucket_config):
744747
root = ElementTree.Element('CreateBucketConfiguration')

tests/test_object.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,17 @@ def test_batch_delete_objects(self):
387387
for object in object_list:
388388
self.assertTrue(not self.bucket.object_exists(object))
389389

390+
def test_batch_delete_objects_specificalChars(self):
391+
object_name = "测试中文python-bswodnvsttpqvnzwsgifetwe\n\n\t@#$!\t<>!@#$%^&*()-="
392+
for i in range(1, 32):
393+
object_name += chr(i)
394+
395+
result = self.bucket.put_object(object_name, "123")
396+
397+
key_list = [object_name]
398+
self.bucket.batch_delete_objects(key_list)
399+
self.assertFalse(self.bucket.object_exists(object_name))
400+
390401
def test_batch_delete_objects_empty(self):
391402
try:
392403
self.bucket.batch_delete_objects([])

tests/test_object_versioning.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,55 @@ def test_delete_object_versions_with_invalid_arguments(self):
10251025
self.assertRaises(oss2.exceptions.ClientError, bucket.delete_object_versions, None)
10261026
self.assertRaises(oss2.exceptions.ClientError, bucket.delete_object_versions, [])
10271027

1028+
def test_batch_delete_verions_with_specifical_chars(self):
1029+
1030+
from oss2.models import BucketVersioningConfig
1031+
from oss2.models import BatchDeleteObjectVersion
1032+
from oss2.models import BatchDeleteObjectVersionList
1033+
1034+
auth = oss2.Auth(OSS_ID, OSS_SECRET)
1035+
bucket_name = OSS_BUCKET + "-test-batch-delete-versions-spec-chars"
1036+
bucket = oss2.Bucket(auth, self.endpoint, bucket_name)
1037+
1038+
bucket.create_bucket(oss2.BUCKET_ACL_PRIVATE)
1039+
1040+
wait_meta_sync()
1041+
1042+
config = BucketVersioningConfig()
1043+
config.status = 'Enabled'
1044+
1045+
result = bucket.put_bucket_versioning(config)
1046+
1047+
wait_meta_sync()
1048+
1049+
result = bucket.get_bucket_info()
1050+
1051+
object_name = "测试中文python-bswodnvsttpqvnzwsgifetwe\n\n\t@#$!\t<>!@#$%^&*()-="
1052+
for i in range(1, 32):
1053+
object_name += chr(i)
1054+
1055+
# put version 1
1056+
result = bucket.put_object(object_name, "123")
1057+
self.assertEqual(int(result.status)/100, 2)
1058+
self.assertTrue(result.versionid != "")
1059+
versionid1 = result.versionid
1060+
1061+
version_list = BatchDeleteObjectVersionList()
1062+
version_list.append(BatchDeleteObjectVersion(key=object_name, versionid=versionid1))
1063+
1064+
self.assertTrue(version_list.len(), 1)
1065+
1066+
result = bucket.delete_object_versions(version_list)
1067+
1068+
self.assertTrue(len(result.delete_versions) == 1)
1069+
self.assertTrue(result.delete_versions[0].versionid == versionid1)
1070+
1071+
self.assertFalse(bucket.object_exists(object_name))
1072+
1073+
try:
1074+
bucket.delete_bucket()
1075+
except:
1076+
self.assertFalse(True, "should not get a exception")
10281077

10291078
if __name__ == '__main__':
10301079
unittest.main()

0 commit comments

Comments
 (0)