|
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