From 2466f6eaa2246598dc6cb3c962364773eb4cc64a Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Wed, 16 Jul 2008 10:32:08 +0000 Subject: Add security. --- repoze/bfg/router.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'repoze/bfg/router.py') diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index 00966dfd1..becf3e3e4 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -1,19 +1,21 @@ from zope.component import getMultiAdapter from zope.component import queryMultiAdapter +from zope.component import queryUtility from zope.interface import directlyProvides from webob import Request from webob.exc import HTTPNotFound +from webob.exc import HTTPUnauthorized from repoze.bfg.interfaces import IPublishTraverserFactory from repoze.bfg.interfaces import IViewFactory +from repoze.bfg.interfaces import IViewPermission +from repoze.bfg.interfaces import ISecurityPolicy from repoze.bfg.interfaces import IWSGIApplicationFactory from repoze.bfg.interfaces import IRequest from repoze.bfg.registry import registry_manager -_marker = () - class Router: def __init__(self, root_policy, registry): self.root_policy = root_policy @@ -25,14 +27,23 @@ class Router: directlyProvides(request, IRequest) root = self.root_policy(environ) path = environ.get('PATH_INFO', '/') - traverser = getMultiAdapter((root, request), - IPublishTraverserFactory) + traverser = getMultiAdapter((root, request), IPublishTraverserFactory) context, name, subpath = traverser(path) request.subpath = subpath request.view_name = name - app = queryMultiAdapter((context, request), IViewFactory, name=name, - default=_marker) - if app is _marker: + + security_policy = queryUtility(ISecurityPolicy) + if security_policy: + permission = queryMultiAdapter((context, request), IViewPermission, + name=name) + if permission is not None: + if not permission(security_policy): + app = HTTPUnauthorized() + app.explanation = repr(permission) + return app(environ, start_response) + + app = queryMultiAdapter((context, request), IViewFactory, name=name) + if app is None: app = HTTPNotFound(request.url) else: app = getMultiAdapter((context, request, app), -- cgit v1.2.3