]> git.ozlabs.org Git - patchwork/commitdiff
Add a config option to FORCE_HTTPS_LINKS
authorKonstantin Ryabitsev <mricon@kernel.org>
Fri, 11 Oct 2013 14:47:30 +0000 (10:47 -0400)
committerJeremy Kerr <jk@ozlabs.org>
Sun, 13 Oct 2013 06:58:23 +0000 (14:58 +0800)
In situations where SSL is terminated at the load-balancer, we cannot
rely on guessing the scheme based on whether patchwork itself was
accessed via http or https, since the last-leg is always going to be
done over http.

Unfortunately, wrongly using http:// URLs results in unusable
.pwclientrc files, since xmlrpc does not handle http->https redirects
and instead displays a traceback.

This change introduces a FORCE_HTTPS_LINKS option, which forces
pwclientrc links to always return "https" regardless of how the project
itself is accessed.

It appears that the http/https check is currently only used for
generating pwclientrc -- a lot of other places seem to hardcode
"http://" and rely on the server to transparently upgrade the
connection. This is not a secure approach (it allows for MITM and
SSL-Strip attacks) and therefore all places currently hardcoding
http://{{site.domain}} and similar should be switched to using the
"sheme" variable, the same as done for generating pwclientrc files.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
apps/patchwork/views/base.py
apps/settings.py

index 7707653e9fa9fab13593a8653ed79dbe55235e39..fa7dd998335ac11ad163f41d84227570e4363efa 100644 (file)
@@ -43,7 +43,7 @@ def pwclientrc(request, project_id):
     project = get_object_or_404(Project, linkname = project_id)
     context = PatchworkRequestContext(request)
     context.project = project
-    if request.is_secure():
+    if settings.FORCE_HTTPS_LINKS or request.is_secure():
         context['scheme'] = 'https'
     else:
         context['scheme'] = 'http'
index 537c38053aa92163e7cc9c1d5b157f5e54eb42ef..43a37d8fe539e3da9c6c6a82bdacb99de95536d4 100644 (file)
@@ -114,6 +114,11 @@ ENABLE_XMLRPC = False
 # of patchwork
 COMPAT_REDIR = True
 
+# Set to True to always generate https:// links instead of guessing
+# the scheme based on current access. This is useful if SSL protocol
+# is terminated upstream of the server (e.g. at the load balancer)
+FORCE_HTTPS_LINKS = False
+
 try:
     from local_settings import *
 except ImportError, ex: