[Zope3-Users] container protectName

Michael Howitz mh at gocept.com
Wed Mar 29 02:06:55 EST 2006


Am Mittwoch, den 29.03.2006, 01:56 -0500 schrieb Pete Taylor:
> Hi all (yet again ;) ),
> I ran into this issue on a project I worked on before, but I ended up
> changing the design before  it became a significant issue.  this time
> around, i don't see a way by it.
> 
> i have a class that derives from Folder (or BTreeContainer, it doesn't
> really matter for this).  in configure.zcml, i set it up as follows:
>          <content class=".consumer.Consumer">
>             <implements
>                
> interface="zope.app.annotation.interfaces.IAttributeAnnotatable"      
>          />
>             <require
>                 permission="zope.ManageContent"
>                 interface="zope.app.container.interfaces.IReadContainer"
>                 />
>             <require
>                 permission="zope.ManageContent"
>                 interface="zope.app.container.interfaces.IWriteContainer"
>                 />
>             <require
>                 permission="zope.ManageContent"
>                 interface=".interfaces.consumer.IConsumer"
>                 />
>             <require
>                 permission="zope.ManageContent"
>                 set_schema=".interfaces.consumer.IConsumer"
>                 />
>         </content>
> 
> this doesn't work.  putting in the third-down require statement breaks
[ ... ]
> I've put the traceback below...
> 
> Traceback (most recent call last):
>   File "bin/runzope", line 48, in ?
>     run()
>   File "bin/runzope", line 44, in run
>     main(["-C", CONFIG_FILE] + sys.argv[1:])
>   File "/opt/zope3//lib/python/zope/app/twisted/main.py", line 74, in main
>     service = setup(load_options(args))
>   File "/opt/zope3//lib/python/zope/app/twisted/main.py", line 139, in setup
>     zope.app.appsetup.config(options.site_definition, features=features)
>   File "/opt/zope3//lib/python/zope/app/appsetup/appsetup.py", line
> 110, in config
>     context = xmlconfig.file(file, context=context, execute=execute)
>   File "/opt/zope3//lib/python/zope/configuration/xmlconfig.py", line
> 556, in file
>     context.execute_actions()
>   File "/opt/zope3//lib/python/zope/configuration/config.py", line
> 606, in execute_actions
>     for action in resolveConflicts(self.actions):
>   File "/opt/zope3//lib/python/zope/configuration/config.py", line
> 1511, in resolveConflicts
>     raise ConfigurationConflictError(conflicts)
> zope.configuration.config.ConfigurationConflictError: Conflicting
> configuration actions
>   For: ('protectName', <class 'petetest.consumer.Consumer'>, '__contains__')
>     File "/usr/lib/python2.4/site-packages/petetest/configure.zcml",
[ ... ]

This is because your Interface IConsumer extends the
IContainer-Interface. In Zope3 security declarations can only be done
once on a content class, but if you extend from IContainer in both
require statements (for IConsumer and IReadContainer) a permission is
declared.

Solution: Let ICustomer extend zope.interface.Interface. Because your
implementation of ICustomer extends BTreeContainer it also interhits the
implements statement for IContainer.

HTH,
 mac



More information about the Zope3-users mailing list