Skip to content

Commit

Permalink
Merge branch 'master' into re-734-Paste-missing
Browse files Browse the repository at this point in the history
  • Loading branch information
dataflake committed Nov 23, 2019
2 parents 2f1ad34 + d8f459d commit 714a617
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
4 changes: 4 additions & 0 deletions CHANGES.rst
Expand Up @@ -9,6 +9,10 @@ https://github.com/zopefoundation/Zope/blob/4.x/CHANGES.rst
5.0a1 (unreleased)
------------------

- The method ``unrestrictedTraverse`` raises an error when
the argument ``path`` is not something it can work with
(`#674 <https://github.com/zopefoundation/Zope/issues/674>`_)

- Improve ZMI Security Tab usability for high numbers of roles
(`#730 <https://github.com/zopefoundation/Zope/issues/730>`_)

Expand Down
6 changes: 5 additions & 1 deletion src/OFS/Traversable.py
Expand Up @@ -172,10 +172,14 @@ def unrestrictedTraverse(self, path, default=_marker, restricted=False):
return self

if isinstance(path, str):
# Only native strings are allowed
path = path.split('/')
else:
path = list(path)
for part in path:
if not isinstance(part, str):
raise TypeError(
"path should be a string or an iterable of strings"
)

REQUEST = {'TraversalRequestNameStack': path}
path.reverse()
Expand Down
18 changes: 18 additions & 0 deletions src/OFS/tests/testTraverse.py
Expand Up @@ -425,6 +425,24 @@ def testTraverseToNameStartingWithPlus(self):
self.assertTrue(
self.folder1.unrestrictedTraverse('+something') == 'plus')

def testTraverseWrongType(self):
with self.assertRaises(TypeError):
self.folder1.unrestrictedTraverse(1)
with self.assertRaises(TypeError):
self.folder1.unrestrictedTraverse(b"foo")
with self.assertRaises(TypeError):
self.folder1.unrestrictedTraverse(["foo", b"bar"])
with self.assertRaises(TypeError):
self.folder1.unrestrictedTraverse(("foo", None))
with self.assertRaises(TypeError):
self.folder1.unrestrictedTraverse({1, "foo"})

def testTraverseEmptyPath(self):
self.assertEqual(self.folder1.unrestrictedTraverse(None), self.folder1)
self.assertEqual(self.folder1.unrestrictedTraverse(""), self.folder1)
self.assertEqual(self.folder1.unrestrictedTraverse([]), self.folder1)
self.assertEqual(self.folder1.unrestrictedTraverse({}), self.folder1)


class SimpleClass(object):
"""Class with no __bobo_traverse__."""
Expand Down

0 comments on commit 714a617

Please sign in to comment.