2424from .b2http import B2Http
2525from .exception import FileOrBucketNotFound , ResourceNotFound , UnusableFileName , InvalidMetadataDirective , WrongEncryptionModeForBucketDefault
2626from .encryption .setting import EncryptionAlgorithm , EncryptionMode , EncryptionSetting
27+ from .file_lock import RetentionMode , RetentionPeriod , RetentionSetting
2728from .utils import b2_url_encode , hex_sha1_of_stream
2829
2930# All possible capabilities
3637 'deleteBuckets' ,
3738 'readBucketEncryption' ,
3839 'writeBucketEncryption' ,
40+ 'readBucketRetentions' ,
41+ 'writeBucketRetentions' ,
42+ 'writeFileRetentions' ,
43+ 'writeFileLegalHolds' ,
44+ 'readFileRetentions' ,
45+ 'readFileLegalHolds' ,
3946 'listFiles' ,
4047 'readFiles' ,
4148 'shareFiles' ,
@@ -118,6 +125,7 @@ def create_bucket(
118125 cors_rules = None ,
119126 lifecycle_rules = None ,
120127 default_server_side_encryption : Optional [EncryptionSetting ] = None ,
128+ is_file_lock_enabled : Optional [bool ] = None ,
121129 ):
122130 pass
123131
@@ -272,6 +280,7 @@ def update_bucket(
272280 lifecycle_rules = None ,
273281 if_revision_is = None ,
274282 default_server_side_encryption : Optional [EncryptionSetting ] = None ,
283+ default_retention : Optional [RetentionSetting ] = None ,
275284 ):
276285 pass
277286
@@ -345,6 +354,16 @@ def _post_json(self, base_url, api_name, auth, **params) -> Dict[str, Any]:
345354 headers = {'Authorization' : auth }
346355 return self .b2_http .post_json_return_json (url , headers , params )
347356
357+ def _get_json (self , base_url , api_name , auth , ** params ) -> Dict [str , Any ]:
358+ # this is useful for testing purposes only
359+ url = '%s/b2api/%s/%s' % (base_url , API_VERSION , api_name )
360+ import urllib
361+ url += '?' + urllib .parse .urlencode (params )
362+ headers = {'Authorization' : auth }
363+ print ('eee' )
364+ with self .b2_http .get_content (url , headers ) as response :
365+ return response .json ()
366+
348367 def authorize_account (self , realm_url , application_key_id , application_key ):
349368 auth = b'Basic ' + base64 .b64encode (
350369 ('%s:%s' % (application_key_id , application_key )).encode ()
@@ -364,7 +383,8 @@ def create_bucket(
364383 bucket_info = None ,
365384 cors_rules = None ,
366385 lifecycle_rules = None ,
367- default_server_side_encryption = None ,
386+ default_server_side_encryption : Optional [EncryptionSetting ] = None ,
387+ is_file_lock_enabled : Optional [bool ] = None ,
368388 ):
369389 kwargs = dict (
370390 accountId = account_id ,
@@ -382,6 +402,10 @@ def create_bucket(
382402 raise WrongEncryptionModeForBucketDefault (default_server_side_encryption .mode )
383403 kwargs ['defaultServerSideEncryption'
384404 ] = default_server_side_encryption .serialize_to_json_for_request ()
405+ if is_file_lock_enabled is not None :
406+ #kwargs['isFileLockEnabled'] = is_file_lock_enabled
407+ kwargs ['isFileLockEnabled' ] = is_file_lock_enabled and "true" or "false"
408+ #return self._get_json(
385409 return self ._post_json (
386410 api_url ,
387411 'b2_create_bucket' ,
@@ -653,7 +677,8 @@ def update_bucket(
653677 cors_rules = None ,
654678 lifecycle_rules = None ,
655679 if_revision_is = None ,
656- default_server_side_encryption = None ,
680+ default_server_side_encryption : Optional [EncryptionSetting ] = None ,
681+ default_retention : Optional [RetentionSetting ] = None ,
657682 ):
658683 assert bucket_info is not None or bucket_type is not None
659684
@@ -669,11 +694,12 @@ def update_bucket(
669694 if lifecycle_rules is not None :
670695 kwargs ['lifecycleRules' ] = lifecycle_rules
671696 if default_server_side_encryption is not None :
672- if default_server_side_encryption is not None :
673- if not default_server_side_encryption .mode .can_be_set_as_bucket_default ():
674- raise WrongEncryptionModeForBucketDefault (default_server_side_encryption .mode )
675- kwargs ['defaultServerSideEncryption'
676- ] = default_server_side_encryption .serialize_to_json_for_request ()
697+ if not default_server_side_encryption .mode .can_be_set_as_bucket_default ():
698+ raise WrongEncryptionModeForBucketDefault (default_server_side_encryption .mode )
699+ kwargs ['defaultServerSideEncryption'
700+ ] = default_server_side_encryption .serialize_to_json_for_request ()
701+ if default_retention is not None :
702+ kwargs ['defaultRetention' ] = default_retention .serialize_to_json_for_request ()
677703
678704 return self ._post_json (
679705 api_url ,
@@ -979,8 +1005,18 @@ def test_raw_api_helper(raw_api):
9791005 bucket_name = 'test-raw-api-%s-%d-%d' % (
9801006 account_id , int (time .time ()), random .randint (1000 , 9999 )
9811007 )
1008+
1009+ import http .client
1010+ http .client .HTTPConnection .debuglevel = 1
1011+
9821012 bucket_dict = raw_api .create_bucket (
983- api_url , account_auth_token , account_id , bucket_name , 'allPublic'
1013+ api_url ,
1014+ account_auth_token ,
1015+ account_id ,
1016+ bucket_name ,
1017+ 'allPublic' ,
1018+ is_file_lock_enabled = False ,
1019+ #is_file_lock_enabled=True,
9841020 )
9851021 bucket_id = bucket_dict ['bucketId' ]
9861022 first_bucket_revision = bucket_dict ['revision' ]
@@ -1186,7 +1222,10 @@ def test_raw_api_helper(raw_api):
11861222 account_id ,
11871223 bucket_id ,
11881224 'allPrivate' ,
1189- bucket_info = {'color' : 'blue' }
1225+ bucket_info = {'color' : 'blue' },
1226+ default_retention = RetentionSetting (
1227+ mode = RetentionMode .GOVERNANCE , period = RetentionPeriod (days = 1 )
1228+ ),
11901229 )
11911230 assert first_bucket_revision < updated_bucket ['revision' ]
11921231
0 commit comments