auth: Redirect the new subdomain for deactivate realms.

For realms whose subdomain has changed, we redirect the user to
the new realm with the same URL structure with just the subdomain
changed.
This commit is contained in:
Aman Agrawal
2025-03-19 17:34:29 +05:30
committed by Tim Abbott
parent dcabac6cad
commit 4dd11e7318
2 changed files with 11 additions and 18 deletions

View File

@@ -185,20 +185,14 @@ class DeactivationNoticeTestCase(ZulipTestCase):
realm.save(update_fields=["deactivated", "deactivated_redirect"]) realm.save(update_fields=["deactivated", "deactivated_redirect"])
result = self.client_get("/login/", follow=True) result = self.client_get("/login/", follow=True)
self.assertIn( self.assertIn(result.request.get("SERVER_NAME"), ["example.zulipchat.com"])
'This organization has moved to <a href="http://example.zulipchat.com">http://example.zulipchat.com</a>.',
result.content.decode(),
)
def test_deactivation_notice_when_realm_subdomain_is_changed(self) -> None: def test_deactivation_notice_when_realm_subdomain_is_changed(self) -> None:
realm = get_realm("zulip") realm = get_realm("zulip")
do_change_realm_subdomain(realm, "new-subdomain-name", acting_user=None) do_change_realm_subdomain(realm, "new-subdomain-name", acting_user=None)
result = self.client_get("/login/", follow=True) result = self.client_get("/login/", follow=True)
self.assertIn( self.assertIn(result.request.get("SERVER_NAME"), ["new-subdomain-name.testserver"])
'This organization has moved to <a href="http://new-subdomain-name.testserver">http://new-subdomain-name.testserver</a>.',
result.content.decode(),
)
def test_no_deactivation_notice_with_no_redirect(self) -> None: def test_no_deactivation_notice_with_no_redirect(self) -> None:
realm = get_realm("zulip") realm = get_realm("zulip")
@@ -220,18 +214,12 @@ class DeactivationNoticeTestCase(ZulipTestCase):
do_change_realm_subdomain(realm, "new-name-1", acting_user=None) do_change_realm_subdomain(realm, "new-name-1", acting_user=None)
result = self.client_get("/login/", follow=True) result = self.client_get("/login/", follow=True)
self.assertIn( self.assertIn(result.request.get("SERVER_NAME"), ["new-name-1.testserver"])
'This organization has moved to <a href="http://new-name-1.testserver">http://new-name-1.testserver</a>.',
result.content.decode(),
)
realm = get_realm("new-name-1") realm = get_realm("new-name-1")
do_change_realm_subdomain(realm, "new-name-2", acting_user=None) do_change_realm_subdomain(realm, "new-name-2", acting_user=None)
result = self.client_get("/login/", follow=True) result = self.client_get("/login/", follow=True)
self.assertIn( self.assertIn(result.request.get("SERVER_NAME"), ["new-name-2.testserver"])
'This organization has moved to <a href="http://new-name-2.testserver">http://new-name-2.testserver</a>.',
result.content.decode(),
)
class AddNewUserHistoryTest(ZulipTestCase): class AddNewUserHistoryTest(ZulipTestCase):

View File

@@ -803,12 +803,15 @@ def redirect_to_misconfigured_ldap_notice(request: HttpRequest, error_type: int)
raise AssertionError("Invalid error type") raise AssertionError("Invalid error type")
def show_deactivation_notice(request: HttpRequest) -> HttpResponse: def show_deactivation_notice(request: HttpRequest, next: str = "/") -> HttpResponse:
realm = get_realm_from_request(request) realm = get_realm_from_request(request)
if realm and realm.deactivated: if realm and realm.deactivated:
context = {"deactivated_domain_name": realm.name} context = {"deactivated_domain_name": realm.name}
if realm.deactivated_redirect is not None: if realm.deactivated_redirect is not None:
context["deactivated_redirect"] = realm.deactivated_redirect # URL hash is automatically preserved by the browser.
# See https://stackoverflow.com/a/5283739
redirect_to = get_safe_redirect_to(next, realm.deactivated_redirect)
return HttpResponseRedirect(redirect_to)
return render(request, "zerver/deactivated.html", context=context) return render(request, "zerver/deactivated.html", context=context)
return HttpResponseRedirect(reverse("login_page")) return HttpResponseRedirect(reverse("login_page"))
@@ -919,6 +922,8 @@ def login_page(
realm = get_realm_from_request(request) realm = get_realm_from_request(request)
if realm and realm.deactivated: if realm and realm.deactivated:
if realm.deactivated_redirect:
return show_deactivation_notice(request, next)
return redirect_to_deactivation_notice() return redirect_to_deactivation_notice()
extra_context = kwargs.pop("extra_context", {}) extra_context = kwargs.pop("extra_context", {})