Browse Source

Fix pathhandling

Rafał Pitoń 7 years ago
parent
commit
63268cc519

+ 6 - 6
misago/admin/tests/test_admin_views.py

@@ -12,20 +12,20 @@ from misago.admin.views import get_protected_namespace
 UserModel = get_user_model()
 UserModel = get_user_model()
 
 
 
 
-class FakeRequest(object):
+class MockRequest(object):
     def __init__(self, path):
     def __init__(self, path):
         self.path = path
         self.path = path
-        self.path_info = path
 
 
 
 
 class AdminProtectedNamespaceTests(TestCase):
 class AdminProtectedNamespaceTests(TestCase):
     def test_valid_cases(self):
     def test_valid_cases(self):
         """get_protected_namespace returns true for protected links"""
         """get_protected_namespace returns true for protected links"""
-        links_prefix = reverse('misago:admin:index')
         TEST_CASES = ('', 'somewhere/', 'ejksajdlksajldjskajdlksajlkdas', )
         TEST_CASES = ('', 'somewhere/', 'ejksajdlksajldjskajdlksajlkdas', )
-
+        
+        links_prefix = reverse('misago:admin:index')
+        
         for case in TEST_CASES:
         for case in TEST_CASES:
-            request = FakeRequest(links_prefix + case)
+            request = MockRequest(links_prefix + case)
             self.assertEqual(get_protected_namespace(request), 'misago:admin')
             self.assertEqual(get_protected_namespace(request), 'misago:admin')
 
 
     def test_invalid_cases(self):
     def test_invalid_cases(self):
@@ -33,7 +33,7 @@ class AdminProtectedNamespaceTests(TestCase):
         TEST_CASES = ('/', '/somewhere/', '/ejksajdlksajldjskajdlksajlkdas', )
         TEST_CASES = ('/', '/somewhere/', '/ejksajdlksajldjskajdlksajlkdas', )
 
 
         for case in TEST_CASES:
         for case in TEST_CASES:
-            request = FakeRequest(case)
+            request = MockRequest(case)
             self.assertEqual(get_protected_namespace(request), None)
             self.assertEqual(get_protected_namespace(request), None)
 
 
 
 

+ 1 - 1
misago/admin/views/__init__.py

@@ -12,7 +12,7 @@ def get_protected_namespace(request):
     for namespace in settings.MISAGO_ADMIN_NAMESPACES:
     for namespace in settings.MISAGO_ADMIN_NAMESPACES:
         try:
         try:
             admin_path = reverse('%s:index' % namespace)
             admin_path = reverse('%s:index' % namespace)
-            if request.path_info.startswith(admin_path):
+            if request.path.startswith(admin_path):
                 return namespace
                 return namespace
         except NoReverseMatch:
         except NoReverseMatch:
             pass
             pass

+ 2 - 2
misago/admin/views/generic/list.py

@@ -96,7 +96,7 @@ class ListView(AdminView):
                 if response:
                 if response:
                     return response
                     return response
                 else:
                 else:
-                    return redirect(request.path_info)
+                    return redirect(request.path)
             except MassActionError as e:
             except MassActionError as e:
                 messages.error(request, e.args[0])
                 messages.error(request, e.args[0])
 
 
@@ -150,7 +150,7 @@ class ListView(AdminView):
                 return redirect('%s%s' % (reverse(self.root_link), context['querystring']))
                 return redirect('%s%s' % (reverse(self.root_link), context['querystring']))
 
 
         if refresh_querystring and not request.GET.get('redirected'):
         if refresh_querystring and not request.GET.get('redirected'):
-            return redirect('%s%s' % (request.path_info, context['querystring']))
+            return redirect('%s%s' % (request.path, context['querystring']))
 
 
         return self.render(request, context)
         return self.render(request, context)
 
 

+ 1 - 1
misago/core/context_processors.py

@@ -17,7 +17,7 @@ def site_address(request):
         'SITE_PROTOCOL': site_protocol,
         'SITE_PROTOCOL': site_protocol,
         'SITE_HOST': host,
         'SITE_HOST': host,
         'SITE_ADDRESS': address_template % host,
         'SITE_ADDRESS': address_template % host,
-        'REQUEST_PATH': request.path_info,
+        'REQUEST_PATH': request.path,
     }
     }
 
 
 
 

+ 1 - 1
misago/core/tests/test_context_processors.py

