[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