[Zope-dev] security.declareProtected doesn't always work?

Martijn Faassen faassen@vet.uu.nl
Sat, 29 Dec 2001 19:38:28 +0100


Hi there,

I have some issues with using declareProtected() outside product
classes (deriving from ObjectManager or SimpleItem). An external method
example that _does_ work, taken from the ZDG:

import Globals
import Acquisition
from AccessControl import ClassSecurityInfo

class Book(Acquisition.Implicit):
  def __init__(self, title):
    self._title=title
    
  # Create a SecurityInfo for this class
  security = ClassSecurityInfo()
  security.declareObjectPublic()
  
  security.declarePublic('getTitle')
  def getTitle(self):
    return self._title
  
Globals.InitializeClass(Book)
    
# The actual external method
def GetBooks(self):
  books=[]
  books.append(Book('King Lear'))
  books.append(Book('Romeo and Juliet'))
  books.append(Book('The Tempest'))
  return books

Now replace the line "security.declarePublic('getTitle')" with something like
"security.declareProtected('View', 'getTitle')", and suddenly nobody is
allowed to call getTitle() on a Book object anymore.

This doesn't only occur in external method code, but also in product code,
which is where I ran into it. Take for instance this class:

class TOCEntry(Acquisition.Implicit):
    security = ClassSecurityInfo()
    security.declareObjectPublic()
    
    def __init__(self, id):
        self.id = id

    security.declareProtected('View', 'render')
    def render(self):
        """Render entry.
        """
        return self.id

Globals.InitializeClass(TOCEntry)

'render()' can now never be called from a DTML method or a ZPT template,
while using 'security.declarePublic('render') does work.

One gets errors like this:

"""
Error Type: Undefined

Error Value: You are not allowed to access render in this context not found in 'entry/render', at line 8, column 3
"""

which doesn't look very grammatical either. :)

I haven't been able to figure out what causes the difference; classes
that are initialized with Zope don't seem to have this problem, but this little
class does. I've tried inheriting from Persistent or SimpleItem.Item but
that doesn't seem to make any difference..

So what's going on? Am I missing something? If so, where is this documented?

Martijn