diff options
author | ianb <devnull@localhost> | 2006-01-27 07:13:59 +0000 |
---|---|---|
committer | ianb <devnull@localhost> | 2006-01-27 07:13:59 +0000 |
commit | 28ed8bd08f343f25353393de2cb7b607377eb17b (patch) | |
tree | 1624f87cbc63d1124394de2b51a65ab4f6049dc2 /paste/auth/open_id.py | |
parent | 1e7152f6cd5ace9accb84323b8e28b2401e0b0d4 (diff) | |
download | paste-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.py | 66 |
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) |