Skip to content

Commit 8635e5e

Browse files
committed
use email_validator and isascii
1 parent 168b5f0 commit 8635e5e

File tree

2 files changed

+16
-7
lines changed

2 files changed

+16
-7
lines changed

server/mergin/auth/forms.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
from .models import MAX_USERNAME_LENGTH, User
1919
from ..app import UpdateForm, CustomStringField
20+
from .utils import get_email_domain
2021

2122

2223
def username_validation(form, field):
@@ -64,13 +65,8 @@ def __call__(self, form, field):
6465
f"Email address '{field.data}' contains an invalid character."
6566
)
6667

67-
try:
68-
local_part, domain_part = field.data.rsplit("@", 1)
69-
except ValueError:
70-
raise ValidationError(f"Invalid email address '{field.data}'.")
71-
72-
# character is one of the standard ASCII characters (0–127)
73-
if not all(ord(c) < 128 for c in domain_part):
68+
domain = get_email_domain(field.data)
69+
if not domain.isascii():
7470
raise ValidationError(
7571
f"Email address '{field.data}' contains non-ASCII characters in the domain part."
7672
)

server/mergin/auth/utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Copyright (C) Lutra Consulting Limited
2+
#
3+
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial
4+
5+
from email_validator import validate_email, EmailNotValidError
6+
7+
8+
def get_email_domain(email: str) -> str | None:
9+
try:
10+
result = validate_email(email, check_deliverability=False)
11+
return result.domain
12+
except EmailNotValidError:
13+
return

0 commit comments

Comments
 (0)