Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions authentik/flows/tests/test_interface_sfe.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
"""flow views tests"""

from django.test import RequestFactory
from django.urls import reverse

from authentik.core.tests.utils import create_test_flow
from authentik.flows.tests import FlowTestCase
from authentik.flows.views.interface import FlowInterfaceView

Expand Down Expand Up @@ -91,3 +93,30 @@ def test_old_chrome(self):
def test_unknown_user_agent(self):
"""A user agent without a parseable version keeps the default flow executor"""
self.assertFalse(self.needs_sfe(""))


class TestFlowInterfaceTitle(FlowTestCase):
"""Test flow title placeholders on the interface page"""

def test_title_placeholder(self):
"""Placeholders are blanked as no plan context exists yet"""
flow = create_test_flow()
flow.title = "Welcome to %(app)s"
flow.save()
response = self.client.get(
reverse("authentik_core:if-flow", kwargs={"flow_slug": flow.slug})
)
self.assertEqual(response.status_code, 200)
self.assertContains(response, '<meta name="ak-flow-title" content="Welcome to">')
flow.refresh_from_db()
self.assertEqual(flow.title, "Welcome to %(app)s")

def test_title_literal_percent(self):
"""Titles with a bare percent sign are left as-is"""
flow = create_test_flow()
flow.title = "100% secure"
flow.save()
response = self.client.get(
reverse("authentik_core:if-flow", kwargs={"flow_slug": flow.slug})
)
self.assertContains(response, '<meta name="ak-flow-title" content="100% secure">')
12 changes: 11 additions & 1 deletion authentik/flows/views/interface.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
"""Interface views"""

from collections import defaultdict
from typing import Any

from django.shortcuts import get_object_or_404
Expand Down Expand Up @@ -34,7 +35,16 @@ class FlowInterfaceView(InterfaceView):

def get_context_data(self, **kwargs: Any) -> dict[str, Any]:
flow = get_object_or_404(Flow, slug=self.kwargs.get("flow_slug"))
kwargs["flow"] = flow
# Flow title formatted with a default dict, as we don't know the keys used
# Only format titles with named placeholders, as a bare "% s" would
# otherwise inline the dict's repr
flow_title = flow.title
if "%(" in flow_title:
try:
flow_title = (flow_title % defaultdict(str)).strip()
except TypeError, ValueError:
Comment thread
github-code-quality[bot] marked this conversation as resolved.
Fixed
Comment thread
github-code-quality[bot] marked this conversation as resolved.
Fixed
pass
kwargs["flow"] = flow_title
kwargs["flow_background_url"] = flow.background_url(self.request)
kwargs["inspector"] = "inspector" in self.request.GET
return super().get_context_data(**kwargs)
Expand Down
Loading