diff --git a/awx/main/middleware.py b/awx/main/middleware.py index 5a0f587440..8e0d7b2190 100644 --- a/awx/main/middleware.py +++ b/awx/main/middleware.py @@ -35,11 +35,20 @@ class TimingMiddleware(threading.local): dest = '/var/log/tower/profile' + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + response = self.process_request(request) + response = self.process_response(request, response) + return response + def process_request(self, request): self.start_time = time.time() if settings.AWX_REQUEST_PROFILE: self.prof = cProfile.Profile() self.prof.enable() + return self.get_response(request) def process_response(self, request, response): if not hasattr(self, 'start_time'): # some tools may not invoke process_request @@ -66,9 +75,15 @@ class TimingMiddleware(threading.local): class ActivityStreamMiddleware(threading.local): - def __init__(self): + def __init__(self, get_response): self.disp_uid = None self.instance_ids = [] + self.get_response = get_response + + def __call__(self, request): + response = self.process_request(request) + response = self.process_response(request, response) + return response def process_request(self, request): if hasattr(request, 'user') and hasattr(request.user, 'is_authenticated') and request.user.is_authenticated(): @@ -80,6 +95,7 @@ class ActivityStreamMiddleware(threading.local): self.disp_uid = str(uuid.uuid1()) self.instance_ids = [] post_save.connect(set_actor, sender=ActivityStream, dispatch_uid=self.disp_uid, weak=False) + return self.get_response(request) def process_response(self, request, response): drf_request = getattr(request, 'drf_request', None) @@ -124,6 +140,14 @@ class SessionTimeoutMiddleware(object): to the value of SESSION_COOKIE_AGE on every request if there is a valid session. """ + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + response = self.get_response(request) + response = self.process_response(request, response) + return response + def process_response(self, request, response): should_skip = 'HTTP_X_WS_SESSION_QUIET' in request.META # Something went wrong, such as upgrade-in-progress page @@ -153,7 +177,8 @@ def _customize_graph(): class URLModificationMiddleware(object): - def __init__(self): + def __init__(self, get_response): + self.get_response = get_response models = [m for m in apps.get_app_config('main').get_models() if hasattr(m, 'get_absolute_url')] generate_graph(models) _customize_graph() @@ -195,6 +220,10 @@ class URLModificationMiddleware(object): url_units[4]) return '/'.join(url_units) + def __call__(self, request): + response = self.process_request(request) + return response + def process_request(self, request): if hasattr(request, 'environ') and 'REQUEST_URI' in request.environ: old_path = urllib.parse.urlsplit(request.environ['REQUEST_URI']).path @@ -205,13 +234,22 @@ class URLModificationMiddleware(object): if request.path_info != new_path: request.path = request.path.replace(request.path_info, new_path) request.path_info = new_path + return self.get_response(request) class MigrationRanCheckMiddleware(object): + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + response = self.process_request(request) + return response + def process_request(self, request): executor = MigrationExecutor(connection) plan = executor.migration_plan(executor.loader.graph.leaf_nodes()) if bool(plan) and \ getattr(resolve(request.path), 'url_name', '') != 'migrations_notran': return redirect(reverse("ui:migrations_notran")) + return self.get_response(request) diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 30fa819d44..b90f0da8c7 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -251,29 +251,11 @@ TEMPLATES = [ }, ] -MIDDLEWARE = ( # NOQA - 'awx.main.middleware.TimingMiddleware', - 'awx.main.middleware.MigrationRanCheckMiddleware', - 'corsheaders.middleware.CorsMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.locale.LocaleMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'awx.main.middleware.ActivityStreamMiddleware', - 'awx.sso.middleware.SocialAuthMiddleware', - 'crum.CurrentRequestUserMiddleware', - 'awx.main.middleware.URLModificationMiddleware', - 'awx.main.middleware.SessionTimeoutMiddleware', -) - - ROOT_URLCONF = 'awx.urls' WSGI_APPLICATION = 'awx.wsgi.application' -INSTALLED_APPS = ( +INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.messages', @@ -294,7 +276,7 @@ INSTALLED_APPS = ( 'awx.ui', 'awx.sso', 'solo' -) +] INTERNAL_IPS = ('127.0.0.1',) @@ -447,16 +429,6 @@ AWX_ISOLATED_VERBOSITY = 0 # } # } -# Use Django-Debug-Toolbar if installed. -try: - import debug_toolbar - INSTALLED_APPS += (debug_toolbar.__name__,) -except ImportError: - pass - -DEBUG_TOOLBAR_CONFIG = { - 'ENABLE_STACKTRACES' : True, -} DEVSERVER_DEFAULT_ADDR = '0.0.0.0' DEVSERVER_DEFAULT_PORT = '8013' @@ -1211,3 +1183,21 @@ AWX_REQUEST_PROFILE = False # Delete temporary directories created to store playbook run-time AWX_CLEANUP_PATHS = True + +MIDDLEWARE = [ # NOQA + 'awx.main.middleware.TimingMiddleware', + 'awx.main.middleware.MigrationRanCheckMiddleware', + 'corsheaders.middleware.CorsMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'awx.main.middleware.ActivityStreamMiddleware', + 'awx.sso.middleware.SocialAuthMiddleware', + 'crum.CurrentRequestUserMiddleware', + 'awx.main.middleware.URLModificationMiddleware', + 'awx.main.middleware.SessionTimeoutMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] diff --git a/awx/settings/development.py b/awx/settings/development.py index 3834c14cc4..717d8d52dd 100644 --- a/awx/settings/development.py +++ b/awx/settings/development.py @@ -93,7 +93,7 @@ INSIGHTS_TRACKING_STATE = False # Use Django-Jenkins if installed. Only run tests for awx.main app. try: import django_jenkins - INSTALLED_APPS += (django_jenkins.__name__,) # noqa + INSTALLED_APPS += [django_jenkins.__name__,] # noqa PROJECT_APPS = ('awx.main.tests', 'awx.api.tests',) except ImportError: pass @@ -112,7 +112,18 @@ if 'django_jenkins' in INSTALLED_APPS: PEP8_RCFILE = "setup.cfg" PYLINT_RCFILE = ".pylintrc" -INSTALLED_APPS += ('rest_framework_swagger',) +INSTALLED_APPS += [ # NOQA + 'rest_framework_swagger', + 'debug_toolbar', +] + +MIDDLEWARE += [ # NOQA + 'debug_toolbar.middleware.DebugToolbarMiddleware', +] + +DEBUG_TOOLBAR_CONFIG = { + 'ENABLE_STACKTRACES' : True, +} # Configure a default UUID for development only. SYSTEM_UUID = '00000000-0000-0000-0000-000000000000' @@ -162,9 +173,3 @@ except Exception: os.environ['SDB_NOTIFY_HOST'] = os.popen('ip route').read().split(' ')[2] WEBSOCKET_ORIGIN_WHITELIST = ['https://localhost:8043', 'https://localhost:3000'] - -MIDDLEWARE = [ - # ... - 'debug_toolbar.middleware.DebugToolbarMiddleware', - # ... -] diff --git a/awx/sso/middleware.py b/awx/sso/middleware.py index aa0a81fd29..dc653fb9b8 100644 --- a/awx/sso/middleware.py +++ b/awx/sso/middleware.py @@ -4,8 +4,6 @@ # Python import urllib.parse -# Six - # Django from django.conf import settings from django.utils.functional import LazyObject @@ -20,9 +18,12 @@ from social_django.middleware import SocialAuthExceptionMiddleware class SocialAuthMiddleware(SocialAuthExceptionMiddleware): - def process_view(self, request, callback, callback_args, callback_kwargs): - if request.path.startswith('/sso/login/'): - request.session['social_auth_last_backend'] = callback_kwargs['backend'] + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + response = self.process_request(request) + return response def process_request(self, request): if request.path.startswith('/sso'): @@ -53,6 +54,11 @@ class SocialAuthMiddleware(SocialAuthExceptionMiddleware): request.user = request.user._wrapped request.session.pop('social_auth_error', None) request.session.pop('social_auth_last_backend', None) + return self.get_response(request) + + def process_view(self, request, callback, callback_args, callback_kwargs): + if request.path.startswith('/sso/login/'): + request.session['social_auth_last_backend'] = callback_kwargs['backend'] def process_exception(self, request, exception): strategy = getattr(request, 'social_strategy', None) diff --git a/awx/wsgi.py b/awx/wsgi.py index 656c96460b..df7531ee92 100644 --- a/awx/wsgi.py +++ b/awx/wsgi.py @@ -41,22 +41,13 @@ if social_django.__version__ != '2.1.0': still works".format(social_django.__version__)) -if django.__version__ != '1.11.20': - raise RuntimeError("Django version other than 1.11.20 detected {}. \ +if not django.__version__.startswith('1.'): + raise RuntimeError("Django version other than 1.XX detected {}. \ Inherit from WSGIHandler to support short-circuit Django Middleware. \ - This is known to work for Django 1.11.20 and may not work with other, \ + This is known to work for Django 1.XX and may not work with other, \ even minor, versions.".format(django.__version__)) -if settings.MIDDLEWARE: - raise RuntimeError("MIDDLEWARE setting detected. \ - The 'migration in progress' view feature short-circuits OLD Django \ - MIDDLEWARE_CLASSES behavior. With the new Django MIDDLEWARE beahvior \ - it's possible to short-ciruit the middleware onion through supported \ - middleware mechanisms. Further, from django.core.wsgi.get_wsgi_application() \ - should be called to get an instance of WSGIHandler().") - - class AWXWSGIHandler(WSGIHandler): def _legacy_get_response(self, request): try: