|
1 | 1 | import logging
|
| 2 | +from typing import Union |
2 | 3 |
|
3 | 4 | from django.conf import settings
|
4 | 5 | from django.utils.translation import gettext_lazy as _
|
|
8 | 9 | from ansible_base.authentication.models import Authenticator
|
9 | 10 | from ansible_base.authentication.serializers import UIAuthResponseSerializer
|
10 | 11 | from ansible_base.lib.utils.settings import get_setting, is_aoc_instance
|
11 |
| -from ansible_base.lib.utils.validation import validate_image_data, validate_url |
| 12 | +from ansible_base.lib.utils.validation import validate_absolute_path, validate_image_data, validate_url |
12 | 13 | from ansible_base.lib.utils.views.django_app_api import AnsibleBaseDjangoAppApiView
|
13 | 14 |
|
14 | 15 | logger = logging.getLogger('ansible_base.authentication.views.ui_auth')
|
@@ -39,6 +40,23 @@ def get(self):
|
39 | 40 | return self._get()
|
40 | 41 |
|
41 | 42 |
|
| 43 | +def _validate_and_get_login_redirect_override() -> Union[str, None]: |
| 44 | + try: |
| 45 | + login_redirect_override = get_setting('LOGIN_REDIRECT_OVERRIDE', '') |
| 46 | + # ignore validation if login_redirect_override is None or empty string |
| 47 | + if login_redirect_override is not None and login_redirect_override != '': |
| 48 | + validate_url(url=login_redirect_override, schemes=['https', 'http'], allow_plain_hostname=True) |
| 49 | + return login_redirect_override |
| 50 | + except ValidationError: |
| 51 | + # login_redirect_override can also be an absolute path |
| 52 | + try: |
| 53 | + validate_absolute_path(path=login_redirect_override) |
| 54 | + return login_redirect_override |
| 55 | + except ValidationError: |
| 56 | + logger.error('LOGIN_REDIRECT_OVERRIDE was set but was not a valid URL or absolute path, ignoring') |
| 57 | + return None |
| 58 | + |
| 59 | + |
42 | 60 | def generate_ui_auth_data():
|
43 | 61 | authenticators = Authenticator.objects.filter(enabled=True)
|
44 | 62 | response = {
|
@@ -68,14 +86,9 @@ def generate_ui_auth_data():
|
68 | 86 | else:
|
69 | 87 | logger.error(f"Don't know how to handle authenticator of type {authenticator.type}")
|
70 | 88 |
|
71 |
| - try: |
72 |
| - login_redirect_override = get_setting('LOGIN_REDIRECT_OVERRIDE', '') |
73 |
| - # ignore validation if login_redirect_override is None or empty string |
74 |
| - if login_redirect_override is not None and login_redirect_override != '': |
75 |
| - validate_url(url=login_redirect_override, allow_plain_hostname=True) |
76 |
| - response['login_redirect_override'] = login_redirect_override |
77 |
| - except ValidationError: |
78 |
| - logger.error('LOGIN_REDIRECT_OVERRIDE was set but was not a valid URL, ignoring') |
| 89 | + login_redirect_override = _validate_and_get_login_redirect_override() |
| 90 | + if login_redirect_override: |
| 91 | + response['login_redirect_override'] = login_redirect_override |
79 | 92 |
|
80 | 93 | custom_login_info = get_setting('custom_login_info', '')
|
81 | 94 | if isinstance(custom_login_info, str):
|
|
0 commit comments