From ca1ed91e480df8aa6810c486c649d7eba82cd4f1 Mon Sep 17 00:00:00 2001 From: missytake Date: Sat, 5 Apr 2025 23:51:15 +0200 Subject: [PATCH] support UTF-8 email addresses --- setup.cfg | 1 + src/keyserver_bot/hooks.py | 8 ++++---- tests/test_hooks.py | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/setup.cfg b/setup.cfg index 0d2c2c1..ddc65cb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -20,6 +20,7 @@ install_requires = deltachat-rpc-server wkdhash requests + email-validator [options.packages.find] where = src diff --git a/src/keyserver_bot/hooks.py b/src/keyserver_bot/hooks.py index 4af5974..a7234c8 100644 --- a/src/keyserver_bot/hooks.py +++ b/src/keyserver_bot/hooks.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 -import re - from deltachat_rpc_client import events, run_bot_cli, EventType, Message +from email_validator import validate_email, EmailNotValidError from keyserver_bot.wkd import request_from_wkd from keyserver_bot.koo import request_from_koo @@ -20,8 +19,9 @@ def command(event): snapshot = event.message_snapshot email = snapshot.text - regex = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$' - if not re.match(regex, email): + try: + validate_email(email, check_deliverability=False) + except EmailNotValidError: snapshot.chat.send_text(HELP_MSG) return diff --git a/tests/test_hooks.py b/tests/test_hooks.py index 7b129b9..a392098 100644 --- a/tests/test_hooks.py +++ b/tests/test_hooks.py @@ -1,4 +1,5 @@ import os +from email_validator import validate_email, EmailNotValidError import pytest from keyserver_bot.hooks import request_key_by_email, delete_data @@ -34,3 +35,22 @@ def test_delete_data(acfactory): delete_data(msg.get_snapshot()) assert bot.get_contacts() == [] assert len(bot.get_chatlist()) == 2 + + +@pytest.mark.parametrize( + ("email", "valid"), + [ + ("test", False), + ("test@example", False), + ("@example", False), + ("@example.org", False), + ("test+asdf@example.org", True), + ("test@example.org", True), + ("ätsch@ツ.life", True), + ] +) +def test_validate_email(email, valid): + try: + validate_email(email, check_deliverability=False) + except EmailNotValidError: + assert not valid