From 6fd22b01d9f4772c96c86a145da2cb3b7008e61d Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Tue, 28 Aug 2018 19:38:04 +0200 Subject: [PATCH] Force resolver to use PUBLIC_DOMAIN over HTTPS if not Domain.https Argument ``require_https_domain`` added to force the resolver to use https URLs with PUBLIC_DOMAIN when the Domain is not https. --- readthedocs/core/resolver.py | 13 ++++++++++--- readthedocs/rtd_tests/tests/test_resolver.py | 8 ++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/readthedocs/core/resolver.py b/readthedocs/core/resolver.py index e2da852ebbe..abe1d5d9671 100644 --- a/readthedocs/core/resolver.py +++ b/readthedocs/core/resolver.py @@ -136,7 +136,7 @@ def resolve_domain(self, project, private=None): return self._get_project_subdomain(canonical_project) return getattr(settings, 'PRODUCTION_DOMAIN') - def resolve(self, project, protocol='http', filename='', private=None, + def resolve(self, project, require_https_domain=False, filename='', private=None, **kwargs): if private is None: version_slug = kwargs.get('version_slug') @@ -149,15 +149,22 @@ def resolve(self, project, protocol='http', filename='', private=None, # This duplication from resolve_domain is for performance purposes # in order to check whether a custom domain should be HTTPS - if custom_domain: + use_custom_domain = any([ + (custom_domain and not require_https_domain), + (custom_domain and require_https_domain and custom_domain.https), + ]) + if use_custom_domain: domain = custom_domain.domain elif self._use_subdomain(): domain = self._get_project_subdomain(canonical_project) else: domain = getattr(settings, 'PRODUCTION_DOMAIN') + protocol = 'http' if custom_domain: - protocol = 'https' if custom_domain.https else 'http' + # Rely on the ``Domain.https`` field or force it if specified + if custom_domain.https or require_https_domain: + protocol = 'https' else: # Use HTTPS if settings specify public_domain = getattr(settings, 'PUBLIC_DOMAIN', None) diff --git a/readthedocs/rtd_tests/tests/test_resolver.py b/readthedocs/rtd_tests/tests/test_resolver.py index 1ef55d564ca..79cd4db99b0 100644 --- a/readthedocs/rtd_tests/tests/test_resolver.py +++ b/readthedocs/rtd_tests/tests/test_resolver.py @@ -471,6 +471,10 @@ def test_resolver_domain(self): url = resolve(project=self.pip) self.assertEqual(url, 'http://docs.foobar.com/en/latest/') + # Do not use the ``Domain.domain`` when ``require_https_domain=True`` + url = resolve(project=self.pip, require_https_domain=True) + self.assertEqual(url, 'https://pip.readthedocs.org/en/latest/') + @override_settings(PRODUCTION_DOMAIN='readthedocs.org') def test_resolver_domain_https(self): self.domain = fixture.get( @@ -487,6 +491,10 @@ def test_resolver_domain_https(self): url = resolve(project=self.pip) self.assertEqual(url, 'https://docs.foobar.com/en/latest/') + # Use the ``Domain.domain`` when ``require_https_domain=True`` + url = resolve(project=self.pip, require_https_domain=True) + self.assertEqual(url, 'https://docs.foobar.com/en/latest/') + @override_settings(PRODUCTION_DOMAIN='readthedocs.org') def test_resolver_subproject(self): with override_settings(USE_SUBDOMAIN=False):