[Zope] Monkey Patching Grief with Zope 2.9.4
Mark Wilson
markwilson at projectfusion.com
Tue Sep 26 10:33:39 EDT 2006
Hello Zope Listers
We've been working on a Zope web app which has been built and running on Zope
2.7.0 for over 2 years now. Recently I've been trying to move it to Zope
2.9.4 but have encountered some severe difficulties with a couple (at least)
of monkey patches that are essential to our app and which worked fine with
the earlier version.
Here's a synopsis of what I'm doing (PF2 is the code name of the app)
#--------------------------------------------------------------------
from AccessControl.User import SpecialUser
class PF2SpecialUser( SpecialUser ):
""" a "pretend" subclass of SpecialUser """
def PF2SpecialUser_allowed( self, object, object_roles=None ):
""" reimplementation of allowed() for PF2 """
# if we're not anon, we must be superuser, so do the
# normal SpecialUser.allowed() stuff (see patching below)
if self.getUserName() != 'Anonymous User':
return self.PF2Superuser_allowed( object, object_roles )
# else we're anonymous - do our special handling which
# basically allows the anonymous role to be assigned
# arbitrary perms at any point in the folder hierarchy
# more code here - return True if anon user can access object
# now the monkey patching - ooh ooh eeeek ooh
# save original method for use by superuser
# (see PF2SpecialUser.PF2SpecialUser_allowed)
PF2SpecialUser.PF2Superuser_allowed = SpecialUser.allowed
# replace with our custom method
SpecialUser.allowed = PF2SpecialUser.PF2SpecialUser_allowed
#--------------------------------------------------------------------
As I said, with 2.7.0 this all works fine and dandy, but with 2.9.4 I get this
error when trying to access (say) a Page Tempplate as the anonymous user:
"unbound method PF2SpecialUser_allowed() must be called with PF2SpecialUser
instance as first argument"
Investigating in more detail, I switched to the Python security
implementation. As an experiment, based on research, I changed line 437 of
AccessControl/ImplPython.py from...
if self._authenticated and context.user.allowed(value, roles):
to...
if self._authenticated and \
context.user.allowed.im_func(context.user, value, roles):
to sidestep the type checking of the self argument. This does indeed prevent
the above error, but its not a good solution at all (its not in C), and I'm
sure its incomplete - there are other places where allowed() gets called.
Has anyone got any smart ideas as to how I can accomplish my goal with Zope
2.9.4 and with minimal changes to our code? If its necessary I'm happy for us
to run with minor modifications to "core" zope (we already have one or two in
place already).
Also, if anyone can tell me exactly what it is that's caused this new
behaviour then I'd be really grateful since I've not been able to figure it
out myself.
Thanks in advance for any help anyone can offer.
Mark
More information about the Zope
mailing list