[z3-checkins] r44708 - z3/deliverance/DeliveranceVHoster/trunk/dvhoster
ltucker at codespeak.net
ltucker at codespeak.net
Tue Jul 3 21:44:29 CEST 2007
Author: ltucker
Date: Tue Jul 3 21:44:29 2007
New Revision: 44708
Added:
z3/deliverance/DeliveranceVHoster/trunk/dvhoster/scrubber.py
Modified:
z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py
z3/deliverance/DeliveranceVHoster/trunk/dvhoster/wsgiapp.py
Log:
make deliverance requests back to domain internal requests, do not scrub recursive requests
Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py
==============================================================================
--- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py (original)
+++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py Tue Jul 3 21:44:29 2007
@@ -1,4 +1,3 @@
-import re
import posixpath
import os
import urlparse
@@ -55,14 +54,7 @@
self.app_conf = app_conf
self.provider = DomainInfoSet(data_dir)
self.rewrite_links = asbool(app_conf.get('rewrite_links', False))
- if app_conf.get('clean_environ_headers_regex'):
- self.clean_environ_headers_regex = re.compile(app_conf['clean_environ_headers_regex'])
- else:
- self.clean_environ_headers_regex = None
- if app_conf.get('safe_header_ips'):
- self.safe_header_ips = app_conf.get('safe_header_ips').strip().split()
- else:
- self.safe_header_ips = None
+
logger = make_logger(app_conf.get('logger'), 'dvhoster')
self.logger = logger
@@ -93,9 +85,10 @@
"""
WSGI interface
"""
+
if 'paste.registry' in environ:
environ['paste.registry'].register(current_environ, environ)
- self.clean_environ_headers(environ)
+
domain_info = self.get_domain_info(environ)
environ['dvhoster.domain_info'] = domain_info
environ['dvhoster.base_url'] = construct_url(
@@ -143,11 +136,24 @@
for r in domain_info.remote_uris])))
return exc(environ, start_response)
+ scheme = environ['wsgi.url_scheme']
+ host_parts = environ['HTTP_HOST'].split(':',1)
+ host = host_parts[0]
+ if len(host_parts) > 1:
+ port = host_parts[1]
+ else:
+ if scheme == 'http':
+ port = '80'
+ elif scheme == 'https':
+ port = '443'
+ else:
+ port = ''
+
vars = {
- 'host': environ['HTTP_HOST'],
+ 'host': host,
'domain': environ['HTTP_HOST'].split(':', 1)[0],
- 'scheme': environ['wsgi.url_scheme'],
- 'port': environ['HTTP_HOST'].split(':', 1)[1],
+ 'scheme': scheme,
+ 'port': port,
'path': environ['SCRIPT_NAME'] + environ['PATH_INFO'],
'script_name': environ['SCRIPT_NAME'],
'path_info': environ['PATH_INFO'],
@@ -178,15 +184,34 @@
app = relocateresponse.RelocateMiddleware(
app, old_href=remote_uri)
- rule_uri = construct_url(
- environ, with_query_string=False,
- path_info='/_rules/rule.xml')
+ internal_prefix = construct_url(
+ environ, with_query_string=False,
+ script_name='', path_info='/')
+
+ rule_uri = urlparse.urljoin(internal_prefix,
+ '/_rules/rule.xml')
+
+ theme_uri = domain_info.theme_uri.strip()
+ theme_uri = urlparse.urljoin(internal_prefix,
+ theme_uri)
+
+ # set up deliverance so all subrequests
+ # to this domain come back through the
+ # recursive middleware as trusted requests
+ # (unscrubbed)
+ def is_internal_uri(uri, environ):
+ test_uri = urlparse.urljoin(internal_prefix, uri)
+ if test_uri.startswith(internal_prefix):
+ return True
+ return False
+
app = DeliveranceMiddleware(
app,
- theme_uri=domain_info.theme_uri,
+ theme_uri=theme_uri,
rule_uri=rule_uri,
- renderer=Renderer)
+ renderer=Renderer,
+ is_internal_uri=is_internal_uri)
return app(environ, start_response)
def find_static_file(self, domain_info, path_info):
@@ -203,30 +228,6 @@
return FileApp(static_path)
return None
- def clean_environ_headers(self, environ):
- """
- Remove any request headers that overlap with internal request
- headers (as configured with ``clean_environ_headers_regex``).
- """
- host = environ.get('HTTP_HOST')
- if host is None:
- host = environ['SERVER_NAME'] + ':' + environ['SERVER_PORT']
- elif ':' not in host:
- if environ['wsgi.url_scheme'] == 'https':
- host += ':443'
- else:
- host += ':80'
- environ['HTTP_HOST'] = host
- if not self.clean_environ_headers_regex:
- return
- remote_addr = environ.get('REMOTE_ADDR')
- if (remote_addr and self.safe_header_ips
- and remote_addr in self.safe_header_ips):
- return
- for key in environ.keys():
- if self.clean_environ_headers_regex.search(key):
- # @@: Should log this
- del environ[key]
def get_domain_info(self, environ):
"""
Added: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/scrubber.py
==============================================================================
--- (empty file)
+++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/scrubber.py Tue Jul 3 21:44:29 2007
@@ -0,0 +1,55 @@
+import re
+
+
+class EnvironScrubber:
+ """
+ Cleans up environment generated by
+ user request. This can be configured
+ to scrub out specific headers using
+ the 'clean_environ_headers_regex'
+ option specified in app_conf
+ """
+
+ def __init__(self, subapp, app_conf):
+ self.app = subapp
+
+ if app_conf.get('clean_environ_headers_regex'):
+ self.clean_environ_headers_regex = re.compile(app_conf['clean_environ_headers_regex'])
+ else:
+ self.clean_environ_headers_regex = None
+
+ if app_conf.get('safe_header_ips'):
+ self.safe_header_ips = app_conf.get('safe_header_ips').strip().split()
+ else:
+ self.safe_header_ips = None
+
+
+ def __call__(self, environ, start_response):
+ self.clean_environ_headers(environ)
+ return self.app(environ, start_response)
+
+
+ def clean_environ_headers(self, environ):
+ """
+ Remove any request headers that overlap with internal request
+ headers (as configured with ``clean_environ_headers_regex``).
+ """
+ host = environ.get('HTTP_HOST')
+ if host is None:
+ host = environ['SERVER_NAME'] + ':' + environ['SERVER_PORT']
+ elif ':' not in host:
+ if environ['wsgi.url_scheme'] == 'https':
+ host += ':443'
+ else:
+ host += ':80'
+ environ['HTTP_HOST'] = host
+ if not self.clean_environ_headers_regex:
+ return
+ remote_addr = environ.get('REMOTE_ADDR')
+ if (remote_addr and self.safe_header_ips
+ and remote_addr in self.safe_header_ips):
+ return
+ for key in environ.keys():
+ if self.clean_environ_headers_regex.search(key):
+ # @@: Should log this
+ del environ[key]
Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/wsgiapp.py
==============================================================================
--- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/wsgiapp.py (original)
+++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/wsgiapp.py Tue Jul 3 21:44:29 2007
@@ -7,12 +7,14 @@
from paste.exceptions.errormiddleware import ErrorMiddleware
from paste.httpexceptions import HTTPExceptionHandler
from dvhoster.dispatcher import DeliveranceDispatcher
+from dvhoster.scrubber import EnvironScrubber
def make_app(global_conf, **app_conf):
"""Create a WSGI application and return it"""
app = DeliveranceDispatcher(app_conf)
app = HTTPExceptionHandler(app)
app = RecursiveMiddleware(app)
+ app = EnvironScrubber(app, app_conf)
app = RegistryManager(app)
debug = app_conf['debug'] = asbool(app_conf.get('debug', global_conf.get('debug')))
if asbool(app_conf.get('debug_headers')):
More information about the z3-checkins
mailing list