Refuse disposable emails in can_be_used_as_personal_email()

This commit is contained in:
Son NK 2020-04-16 09:43:14 +02:00
parent 6fa46042dc
commit cf016caa91
2 changed files with 20 additions and 2 deletions

View file

@ -4,7 +4,7 @@ from email.message import Message
from email.mime.base import MIMEBase from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.utils import make_msgid, formatdate, parseaddr, formataddr from email.utils import make_msgid, formatdate, parseaddr
from smtplib import SMTP from smtplib import SMTP
from typing import Optional from typing import Optional
@ -23,6 +23,7 @@ from app.config import (
SUPPORT_NAME, SUPPORT_NAME,
POSTFIX_SUBMISSION_TLS, POSTFIX_SUBMISSION_TLS,
MAX_NB_EMAIL_FREE_PLAN, MAX_NB_EMAIL_FREE_PLAN,
DISPOSABLE_EMAIL_DOMAINS,
) )
from app.log import LOG from app.log import LOG
from app.models import Mailbox, User from app.models import Mailbox, User
@ -246,7 +247,7 @@ def get_email_domain_part(address):
Get the domain part from email Get the domain part from email
ab@cd.com -> cd.com ab@cd.com -> cd.com
""" """
return address[address.find("@") + 1 :] return address[address.find("@") + 1 :].strip().lower()
def add_dkim_signature(msg: Message, email_domain: str): def add_dkim_signature(msg: Message, email_domain: str):
@ -320,6 +321,13 @@ def can_be_used_as_personal_email(email: str) -> bool:
if CustomDomain.get_by(domain=domain, verified=True): if CustomDomain.get_by(domain=domain, verified=True):
return False return False
for d in DISPOSABLE_EMAIL_DOMAINS:
if domain == d:
return False
# subdomain
if domain.endswith("." + d):
return False
return True return True

View file

@ -40,6 +40,16 @@ def test_can_be_used_as_personal_email(flask_client):
db.session.commit() db.session.commit()
assert not can_be_used_as_personal_email("hey@ab.cd") assert not can_be_used_as_personal_email("hey@ab.cd")
# disposable domain
assert not can_be_used_as_personal_email("abcd@10minutesmail.fr")
assert not can_be_used_as_personal_email("abcd@temp-mail.com")
# subdomain will not work
assert not can_be_used_as_personal_email("abcd@sub.temp-mail.com")
# valid domains should not be affected
assert can_be_used_as_personal_email("abcd@protonmail.com")
assert can_be_used_as_personal_email("abcd@gmail.com")
assert can_be_used_as_personal_email("abcd@example.com")
def test_delete_header(): def test_delete_header():
msg = EmailMessage() msg = EmailMessage()