authentik.admin.files.backends.passthrough

 1from collections.abc import Generator
 2
 3from django.http.request import HttpRequest
 4
 5from authentik.admin.files.backends.base import Backend
 6from authentik.admin.files.usage import FileUsage
 7
 8EXTERNAL_URL_SCHEMES = ["http:", "https://"]
 9FONT_AWESOME_SCHEME = "fa://"
10
11
12class PassthroughBackend(Backend):
13    """Passthrough backend for external URLs and special schemes.
14
15    Handles external resources that aren't stored in authentik:
16    - Font Awesome icons (fa://...)
17    - HTTP/HTTPS URLs (http://..., https://...)
18
19    Files that are "managed" by this backend are just passed through as-is.
20    No upload, delete, or listing operations are supported.
21    Only accessible through resolve_file_url when an external URL is detected.
22    """
23
24    allowed_usages = [FileUsage.MEDIA]
25
26    def supports_file(self, name: str) -> bool:
27        """Check if file path is an external URL or Font Awesome icon."""
28        if name.startswith(FONT_AWESOME_SCHEME):
29            return True
30
31        for scheme in EXTERNAL_URL_SCHEMES:
32            if name.startswith(scheme):
33                return True
34
35        return False
36
37    def list_files(self) -> Generator[str]:
38        """External files cannot be listed."""
39        yield from []
40
41    def file_url(
42        self,
43        name: str,
44        request: HttpRequest | None = None,
45        use_cache: bool = True,
46    ) -> str:
47        """Return the URL as-is for passthrough files."""
48        return name
49
50    def themed_urls(
51        self,
52        name: str,
53        request: HttpRequest | None = None,
54    ) -> dict[str, str] | None:
55        """Support themed URLs for external URLs with %(theme)s placeholder.
56
57        If the external URL contains %(theme)s, substitute it for each theme.
58        We can't verify that themed variants exist at the external location,
59        but we trust the user to provide valid URLs.
60        """
61        from authentik.admin.files.backends.base import (
62            get_valid_themes,
63            has_theme_variable,
64            substitute_theme,
65        )
66
67        if not has_theme_variable(name):
68            return None
69
70        return {theme: substitute_theme(name, theme) for theme in get_valid_themes()}
EXTERNAL_URL_SCHEMES = ['http:', 'https://']
FONT_AWESOME_SCHEME = 'fa://'
class PassthroughBackend(authentik.admin.files.backends.base.Backend):
13class PassthroughBackend(Backend):
14    """Passthrough backend for external URLs and special schemes.
15
16    Handles external resources that aren't stored in authentik:
17    - Font Awesome icons (fa://...)
18    - HTTP/HTTPS URLs (http://..., https://...)
19
20    Files that are "managed" by this backend are just passed through as-is.
21    No upload, delete, or listing operations are supported.
22    Only accessible through resolve_file_url when an external URL is detected.
23    """
24
25    allowed_usages = [FileUsage.MEDIA]
26
27    def supports_file(self, name: str) -> bool:
28        """Check if file path is an external URL or Font Awesome icon."""
29        if name.startswith(FONT_AWESOME_SCHEME):
30            return True
31
32        for scheme in EXTERNAL_URL_SCHEMES:
33            if name.startswith(scheme):
34                return True
35
36        return False
37
38    def list_files(self) -> Generator[str]:
39        """External files cannot be listed."""
40        yield from []
41
42    def file_url(
43        self,
44        name: str,
45        request: HttpRequest | None = None,
46        use_cache: bool = True,
47    ) -> str:
48        """Return the URL as-is for passthrough files."""
49        return name
50
51    def themed_urls(
52        self,
53        name: str,
54        request: HttpRequest | None = None,
55    ) -> dict[str, str] | None:
56        """Support themed URLs for external URLs with %(theme)s placeholder.
57
58        If the external URL contains %(theme)s, substitute it for each theme.
59        We can't verify that themed variants exist at the external location,
60        but we trust the user to provide valid URLs.
61        """
62        from authentik.admin.files.backends.base import (
63            get_valid_themes,
64            has_theme_variable,
65            substitute_theme,
66        )
67
68        if not has_theme_variable(name):
69            return None
70
71        return {theme: substitute_theme(name, theme) for theme in get_valid_themes()}

Passthrough backend for external URLs and special schemes.

Handles external resources that aren't stored in authentik:

  • Font Awesome icons (fa://...)
  • HTTP/HTTPS URLs (http://..., https://...)

Files that are "managed" by this backend are just passed through as-is. No upload, delete, or listing operations are supported. Only accessible through resolve_file_url when an external URL is detected.

allowed_usages = [<FileUsage.MEDIA: 'media'>]
def supports_file(self, name: str) -> bool:
27    def supports_file(self, name: str) -> bool:
28        """Check if file path is an external URL or Font Awesome icon."""
29        if name.startswith(FONT_AWESOME_SCHEME):
30            return True
31
32        for scheme in EXTERNAL_URL_SCHEMES:
33            if name.startswith(scheme):
34                return True
35
36        return False

Check if file path is an external URL or Font Awesome icon.

def list_files(self) -> Generator[str]:
38    def list_files(self) -> Generator[str]:
39        """External files cannot be listed."""
40        yield from []

External files cannot be listed.

def file_url( self, name: str, request: django.http.request.HttpRequest | None = None, use_cache: bool = True) -> str:
42    def file_url(
43        self,
44        name: str,
45        request: HttpRequest | None = None,
46        use_cache: bool = True,
47    ) -> str:
48        """Return the URL as-is for passthrough files."""
49        return name

Return the URL as-is for passthrough files.

def themed_urls( self, name: str, request: django.http.request.HttpRequest | None = None) -> dict[str, str] | None:
51    def themed_urls(
52        self,
53        name: str,
54        request: HttpRequest | None = None,
55    ) -> dict[str, str] | None:
56        """Support themed URLs for external URLs with %(theme)s placeholder.
57
58        If the external URL contains %(theme)s, substitute it for each theme.
59        We can't verify that themed variants exist at the external location,
60        but we trust the user to provide valid URLs.
61        """
62        from authentik.admin.files.backends.base import (
63            get_valid_themes,
64            has_theme_variable,
65            substitute_theme,
66        )
67
68        if not has_theme_variable(name):
69            return None
70
71        return {theme: substitute_theme(name, theme) for theme in get_valid_themes()}

Support themed URLs for external URLs with %(theme)s placeholder.

If the external URL contains %(theme)s, substitute it for each theme. We can't verify that themed variants exist at the external location, but we trust the user to provide valid URLs.