def testDot(self):
        ob = Content()
        from zope.traversing.publicationtraverse import PublicationTraverser

        t = PublicationTraverser()
        request = TestRequest()
        self.assertEqual(ob, t.traverseName(request, ob, "."))
 def testDirectTraversal(self):
     request = TestRequest()
     ob = DummyPublishTraverse(Content(), request)
     t = PublicationTraverser()
     proxy = t.traverseName(request, ob, 'foo')
     view = removeSecurityProxy(proxy)
     self.assertTrue(proxy is not view)
     self.assertEqual(view.__class__, View)
     self.assertEqual(view.name, 'foo')
 def testDirectTraversal(self):
     request = TestRequest()
     ob = DummyPublishTraverse(Content(), request)
     t = PublicationTraverser()
     proxy = t.traverseName(request, ob, 'foo')
     view = removeSecurityProxy(proxy)
     self.assertTrue(proxy is not view)
     self.assertEqual(view.__class__, View)
     self.assertEqual(view.name, 'foo')
 def testNameFound(self):
     provideAdapter(DummyPublishTraverse, (Interface, Interface),
                    IPublishTraverse)
     ob = Content()
     t = PublicationTraverser()
     request = TestRequest()
     proxy = t.traverseName(request, ob, 'foo')
     view = removeSecurityProxy(proxy)
     self.assertTrue(proxy is not view)
     self.assertEqual(view.__class__, View)
     self.assertEqual(view.name, 'foo')
 def testNameFound(self):
     provideAdapter(DummyPublishTraverse, (Interface, Interface),
                    IPublishTraverse)
     ob = Content()
     t = PublicationTraverser()
     request = TestRequest()
     proxy = t.traverseName(request, ob, 'foo')
     view = removeSecurityProxy(proxy)
     self.assertTrue(proxy is not view)
     self.assertEqual(view.__class__, View)
     self.assertEqual(view.name, 'foo')
    def testViewFound(self):
        provideAdapter(DummyViewTraverser, (Interface, Interface), ITraversable, name="view")
        ob = Content()
        from zope.traversing.publicationtraverse import PublicationTraverser

        t = PublicationTraverser()
        request = TestRequest()
        proxy = t.traverseName(request, ob, "@@foo")
        view = removeSecurityProxy(proxy)
        self.assertTrue(proxy is not view)
        self.assertEqual(view.__class__, View)
        self.assertEqual(view.name, "foo")
Esempio n. 7
0
 def testViewFound(self):
     provideAdapter(DummyViewTraverser, (Interface, Interface),
                    ITraversable,
                    name='view')
     ob = Content()
     from zope.traversing.publicationtraverse import PublicationTraverser
     t = PublicationTraverser()
     request = TestRequest()
     proxy = t.traverseName(request, ob, '@@foo')
     view = removeSecurityProxy(proxy)
     self.assertTrue(proxy is not view)
     self.assertEqual(view.__class__, View)
     self.assertEqual(view.name, 'foo')
 def testDot(self):
     ob = Content()
     t = PublicationTraverser()
     request = TestRequest()
     self.assertEqual(ob, t.traverseName(request, ob, '.'))
Esempio n. 9
0
 def testDot(self):
     ob = Content()
     from zope.traversing.publicationtraverse import PublicationTraverser
     t = PublicationTraverser()
     request = TestRequest()
     self.assertEqual(ob, t.traverseName(request, ob, '.'))
 def testDot(self):
     ob = Content()
     t = PublicationTraverser()
     request = TestRequest()
     self.assertEqual(ob, t.traverseName(request, ob, '.'))
Esempio n. 11
0
class MinimalisticPublisher(object):
    implements(IPublication)
    def __init__(self, root_name):
        self.root_name = root_name
        self.traverser = PublicationTraverser()

    def getApplication(self, request):
        #Yep, we think we know implementation details here
        #but whole package is big optimisation hack
        return request.annotations[ZODB_ANNOTATION_KEY]

    def proxy(self, ob):
        """Security-proxy an object

        Subclasses may override this to use a different proxy (or
        checker) implementation or to not proxy at all.
        """
        return ProxyFactory(ob)

    def getDefaultTraversal(self, request, ob):
        if IBrowserPublisher.providedBy(ob):
            # ob is already proxied, so the result of calling a method will be
            return ob.browserDefault(request)
        else:
            adapter = queryMultiAdapter((ob, request), IBrowserPublisher)
            if adapter is not None:
                ob, path = adapter.browserDefault(request)
                ob = self.proxy(ob)
                return ob, path
            else:
                # ob is already proxied
                return ob, None


    def publish(self, request):
        request.processInputs()
        self.beforeTraversal(request)

        obj = self.getApplication(request)
        obj = request.traverse(obj)
        self.afterTraversal(request, obj)
        
        result = self.callObject(request, obj)
        
        response = request.response
        if result is not response:
           response.setResult(result)

        self.afterCall(request, obj)


    def callObject(self, request, ob):
        # Exception handling, dont try to call request.method
        orig = ob
        #if not IHTTPException.providedBy(ob):
        #    ob = getattr(ob, request.method, None)
        #    if ob is None:
        #        raise MethodNotAllowed(orig, request)
        return mapply(ob, request.getPositionalArguments(), request)

    def afterCall(self, request, obj):
        if request.method == 'HEAD':
           request.response.setResult('')

        notify(AfterCallEvent(request, obj))
        endInteraction()

    def traverseName(self, request, obj, name):
        return self.traverser.traverseName(request, obj, name)

    def beforeTraversal(self, request):
        self.authenticate(request, getGlobalSiteManager(), fallback=True)
        newInteraction(request)

    def callTraversalHooks(self, request, ob):
        # Call __before_publishing_traverse__ hooks
        notify(BeforeTraverseEvent(ob, request))
        # This is also a handy place to try and authenticate.
        self._maybePlacefullyAuthenticate(request, ob)

    def afterTraversal(self, request, ob):
        self._maybePlacefullyAuthenticate(request, ob)

    def _maybePlacefullyAuthenticate(self, request, ob):
        if not IUnauthenticatedPrincipal.providedBy(request.principal):
            # We've already got an authenticated user. There's nothing to do.
            # Note that beforeTraversal guarentees that user is not None.
            return

        if not ISite.providedBy(ob):
            # We won't find an authentication utility here, so give up.
            return

        sm = removeSecurityProxy(ob).getSiteManager()
        self.authenticate(request, sm)

    def authenticate(self, request, sm, fallback=False):
        principal = None
        auth = sm.queryUtility(IAuthentication)
        if auth is not None:

            # Try to authenticate against the auth utility
            principal = auth.authenticate(request)
            if principal is None:
                principal = auth.unauthenticatedPrincipal()

        if principal is None:
            # nothing to do here
            if not fallback:
                return
            principal = getUtility(IFallbackUnauthenticatedPrincipal)

        request.setPrincipal(principal)