From 0b017c6f9cb3a643725302ab7d4667a51b91cd46 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 16 May 2019 17:43:44 +0200 Subject: [PATCH 2/2] debian: add InternalIpMiddleware (#29149) It sets DEBUG=True when current request IP is in settings.INTERNAL_IPS. --- debian/debian_config_common.py | 2 ++ hobo/middleware/debug.py | 49 ++++++++++++++++++++++++++++ hobo/{agent => }/test_urls.py | 3 ++ tests_multitenant/conftest.py | 10 ++++++ tests_multitenant/test_middleware.py | 18 ++++++++++ 5 files changed, 82 insertions(+) create mode 100644 hobo/middleware/debug.py rename hobo/{agent => }/test_urls.py (81%) diff --git debian/debian_config_common.py debian/debian_config_common.py index 19d6119..6c11aa8 100644 --- debian/debian_config_common.py +++ debian/debian_config_common.py @@ -385,6 +385,7 @@ if 'MIDDLEWARE_CLASSES' in globals(): MIDDLEWARE_CLASSES = ( 'hobo.middleware.utils.StoreRequestMiddleware', 'hobo.middleware.xforwardedfor.XForwardedForMiddleware', + 'hobo.middleware.debug.InternalIPMiddleware', ) + MIDDLEWARE_CLASSES MIDDLEWARE_CLASSES = MIDDLEWARE_CLASSES + ( @@ -393,6 +394,7 @@ else: MIDDLEWARE = ( 'hobo.middleware.utils.StoreRequestMiddleware', 'hobo.middleware.xforwardedfor.XForwardedForMiddleware', + 'hobo.middleware.debug.InternalIPMiddleware', ) + MIDDLEWARE MIDDLEWARE = MIDDLEWARE + ( diff --git hobo/middleware/debug.py hobo/middleware/debug.py new file mode 100644 index 0000000..d73e826 --- /dev/null +++ hobo/middleware/debug.py @@ -0,0 +1,49 @@ +# hobo - portal to configure and deploy applications +# Copyright (C) 2019 Entr'ouvert +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from django.conf import settings + + +class InternalIPMiddleware(object): + def __init__(self, get_response=None): + self.get_response = get_response + + def process_request(self, request): + internal_ips = getattr(settings, 'INTERNAL_IPS', []) + try: + if request.META['REMOTE_ADDR'] in internal_ips: + self.old_value = settings.DEBUG + settings.DEBUG = True + except TypeError: + pass + return None + + def process_response(self, request, response): + if hasattr(self, 'old_value'): + settings.DEBUG = self.old_value + del self.old_value + return response + + def __call__(self, request): + old_value = settings.DEBUG + internal_ips = getattr(settings, 'INTERNAL_IPS', []) + set_debug = request.META['REMOTE_ADDR'] in internal_ips + try: + if set_debug: + settings.DEBUG = True + return self.get_response(request) + finally: + settings.DEBUG = old_value diff --git hobo/agent/test_urls.py hobo/test_urls.py similarity index 81% rename from hobo/agent/test_urls.py rename to hobo/test_urls.py index de2901f..d1f4635 100644 --- hobo/agent/test_urls.py +++ hobo/test_urls.py @@ -3,8 +3,11 @@ import logging from django.conf.urls import url from django.http import HttpResponse + def helloworld(request): logging.getLogger(__name__).error('wat!') + if 'raise' in request.GET: + raise Exception('wat!') return HttpResponse('Hello world %s' % request.META['REMOTE_ADDR']) urlpatterns = [ diff --git tests_multitenant/conftest.py tests_multitenant/conftest.py index c64523f..3ccfddd 100644 --- tests_multitenant/conftest.py +++ tests_multitenant/conftest.py @@ -5,6 +5,8 @@ import json import pytest +import django_webtest + @pytest.fixture(scope='function') def tenants(transactional_db, request, settings): @@ -92,3 +94,11 @@ def tenants(transactional_db, request, settings): shutil.rmtree(base) request.addfinalizer(fin) return tenants + + +@pytest.fixture +def app(request): + wtm = django_webtest.WebTestMixin() + wtm._patch_settings() + yield django_webtest.DjangoTestApp() + wtm._unpatch_settings() diff --git tests_multitenant/test_middleware.py tests_multitenant/test_middleware.py index eabbbaa..a4cbe69 100644 --- tests_multitenant/test_middleware.py +++ tests_multitenant/test_middleware.py @@ -1,3 +1,6 @@ +from __future__ import unicode_literals +import pytest + from hobo.multitenant.middleware import TenantMiddleware @@ -13,3 +16,18 @@ def test_hostname2schema(): # and it matches the suffix assert shortened[-20:] == ('x' * 20) + +@pytest.mark.urls('hobo.test_urls') +def test_internalipmiddleware(app, tenants, settings): + settings.INTERNAL_IPS = [] + settings.ALLOWED_HOSTS = ['*'] + settings.DEBUG_PROPAGATE_EXCEPTIONS = False + app.get('/?raise', status=404) + response = app.get('/?raise', status=500, extra_environ={'HTTP_HOST': tenants[0].domain_url}) + assert response.text == '

Server Error (500)

' + + settings.INTERNAL_IPS = ['127.0.0.1'] + + response = app.get('/?raise', status=500, extra_environ={'HTTP_HOST': tenants[0].domain_url}) + assert 'You\'re seeing this error because you have' in response.text + -- 2.26.0