"""An existing NetKingdom sign-in is shown before the account site continues it.""" import unittest from urllib.parse import parse_qs, urlparse import test_portal_navigation from test_web import invoke class RecordingLookup: def __init__(self, result): self.result = result self.headers = [] def username(self, header): self.headers.append(header) if isinstance(self.result, BaseException): raise self.result if callable(self.result): return self.result(header) return self.result class AccountIdentityDisclosureTests(unittest.TestCase): setUp = test_portal_navigation.PortalNavigationTests.setUp def test_confirmed_sign_in_is_named_before_the_account_site_continues(self): def answer(header): if "authelia_session=super-secret-session" in header: return "platform-root" return None self.app.identity_lookup = RecordingLookup(answer) cookie = "ue_session=absent; authelia_session=super-secret-session" response, body = invoke(self.app, "/", cookie=cookie) self.assertEqual("200 OK", response["status"]) self.assertEqual(1, len(self.app.identity_lookup.headers)) self.assertIn(b"NetKingdom sign-in is platform-root", body) self.assertIn(b"This account site has no session yet.", body) self.assertIn(b'href="/login">Continue as platform-root', body) self.assertIn(b'href="/login?fresh=1">Use a different identity', body) self.assertNotIn(b"Not signed in", body) self.assertNotIn(b"You are not signed in.", body) self.assertNotIn(b"Signed in as", body) self.assertNotIn(b"super-secret-session", body) self.assertNotIn(b"Active now", body) _response, body = invoke(self.app, "/") self.assertIn(b'href="/login">Sign in', body) self.assertIn(b"Not signed in", body) self.assertNotIn(b"platform-root", body) self.assertEqual(2, len(self.app.identity_lookup.headers)) def test_account_session_is_not_replaced_by_the_netkingdom_cookie(self): self.app.identity_lookup = RecordingLookup("platform-root") _, body = invoke( self.app, "/", cookie="ue_session=member; authelia_session=super-secret-session" ) # The account-site session stays; the other Authelia uid is only shown. self.assertIn(b"Signed in as sample.user", body) self.assertNotIn(b"Signed in as platform-root", body) self.assertNotIn(b'href="/login"', body) self.assertNotIn(b"super-secret-session", body) self.assertEqual(1, len(self.app.identity_lookup.headers)) # NK-WP-0051-T03: two labelled uid lines and a visible mismatch marker. def _uid_lines(self, path, lookup_result, cookie="ue_session=member; authelia_session=super-secret-session"): self.app.identity_lookup = RecordingLookup(lookup_result) response, body = invoke(self.app, path, cookie=cookie) self.assertEqual("200 OK", response["status"]) return body def test_signed_in_page_names_both_session_uids(self): for path in ["/", "/onboarding"]: with self.subTest(path=path): body = self._uid_lines(path, "sample.user") self.assertIn(b'
sample.user · ', body) self.assertIn(b'
sample.user
', body) self.assertIn(b"Account site session uid", body) self.assertIn(b"Authelia session uid", body) self.assertNotIn(b"session-uid-mismatch", body) self.assertEqual(1, len(self.app.identity_lookup.headers)) def test_differing_authelia_uid_is_marked(self): for path in ["/", "/onboarding"]: with self.subTest(path=path): body = self._uid_lines(path, "bernd.worsch-3") self.assertIn(b'
sample.user · ', body) self.assertIn(b'
bernd.worsch-3
', body) self.assertIn(b'role="alert" class="session-uid-mismatch"', body) self.assertIn(b"These sessions differ.", body) self.assertIn(b"https://kc.example/account/logout", body) self.assertNotIn(b"super-secret-session", body) def test_unknown_authelia_uid_is_not_guessed(self): cases = [ (None, "ue_session=member; authelia_session=opaque"), (TimeoutError("slow"), "ue_session=member; authelia_session=opaque"), ("", "ue_session=member; authelia_session=opaque"), ("sample.user", "ue_session=member"), ] for result, cookie in cases: with self.subTest(result=result, cookie=cookie): body = self._uid_lines("/", result if cookie.count("authelia") else None, cookie) self.assertIn(b'
not signed in / unknown
', body) self.assertNotIn(b"session-uid-mismatch", body) self.assertNotIn(b"", "platform root"]: with self.subTest(result=result): self.app.identity_lookup = RecordingLookup(result) _, body = invoke(self.app, "/", cookie="authelia_session=opaque") self.assertIn(b'href="/login">Sign in', body) self.assertIn(b"You are not signed in.", body) self.assertNotIn(b"Signed in as", body) self.assertNotIn(b"