@@ -40,54 +40,56 @@ def _extract_rc_msg(result):
4040 return getattr (result , 'rc' , None ), getattr (result , 'msg' , None )
4141
4242
43- _STRICT_PERMISSION_ERROR_SET = {
44- (None , None ),
45- (None , '' ),
46- (0 , None ),
47- ('0' , None ),
48- (None , 'permission denied' ),
49- (None , 'access denied' ),
50- (None , 'read only' ),
51- (None , 'action is not allowed' ),
52- ('permissiondenied' , None ),
53- (None , 'permissiondenied' ),
54- ('permissiondenied' , 'permissiondenied' ),
43+ _STRICT_PERMISSION_DENIED_MESSAGES = {
44+ 'permission denied' ,
45+ 'access denied' ,
46+ 'read only' ,
47+ 'action is not allowed' ,
5548}
5649
57- _STRICT_PERMISSION_TASK_ERROR_SET = {
58- (None , None , 'permissiondenied' ),
59- (None , None , 'permission denied' ),
60- (None , None , 'access denied' ),
61- (None , None , 'read only' ),
62- (None , None , 'action is not allowed' ),
63- (None , 'permission denied' , None ),
64- (None , 'access denied' , None ),
65- (None , 'read only' , None ),
66- (None , 'action is not allowed' , None ),
67- (0 , None , 'permissiondenied' ),
68- ('0' , None , 'permissiondenied' ),
69- }
50+ # Some APIs return condensed "permissiondenied" in rc/msg/error_type.
51+ _STRICT_PERMISSION_DENIED_TOKENS = {'permissiondenied' }
52+ _STRICT_PERMISSION_AMBIGUOUS_RC = {None , 0 , '0' }
53+ _STRICT_PERMISSION_EMPTY_MESSAGES = {None , '' }
7054
7155
7256def _raise_strict_permission_denied (result , path ):
73- rc , msg = _extract_rc_msg (result )
74- rc = _normalize_rc (rc )
75- msg = _normalize_msg (msg )
57+ rc , msg = _extract_normalized_rc_msg (result )
7658 logger .info (
7759 'strict_permission response for %s: rc=%r msg=%r raw=%s' ,
7860 path , rc , msg , type (result ).__name__
7961 )
80- if (rc , msg ) in _STRICT_PERMISSION_ERROR_SET :
62+ if _is_strict_permission_denied_response (rc , msg ):
8163 raise exceptions .io .core .PrivilegeError (path )
8264
8365
84- def _extract_task_error_tuple (result ):
66+ def _extract_normalized_rc_msg (result ):
67+ rc , msg = _extract_rc_msg (result )
68+ return _normalize_rc (rc ), _normalize_msg (msg )
69+
70+
71+ def _extract_task_error_fields (result ):
8572 rc = _normalize_rc (getattr (result , 'rc' , None ))
8673 msg = _normalize_msg (getattr (result , 'msg' , None ))
8774 error_type = _normalize_msg (getattr (result , 'error_type' , None ))
8875 return rc , msg , error_type
8976
9077
78+ def _is_strict_permission_denied_response (rc , msg ):
79+ if msg in _STRICT_PERMISSION_DENIED_MESSAGES :
80+ return True
81+ if rc in _STRICT_PERMISSION_DENIED_TOKENS or msg in _STRICT_PERMISSION_DENIED_TOKENS :
82+ return True
83+ return rc in _STRICT_PERMISSION_AMBIGUOUS_RC and msg in _STRICT_PERMISSION_EMPTY_MESSAGES
84+
85+
86+ def _is_strict_permission_denied_task (rc , msg , error_type ):
87+ _ = rc
88+ if error_type in _STRICT_PERMISSION_DENIED_MESSAGES or error_type in _STRICT_PERMISSION_DENIED_TOKENS :
89+ return True
90+ return msg in _STRICT_PERMISSION_DENIED_MESSAGES
91+
92+
9193def split_file_directory (listdir , receiver , destination ):
9294 """
9395 Split a path into its parent directory and final component.
@@ -1022,8 +1024,8 @@ async def _a_execute(self):
10221024
10231025 def _handle_response (self , r ):
10241026 if self ._strict_permission :
1025- rc , msg , error_type = _extract_task_error_tuple (r )
1026- if (rc , msg , error_type ) in _STRICT_PERMISSION_TASK_ERROR_SET :
1027+ rc , msg , error_type = _extract_task_error_fields (r )
1028+ if _is_strict_permission_denied_task (rc , msg , error_type ):
10271029 raise exceptions .io .core .PrivilegeError ('' )
10281030 if not self .block :
10291031 return r
0 commit comments