changeset 3:3478e20885fd 0.1

Add a ReverseProxy and fix the cache path everywhere
author Benoît Allard <benoit.allard@greenbone.net>
date Wed, 24 Sep 2014 17:46:44 +0200
parents fe1918b6e3e0
children 5967ea2e15cd
files farol/main.py farol/proxy.py
diffstat 2 files changed, 47 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/farol/main.py	Wed Sep 24 16:16:42 2014 +0200
+++ b/farol/main.py	Wed Sep 24 17:46:44 2014 +0200
@@ -38,6 +38,7 @@
 from .session import get_current, set_current, has_current, del_current, document_required
 from .vulnerability import vulnerability
 from .producttree import producttree
+from .proxy import ReverseProxied
 
 app = Flask(__name__, instance_relative_config=True)
 app.config.from_object('farol.config.Config')
@@ -46,6 +47,8 @@
 app.register_blueprint(vulnerability, url_prefix='/vulnerability')
 app.register_blueprint(producttree, url_prefix='/producttree')
 
+app.wsgi_app = ReverseProxied(app.wsgi_app)
+
 @app.context_processor
 def cache_content():
     """ List the documents in cache """
@@ -354,7 +357,9 @@
     # Get some kind of filename, and save the cvrf on cache (disk)
     path = secure_filename(request.form['fname'])
     path, _ = os.path.splitext(path)
-    with open(os.path.join(app.config['CACHE_DIRECTORY'], path + '.xml'), 'wt') as f:
+    dirname = app.config.get('CACHE_DIRECTORY',
+                             os.path.join(app.instance_path, '_cache'))
+    with open(os.path.join(dirname, path + '.xml'), 'wt') as f:
         f.write(render_cvrf(get_current(), 'cvrf.j2').encode('utf-8'))
     flash('File saved as %s' % path)
     del_current()
@@ -367,7 +372,9 @@
             # Suggest to save first
             return render_template('load.j2', element=element)
 
-    fpath = os.path.join(app.config['CACHE_DIRECTORY'], element+'.xml')
+    dirname = app.config.get('CACHE_DIRECTORY',
+                             os.path.join(app.instance_path, '_cache'))
+    fpath = os.path.join(dirname, element+'.xml')
     with open(fpath, 'rt') as f:
         set_current(parse(f))
     os.remove(fpath)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/farol/proxy.py	Wed Sep 24 17:46:44 2014 +0200
@@ -0,0 +1,38 @@
+# Code from http://flask.pocoo.org/snippets/35/
+#
+# This snippet by Peter Hansen can be used freely for anything you like.
+# Consider it public domain.
+
+
+class ReverseProxied(object):
+    '''Wrap the application in this middleware and configure the
+    front-end server to add these headers, to let you quietly bind
+    this to a URL other than / and to an HTTP scheme that is
+    different than what is used locally.
+
+    In nginx:
+    location /myprefix {
+        proxy_pass http://192.168.0.1:5001;
+        proxy_set_header Host $host;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Scheme $scheme;
+        proxy_set_header X-Script-Name /myprefix;
+        }
+
+    :param app: the WSGI application
+    '''
+    def __init__(self, app):
+        self.app = app
+
+    def __call__(self, environ, start_response):
+        script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
+        if script_name:
+            environ['SCRIPT_NAME'] = script_name
+            path_info = environ['PATH_INFO']
+            if path_info.startswith(script_name):
+                environ['PATH_INFO'] = path_info[len(script_name):]
+
+        scheme = environ.get('HTTP_X_SCHEME', '')
+        if scheme:
+            environ['wsgi.url_scheme'] = scheme
+        return self.app(environ, start_response)

http://farol.wald.intevation.org