Merge pull request #192 from simple-login/fix-user-email
Fix user cannot change personal email back and better naming.
This commit is contained in:
commit
069997ddb9
|
@ -12,8 +12,8 @@ from app.api.base import api_bp
|
||||||
from app.config import FLASK_SECRET, DISABLE_REGISTRATION
|
from app.config import FLASK_SECRET, DISABLE_REGISTRATION
|
||||||
from app.dashboard.views.setting import send_reset_password_email
|
from app.dashboard.views.setting import send_reset_password_email
|
||||||
from app.email_utils import (
|
from app.email_utils import (
|
||||||
can_be_used_as_personal_email,
|
email_domain_can_be_used_as_mailbox,
|
||||||
email_already_used,
|
personal_email_already_used,
|
||||||
send_email,
|
send_email,
|
||||||
render,
|
render,
|
||||||
)
|
)
|
||||||
|
@ -84,7 +84,9 @@ def auth_register():
|
||||||
|
|
||||||
if DISABLE_REGISTRATION:
|
if DISABLE_REGISTRATION:
|
||||||
return jsonify(error="registration is closed"), 400
|
return jsonify(error="registration is closed"), 400
|
||||||
if not can_be_used_as_personal_email(email) or email_already_used(email):
|
if not email_domain_can_be_used_as_mailbox(email) or personal_email_already_used(
|
||||||
|
email
|
||||||
|
):
|
||||||
return jsonify(error=f"cannot use {email} as personal inbox"), 400
|
return jsonify(error=f"cannot use {email} as personal inbox"), 400
|
||||||
|
|
||||||
if not password or len(password) < 8:
|
if not password or len(password) < 8:
|
||||||
|
@ -236,7 +238,9 @@ def auth_facebook():
|
||||||
if not user:
|
if not user:
|
||||||
if DISABLE_REGISTRATION:
|
if DISABLE_REGISTRATION:
|
||||||
return jsonify(error="registration is closed"), 400
|
return jsonify(error="registration is closed"), 400
|
||||||
if not can_be_used_as_personal_email(email) or email_already_used(email):
|
if not email_domain_can_be_used_as_mailbox(
|
||||||
|
email
|
||||||
|
) or personal_email_already_used(email):
|
||||||
return jsonify(error=f"cannot use {email} as personal inbox"), 400
|
return jsonify(error=f"cannot use {email} as personal inbox"), 400
|
||||||
|
|
||||||
LOG.d("create facebook user with %s", user_info)
|
LOG.d("create facebook user with %s", user_info)
|
||||||
|
@ -288,7 +292,9 @@ def auth_google():
|
||||||
if not user:
|
if not user:
|
||||||
if DISABLE_REGISTRATION:
|
if DISABLE_REGISTRATION:
|
||||||
return jsonify(error="registration is closed"), 400
|
return jsonify(error="registration is closed"), 400
|
||||||
if not can_be_used_as_personal_email(email) or email_already_used(email):
|
if not email_domain_can_be_used_as_mailbox(
|
||||||
|
email
|
||||||
|
) or personal_email_already_used(email):
|
||||||
return jsonify(error=f"cannot use {email} as personal inbox"), 400
|
return jsonify(error=f"cannot use {email} as personal inbox"), 400
|
||||||
|
|
||||||
LOG.d("create Google user with %s", user_info)
|
LOG.d("create Google user with %s", user_info)
|
||||||
|
|
|
@ -7,7 +7,10 @@ from app import email_utils, config
|
||||||
from app.auth.base import auth_bp
|
from app.auth.base import auth_bp
|
||||||
from app.auth.views.login_utils import get_referral
|
from app.auth.views.login_utils import get_referral
|
||||||
from app.config import URL
|
from app.config import URL
|
||||||
from app.email_utils import can_be_used_as_personal_email, email_already_used
|
from app.email_utils import (
|
||||||
|
email_domain_can_be_used_as_mailbox,
|
||||||
|
personal_email_already_used,
|
||||||
|
)
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from app.log import LOG
|
from app.log import LOG
|
||||||
from app.models import User, ActivationCode
|
from app.models import User, ActivationCode
|
||||||
|
@ -37,10 +40,10 @@ def register():
|
||||||
|
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
email = form.email.data.strip().lower()
|
email = form.email.data.strip().lower()
|
||||||
if not can_be_used_as_personal_email(email):
|
if not email_domain_can_be_used_as_mailbox(email):
|
||||||
flash("You cannot use this email address as your personal inbox.", "error")
|
flash("You cannot use this email address as your personal inbox.", "error")
|
||||||
else:
|
else:
|
||||||
if email_already_used(email):
|
if personal_email_already_used(email):
|
||||||
flash(f"Email {email} already used", "error")
|
flash(f"Email {email} already used", "error")
|
||||||
else:
|
else:
|
||||||
LOG.debug("create user %s", form.email.data)
|
LOG.debug("create user %s", form.email.data)
|
||||||
|
|
|
@ -8,7 +8,7 @@ from wtforms.fields.html5 import EmailField
|
||||||
from app.config import EMAIL_DOMAIN, ALIAS_DOMAINS, MAILBOX_SECRET, URL
|
from app.config import EMAIL_DOMAIN, ALIAS_DOMAINS, MAILBOX_SECRET, URL
|
||||||
from app.dashboard.base import dashboard_bp
|
from app.dashboard.base import dashboard_bp
|
||||||
from app.email_utils import (
|
from app.email_utils import (
|
||||||
can_be_used_as_personal_email,
|
email_domain_can_be_used_as_mailbox,
|
||||||
mailbox_already_used,
|
mailbox_already_used,
|
||||||
render,
|
render,
|
||||||
send_email,
|
send_email,
|
||||||
|
@ -86,7 +86,7 @@ def mailbox_route():
|
||||||
|
|
||||||
if mailbox_already_used(mailbox_email, current_user):
|
if mailbox_already_used(mailbox_email, current_user):
|
||||||
flash(f"{mailbox_email} already used", "error")
|
flash(f"{mailbox_email} already used", "error")
|
||||||
elif not can_be_used_as_personal_email(mailbox_email):
|
elif not email_domain_can_be_used_as_mailbox(mailbox_email):
|
||||||
flash(f"You cannot use {mailbox_email}.", "error")
|
flash(f"You cannot use {mailbox_email}.", "error")
|
||||||
else:
|
else:
|
||||||
new_mailbox = Mailbox.create(
|
new_mailbox = Mailbox.create(
|
||||||
|
|
|
@ -10,7 +10,7 @@ from wtforms.fields.html5 import EmailField
|
||||||
from app.config import ENFORCE_SPF, MAILBOX_SECRET
|
from app.config import ENFORCE_SPF, MAILBOX_SECRET
|
||||||
from app.config import URL
|
from app.config import URL
|
||||||
from app.dashboard.base import dashboard_bp
|
from app.dashboard.base import dashboard_bp
|
||||||
from app.email_utils import can_be_used_as_personal_email
|
from app.email_utils import email_domain_can_be_used_as_mailbox
|
||||||
from app.email_utils import mailbox_already_used, render, send_email
|
from app.email_utils import mailbox_already_used, render, send_email
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from app.log import LOG
|
from app.log import LOG
|
||||||
|
@ -54,7 +54,7 @@ def mailbox_detail_route(mailbox_id):
|
||||||
or DeletedAlias.get_by(email=new_email)
|
or DeletedAlias.get_by(email=new_email)
|
||||||
):
|
):
|
||||||
flash(f"Email {new_email} already used", "error")
|
flash(f"Email {new_email} already used", "error")
|
||||||
elif not can_be_used_as_personal_email(new_email):
|
elif not email_domain_can_be_used_as_mailbox(new_email):
|
||||||
flash("You cannot use this email address as your mailbox", "error")
|
flash("You cannot use this email address as your mailbox", "error")
|
||||||
else:
|
else:
|
||||||
mailbox.new_email = new_email
|
mailbox.new_email = new_email
|
||||||
|
|
|
@ -12,7 +12,10 @@ from wtforms.fields.html5 import EmailField
|
||||||
from app import s3, email_utils
|
from app import s3, email_utils
|
||||||
from app.config import URL
|
from app.config import URL
|
||||||
from app.dashboard.base import dashboard_bp
|
from app.dashboard.base import dashboard_bp
|
||||||
from app.email_utils import can_be_used_as_personal_email, email_already_used
|
from app.email_utils import (
|
||||||
|
email_domain_can_be_used_as_mailbox,
|
||||||
|
personal_email_already_used,
|
||||||
|
)
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from app.log import LOG
|
from app.log import LOG
|
||||||
from app.models import (
|
from app.models import (
|
||||||
|
@ -70,12 +73,12 @@ def setting():
|
||||||
|
|
||||||
# check if this email is not already used
|
# check if this email is not already used
|
||||||
if (
|
if (
|
||||||
email_already_used(new_email)
|
personal_email_already_used(new_email)
|
||||||
or Alias.get_by(email=new_email)
|
or Alias.get_by(email=new_email)
|
||||||
or DeletedAlias.get_by(email=new_email)
|
or DeletedAlias.get_by(email=new_email)
|
||||||
):
|
):
|
||||||
flash(f"Email {new_email} already used", "error")
|
flash(f"Email {new_email} already used", "error")
|
||||||
elif not can_be_used_as_personal_email(new_email):
|
elif not email_domain_can_be_used_as_mailbox(new_email):
|
||||||
flash(
|
flash(
|
||||||
"You cannot use this email address as your personal inbox.",
|
"You cannot use this email address as your personal inbox.",
|
||||||
"error",
|
"error",
|
||||||
|
|
|
@ -346,10 +346,11 @@ def email_belongs_to_alias_domains(address: str) -> bool:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def can_be_used_as_personal_email(email: str) -> bool:
|
def email_domain_can_be_used_as_mailbox(email: str) -> bool:
|
||||||
"""return True if an email can be used as a personal email. Currently the only condition is email domain is not
|
"""return True if an email can be used as a personal email. An email domain can be used if it is not
|
||||||
- one of ALIAS_DOMAINS
|
- one of ALIAS_DOMAINS
|
||||||
- one of custom domains
|
- one of custom domains
|
||||||
|
- disposable domain
|
||||||
"""
|
"""
|
||||||
domain = get_email_domain_part(email)
|
domain = get_email_domain_part(email)
|
||||||
if not domain:
|
if not domain:
|
||||||
|
@ -402,17 +403,12 @@ def get_mx_domain_list(domain) -> [str]:
|
||||||
return [d[:-1] for _, d in priority_domains]
|
return [d[:-1] for _, d in priority_domains]
|
||||||
|
|
||||||
|
|
||||||
def email_already_used(email: str) -> bool:
|
def personal_email_already_used(email: str) -> bool:
|
||||||
"""test if an email can be used when:
|
"""test if an email can be used as user email
|
||||||
- user signs up
|
|
||||||
- add a new mailbox
|
|
||||||
"""
|
"""
|
||||||
if User.get_by(email=email):
|
if User.get_by(email=email):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
if Mailbox.get_by(email=email):
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ from app.config import MAX_ALERT_24H
|
||||||
from app.email_utils import (
|
from app.email_utils import (
|
||||||
get_email_domain_part,
|
get_email_domain_part,
|
||||||
email_belongs_to_alias_domains,
|
email_belongs_to_alias_domains,
|
||||||
can_be_used_as_personal_email,
|
email_domain_can_be_used_as_mailbox,
|
||||||
delete_header,
|
delete_header,
|
||||||
add_or_replace_header,
|
add_or_replace_header,
|
||||||
parseaddr_unicode,
|
parseaddr_unicode,
|
||||||
|
@ -29,10 +29,10 @@ def test_email_belongs_to_alias_domains():
|
||||||
|
|
||||||
def test_can_be_used_as_personal_email(flask_client):
|
def test_can_be_used_as_personal_email(flask_client):
|
||||||
# default alias domain
|
# default alias domain
|
||||||
assert not can_be_used_as_personal_email("ab@sl.local")
|
assert not email_domain_can_be_used_as_mailbox("ab@sl.local")
|
||||||
assert not can_be_used_as_personal_email("hey@d1.test")
|
assert not email_domain_can_be_used_as_mailbox("hey@d1.test")
|
||||||
|
|
||||||
assert can_be_used_as_personal_email("hey@ab.cd")
|
assert email_domain_can_be_used_as_mailbox("hey@ab.cd")
|
||||||
# custom domain
|
# custom domain
|
||||||
user = User.create(
|
user = User.create(
|
||||||
email="a@b.c", password="password", name="Test User", activated=True
|
email="a@b.c", password="password", name="Test User", activated=True
|
||||||
|
@ -40,17 +40,17 @@ def test_can_be_used_as_personal_email(flask_client):
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
CustomDomain.create(user_id=user.id, domain="ab.cd", verified=True)
|
CustomDomain.create(user_id=user.id, domain="ab.cd", verified=True)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
assert not can_be_used_as_personal_email("hey@ab.cd")
|
assert not email_domain_can_be_used_as_mailbox("hey@ab.cd")
|
||||||
|
|
||||||
# disposable domain
|
# disposable domain
|
||||||
assert not can_be_used_as_personal_email("abcd@10minutesmail.fr")
|
assert not email_domain_can_be_used_as_mailbox("abcd@10minutesmail.fr")
|
||||||
assert not can_be_used_as_personal_email("abcd@temp-mail.com")
|
assert not email_domain_can_be_used_as_mailbox("abcd@temp-mail.com")
|
||||||
# subdomain will not work
|
# subdomain will not work
|
||||||
assert not can_be_used_as_personal_email("abcd@sub.temp-mail.com")
|
assert not email_domain_can_be_used_as_mailbox("abcd@sub.temp-mail.com")
|
||||||
# valid domains should not be affected
|
# valid domains should not be affected
|
||||||
assert can_be_used_as_personal_email("abcd@protonmail.com")
|
assert email_domain_can_be_used_as_mailbox("abcd@protonmail.com")
|
||||||
assert can_be_used_as_personal_email("abcd@gmail.com")
|
assert email_domain_can_be_used_as_mailbox("abcd@gmail.com")
|
||||||
assert can_be_used_as_personal_email("abcd@example.com")
|
assert email_domain_can_be_used_as_mailbox("abcd@example.com")
|
||||||
|
|
||||||
|
|
||||||
def test_delete_header():
|
def test_delete_header():
|
||||||
|
|
Loading…
Reference in New Issue