Skip to content

Commit fa62b98

Browse files
committed
Disposable emails not allowed
1 parent df40a68 commit fa62b98

File tree

4 files changed

+42
-1
lines changed

4 files changed

+42
-1
lines changed

app/settings.py

+3
Original file line numberDiff line numberDiff line change
@@ -428,3 +428,6 @@
428428
},
429429
'ICON': 'bi bi-github',
430430
}
431+
432+
# Disposable email token from https://api.testmail.top/
433+
DISPOSABLE_EMAIL_TOKEN = os.environ.get('DISPOSABLE_EMAIL_TOKEN', None)
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 4.0.8 on 2022-11-28 22:06
2+
3+
from django.db import migrations, models
4+
import user.validations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('user', '0006_delete_loginrequest'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='user',
16+
name='email',
17+
field=models.EmailField(max_length=254, unique=True, validators=[user.validations.disposable_email], verbose_name='email address'),
18+
),
19+
]

user/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
1212
from django.utils.translation import gettext_lazy as _
1313

14+
from user.validations import disposable_email
15+
1416

1517
# UserManager from default Auth Django models. This is just to get rid of username field
1618
class UserManager(BaseUserManager):
@@ -128,7 +130,7 @@ class User(AbstractBaseUser, PermissionsMixin):
128130

129131
first_name = models.CharField(_("first name"), max_length=150)
130132
last_name = models.CharField(_("last names"), max_length=150)
131-
email = models.EmailField(_("email address"), unique=True)
133+
email = models.EmailField(_("email address"), unique=True, validators=[disposable_email])
132134
email_verified = models.BooleanField(_('email verified'), default=False)
133135
email_subscribe = models.BooleanField(_('email subscribed'), default=False)
134136
is_staff = models.BooleanField(

user/validations.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import requests
2+
from django.conf import settings
3+
from django.core.exceptions import ValidationError
4+
5+
6+
def disposable_email(email):
7+
token = getattr(settings, 'DISPOSABLE_EMAIL_TOKEN', None)
8+
if token is not None:
9+
url = "https://api.testmail.top/domain/check"
10+
email_domain = email.split('@')[1]
11+
headers = {
12+
'Authorization': 'Bearer %s' % token
13+
}
14+
response = requests.request("GET", url, headers=headers, params={"data": email_domain})
15+
result = response.json()
16+
if not result["result"]:
17+
raise ValidationError('Disposable emails are not permitted.')

0 commit comments

Comments
 (0)