Index: lib/python/ZPublisher/tests/testBaseRequest.py =================================================================== --- lib/python/ZPublisher/tests/testBaseRequest.py (revision 1197) +++ lib/python/ZPublisher/tests/testBaseRequest.py (working copy) @@ -1,6 +1,6 @@ from unittest import TestCase, TestSuite, makeSuite, main -from Acquisition import Implicit +from Acquisition import Implicit, Explicit from ZPublisher.BaseRequest import BaseRequest from ZPublisher.HTTPResponse import HTTPResponse @@ -84,7 +84,15 @@ return getattr(self, name) raise AttributeError, name +class DummyObjectWithPAH(DummyObjectBasic): + """Dummy class with post_authentication_hook.""" + def post_authentication_hook(self, request, user): + self.request, self.user = request, user + def some_method(self): + ''' ''' + + class TestBaseRequest(TestCase): def setUp(self): @@ -247,6 +255,33 @@ self.assertRaises(NotFound, r.traverse, 'folder/simpleSet') self.assertRaises(NotFound, r.traverse, 'folder/simpleFrozenSet') + def test_traverse_post_authentication_hook(self): + r = self.makeBaseRequest() + # post authentication hook from object + o = DummyObjectWithPAH() + self.f1._setObject('objWithPAH', o) + r.traverse('folder/objWithPAH') + self.assertEqual(o.request, r) + self.assertEqual(o.user, None) + del o.request; del o.user # clean up + # post authentication hook from method + r.traverse('folder/objWithPAH/some_method') + self.assertEqual(o.request, r) + self.assertEqual(o.user, None) + del o.request; del o.user # clean up + # post authentication hook from "ExplicitAcquirer" + class _E(Explicit): pass + o._setObject('e', _E()) + r.traverse('folder/objWithPAH/e') + self.assertEqual(o.request, r) + self.assertEqual(o.user, None) + del o.request; del o.user # clean up + # the feature does not make much sense for non acquisition aware + # objects -- we do not check this + # Note: the feature is likely to break for Zope3 views (as they + # are not acquisition aware) + + def test_hold_after_close(self): # Request should no longer accept holds after it has been closed r = self.makeBaseRequest() Index: lib/python/ZPublisher/BaseRequest.py =================================================================== --- lib/python/ZPublisher/BaseRequest.py (revision 1197) +++ lib/python/ZPublisher/BaseRequest.py (working copy) @@ -603,6 +603,14 @@ # Remove http request method from the URL. request['URL']=URL + pah_base = object + if hasattr(aq_base(object), 'im_self'): pah_base = object.im_self + if hasattr(pah_base, 'aq_acquire'): + pah = pah_base.aq_acquire('post_authentication_hook', default=None) + else: + pah = getattr(pah_base, 'post_authentication_hook', None) + if pah is not None: pah(self, user) + # Run post traversal hooks if post_traverse: result = exec_callables(post_traverse)