summaryrefslogtreecommitdiff
path: root/paste/auth/open_id.py
diff options
context:
space:
mode:
authorianb <devnull@localhost>2006-01-27 07:13:59 +0000
committerianb <devnull@localhost>2006-01-27 07:13:59 +0000
commit28ed8bd08f343f25353393de2cb7b607377eb17b (patch)
tree1624f87cbc63d1124394de2b51a65ab4f6049dc2 /paste/auth/open_id.py
parent1e7152f6cd5ace9accb84323b8e28b2401e0b0d4 (diff)
downloadpaste-28ed8bd08f343f25353393de2cb7b607377eb17b.tar.gz
Added a paste.deploy entry point for open_id; added a 401 catcher option to open_id (but I haven't tested that yet)
Diffstat (limited to 'paste/auth/open_id.py')
-rw-r--r--paste/auth/open_id.py66
1 files changed, 58 insertions, 8 deletions
diff --git a/paste/auth/open_id.py b/paste/auth/open_id.py
index d61233b..0bfc445 100644
--- a/paste/auth/open_id.py
+++ b/paste/auth/open_id.py
@@ -84,16 +84,21 @@ class AuthOpenIDHandler(object):
"""
def __init__(self, app, data_store_path, auth_prefix='/oid',
- login_redirect=None):
+ login_redirect=None, catch_401=False):
"""
Initialize the OpenID middleware
- app - Your WSGI app to call
- data_store_path - Directory to store crypto data in for use with
- OpenID servers.
- auth_prefix - Location for authentication process/verification
- login_redirect - Location to load after successful process of
- login
+ ``app``
+ Your WSGI app to call
+
+ ``data_store_path``
+ Directory to store crypto data in for use with OpenID servers.
+
+ ``auth_prefix``
+ Location for authentication process/verification
+
+ ``login_redirect``
+ Location to load after successful process of login
"""
store = filestore.FileOpenIDStore(data_store_path)
self.oidconsumer = consumer.OpenIDConsumer(store)
@@ -102,13 +107,14 @@ class AuthOpenIDHandler(object):
self.auth_prefix = auth_prefix
self.data_store_path = data_store_path
self.login_redirect = login_redirect
+ self.catch_401 = catch_401
def __call__(self, environ, start_response):
if environ['PATH_INFO'].startswith(self.auth_prefix):
# Let's load everything into a request dict to pass around easier
request = dict(environ=environ, start=start_response, body=[])
request['base_url'] = paste.request.construct_url(environ, with_path_info=False,
- with_query_string=False)
+ with_query_string=False)
path = re.sub(self.auth_prefix, '', environ['PATH_INFO'])
request['parsed_uri'] = urlparse.urlparse(path)
@@ -124,8 +130,38 @@ class AuthOpenIDHandler(object):
else:
return self.not_found(request)
else:
+ if self.catch_401:
+ return self.catch_401_app_call(environ, start_response)
return self.app(environ, start_response)
+ def catch_401_app_call(self, environ, start_response):
+ """
+ Call the application, and redirect if the app returns a 401 response
+ """
+ was_401 = []
+ def replacement_start_response(status, headers, exc_info=None):
+ if int(status.split(None, 1)) == 401:
+ # @@: Do I need to append something to go back to where we
+ # came from?
+ was_401.append(1)
+ def dummy_writer(v): pass
+ return dummy_writer
+ else:
+ return start_response(status, headers, exc_info)
+ app_iter = self.app(environ, replacement_start_response)
+ if was_401:
+ try:
+ list(app_iter)
+ finally:
+ if hasattr(app_iter, 'close'):
+ app_iter.close()
+ redir_url = paste.request.construct_url(environ, with_path_info=False,
+ with_query_string=False)
+ exc = httpexceptions.HTTPTemporaryRedirect(redir_url)
+ return exc.wsgi_application(environ, start_response)
+ else:
+ return app_iter
+
def do_verify(self, request):
"""Process the form submission, initating OpenID verification.
"""
@@ -328,3 +364,17 @@ class AuthOpenIDHandler(object):
middleware = AuthOpenIDHandler
+
+def make_middleware(
+ app,
+ global_conf,
+ # Should this default to something, or inherit something from global_conf?:
+ data_store_path,
+ auth_prefix='/oid',
+ login_redirect=None,
+ catch_401=False):
+ from paste.deploy.converters import asbool
+ catch_401 = asbool(catch_401)
+ return AuthOpenIDHandler(
+ app, data_store_path=data_store_path, auth_prefix=auth_prefix,
+ login_redirect=login_redirect, catch_401=catch_401)