From 9b0d6167b43665f8f96c67616bb4e3edb9b7abcb Mon Sep 17 00:00:00 2001 From: jayzhenghan Date: Mon, 10 Aug 2020 17:59:10 +0800 Subject: [PATCH 1/8] fix python2/python3 long int --- qcloud_cos/resumable_downloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qcloud_cos/resumable_downloader.py b/qcloud_cos/resumable_downloader.py index 9b938d11..abb2fa4e 100644 --- a/qcloud_cos/resumable_downloader.py +++ b/qcloud_cos/resumable_downloader.py @@ -179,7 +179,7 @@ def __del_record(self): def __check_crc(self): logger.debug('start to check crc') - c64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693L, initCrc=0L, xorOut=0xffffffffffffffffL, rev=True) + c64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693, initCrc=0L, xorOut=0xffffffffffffffff, rev=True) with open(self.__dest_file_path, 'rb') as f: local_crc64 = str(c64(f.read())) object_crc64 = self.__object_info['x-cos-hash-crc64ecma'] From 2c1bcd15e0628c604ce72bac086518827983cade Mon Sep 17 00:00:00 2001 From: jayzhenghan Date: Mon, 10 Aug 2020 18:01:23 +0800 Subject: [PATCH 2/8] fix python2/python3 long int 2 --- qcloud_cos/resumable_downloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qcloud_cos/resumable_downloader.py b/qcloud_cos/resumable_downloader.py index abb2fa4e..01d14090 100644 --- a/qcloud_cos/resumable_downloader.py +++ b/qcloud_cos/resumable_downloader.py @@ -179,7 +179,7 @@ def __del_record(self): def __check_crc(self): logger.debug('start to check crc') - c64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693, initCrc=0L, xorOut=0xffffffffffffffff, rev=True) + c64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693, initCrc=0, xorOut=0xffffffffffffffff, rev=True) with open(self.__dest_file_path, 'rb') as f: local_crc64 = str(c64(f.read())) object_crc64 = self.__object_info['x-cos-hash-crc64ecma'] From 211724966194dd6deeeabfa02be9d41e768c6175 Mon Sep 17 00:00:00 2001 From: jayzhenghan Date: Tue, 11 Aug 2020 19:18:50 +0800 Subject: [PATCH 3/8] add funtion of bucket encryption --- qcloud_cos/cos_client.py | 89 ++++++++++++++++++++++++++++++++++++++++ ut/test.py | 13 ++++++ 2 files changed, 102 insertions(+) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index ada01a9a..b63bb1e5 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -3425,6 +3425,95 @@ def update_object_meta(self, Bucket, Key, **kwargs): ) return response + def put_bucket_encryption(self, Bucket, SSEAlgorithm=None, **kwargs): + """设置执行存储桶下的默认加密配置 + + :param Bucket(string): 存储桶名称. + :param SSEAlgorithm(string): 要使用的服务端加密算法 + :param kwargs(dict): 设置下载的headers. + :return(dict): 设置成功返回的结果. + """ + if SSEAlgorithm is None: + raise CosClientError('SSEAlgorithm is None and must be set!') + + root = xml.etree.ElementTree.Element("ServerSideEncryptionConfiguration") + rule_node = xml.etree.ElementTree.SubElement(root, "Rule") + apply_node = xml.etree.ElementTree.SubElement(rule_node, "ApplySideEncryptionConfiguration") + xml.etree.ElementTree.SubElement(apply_node, "SSEAlgorithm").text = to_str(SSEAlgorithm) + body = xml.etree.ElementTree.tostring(root, encoding='utf-8') + + headers = mapped(kwargs) + params = {'encryption': ''} + url = self._conf.uri(bucket=Bucket) + logger.info("put bucket encryption, url=:{url} ,headers=:{headers}".format( + url=url, + headers=headers)) + rt = self.send_request( + method='PUT', + url=url, + bucket=Bucket, + auth=CosS3Auth(self._conf, params=params), + data=to_bytes(body), + headers=headers, + params=params) + + response = dict(**rt.headers) + return response + + def get_bucket_encryption(self, Bucket, **kwargs): + """获取存储桶下的默认加密配置 + + :param Bucket(string): 存储桶名称. + :param kwargs(dict): 设置下载的headers. + :return(string): 服务端的加密算法. + """ + headers = mapped(kwargs) + params = {'encryption': ''} + url = self._conf.uri(bucket=Bucket) + logger.info("get bucket encryption, url=:{url} ,headers=:{headers}".format( + url=url, + headers=headers)) + rt = self.send_request( + method='GET', + url=url, + bucket=Bucket, + auth=CosS3Auth(self._conf, params=params), + headers=headers, + params=params) + data = xml.etree.ElementTree.fromstring(rt.content) + sse_algorithm = None + rule = data.find('Rule') + if rule is not None: + apply = rule.find('ApplyServerSideEncryptionByDefault') + if apply is not None: + sse_algorithm = to_str(apply.find('SSEAlgorithm').text) + + return sse_algorithm + + def delete_bucket_encryption(self, Bucket, **kwargs): + """用于删除指定存储桶下的默认加密配置 + + :param Bucket(string): 存储桶名称. + :param kwargs(dict): 设置下载的headers. + :return(dict): 上传成功返回的结果. + """ + headers = mapped(kwargs) + params = {'encryption': ''} + url = self._conf.uri(bucket=Bucket) + logger.info("put bucket encryption, url=:{url} ,headers=:{headers}".format( + url=url, + headers=headers)) + rt = self.send_request( + method='DELETE', + url=url, + bucket=Bucket, + auth=CosS3Auth(self._conf, params=params), + headers=headers, + params=params) + + response = dict(**rt.headers) + return response + if __name__ == "__main__": pass diff --git a/ut/test.py b/ut/test.py index 12151f61..b1058b03 100644 --- a/ut/test.py +++ b/ut/test.py @@ -1212,6 +1212,19 @@ def test_download_file(): if os.path.exists(file_name): os.remove(file_name) +def test_bucket_encryption(): + """测试存储桶默认加密配置""" + # 测试设置存储桶的默认加密配置 + client.put_bucket_encryption(copy_test_bucket, 'AES256') + + # 测试获取存储桶默认加密配置 + ret = client.get_bucket_encryption(copy_test_bucket) + assert(ret == 'AES256') + + # 删除存储桶默认加密配置 + client.delete_bucket_encryption(copy_test_bucket) + + if __name__ == "__main__": setUp() """ From 9bd4c1ab26d1f9afe8b9e14dfba08a19424d16e3 Mon Sep 17 00:00:00 2001 From: jayzhenghan Date: Tue, 11 Aug 2020 19:22:16 +0800 Subject: [PATCH 4/8] add funtion of bucket encryption --- qcloud_cos/cos_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index b63bb1e5..5a51e664 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -3513,7 +3513,7 @@ def delete_bucket_encryption(self, Bucket, **kwargs): response = dict(**rt.headers) return response - + if __name__ == "__main__": pass From c92ba31c2ed5f713858f78ad0f45f546b371b985 Mon Sep 17 00:00:00 2001 From: jayzhenghan Date: Fri, 14 Aug 2020 11:08:06 +0800 Subject: [PATCH 5/8] add funtion of bucket encryption --- qcloud_cos/cos_client.py | 40 ++++++++++++++++------------------------ ut/test.py | 18 ++++++++++++++---- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 5a51e664..88c57d32 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -3425,7 +3425,7 @@ def update_object_meta(self, Bucket, Key, **kwargs): ) return response - def put_bucket_encryption(self, Bucket, SSEAlgorithm=None, **kwargs): + def put_bucket_encryption(self, Bucket, ServerSideEncryptionConfiguration={}, **kwargs): """设置执行存储桶下的默认加密配置 :param Bucket(string): 存储桶名称. @@ -3433,15 +3433,13 @@ def put_bucket_encryption(self, Bucket, SSEAlgorithm=None, **kwargs): :param kwargs(dict): 设置下载的headers. :return(dict): 设置成功返回的结果. """ - if SSEAlgorithm is None: - raise CosClientError('SSEAlgorithm is None and must be set!') - - root = xml.etree.ElementTree.Element("ServerSideEncryptionConfiguration") - rule_node = xml.etree.ElementTree.SubElement(root, "Rule") - apply_node = xml.etree.ElementTree.SubElement(rule_node, "ApplySideEncryptionConfiguration") - xml.etree.ElementTree.SubElement(apply_node, "SSEAlgorithm").text = to_str(SSEAlgorithm) - body = xml.etree.ElementTree.tostring(root, encoding='utf-8') - + # 类型为list的标签 + lst = [ + '', + '' + ] + xml_config = format_xml(data=ServerSideEncryptionConfiguration, root='ServerSideEncryptionConfiguration', lst=lst) + logger.info('xml_config: {0}'.format(xml_config)) headers = mapped(kwargs) params = {'encryption': ''} url = self._conf.uri(bucket=Bucket) @@ -3453,12 +3451,11 @@ def put_bucket_encryption(self, Bucket, SSEAlgorithm=None, **kwargs): url=url, bucket=Bucket, auth=CosS3Auth(self._conf, params=params), - data=to_bytes(body), + data=xml_config, headers=headers, params=params) - response = dict(**rt.headers) - return response + return None def get_bucket_encryption(self, Bucket, **kwargs): """获取存储桶下的默认加密配置 @@ -3480,15 +3477,11 @@ def get_bucket_encryption(self, Bucket, **kwargs): auth=CosS3Auth(self._conf, params=params), headers=headers, params=params) - data = xml.etree.ElementTree.fromstring(rt.content) - sse_algorithm = None - rule = data.find('Rule') - if rule is not None: - apply = rule.find('ApplyServerSideEncryptionByDefault') - if apply is not None: - sse_algorithm = to_str(apply.find('SSEAlgorithm').text) - return sse_algorithm + data = xml_to_dict(rt.content) + format_dict(data, ['Rule']) + logger.info('data: {0}'.format(data)) + return data def delete_bucket_encryption(self, Bucket, **kwargs): """用于删除指定存储桶下的默认加密配置 @@ -3500,7 +3493,7 @@ def delete_bucket_encryption(self, Bucket, **kwargs): headers = mapped(kwargs) params = {'encryption': ''} url = self._conf.uri(bucket=Bucket) - logger.info("put bucket encryption, url=:{url} ,headers=:{headers}".format( + logger.info("delete bucket encryption, url=:{url} ,headers=:{headers}".format( url=url, headers=headers)) rt = self.send_request( @@ -3511,8 +3504,7 @@ def delete_bucket_encryption(self, Bucket, **kwargs): headers=headers, params=params) - response = dict(**rt.headers) - return response + return None if __name__ == "__main__": diff --git a/ut/test.py b/ut/test.py index b1058b03..7fa29cbd 100644 --- a/ut/test.py +++ b/ut/test.py @@ -1215,14 +1215,24 @@ def test_download_file(): def test_bucket_encryption(): """测试存储桶默认加密配置""" # 测试设置存储桶的默认加密配置 - client.put_bucket_encryption(copy_test_bucket, 'AES256') + config_dict = { + 'Rule': [ + { + 'ApplySideEncryptionConfiguration': { + 'SSEAlgorithm': 'AES256', + } + }, + ] + } + client.put_bucket_encryption(test_bucket, config_dict) # 测试获取存储桶默认加密配置 - ret = client.get_bucket_encryption(copy_test_bucket) - assert(ret == 'AES256') + ret = client.get_bucket_encryption(test_bucket) + sse_algorithm = ret['Rule'][0]['ApplyServerSideEncryptionByDefault']['SSEAlgorithm'] + assert(sse_algorithm == 'AES256') # 删除存储桶默认加密配置 - client.delete_bucket_encryption(copy_test_bucket) + client.delete_bucket_encryption(test_bucket) if __name__ == "__main__": From 8a93284ef1916507c8ff269d709fe12ea5557345 Mon Sep 17 00:00:00 2001 From: jayzhenghan Date: Fri, 14 Aug 2020 11:09:50 +0800 Subject: [PATCH 6/8] add funtion of bucket encryption --- qcloud_cos/cos_client.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 88c57d32..58c9430c 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -3439,7 +3439,6 @@ def put_bucket_encryption(self, Bucket, ServerSideEncryptionConfiguration={}, ** '' ] xml_config = format_xml(data=ServerSideEncryptionConfiguration, root='ServerSideEncryptionConfiguration', lst=lst) - logger.info('xml_config: {0}'.format(xml_config)) headers = mapped(kwargs) params = {'encryption': ''} url = self._conf.uri(bucket=Bucket) @@ -3480,7 +3479,6 @@ def get_bucket_encryption(self, Bucket, **kwargs): data = xml_to_dict(rt.content) format_dict(data, ['Rule']) - logger.info('data: {0}'.format(data)) return data def delete_bucket_encryption(self, Bucket, **kwargs): From 2f397674a790467e04032837131769926b3faabb Mon Sep 17 00:00:00 2001 From: jayzhenghan Date: Fri, 14 Aug 2020 11:20:19 +0800 Subject: [PATCH 7/8] add funtion of bucket encryption --- qcloud_cos/cos_client.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 58c9430c..0cd213b6 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -2807,7 +2807,7 @@ def list_buckets(self, **kwargs): config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象 client = CosS3Client(config) # 获取账户下所有存储桶信息 - response = logging_client.list_buckets( + response = client.list_buckets( Bucket='bucket' ) """ @@ -3429,9 +3429,9 @@ def put_bucket_encryption(self, Bucket, ServerSideEncryptionConfiguration={}, ** """设置执行存储桶下的默认加密配置 :param Bucket(string): 存储桶名称. - :param SSEAlgorithm(string): 要使用的服务端加密算法 - :param kwargs(dict): 设置下载的headers. - :return(dict): 设置成功返回的结果. + :param ServerSideEncryptionConfiguration(dict): 设置Bucket的加密规则 + :param kwargs(dict): 设置请求的headers. + :return: None. """ # 类型为list的标签 lst = [ @@ -3460,8 +3460,8 @@ def get_bucket_encryption(self, Bucket, **kwargs): """获取存储桶下的默认加密配置 :param Bucket(string): 存储桶名称. - :param kwargs(dict): 设置下载的headers. - :return(string): 服务端的加密算法. + :param kwargs(dict): 设置请求的headers. + :return(dict): 返回bucket的加密规则. """ headers = mapped(kwargs) params = {'encryption': ''} @@ -3485,8 +3485,8 @@ def delete_bucket_encryption(self, Bucket, **kwargs): """用于删除指定存储桶下的默认加密配置 :param Bucket(string): 存储桶名称. - :param kwargs(dict): 设置下载的headers. - :return(dict): 上传成功返回的结果. + :param kwargs(dict): 设置请求的headers. + :return: None. """ headers = mapped(kwargs) params = {'encryption': ''} From 9e2d393177bf6fbd0e964dd9486fbce7af395ac3 Mon Sep 17 00:00:00 2001 From: jayzhenghan Date: Fri, 14 Aug 2020 11:37:02 +0800 Subject: [PATCH 8/8] update version to 1.8.3 --- qcloud_cos/cos_client.py | 4 +--- qcloud_cos/version.py | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 0cd213b6..c07c39a9 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -2807,9 +2807,7 @@ def list_buckets(self, **kwargs): config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象 client = CosS3Client(config) # 获取账户下所有存储桶信息 - response = client.list_buckets( - Bucket='bucket' - ) + response = client.list_buckets() """ headers = mapped(kwargs) url = '{scheme}://service.cos.myqcloud.com/'.format(scheme=self._conf._scheme) diff --git a/qcloud_cos/version.py b/qcloud_cos/version.py index be46c417..24fcf0b5 100644 --- a/qcloud_cos/version.py +++ b/qcloud_cos/version.py @@ -1,2 +1,2 @@ -__version__ = '5.1.8.1' +__version__ = '5.1.8.3' diff --git a/setup.py b/setup.py index 930d2fae..903ec444 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ def long_description(): setup( name='cos-python-sdk-v5', - version='1.8.1', + version='1.8.3', url='https://www.qcloud.com/', license='MIT', author='tiedu, lewzylu, channingliu',