summaryrefslogtreecommitdiff
path: root/repoze/bfg/security.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-05-25 01:37:25 +0000
committerChris McDonough <chrism@agendaless.com>2009-05-25 01:37:25 +0000
commit7d1da854e77b56ab6e50f0b8a3e0e61d8ebfb7a7 (patch)
treec90afb9a21697481fd272555fd9c60da31ffd72b /repoze/bfg/security.py
parent267f2db66f514db43d0801237213799cd6797ee4 (diff)
downloadpyramid-7d1da854e77b56ab6e50f0b8a3e0e61d8ebfb7a7.tar.gz
pyramid-7d1da854e77b56ab6e50f0b8a3e0e61d8ebfb7a7.tar.bz2
pyramid-7d1da854e77b56ab6e50f0b8a3e0e61d8ebfb7a7.zip
IForbiddenAppFactory -> IForbiddenResponseFactory.
Diffstat (limited to 'repoze/bfg/security.py')
-rw-r--r--repoze/bfg/security.py63
1 files changed, 59 insertions, 4 deletions
diff --git a/repoze/bfg/security.py b/repoze/bfg/security.py
index ba89a80e3..81ecf88ee 100644
--- a/repoze/bfg/security.py
+++ b/repoze/bfg/security.py
@@ -1,3 +1,6 @@
+from webob import Response
+from cgi import escape
+
from zope.component import queryUtility
from zope.deprecation import deprecated
from zope.interface import implements
@@ -7,6 +10,7 @@ from repoze.bfg.location import lineage
from repoze.bfg.interfaces import ISecurityPolicy
from repoze.bfg.interfaces import IViewPermission
from repoze.bfg.interfaces import IViewPermissionFactory
+from repoze.bfg.interfaces import IResponseFactory
from repoze.bfg.wsgi import Unauthorized as UnauthorizedApp
@@ -78,7 +82,9 @@ def principals_allowed_by_permission(context, permission):
class ACLSecurityPolicy(object):
implements(ISecurityPolicy)
-
+
+ forbidden_status = '401 Unauthorized' # b/c, should be 403
+
def __init__(self, get_principals):
self.get_principals = get_principals
@@ -148,7 +154,11 @@ class ACLSecurityPolicy(object):
return []
def forbidden(self, context, request):
- return UnauthorizedApp()
+ body, headerlist = _forbidden_html(request, self.forbidden_status)
+ response_factory = queryUtility(IResponseFactory, default=Response)
+ return response_factory(status = self.forbidden_status,
+ headerlist = headerlist,
+ app_iter = body)
class InheritingACLSecurityPolicy(object):
""" A security policy which uses ACLs in the following ways:
@@ -194,7 +204,9 @@ class InheritingACLSecurityPolicy(object):
``authenticated_userid``).
"""
implements(ISecurityPolicy)
-
+
+ forbidden_status = '401 Unauthorized' # b/c, should be 403
+
def __init__(self, get_principals):
self.get_principals = get_principals
@@ -274,7 +286,11 @@ class InheritingACLSecurityPolicy(object):
return allowed
def forbidden(self, context, request):
- return UnauthorizedApp()
+ body, headerlist = _forbidden_html(request, self.forbidden_status)
+ response_factory = queryUtility(IResponseFactory, default=Response)
+ return response_factory(status = self.forbidden_status,
+ headerlist = headerlist,
+ app_iter = body)
def get_remoteuser(request):
user_id = request.environ.get('REMOTE_USER')
@@ -491,6 +507,27 @@ def WhoInheritingACLSecurityPolicy():
"""
return InheritingACLSecurityPolicy(get_who_principals)
+## class StandaloneInheritingACLSecurityPolicy(InheritingACLSecurityPolicy):
+## def __init__(self, get_principals, login_view_name='login_view',
+## forbidden_view_name='forbidden_view'):
+## self.get_principals = get_principals
+## self.login_view_name = login_view_name
+## self.forbidden_view_name = forbidden_view_name
+
+## def forbidden(self, context, request):
+## from repoze.bfg.view import render_view_to_response
+## from webob import Response
+
+## userid = self.authenticated_userid(request)
+
+## if userid is None:
+## view_name = self.login_view_name
+## else:
+## view_name = self.forbidden_view_name
+
+## return render_view_to_response(context, request, name=view_name,
+## secure=False)
+
class PermitsResult(int):
def __new__(cls, s, *args):
inst = int.__new__(cls, cls.boolval)
@@ -603,3 +640,21 @@ class ViewPermissionFactory(object):
class Unauthorized(Exception):
pass
+def _forbidden_html(request, status):
+ try:
+ msg = escape(request.environ['repoze.bfg.message'])
+ except KeyError:
+ msg = ''
+ html = """
+ <html>
+ <title>%s</title>
+ <body>
+ <h1>%s</h1>
+ <code>%s</code>
+ </body>
+ </html>
+ """ % (status, status, msg)
+ headers = [('Content-Length', str(len(html))),
+ ('Content-Type', 'text/html')]
+ return [html], headers
+