[Zope-dev] Ambiguities in "Inheritance and Class Security Declaration"

Florent Guillaume fg@nuxeo.com
Sat, 20 Jul 2002 23:47:27 +0000 (UTC)


Chris McDonough <chrism@zope.com> wrote:
> So, the (somewhat suprising) morals of the story are:
> 
>   - you needn't use InitializeClass on classes which inherit
>     from a base class which has security assertions
>     and has itself been run through InitializeClass if
>     a) you don't add any methods to the subclass and b)
>     you're willing to accept the base class' security
>     assertions.  Not suprising.
>
>   - You needn't declare security assertions on overriding methods
>     of subclasses of security-aware base classes unless you want
>     to change those assertions.  Not suprising.

This is understandable given that the underlying implementation of
security assertions is to set a getSubobjectLimit__roles__ attribute,
which gets inherited by subclasses.

>   - It's always safe to run a class through InitializeClass even
>     if it does not have security declarations of its own.  Not
>     suprising.

InitializeClass checks for an attribute itself having a
__security_info__ attribute (security = ClassSecurityInfo() does
that), interprets it (by calling security.apply(cls)), and removes it
after having being done with it.

>   - If you declare differing security assertions in your subclass,
>     you do not need to run the subclass through InitializeClass
>     for those security assertions to have an effect.  Why this
>     is the case is still somewhat a mystery.  Surprising.
> 
> I'm sort of stumped as to how the subclass' assertions are applied in
> the absence of InitializeClass!  This is not what I expected, I would
> have thought that differing assertions would only be applied if
> InitializeClass was called on the subclass.  There's some magic going
> on here that I don't understand.

The magic is that Persistent has a __class_init__ that calls
InitializeClass for you. (This attribute is actually set by
App.PersistentExtra, called from Globals.)

__class_init__ is an ExtensionClass feature.


Florent

-- 
Florent Guillaume, Nuxeo (Paris, France)
+33 1 40 33 79 87  http://nuxeo.com  mailto:fg@nuxeo.com