@@ -5,7 +5,7 @@ from misago.core import context_processors
 
 
 
 
 class MockRequest(object):
 class MockRequest(object):
-    path_info = '/'
+    path = '/'
 
 
     def __init__(self, secure, host):
     def __init__(self, secure, host):
         self.secure = secure
         self.secure = secure

+ 5 - 7
misago/core/tests/test_utils.py

@@ -12,21 +12,19 @@ from misago.core.utils import (
     parse_iso8601_string, slugify, get_exception_message, clean_ids_list)
     parse_iso8601_string, slugify, get_exception_message, clean_ids_list)
 
 
 
 
-VALID_PATHS = ("/", "/threads/", )
-
-INVALID_PATHS = ("", "somewhere/", )
-
-
 class IsRequestToMisagoTests(TestCase):
 class IsRequestToMisagoTests(TestCase):
     def test_is_request_to_misago(self):
     def test_is_request_to_misago(self):
         """
         """
         is_request_to_misago correctly detects requests directed at Misago
         is_request_to_misago correctly detects requests directed at Misago
         """
         """
+        VALID_PATHS = ('/', '/threads/', )
+        INVALID_PATHS = ('', 'somewhere/', )
+
         misago_prefix = reverse('misago:index')
         misago_prefix = reverse('misago:index')
 
 
         for path in VALID_PATHS:
         for path in VALID_PATHS:
             request = RequestFactory().get('/')
             request = RequestFactory().get('/')
