-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Align behavior with objects raising in __getattr__
#157
Conversation
Some more notes:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can't claim to understand the implications 100% but it looks like a sensible change.
27d88c4
to
2db5b9f
Compare
__getattr__
I have updated the changes here to make the For the testing, I have changed the test of |
The observed problem was a behavior different between C and python implementation on python 3, happening with Zope python script. When the context can not be accessed by the current user, Zope binds a `Shared.DC.Scripts.Bindings.UnauthorizedBinding`, a class that raises an Unauthorized error when the context is actually accessed, in order to postpone the Unauthorized if something is actually accessed. This class does implements this by raising Unauthorized in `__getattr__`. The python implementation of `rolesForPermissionOn` used `hasattr` and `hasattr` has changed between python2 and python3, on python2 it was ignoring all exceptions, including potential Unauthorized errors and just returning False, but on python3 these errors are now raised. This change of behavior of python causes `rolesForPermissionOn` to behave differently: when using python implementation on python2 or when using C implementation, such Unauthorized errors were gracefully handled and caused `checkPermission` to return False, but on python3 the Unauthorized is raised. The C implementation of `rolesForPermissionOn` uses a construct equivalent to the python2 version of `hasattr`. For consistency - and because ignoring errors is usually not good - we also want to change it to be have like the python3 implementation. This change make this scenario behave the same between python and C implementations: - `Unauthorized` errors raised in `__getattr__` are supported on py3. - Other errors than `AttributeError` and `Unauthorized` raised in `__getattr__` are no longer ignored in the C implementation.
2db5b9f
to
52994b3
Compare
Co-authored-by: Dieter Maurer <[email protected]>
The observed problem was a behavior different between C and python
implementation on python 3, happening with Zope python script. When the
context can not be accessed by the current user, Zope binds a
Shared.DC.Scripts.Bindings.UnauthorizedBinding
, a class that raises anUnauthorized error when the context is actually accessed, in order to
postpone the Unauthorized if something is actually accessed. This class
does implements this by raising Unauthorized in
__getattr__
.The python implementation of
rolesForPermissionOn
usedhasattr
andhasattr
has changed between python2 and python3, on python2 it wasignoring all exceptions, including potential Unauthorized errors and
just returning False, but on python3 these errors are now raised.
This change of behavior of python causes
rolesForPermissionOn
tobehave differently: when using python implementation on python2 or when
using C implementation, such Unauthorized errors were gracefully handled
and caused
checkPermission
to return False, but on python3 theUnauthorized is raised.
The C implementation of
rolesForPermissionOn
uses a constructequivalent to the python2 version of
hasattr
. For consistency - andbecause ignoring errors is usually not good - we also want to change it
to be have like the python3 implementation.
This change make this scenario behave the same between python and C
implementations:
Unauthorized
errors raised in__getattr__
are supported on py3.AttributeError
andUnauthorized
raised in__getattr__
are no longer ignored in the C implementation.