forms: Set EmailField max_length to match Django Model.EmailField.

Django's Model.EmailField's default max_length is 254 characters,
while the Form.EmailField's default max length is 320 characters.
The longer valid length for form email fields raises an error
when an email with over 254 characters is validated and the server
attempts to create a preregistration user or realm.

Sets the max length on current form EmailFields to match the max
length on corresponding email fields in the database.

For the form MultiEmailField used on the find account/team page,
we don't need to set the max length to 254, but we don't expect
any emails longer than that to match any existing user accounts.
Adds tests in `zerver/tests/test_signup.py` for form submissions
with long email addresses.
This commit is contained in:
Lauryn Menard
2025-10-09 17:03:25 +02:00
committed by Alex Vandiver
parent fdcfafd13d
commit b42d3e77e7
2 changed files with 42 additions and 3 deletions

View File

@@ -1108,6 +1108,11 @@ class LoginTest(ZulipTestCase):
self.assertEqual(result.status_code, 200)
self.assertContains(result, "Enter a valid email address")
invalid_email = "a" * 260 + "@example.com"
result = self.client_post("/accounts/home/", {"email": invalid_email}, subdomain="zulip")
self.assertEqual(result.status_code, 200)
self.assertContains(result, "Ensure this value has at most 254 characters (it has 272).")
def test_register_deactivated_partway_through(self) -> None:
"""
If you try to register for a deactivated realm, you get a clear error
@@ -4743,6 +4748,33 @@ class TestFindMyTeam(ZulipTestCase):
result = self.client_get("/accounts/find/", {"emails": "invalid"})
self.assertEqual(result.status_code, 200)
def test_find_team_long_email_address(self) -> None:
# Emails over 320 characters are considered invalid.
data = {"emails": "a" * 320 + "@example.com"}
result = self.client_post("/accounts/find/", data)
self.assertEqual(result.status_code, 200)
self.assertIn(b"Enter a valid email", result.content)
from django.core.mail import outbox
self.assert_length(outbox, 0)
# Emails in the database are never over 254 characters,
# but searching for them does not cause an error.
# When https://code.djangoproject.com/ticket/35119 is
# resolved, Django's email validator will return this
# case as invalid, so this test will need to be updated.
data = {"emails": "a" * 260 + "@example.com"}
result = self.client_post("/accounts/find/", data)
self.assertEqual(result.status_code, 200)
content = result.content.decode()
self.assertIn("Emails sent! The addresses entered on", content)
self.assertIn("a@example.com", content)
from django.core.mail import outbox
self.assert_length(outbox, 1)
message = outbox[0]
self.assertIn("Unfortunately, no Zulip Cloud accounts", message.body)
def test_find_team_zero_emails(self) -> None:
data = {"emails": ""}
result = self.client_post("/accounts/find/", data)