esdk-obs-python 3.25.3__tar.gz → 3.25.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/PKG-INFO +1 -1
  2. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/esdk_obs_python.egg-info/PKG-INFO +1 -1
  3. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/__init__.py +3 -2
  4. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/bucket.py +113 -113
  5. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/client.py +47 -31
  6. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/const.py +1 -1
  7. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/convertor.py +14 -1
  8. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/crc64mod.py +151 -151
  9. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/crypto_client.py +279 -279
  10. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/http.py +432 -432
  11. esdk-obs-python-3.25.8/obs/loadtoken.py +341 -0
  12. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/model.py +37 -8
  13. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/transfer.py +832 -830
  14. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/util.py +526 -526
  15. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/setup.py +1 -1
  16. esdk-obs-python-3.25.3/obs/loadtoken.py +0 -184
  17. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/esdk_obs_python.egg-info/SOURCES.txt +0 -0
  18. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/esdk_obs_python.egg-info/dependency_links.txt +0 -0
  19. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/esdk_obs_python.egg-info/not-zip-safe +0 -0
  20. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/esdk_obs_python.egg-info/requires.txt +0 -0
  21. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/esdk_obs_python.egg-info/top_level.txt +0 -0
  22. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/auth.py +0 -0
  23. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/bulktasks.py +0 -0
  24. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/cache.py +0 -0
  25. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/extension.py +0 -0
  26. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/http2.py +0 -0
  27. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/ilog.py +0 -0
  28. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/locks.py +0 -0
  29. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/obs_cipher_suite.py +0 -0
  30. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/posix_transfer.py +0 -0
  31. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/progress.py +0 -0
  32. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/scheduler.py +0 -0
  33. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/searchmethod.py +0 -0
  34. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/obs/workflow.py +0 -0
  35. {esdk-obs-python-3.25.3 → esdk-obs-python-3.25.8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esdk-obs-python
3
- Version: 3.25.3
3
+ Version: 3.25.8
4
4
  Summary: OBS Python SDK
5
5
  Home-page: UNKNOWN
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esdk-obs-python
3
- Version: 3.25.3
3
+ Version: 3.25.8
4
4
  Summary: OBS Python SDK
5
5
  Home-page: UNKNOWN
6
6
  License: Apache-2.0
@@ -23,7 +23,7 @@ from obs.model import TopicConfiguration, FunctionGraphConfiguration, FilterRule
23
23
  from obs.model import Options, PutObjectHeader, AppendObjectHeader, AppendObjectContent, RedirectAllRequestTo
24
24
  from obs.model import Redirect, RoutingRule, Tag, TagInfo, Transition, NoncurrentVersionTransition, Rule, Versions, AbortIncompleteMultipartUpload
25
25
  from obs.model import Object, WebsiteConfiguration, Logging, CompleteMultipartUploadRequest, DeleteObjectsRequest,CustomDomainConfiguration
26
- from obs.model import ListMultipartUploadsRequest, GetObjectRequest, UploadFileHeader, Payer
26
+ from obs.model import ListMultipartUploadsRequest, GetObjectRequest, UploadFileHeader, Payer, ClientVerify
27
27
  from obs.model import ExtensionHeader, FetchStatus, BucketAliasModel, ListBucketAliasModel
28
28
  from obs.workflow import WorkflowClient
29
29
  from obs.crypto_client import CryptoObsClient
@@ -97,5 +97,6 @@ __all__ = [
97
97
  'CtrRSACipherGenerator',
98
98
  'BucketAliasModel',
99
99
  'ListBucketAliasModel',
100
- 'CustomDomainConfiguration'
100
+ 'CustomDomainConfiguration',
101
+ 'ClientVerify'
101
102
  ]
@@ -1,113 +1,113 @@
1
- #!/usr/bin/python
2
- # -*- coding:utf-8 -*-
3
- # Copyright 2019 Huawei Technologies Co.,Ltd.
4
- # Licensed under the Apache License, Version 2.0 (the "License"); you may not use
5
- # this file except in compliance with the License. You may obtain a copy of the
6
- # License at
7
-
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- # Unless required by applicable law or agreed to in writing, software distributed
11
- # under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
- # CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
- # specific language governing permissions and limitations under the License.
14
-
15
-
16
- class BucketClient(object):
17
- allowedMethod = [
18
- 'createBucket',
19
- 'deleteBucket',
20
- 'headBucket',
21
- 'getBucketMetadata',
22
- 'setBucketQuota',
23
- 'getBucketQuota',
24
- 'getBucketStorageInfo',
25
- 'setBucketAcl',
26
- 'getBucketAcl',
27
- 'setBucketPolicy',
28
- 'getBucketPolicy',
29
- 'deleteBucketPolicy',
30
- 'setBucketVersioning',
31
- 'getBucketVersioning',
32
- 'listVersions',
33
- 'listObjects',
34
- 'listMultipartUploads',
35
- 'deleteBucketLifecycle',
36
- 'setBucketLifecycle',
37
- 'getBucketLifecycle',
38
- 'deleteBucketWebsite',
39
- 'setBucketWebsite',
40
- 'getBucketWebsite',
41
- 'setBucketLogging',
42
- 'getBucketLogging',
43
- 'getBucketLocation',
44
- 'getBucketTagging',
45
- 'setBucketTagging',
46
- 'deleteBucketTagging',
47
- 'setBucketCors',
48
- 'deleteBucketCors',
49
- 'getBucketCors',
50
- 'setBucketNotification',
51
- 'getBucketNotification',
52
- 'getObjectMetadata',
53
- 'setObjectMetadata',
54
- 'getObject',
55
- 'putContent',
56
- 'putObject',
57
- 'appendObject',
58
- 'putFile',
59
- 'uploadPart',
60
- 'copyObject',
61
- 'setObjectAcl',
62
- 'getObjectAcl',
63
- 'deleteObject',
64
- 'deleteObjects',
65
- 'restoreObject',
66
- 'initiateMultipartUpload',
67
- 'copyPart',
68
- 'completeMultipartUpload',
69
- 'abortMultipartUpload',
70
- 'listParts',
71
- 'getBucketStoragePolicy',
72
- 'setBucketStoragePolicy',
73
- 'optionsBucket',
74
- 'optionsObject',
75
- 'setBucketEncryption',
76
- 'getBucketEncryption',
77
- 'deleteBucketEncryption',
78
- 'headObject',
79
- 'setBucketRequestPayment',
80
- 'getBucketRequestPayment',
81
- 'setBucketFetchPolicy',
82
- 'getBucketFetchPolicy',
83
- 'deleteBucketFetchPolicy',
84
- 'setBucketFetchJob',
85
- 'getBucketFetchJob',
86
- 'setBucketCustomDomain',
87
- 'deleteBucketCustomDomain',
88
- 'getBucketCustomDomain',
89
- ]
90
-
91
- def __init__(self, obsClient, bucketName):
92
- self.__obsClient = obsClient
93
- self.__bucketName = bucketName
94
-
95
- def __getattr__(self, key):
96
- if key in self.allowedMethod and hasattr(self.__obsClient, key):
97
- original_method = getattr(self.__obsClient, key)
98
- if callable(original_method):
99
- def delegate(*args, **kwargs):
100
- _args = list(args)
101
- if key == 'copyObject':
102
- if 'destBucketName' not in kwargs:
103
- if len(_args) >= 2:
104
- _args.insert(2, self.__bucketName)
105
- else:
106
- kwargs['destBucketName'] = self.__bucketName
107
- else:
108
- if 'bucketName' not in kwargs:
109
- _args.insert(0, self.__bucketName)
110
- return original_method(*_args, **kwargs)
111
-
112
- return delegate
113
- return super(BucketClient, self).__getattribute__(key)
1
+ #!/usr/bin/python
2
+ # -*- coding:utf-8 -*-
3
+ # Copyright 2019 Huawei Technologies Co.,Ltd.
4
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may not use
5
+ # this file except in compliance with the License. You may obtain a copy of the
6
+ # License at
7
+
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ # Unless required by applicable law or agreed to in writing, software distributed
11
+ # under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
+ # CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
+ # specific language governing permissions and limitations under the License.
14
+
15
+
16
+ class BucketClient(object):
17
+ allowedMethod = [
18
+ 'createBucket',
19
+ 'deleteBucket',
20
+ 'headBucket',
21
+ 'getBucketMetadata',
22
+ 'setBucketQuota',
23
+ 'getBucketQuota',
24
+ 'getBucketStorageInfo',
25
+ 'setBucketAcl',
26
+ 'getBucketAcl',
27
+ 'setBucketPolicy',
28
+ 'getBucketPolicy',
29
+ 'deleteBucketPolicy',
30
+ 'setBucketVersioning',
31
+ 'getBucketVersioning',
32
+ 'listVersions',
33
+ 'listObjects',
34
+ 'listMultipartUploads',
35
+ 'deleteBucketLifecycle',
36
+ 'setBucketLifecycle',
37
+ 'getBucketLifecycle',
38
+ 'deleteBucketWebsite',
39
+ 'setBucketWebsite',
40
+ 'getBucketWebsite',
41
+ 'setBucketLogging',
42
+ 'getBucketLogging',
43
+ 'getBucketLocation',
44
+ 'getBucketTagging',
45
+ 'setBucketTagging',
46
+ 'deleteBucketTagging',
47
+ 'setBucketCors',
48
+ 'deleteBucketCors',
49
+ 'getBucketCors',
50
+ 'setBucketNotification',
51
+ 'getBucketNotification',
52
+ 'getObjectMetadata',
53
+ 'setObjectMetadata',
54
+ 'getObject',
55
+ 'putContent',
56
+ 'putObject',
57
+ 'appendObject',
58
+ 'putFile',
59
+ 'uploadPart',
60
+ 'copyObject',
61
+ 'setObjectAcl',
62
+ 'getObjectAcl',
63
+ 'deleteObject',
64
+ 'deleteObjects',
65
+ 'restoreObject',
66
+ 'initiateMultipartUpload',
67
+ 'copyPart',
68
+ 'completeMultipartUpload',
69
+ 'abortMultipartUpload',
70
+ 'listParts',
71
+ 'getBucketStoragePolicy',
72
+ 'setBucketStoragePolicy',
73
+ 'optionsBucket',
74
+ 'optionsObject',
75
+ 'setBucketEncryption',
76
+ 'getBucketEncryption',
77
+ 'deleteBucketEncryption',
78
+ 'headObject',
79
+ 'setBucketRequestPayment',
80
+ 'getBucketRequestPayment',
81
+ 'setBucketFetchPolicy',
82
+ 'getBucketFetchPolicy',
83
+ 'deleteBucketFetchPolicy',
84
+ 'setBucketFetchJob',
85
+ 'getBucketFetchJob',
86
+ 'setBucketCustomDomain',
87
+ 'deleteBucketCustomDomain',
88
+ 'getBucketCustomDomain',
89
+ ]
90
+
91
+ def __init__(self, obsClient, bucketName):
92
+ self.__obsClient = obsClient
93
+ self.__bucketName = bucketName
94
+
95
+ def __getattr__(self, key):
96
+ if key in self.allowedMethod and hasattr(self.__obsClient, key):
97
+ original_method = getattr(self.__obsClient, key)
98
+ if callable(original_method):
99
+ def delegate(*args, **kwargs):
100
+ _args = list(args)
101
+ if key == 'copyObject':
102
+ if 'destBucketName' not in kwargs:
103
+ if len(_args) >= 2:
104
+ _args.insert(2, self.__bucketName)
105
+ else:
106
+ kwargs['destBucketName'] = self.__bucketName
107
+ else:
108
+ if 'bucketName' not in kwargs:
109
+ _args.insert(0, self.__bucketName)
110
+ return original_method(*_args, **kwargs)
111
+
112
+ return delegate
113
+ return super(BucketClient, self).__getattribute__(key)
@@ -199,9 +199,9 @@ class ConvertWrapper(object):
199
199
 
200
200
  class _BasicClient(object):
201
201
  def __init__(self, access_key_id='', secret_access_key='', is_secure=True, server=None,
202
- signature='obs', region='region', path_style=False, ssl_verify=False,
202
+ signature='obs', region='region', path_style=False, ssl_verify=False, is_use_gmssl=False,
203
203
  port=None, max_retry_count=3, timeout=60, chunk_size=const.READ_ONCE_LENGTH,
204
- long_conn_mode=False, proxy_host=None, proxy_port=None,
204
+ long_conn_mode=False, proxy_host=None, proxy_port=None, client_verify=None,
205
205
  proxy_username=None, proxy_password=None, security_token=None,
206
206
  custom_ciphers=None, use_http2=False, is_signature_negotiation=True, is_cname=False,
207
207
  max_redirect_count=10, security_providers=None, security_provider_policy=None, client_mode='obs',
@@ -239,7 +239,8 @@ class _BasicClient(object):
239
239
  self.is_signature_negotiation = is_signature_negotiation
240
240
  self.is_cname = is_cname
241
241
  self.max_redirect_count = max_redirect_count
242
-
242
+ self.is_use_gmssl = is_use_gmssl
243
+ self.client_verify = client_verify
243
244
  if client_mode == 'obs':
244
245
  if self.path_style or self.is_cname:
245
246
  self.is_signature_negotiation = False
@@ -364,30 +365,45 @@ class _BasicClient(object):
364
365
  self.connHolder = {'connSet': Queue(), 'lock': threading.Lock()}
365
366
 
366
367
  def _init_ssl_context(self, custom_ciphers):
367
- try:
368
- import ssl
369
- if hasattr(ssl, 'SSLContext'):
368
+ import ssl
369
+ if hasattr(ssl, 'SSLContext'):
370
+ if self.is_use_gmssl:
371
+ if not hasattr(ssl, 'PROTOCOL_GMTLS'):
372
+ raise Exception('ssl not support PROTOCOL_GMTLS.')
373
+ context = ssl.SSLContext(ssl.PROTOCOL_GMTLS)
374
+ context.set_ciphers('ECC-SM4-SM3:ECDHE-SM4-SM3')
375
+ else:
370
376
  context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
371
- context.options |= ssl.OP_NO_SSLv2
372
- context.options |= ssl.OP_NO_SSLv3
373
- if custom_ciphers is not None:
374
- custom_ciphers = util.to_string(custom_ciphers).strip()
375
- if custom_ciphers != '' and hasattr(context, 'set_ciphers') and callable(context.set_ciphers):
376
- context.set_ciphers(custom_ciphers)
377
- if self.ssl_verify:
378
- import _ssl
379
- cafile = util.to_string(self.ssl_verify)
380
- context.options |= getattr(_ssl, "OP_NO_COMPRESSION", 0)
381
- context.verify_mode = ssl.CERT_REQUIRED
382
- if os.path.isfile(cafile):
383
- context.load_verify_locations(cafile)
384
- else:
385
- context.verify_mode = ssl.CERT_NONE
386
- if hasattr(context, 'check_hostname'):
387
- context.check_hostname = False
388
- self.context = context
389
- except Exception:
390
- print(traceback.format_exc())
377
+ context.options |= ssl.OP_NO_SSLv2
378
+ context.options |= ssl.OP_NO_SSLv3
379
+ if custom_ciphers is not None:
380
+ custom_ciphers = util.to_string(custom_ciphers).strip()
381
+ if custom_ciphers != '' and hasattr(context, 'set_ciphers') and callable(context.set_ciphers):
382
+ context.set_ciphers(custom_ciphers)
383
+ if self.ssl_verify:
384
+ import _ssl
385
+ cafile = util.to_string(self.ssl_verify)
386
+ context.options |= getattr(_ssl, "OP_NO_COMPRESSION", 0)
387
+ context.verify_mode = ssl.CERT_REQUIRED
388
+ if os.path.isfile(cafile):
389
+ context.load_verify_locations(cafile)
390
+ else:
391
+ context.verify_mode = ssl.CERT_NONE
392
+ is_client_sign_verify = self.client_verify and self.client_verify.clientCert and \
393
+ self.client_verify.clientKey
394
+ is_client_enc_verify = self.client_verify and self.client_verify.clientEncCert and \
395
+ self.client_verify.clientEncKey
396
+ if is_client_sign_verify:
397
+ context.load_cert_chain(certfile=util.to_string(self.client_verify.clientCert),
398
+ keyfile=util.to_string(self.client_verify.clientKey),
399
+ password=util.to_string(self.client_verify.clientKeyPassword))
400
+ if is_client_enc_verify:
401
+ context.load_cert_chain(certfile=util.to_string(self.client_verify.clientEncCert),
402
+ keyfile=util.to_string(self.client_verify.clientEncKey),
403
+ password=util.to_string(self.client_verify.clientEncKeyPassword))
404
+ if hasattr(context, 'check_hostname'):
405
+ context.check_hostname = False
406
+ self.context = context
391
407
 
392
408
  def close(self):
393
409
  if self.connHolder is not None:
@@ -502,7 +518,7 @@ class _BasicClient(object):
502
518
  if flag >= self.max_retry_count or readable:
503
519
  return self._make_error_result(e, ret)
504
520
  flag += 1
505
- time.sleep(math.pow(2, flag) * 0.05)
521
+ time.sleep(math.pow(2, flag) * 0.1)
506
522
  self.log_client.log(WARNING, 'request again, time:%d' % int(flag))
507
523
  continue
508
524
 
@@ -824,7 +840,9 @@ class _BasicClient(object):
824
840
  result_wrapper = ResponseWrapper(conn, response, self.connHolder, content_length, notifier, obs_crc64=obs_crc64)
825
841
  self.log_client.log(DEBUG, 'CRC64 from the server is {0}'.format(obs_crc64))
826
842
  else:
827
- raise Exception('No CRC64 is obtained from the server.')
843
+ result_wrapper = ResponseWrapper(conn, response, self.connHolder, content_length, notifier)
844
+ self.log_client.log(WARNING, 'object {0} not get CRC64 from the server.'.format(objectKey))
845
+
828
846
  else:
829
847
  result_wrapper = ResponseWrapper(conn, response, self.connHolder, content_length, notifier)
830
848
  if loadStreamInMemory:
@@ -1248,9 +1266,7 @@ class ObsClient(_BasicClient):
1248
1266
  if matchAnyKey:
1249
1267
  policy.append('["starts-with", "$key", ""],')
1250
1268
 
1251
- policy.append(']}')
1252
-
1253
- originPolicy = ''.join(policy)
1269
+ originPolicy = ''.join(policy).rstrip(',') + ']}'
1254
1270
 
1255
1271
  policy = util.base64_encode(originPolicy)
1256
1272
 
@@ -101,7 +101,7 @@ DEFAULT_TASK_NUM = 8
101
101
  DEFAULT_TASK_QUEUE_SIZE = 20000
102
102
  CONNECTION_POOL_SIZE = 10
103
103
 
104
- OBS_SDK_VERSION = '3.25.3'
104
+ OBS_SDK_VERSION = '3.25.8'
105
105
 
106
106
  V2_META_HEADER_PREFIX = 'x-amz-meta-'
107
107
  V2_HEADER_PREFIX = 'x-amz-'
@@ -641,6 +641,14 @@ class Convertor(object):
641
641
  if certificate.get("certificateChain", None):
642
642
  ET.SubElement(root, "CertificateChain").text = util.to_string(certificate.get("certificateChain", None))
643
643
  ET.SubElement(root, "PrivateKey").text = util.to_string(certificate.get("privateKey"))
644
+ if certificate.get("certificateType", None):
645
+ ET.SubElement(root, "CertificateType").text = util.to_string(certificate.get("certificateType", None))
646
+ if certificate.get("encCertificate", None):
647
+ ET.SubElement(root, "ENCCertificate").text = util.to_string(certificate.get("encCertificate", None))
648
+ if certificate.get("encPrivateKey", None):
649
+ ET.SubElement(root, "ENCPrivateKey").text = util.to_string(certificate.get("encPrivateKey", None))
650
+ if util.to_string(certificate.get("deleteCertificate", None)):
651
+ ET.SubElement(root, "DeleteCertificate").text = util.to_string(certificate.get("deleteCertificate", None))
644
652
  entity = ET.tostring(root, "UTF-8")
645
653
  if len(entity) > const.MAX_CERT_XML_BODY_SIZE:
646
654
  error_message = "XML body size exceeds {} KB limit".format(const.MAX_CERT_XML_BODY_SIZE / 1024)
@@ -1336,7 +1344,12 @@ class Convertor(object):
1336
1344
  d = self._find_item(domain, "CreateTime")
1337
1345
  certificate_id = self._find_item(domain, "CertificateId")
1338
1346
  create_time = DateTime.UTCToLocal(d)
1339
- curr_bucket = BucketCustomDomain(domain_name=domain_name,create_time=create_time,certificate_id=certificate_id)
1347
+ name = self._find_item(domain, "Name")
1348
+ certificate_type = self._find_item(domain, "CertificateType")
1349
+ e = self._find_item(domain, "ExpiredTime")
1350
+ expired_time = DateTime.UTCToLocal(e)
1351
+ curr_bucket = BucketCustomDomain(domainName=domain_name, createTime=create_time, certificateId=certificate_id,
1352
+ name=name, certificateType=certificate_type, expiredTime=expired_time)
1340
1353
  entries.append(curr_bucket)
1341
1354
 
1342
1355
  return ListBucketCustomDomainsResponse(domains=entries)