@@ -30,23 +30,52 @@ def _is_permission_denied_message(message):
3030 )
3131
3232
33- def _raise_strict_permission_denied ( result , path ):
34- if result is None :
35- raise exceptions . io . core . PrivilegeError ( path )
36- if isinstance ( result , str ) and not result . strip ():
37- raise exceptions . io . core . PrivilegeError ( path )
33+ def _normalize_rc ( rc ):
34+ if isinstance ( rc , str ) :
35+ return rc . strip ( )
36+ return rc
37+
3838
39+ def _normalize_msg (msg ):
40+ if isinstance (msg , str ):
41+ return msg .strip ().lower ()
42+ return msg
43+
44+
45+ def _extract_rc_msg (result ):
46+ if result is None :
47+ return None , None
3948 if isinstance (result , str ):
40- if _is_permission_denied_message (result ):
41- raise exceptions .io .core .PrivilegeError (path )
42- return
43-
44- msg = getattr (result , 'msg' , None )
45- rc = getattr (result , 'rc' , None )
46- if msg and _is_permission_denied_message (msg ):
47- raise exceptions .io .core .PrivilegeError (path )
48- if msg in (None , '' ) and rc in (0 , '0' , None ):
49- raise exceptions .io .core .PrivilegeError (path )
49+ return None , result
50+ return getattr (result , 'rc' , None ), getattr (result , 'msg' , None )
51+
52+
53+ _STRICT_PERMISSION_ERROR_MAP = {
54+ (None , None ): exceptions .io .core .PrivilegeError ,
55+ (None , '' ): exceptions .io .core .PrivilegeError ,
56+ (0 , None ): exceptions .io .core .PrivilegeError ,
57+ ('0' , None ): exceptions .io .core .PrivilegeError ,
58+ (None , 'permission denied' ): exceptions .io .core .PrivilegeError ,
59+ (None , 'access denied' ): exceptions .io .core .PrivilegeError ,
60+ (None , 'read only' ): exceptions .io .core .PrivilegeError ,
61+ (None , 'action is not allowed' ): exceptions .io .core .PrivilegeError ,
62+ ('permissiondenied' , None ): exceptions .io .core .PrivilegeError ,
63+ (None , 'permissiondenied' ): exceptions .io .core .PrivilegeError ,
64+ ('permissiondenied' , 'permissiondenied' ): exceptions .io .core .PrivilegeError ,
65+ }
66+
67+
68+ def _raise_strict_permission_denied (result , path ):
69+ rc , msg = _extract_rc_msg (result )
70+ rc = _normalize_rc (rc )
71+ msg = _normalize_msg (msg )
72+ logger .debug (
73+ 'strict_permission response for %s: rc=%r msg=%r' ,
74+ path , rc , msg
75+ )
76+ error_cls = _STRICT_PERMISSION_ERROR_MAP .get ((rc , msg ))
77+ if error_cls is not None :
78+ raise error_cls (path )
5079
5180
5281def split_file_directory (listdir , receiver , destination ):
0 commit comments