summaryrefslogtreecommitdiff
path: root/repoze/bfg/router.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2008-07-16 10:32:08 +0000
committerChris McDonough <chrism@agendaless.com>2008-07-16 10:32:08 +0000
commit2466f6eaa2246598dc6cb3c962364773eb4cc64a (patch)
tree80954892ad8e12cffb534f3ae92cd321d4d870f5 /repoze/bfg/router.py
parent23aa82c4963dc75737d7dc8a84d7639775c3b282 (diff)
downloadpyramid-2466f6eaa2246598dc6cb3c962364773eb4cc64a.tar.gz
pyramid-2466f6eaa2246598dc6cb3c962364773eb4cc64a.tar.bz2
pyramid-2466f6eaa2246598dc6cb3c962364773eb4cc64a.zip
Add security.
Diffstat (limited to 'repoze/bfg/router.py')
-rw-r--r--repoze/bfg/router.py25
1 files changed, 18 insertions, 7 deletions
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),