[Zope-dev] Re: ...but I want to access 'a particular tuple' in that context!

Tres Seaver tseaver at zope.com
Tue Mar 23 11:43:50 EST 2004


Jamie Heilman wrote:
> Try this in a PythonScript:
> 
> d = {1:2}
> for t in d.iteritems():
>   pass
> 
> Annoyingly, it raises Unauthorized: You are not allowed to access 'a
> particular tuple' in this context
> 
> Is there a reason for this, or is it just part of
> AccessControl/RestrictedPython that hasn't been fleshed out yet?

The 'iteritems' method of a dictionary returns an object of type 
'dictionary-iterator';  AccessControl.ZopeGuards makes no container 
assertions about that type, although it *does* permit calling the 
'iteritems' method which returns an instance of it.

I find it interesting that that module wraps 'iterkeys' and 'itervalues' 
in its 'get_iter' checker, but allows unrestricted access to 'iteritems'.

The following patch will make your use case work (it would need to be 
prettied up for Python < 2.3):


--- lib/python/AccessControl/ZopeGuards.py      16 Jan 2004 18:18:51 
-0000     1.18
+++ lib/python/AccessControl/ZopeGuards.py      23 Mar 2004 16:41:19 -0000
@@ -161,6 +161,8 @@
      'iterkeys': get_iter,  'itervalues':get_iter,
      'pop':get_dict_pop, 'popitem':1, 'setdefault':1, 'update':1, 
'values':1}

+ContainerAssertions[type({}.iteritems())] = 1
+
  ContainerAssertions[type([])] = {
      'append':1, 'count':1, 'extend':1, 'index':1, 'insert':1,
      'pop':get_list_pop, 'remove':1, 'reverse':1, 'sort':1}



Tres.
-- 
===============================================================
Tres Seaver                                tseaver at zope.com
Zope Corporation      "Zope Dealers"       http://www.zope.com




More information about the Zope-Dev mailing list