authentik.lib.utils.urls

URL-related utils

 1"""URL-related utils"""
 2
 3from urllib.parse import urlparse
 4
 5from django.http import HttpResponse, QueryDict
 6from django.shortcuts import redirect
 7from django.urls import NoReverseMatch, reverse
 8from structlog.stdlib import get_logger
 9
10LOGGER = get_logger()
11
12
13def is_url_absolute(url):
14    """Check if domain is absolute to prevent user from being redirect somewhere else"""
15    return bool(urlparse(url).netloc)
16
17
18def redirect_with_qs(view: str, get_query_set: QueryDict | None = None, **kwargs) -> HttpResponse:
19    """Wrapper to redirect whilst keeping GET Parameters"""
20    try:
21        target = reverse(view, kwargs=kwargs)
22    except NoReverseMatch:
23        if not is_url_absolute(view):
24            return redirect(view)
25        LOGGER.warning("redirect target is not a valid view", view=view)
26        raise
27    if get_query_set:
28        target += "?" + get_query_set.urlencode()
29    return redirect(target)
30
31
32def reverse_with_qs(view: str, query: QueryDict | None = None, **kwargs) -> str:
33    """Reverse a view to it's url but include get params"""
34    url = reverse(view, **kwargs)
35    if query:
36        url += "?" + query.urlencode()
37    return url
LOGGER = <BoundLoggerLazyProxy(logger=None, wrapper_class=None, processors=None, context_class=None, initial_values={}, logger_factory_args=())>
def is_url_absolute(url):
14def is_url_absolute(url):
15    """Check if domain is absolute to prevent user from being redirect somewhere else"""
16    return bool(urlparse(url).netloc)

Check if domain is absolute to prevent user from being redirect somewhere else

def redirect_with_qs( view: str, get_query_set: django.http.request.QueryDict | None = None, **kwargs) -> django.http.response.HttpResponse:
19def redirect_with_qs(view: str, get_query_set: QueryDict | None = None, **kwargs) -> HttpResponse:
20    """Wrapper to redirect whilst keeping GET Parameters"""
21    try:
22        target = reverse(view, kwargs=kwargs)
23    except NoReverseMatch:
24        if not is_url_absolute(view):
25            return redirect(view)
26        LOGGER.warning("redirect target is not a valid view", view=view)
27        raise
28    if get_query_set:
29        target += "?" + get_query_set.urlencode()
30    return redirect(target)

Wrapper to redirect whilst keeping GET Parameters

def reverse_with_qs( view: str, query: django.http.request.QueryDict | None = None, **kwargs) -> str:
33def reverse_with_qs(view: str, query: QueryDict | None = None, **kwargs) -> str:
34    """Reverse a view to it's url but include get params"""
35    url = reverse(view, **kwargs)
36    if query:
37        url += "?" + query.urlencode()
38    return url

Reverse a view to it's url but include get params