[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/Traversing - DefaultTraversable.py:1.1.2.2 Traverser.py:1.1.2.3

Martijn Pieters mj@zope.com
Tue, 4 Dec 2001 11:52:49 -0500


Update of /cvs-repository/Zope3/lib/python/Zope/App/Traversing
In directory cvs.zope.org:/tmp/cvs-serv20303/lib/python/Zope/App/Traversing

Modified Files:
      Tag: Zope-3x-branch
	DefaultTraversable.py Traverser.py 
Log Message:
- Remove the silly restriction on underscore; this is the responsibility of the
  securty policy

- Implement restrictedTraverse


=== Zope3/lib/python/Zope/App/Traversing/DefaultTraversable.py 1.1.2.1 => 1.1.2.2 ===
 
     def traverse(self, name, furtherPath):
-        if name.startswith('_'):
-            raise NotFoundError, name
-
         if hasattr(self._subject, name):
             return getattr(self._subject, name)
         else:


=== Zope3/lib/python/Zope/App/Traversing/Traverser.py 1.1.2.2 => 1.1.2.3 ===
 from Zope.ContextWrapper import wrapper
 from Zope.ComponentArchitecture import getFeature
-from Zope.Exceptions import NotFoundError
+from Zope.Exceptions import NotFoundError, Unauthorized
+from Zope.App.Security.SecurityManagement import getSecurityManager
 
 from types import StringType
 
@@ -66,13 +67,14 @@
         path.reverse()
         pop = path.pop
 
+        validate = restricted and getSecurityManager().validate
+
         curr = self._wrapper
         if not path[-1]:
             # Start at the root
             pop()
             curr = self.getPhysicalRoot()
-            if restricted: pass
-                # TODO: security restrictions
+            if restricted: validate(None, curr)
 
         try:
             while path:
@@ -82,11 +84,9 @@
                     continue
 
                 if name == '..':
-                    next = wrapper.getcontext(curr) or curr
-                    if next is not None:
-                        # TODO: security restrictions
-                        curr = next
-                        continue
+                    curr = wrapper.getcontext(curr) or curr
+                    if restricted: validate(None, curr)
+                    continue
 
                 traversable = getFeature(curr, ITraversable, None)
                 if traversable is None:
@@ -95,10 +95,8 @@
 
                 else:
                     next = traversable.traverse(name, path)
-                    next = wrapper.Wrapper(next, curr, name=name)
-                    if restricted: pass
-                        # TODO: security restrictions
-                    curr = next
+                    curr = wrapper.Wrapper(next, curr, name=name)
+                    if restricted: validate(name, curr)
 
             return curr
 
@@ -107,5 +105,5 @@
             return default
 
     def restrictedTraverse(self, path, default=_marker):
-        self.unrestrictedTraverse(self, path, default, restricted=1)
+        return self.unrestrictedTraverse(path, default, restricted=1)