-            request.path_info = path
+            request.path = path
             self.assertTrue(
             self.assertTrue(
                 is_request_to_misago(request),
                 is_request_to_misago(request),
                 '"%s" is not overlapped by "%s"' % (path, misago_prefix)
                 '"%s" is not overlapped by "%s"' % (path, misago_prefix)
@@ -34,7 +32,7 @@ class IsRequestToMisagoTests(TestCase):
 
 
         for path in INVALID_PATHS:
         for path in INVALID_PATHS:
             request = RequestFactory().get('/')
             request = RequestFactory().get('/')
-            request.path_info = path
+            request.path = path
             self.assertFalse(
             self.assertFalse(
                 is_request_to_misago(request),
                 is_request_to_misago(request),
                 '"%s" is overlapped by "%s"' % (path, misago_prefix)
                 '"%s" is overlapped by "%s"' % (path, misago_prefix)

+ 3 - 3
misago/core/utils.py

@@ -115,11 +115,11 @@ def is_request_to_misago(request):
 def _is_request_path_under_misago(request):
 def _is_request_path_under_misago(request):
     # We are assuming that forum_index link is root of all Misago links
     # We are assuming that forum_index link is root of all Misago links
     forum_index = reverse('misago:index')
     forum_index = reverse('misago:index')
-    path_info = request.path_info
+    path = request.path
 
 
-    if len(forum_index) > len(path_info):
+    if len(forum_index) > len(path):
         return False
         return False
-    return path_info[:len(forum_index)] == forum_index
+    return path[:len(forum_index)] == forum_index
 
 
 
 
 def is_referer_local(request):
 def is_referer_local(request):

+ 6 - 1
misago/threads/tests/test_utils.py

@@ -253,11 +253,16 @@ class GetThreadIdFromUrlTests(MisagoTestCase):
     def test_get_thread_id_from_invalid_urls(self):
     def test_get_thread_id_from_invalid_urls(self):
         TEST_CASES = [
         TEST_CASES = [
             {
             {
-                # invalid wsgi alias
+                # lacking wsgi alias
                 'request': MockRequest('https', 'testforum.com'),
                 'request': MockRequest('https', 'testforum.com'),
                 'url': 'http://testforum.com/discuss/t/test-thread-123/',
                 'url': 'http://testforum.com/discuss/t/test-thread-123/',
             },
             },
             {
             {
+                # invalid wsgi alias
+                'request': MockRequest('https', 'testforum.com', '/discuss/'),
+                'url': 'http://testforum.com/forum/t/test-thread-123/',
+            },
+            {
                 # invalid hostname
                 # invalid hostname
                 'request': MockRequest('http', 'misago-project.org', '/discuss/'),
                 'request': MockRequest('http', 'misago-project.org', '/discuss/'),
                 'url': 'https://testforum.com/discuss/t/test-thread-432/post/12321/',
                 'url': 'https://testforum.com/discuss/t/test-thread-432/post/12321/',

+ 2 - 0
misago/threads/utils.py

@@ -55,6 +55,8 @@ def get_thread_id_from_url(request, url):
 
 
     try:
     try:
         wsgi_alias = request.path[:len(request.path_info) * -1]
         wsgi_alias = request.path[:len(request.path_info) * -1]
+        if wsgi_alias and not clean_path.startswith(wsgi_alias):
+            return None
         resolution = resolve(clean_path[len(wsgi_alias):])
         resolution = resolve(clean_path[len(wsgi_alias):])
     except:
     except:
         return None
         return None

+ 8 - 8
misago/users/tests/test_bans.py

@@ -185,7 +185,7 @@ class UserBansTests(TestCase):
         self.assertFalse(self.user.ban_cache.is_banned)
         self.assertFalse(self.user.ban_cache.is_banned)
 
 
 
 
-class FakeRequest(object):
+class MockRequest(object):
     def __init__(self):
     def __init__(self):
         self.user_ip = '127.0.0.1'
         self.user_ip = '127.0.0.1'
         self.session = {}
         self.session = {}
@@ -194,7 +194,7 @@ class FakeRequest(object):
 class RequestIPBansTests(TestCase):
 class RequestIPBansTests(TestCase):
     def test_no_ban(self):
     def test_no_ban(self):
         """no ban found"""
         """no ban found"""
-        ip_ban = get_request_ip_ban(FakeRequest())
+        ip_ban = get_request_ip_ban(MockRequest())
         self.assertIsNone(ip_ban)
         self.assertIsNone(ip_ban)
 
 
     def test_permanent_ban(self):
     def test_permanent_ban(self):
@@ -205,13 +205,13 @@ class RequestIPBansTests(TestCase):
             user_message='User reason',
             user_message='User reason',
         )
         )
 
 
-        ip_ban = get_request_ip_ban(FakeRequest())
+        ip_ban = get_request_ip_ban(MockRequest())
         self.assertTrue(ip_ban['is_banned'])
         self.assertTrue(ip_ban['is_banned'])
         self.assertEqual(ip_ban['ip'], '127.0.0.1')
         self.assertEqual(ip_ban['ip'], '127.0.0.1')
         self.assertEqual(ip_ban['message'], 'User reason')
         self.assertEqual(ip_ban['message'], 'User reason')
 
 
         # repeated call uses cache
         # repeated call uses cache
-        get_request_ip_ban(FakeRequest())
+        get_request_ip_ban(MockRequest())
 
 
     def test_temporary_ban(self):
     def test_temporary_ban(self):
         """ip is caught by temporary ban"""
         """ip is caught by temporary ban"""
@@ -222,13 +222,13 @@ class RequestIPBansTests(TestCase):
             expires_on=timezone.now() + timedelta(days=7),
             expires_on=timezone.now() + timedelta(days=7),
         )
         )
 
 
-        ip_ban = get_request_ip_ban(FakeRequest())
+        ip_ban = get_request_ip_ban(MockRequest())
         self.assertTrue(ip_ban['is_banned'])
         self.assertTrue(ip_ban['is_banned'])
         self.assertEqual(ip_ban['ip'], '127.0.0.1')
         self.assertEqual(ip_ban['ip'], '127.0.0.1')
         self.assertEqual(ip_ban['message'], 'User reason')
         self.assertEqual(ip_ban['message'], 'User reason')
 
 
         # repeated call uses cache
         # repeated call uses cache
-        get_request_ip_ban(FakeRequest())
+        get_request_ip_ban(MockRequest())
 
 
     def test_expired_ban(self):
     def test_expired_ban(self):
         """ip is not caught by expired ban"""
         """ip is not caught by expired ban"""
@@ -239,11 +239,11 @@ class RequestIPBansTests(TestCase):
             expires_on=timezone.now() - timedelta(days=7),
             expires_on=timezone.now() - timedelta(days=7),
         )
         )
 
 
-        ip_ban = get_request_ip_ban(FakeRequest())
+        ip_ban = get_request_ip_ban(MockRequest())
         self.assertIsNone(ip_ban)
         self.assertIsNone(ip_ban)
 
 
         # repeated call uses cache
         # repeated call uses cache
-        get_request_ip_ban(FakeRequest())
+        get_request_ip_ban(MockRequest())
 
 
 
 
 class BanUserTests(TestCase):
 class BanUserTests(TestCase):