|
1 | 1 | from hashlib import md5
|
2 | 2 | from typing import Literal
|
3 | 3 | from unittest.mock import patch
|
| 4 | +from urllib.parse import urlencode |
4 | 5 |
|
| 6 | +from django.conf import settings |
5 | 7 | from django.contrib.auth import get_user_model
|
6 | 8 | from django.core.exceptions import ValidationError
|
7 | 9 | from django.test import TestCase, modify_settings, override_settings
|
@@ -643,20 +645,64 @@ def test_logout(self, mock_get_solo):
|
643 | 645 | self. assertFalse( User. objects. filter( email="[email protected]"). exists())
|
644 | 646 |
|
645 | 647 | # enter the logout flow
|
646 |
| - with requests_mock.Mocker() as m: |
647 |
| - m.post("http://localhost:8080/logout") |
648 |
| - logout_response = self.client.get(logout_url) |
| 648 | + logout_response = self.client.get(logout_url) |
649 | 649 |
|
650 |
| - self.assertEqual(len(m.request_history), 1) |
651 |
| - self.assertEqual(m.request_history[0].url, "http://localhost:8080/logout") |
652 |
| - self.assertEqual(m.request_history[0].body, "id_token_hint=foo") |
| 650 | + self.assertRedirects( |
| 651 | + logout_response, |
| 652 | + "http://localhost:8080/logout" |
| 653 | + + "?" |
| 654 | + + urlencode( |
| 655 | + dict( |
| 656 | + id_token_hint="foo", |
| 657 | + post_logout_redirect_uri=f"http://testserver{settings.LOGOUT_REDIRECT_URL}", |
| 658 | + ) |
| 659 | + ), |
| 660 | + fetch_redirect_response=False, |
| 661 | + ) |
| 662 | + |
| 663 | + self.assertNotIn("oidc_states", self.client.session) |
| 664 | + self.assertNotIn("oidc_id_token", self.client.session) |
| 665 | + self.assertFalse(logout_response.wsgi_request.user.is_authenticated) |
| 666 | + |
| 667 | + @patch( |
| 668 | + "open_inwoner.accounts.models.OpenIDDigiDConfig.get_solo", |
| 669 | + return_value=OpenIDDigiDConfig( |
| 670 | + id=1, |
| 671 | + enabled=True, |
| 672 | + oidc_op_logout_endpoint=None, |
| 673 | + ), |
| 674 | + ) |
| 675 | + def test_logout_without_sso_logout_configured(self, mock_get_solo): |
| 676 | + # set up a user with a non existing email address |
| 677 | + user = DigidUserFactory.create( |
| 678 | + bsn="123456782", email="[email protected]" |
| 679 | + ) |
| 680 | + self.client.force_login(user) |
| 681 | + session = self.client.session |
| 682 | + session["oidc_states"] = { |
| 683 | + "mock": { |
| 684 | + "nonce": "nonce", |
| 685 | + "config_class": "accounts.OpenIDDigiDConfig", |
| 686 | + } |
| 687 | + } |
| 688 | + session["oidc_id_token"] = "foo" |
| 689 | + session.save() |
| 690 | + logout_url = reverse("digid_oidc:logout") |
| 691 | + |
| 692 | + self. assertFalse( User. objects. filter( email="[email protected]"). exists()) |
| 693 | + |
| 694 | + # enter the logout flow |
| 695 | + logout_response = self.client.get(logout_url) |
653 | 696 |
|
654 | 697 | self.assertRedirects(
|
655 |
| - logout_response, reverse("login"), fetch_redirect_response=False |
| 698 | + logout_response, |
| 699 | + settings.LOGOUT_REDIRECT_URL, |
| 700 | + fetch_redirect_response=False, |
656 | 701 | )
|
657 | 702 |
|
658 | 703 | self.assertNotIn("oidc_states", self.client.session)
|
659 | 704 | self.assertNotIn("oidc_id_token", self.client.session)
|
| 705 | + self.assertFalse(logout_response.wsgi_request.user.is_authenticated) |
660 | 706 |
|
661 | 707 | def test_error_page_direct_access(self):
|
662 | 708 | error_url = reverse("oidc-error")
|
@@ -1176,20 +1222,66 @@ def test_logout(self, mock_get_solo):
|
1176 | 1222 | self. assertFalse( User. objects. filter( email="[email protected]"). exists())
|
1177 | 1223 |
|
1178 | 1224 | # enter the logout flow
|
1179 |
| - with requests_mock.Mocker() as m: |
1180 |
| - m.post("http://localhost:8080/logout") |
1181 |
| - logout_response = self.client.get(logout_url) |
| 1225 | + logout_response = self.client.get(logout_url) |
| 1226 | + |
| 1227 | + self.assertRedirects( |
| 1228 | + logout_response, |
| 1229 | + "http://localhost:8080/logout" |
| 1230 | + + "?" |
| 1231 | + + urlencode( |
| 1232 | + dict( |
| 1233 | + id_token_hint="foo", |
| 1234 | + post_logout_redirect_uri=f"http://testserver{settings.LOGOUT_REDIRECT_URL}", |
| 1235 | + ) |
| 1236 | + ), |
| 1237 | + fetch_redirect_response=False, |
| 1238 | + ) |
1182 | 1239 |
|
1183 |
| - self.assertEqual(len(m.request_history), 1) |
1184 |
| - self.assertEqual(m.request_history[0].url, "http://localhost:8080/logout") |
1185 |
| - self.assertEqual(m.request_history[0].body, "id_token_hint=foo") |
| 1240 | + self.assertNotIn("oidc_states", self.client.session) |
| 1241 | + self.assertNotIn("oidc_id_token", self.client.session) |
| 1242 | + self.assertFalse(logout_response.wsgi_request.user.is_authenticated) |
| 1243 | + |
| 1244 | + @patch( |
| 1245 | + "open_inwoner.accounts.models.OpenIDEHerkenningConfig.get_solo", |
| 1246 | + return_value=OpenIDEHerkenningConfig( |
| 1247 | + id=1, |
| 1248 | + enabled=True, |
| 1249 | + legal_subject_claim=["kvk"], |
| 1250 | + oidc_op_logout_endpoint=None, |
| 1251 | + ), |
| 1252 | + ) |
| 1253 | + def test_logout_without_sso_logout_configured(self, mock_get_solo): |
| 1254 | + # set up a user with a non existing email address |
| 1255 | + user = eHerkenningUserFactory.create( |
| 1256 | + kvk="12345678", email="[email protected]" |
| 1257 | + ) |
| 1258 | + self.client.force_login(user) |
| 1259 | + session = self.client.session |
| 1260 | + session["oidc_states"] = { |
| 1261 | + "mock": { |
| 1262 | + "nonce": "nonce", |
| 1263 | + "config_class": "accounts.OpenIDEHerkenningConfig", |
| 1264 | + } |
| 1265 | + } |
| 1266 | + session["oidc_id_token"] = "foo" |
| 1267 | + session[KVK_BRANCH_SESSION_VARIABLE] = None |
| 1268 | + session.save() |
| 1269 | + logout_url = reverse("eherkenning_oidc:logout") |
| 1270 | + |
| 1271 | + self. assertFalse( User. objects. filter( email="[email protected]"). exists()) |
| 1272 | + |
| 1273 | + # enter the logout flow |
| 1274 | + logout_response = self.client.get(logout_url) |
1186 | 1275 |
|
1187 | 1276 | self.assertRedirects(
|
1188 |
| - logout_response, reverse("login"), fetch_redirect_response=False |
| 1277 | + logout_response, |
| 1278 | + settings.LOGOUT_REDIRECT_URL, |
| 1279 | + fetch_redirect_response=False, |
1189 | 1280 | )
|
1190 | 1281 |
|
1191 | 1282 | self.assertNotIn("oidc_states", self.client.session)
|
1192 | 1283 | self.assertNotIn("oidc_id_token", self.client.session)
|
| 1284 | + self.assertFalse(logout_response.wsgi_request.user.is_authenticated) |
1193 | 1285 |
|
1194 | 1286 | @modify_settings(
|
1195 | 1287 | MIDDLEWARE={
|
|
0 commit comments