From 3764e00e439ae912473fd2579b1eab3c5a9185d9 Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Tue, 4 Sep 2018 12:35:29 +0200 Subject: [PATCH] Return 404 for inactive versions and allow redirects on them When a version exists and is inactive, we return 404 instead of 401 so our redirect system can be used for these versions. We only return 401 when the reader has no permission to read the version (active and private). --- readthedocs/core/views/serve.py | 5 ++-- readthedocs/rtd_tests/tests/test_redirects.py | 27 ++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/readthedocs/core/views/serve.py b/readthedocs/core/views/serve.py index 6c828dc5011..245b0bba137 100644 --- a/readthedocs/core/views/serve.py +++ b/readthedocs/core/views/serve.py @@ -155,8 +155,9 @@ def serve_docs( try: version = project.versions.public(request.user).get(slug=version_slug) except Version.DoesNotExist: - # Properly raise a 404 if the version doesn't exist & a 401 if it does - if project.versions.filter(slug=version_slug).exists(): + # Properly raise a 404 if the version doesn't exist (or is inactive) and + # a 401 if it does + if project.versions.filter(slug=version_slug, active=True).exists(): return _serve_401(request, project) raise Http404('Version does not exist.') filename = resolve_path( diff --git a/readthedocs/rtd_tests/tests/test_redirects.py b/readthedocs/rtd_tests/tests/test_redirects.py index a4611b34f77..7595d147568 100644 --- a/readthedocs/rtd_tests/tests/test_redirects.py +++ b/readthedocs/rtd_tests/tests/test_redirects.py @@ -1,5 +1,4 @@ from __future__ import absolute_import -from django.core.urlresolvers import reverse from django.http import Http404 from django.test import TestCase from django.test.utils import override_settings @@ -9,6 +8,7 @@ from mock import patch from readthedocs.builds.constants import LATEST +from readthedocs.builds.models import Version from readthedocs.projects.models import Project from readthedocs.redirects.models import Redirect @@ -185,6 +185,31 @@ def test_redirect_exact_with_rest(self): self.assertEqual( r['Location'], 'http://pip.readthedocs.org/en/master/guides/install.html') + @override_settings(USE_SUBDOMAIN=True) + def test_redirect_inactive_version(self): + """ + Inactive Version (``active=False``) should redirect properly. + + The function that servers the page should return 404 when serving a page + of an inactive version and the redirect system should work. + """ + version = get( + Version, + slug='oldversion', + project=self.pip, + active=False, + ) + Redirect.objects.create( + project=self.pip, + redirect_type='exact', + from_url='/en/oldversion/', + to_url='/en/newversion/', + ) + r = self.client.get('/en/oldversion/', HTTP_HOST='pip.readthedocs.org') + self.assertEqual(r.status_code, 302) + self.assertEqual( + r['Location'], 'http://pip.readthedocs.org/en/newversion/') + @override_settings(USE_SUBDOMAIN=True) def test_redirect_keeps_version_number(self): Redirect.objects.create(