From 89e59e54edb410bb74bdbd14024d63662474f702 Mon Sep 17 00:00:00 2001 From: David Fischer Date: Fri, 20 Apr 2018 13:09:16 -0700 Subject: [PATCH 1/2] Subdomains use HTTPS if settings specify --- docs/settings.rst | 11 +++++++++++ readthedocs/core/resolver.py | 10 +++++++++- readthedocs/rtd_tests/tests/test_resolver.py | 13 +++++++++++++ readthedocs/settings/base.py | 1 + 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/settings.rst b/docs/settings.rst index ea4f52bc6d7..ef6d4d2797d 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -83,6 +83,17 @@ Default: :djangosetting:`PUBLIC_DOMAIN` A special domain for serving public documentation. If set, public docs will be linked here instead of the `PRODUCTION_DOMAIN`. + +PUBLIC_DOMAIN_USES_HTTPS +------------------------ + +Default: ``False`` + +If ``True`` and ``PUBLIC_DOMAIN`` is set, that domain will default to +serving public documentation over HTTPS. By default, documentation is +served over HTTP. + + ALLOW_ADMIN ----------- diff --git a/readthedocs/core/resolver.py b/readthedocs/core/resolver.py index 6a131bca332..1979bc4b3a0 100644 --- a/readthedocs/core/resolver.py +++ b/readthedocs/core/resolver.py @@ -144,9 +144,17 @@ def resolve(self, project, protocol='http', filename='', private=None, version_slug = project.get_default_version() private = self._get_private(project, version_slug) + domain = self.resolve_domain(project, private=private) + + # Use HTTPS if settings specify + public_domain = getattr(settings, 'PUBLIC_DOMAIN', None) + use_https = getattr(settings, 'PUBLIC_DOMAIN_USES_HTTPS', False) + if use_https and public_domain and public_domain in domain: + protocol = 'https' + return '{protocol}://{domain}{path}'.format( protocol=protocol, - domain=self.resolve_domain(project, private=private), + domain=domain, path=self.resolve_path(project, filename=filename, private=private, **kwargs), ) diff --git a/readthedocs/rtd_tests/tests/test_resolver.py b/readthedocs/rtd_tests/tests/test_resolver.py index cab0d794025..5a59d15a0fe 100644 --- a/readthedocs/rtd_tests/tests/test_resolver.py +++ b/readthedocs/rtd_tests/tests/test_resolver.py @@ -488,6 +488,19 @@ def test_resolver_public_domain_overrides(self): url = resolve(project=self.pip, private=False) self.assertEqual(url, 'http://docs.foobar.com/en/latest/') + @override_settings( + PRODUCTION_DOMAIN='readthedocs.org', + PUBLIC_DOMAIN='readthedocs.io', + PUBLIC_DOMAIN_USES_HTTPS=True, + USE_SUBDOMAIN=True, + ) + def test_resolver_domain_https(self): + url = resolve(project=self.pip, private=True) + self.assertEqual(url, 'https://pip.readthedocs.io/en/latest/') + + url = resolve(project=self.pip, private=False) + self.assertEqual(url, 'https://pip.readthedocs.io/en/latest/') + class ResolverAltSetUp(object): diff --git a/readthedocs/settings/base.py b/readthedocs/settings/base.py index ed1b6b4fed3..31d01c302e5 100644 --- a/readthedocs/settings/base.py +++ b/readthedocs/settings/base.py @@ -42,6 +42,7 @@ class CommunityBaseSettings(Settings): # Domains and URLs PRODUCTION_DOMAIN = 'readthedocs.org' PUBLIC_DOMAIN = None + PUBLIC_DOMAIN_USES_HTTPS = False USE_SUBDOMAIN = False PUBLIC_API_URL = 'https://{0}'.format(PRODUCTION_DOMAIN) From ade7cb2f1662028db0699a11df3e93cb1c61cd93 Mon Sep 17 00:00:00 2001 From: David Fischer Date: Tue, 15 May 2018 15:07:57 -0700 Subject: [PATCH 2/2] Updates based on feedback --- readthedocs/rtd_tests/tests/test_resolver.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/readthedocs/rtd_tests/tests/test_resolver.py b/readthedocs/rtd_tests/tests/test_resolver.py index 5a59d15a0fe..17d87df3abc 100644 --- a/readthedocs/rtd_tests/tests/test_resolver.py +++ b/readthedocs/rtd_tests/tests/test_resolver.py @@ -491,15 +491,19 @@ def test_resolver_public_domain_overrides(self): @override_settings( PRODUCTION_DOMAIN='readthedocs.org', PUBLIC_DOMAIN='readthedocs.io', - PUBLIC_DOMAIN_USES_HTTPS=True, USE_SUBDOMAIN=True, ) def test_resolver_domain_https(self): - url = resolve(project=self.pip, private=True) - self.assertEqual(url, 'https://pip.readthedocs.io/en/latest/') + with override_settings(PUBLIC_DOMAIN_USES_HTTPS=True): + url = resolve(project=self.pip, private=True) + self.assertEqual(url, 'https://pip.readthedocs.io/en/latest/') + + url = resolve(project=self.pip, private=False) + self.assertEqual(url, 'https://pip.readthedocs.io/en/latest/') - url = resolve(project=self.pip, private=False) - self.assertEqual(url, 'https://pip.readthedocs.io/en/latest/') + with override_settings(PUBLIC_DOMAIN_USES_HTTPS=False): + url = resolve(project=self.pip, private=True) + self.assertEqual(url, 'http://pip.readthedocs.io/en/latest/') class ResolverAltSetUp(object):