app-MAIL-temp/app/dashboard/views/mailbox.py

199 lines
6.5 KiB
Python
Raw Normal View History

2021-08-15 17:50:47 +02:00
from threading import Thread
2020-02-10 17:17:05 +01:00
from flask import render_template, request, redirect, url_for, flash
from flask_login import login_required, current_user
from flask_wtf import FlaskForm
2020-04-25 11:30:09 +02:00
from itsdangerous import Signer
2020-02-10 17:17:05 +01:00
from wtforms import validators
from wtforms.fields.html5 import EmailField
from app.config import MAILBOX_SECRET, URL
2020-02-10 17:17:05 +01:00
from app.dashboard.base import dashboard_bp
from app.email_utils import (
email_can_be_used_as_mailbox,
mailbox_already_used,
render,
send_email,
2020-11-22 12:18:31 +01:00
is_valid_email,
2020-02-10 17:17:05 +01:00
)
from app.extensions import db
from app.log import LOG
from app.models import Mailbox
class NewMailboxForm(FlaskForm):
email = EmailField(
"email", validators=[validators.DataRequired(), validators.Email()]
)
@dashboard_bp.route("/mailbox", methods=["GET", "POST"])
@login_required
def mailbox_route():
2020-04-28 20:22:37 +02:00
mailboxes = (
Mailbox.query.filter_by(user_id=current_user.id)
.order_by(Mailbox.created_at.desc())
.all()
)
2020-02-10 17:17:05 +01:00
new_mailbox_form = NewMailboxForm()
if request.method == "POST":
if request.form.get("form-name") == "delete":
mailbox_id = request.form.get("mailbox-id")
mailbox = Mailbox.get(mailbox_id)
if not mailbox or mailbox.user_id != current_user.id:
flash("Unknown error. Refresh the page", "warning")
return redirect(url_for("dashboard.mailbox_route"))
2020-02-23 09:41:53 +01:00
if mailbox.id == current_user.default_mailbox_id:
flash("You cannot delete default mailbox", "error")
return redirect(url_for("dashboard.mailbox_route"))
2021-08-15 17:50:47 +02:00
LOG.d("Schedule deleting %s", mailbox)
Thread(target=delete_mailbox, args=(mailbox.id,)).start()
flash(
f"Mailbox {mailbox.email} scheduled for deletion."
f"You will receive a confirmation email when the deletion is finished",
"success",
)
2020-02-10 17:17:05 +01:00
2020-02-23 09:51:26 +01:00
return redirect(url_for("dashboard.mailbox_route"))
if request.form.get("form-name") == "set-default":
mailbox_id = request.form.get("mailbox-id")
mailbox = Mailbox.get(mailbox_id)
if not mailbox or mailbox.user_id != current_user.id:
flash("Unknown error. Refresh the page", "warning")
return redirect(url_for("dashboard.mailbox_route"))
if mailbox.id == current_user.default_mailbox_id:
flash("This mailbox is already default one", "error")
return redirect(url_for("dashboard.mailbox_route"))
if not mailbox.verified:
flash("Cannot set unverified mailbox as default", "error")
return redirect(url_for("dashboard.mailbox_route"))
current_user.default_mailbox_id = mailbox.id
db.session.commit()
flash(f"Mailbox {mailbox.email} is set as Default Mailbox", "success")
2020-02-10 17:17:05 +01:00
return redirect(url_for("dashboard.mailbox_route"))
elif request.form.get("form-name") == "create":
if not current_user.is_premium():
flash("Only premium plan can add additional mailbox", "warning")
return redirect(url_for("dashboard.mailbox_route"))
2020-02-10 17:17:05 +01:00
if new_mailbox_form.validate():
mailbox_email = (
new_mailbox_form.email.data.lower().strip().replace(" ", "")
)
2020-02-10 17:17:05 +01:00
2020-11-22 12:18:31 +01:00
if not is_valid_email(mailbox_email):
flash(f"{mailbox_email} invalid", "error")
elif mailbox_already_used(mailbox_email, current_user):
2020-02-10 17:17:05 +01:00
flash(f"{mailbox_email} already used", "error")
elif not email_can_be_used_as_mailbox(mailbox_email):
2020-03-05 11:00:58 +01:00
flash(f"You cannot use {mailbox_email}.", "error")
2020-02-10 17:17:05 +01:00
else:
new_mailbox = Mailbox.create(
email=mailbox_email, user_id=current_user.id
)
db.session.commit()
send_verification_email(current_user, new_mailbox)
2020-02-10 17:17:05 +01:00
flash(
f"You are going to receive an email to confirm {mailbox_email}.",
"success",
)
return redirect(
url_for(
"dashboard.mailbox_detail_route", mailbox_id=new_mailbox.id
)
)
2020-02-10 17:17:05 +01:00
return render_template(
"dashboard/mailbox.html",
mailboxes=mailboxes,
new_mailbox_form=new_mailbox_form,
)
2021-08-15 17:50:47 +02:00
def delete_mailbox(mailbox_id: int):
from server import create_light_app
with create_light_app().app_context():
mailbox = Mailbox.get(mailbox_id)
if not mailbox:
return
mailbox_email = mailbox.email
user = mailbox.user
Mailbox.delete(mailbox_id)
db.session.commit()
2021-08-15 17:56:31 +02:00
LOG.d("Mailbox %s %s deleted", mailbox_id, mailbox_email)
2021-08-15 17:50:47 +02:00
send_email(
user.email,
f"Your mailbox {mailbox_email} has been deleted",
f"""Mailbox {mailbox_email} along with its aliases are deleted successfully.
Regards,
SimpleLogin team.
""",
)
def send_verification_email(user, mailbox):
s = Signer(MAILBOX_SECRET)
mailbox_id_signed = s.sign(str(mailbox.id)).decode()
verification_url = (
URL + "/dashboard/mailbox_verify" + f"?mailbox_id={mailbox_id_signed}"
)
send_email(
mailbox.email,
f"Please confirm your email {mailbox.email}",
render(
"transactional/verify-mailbox.txt",
user=user,
link=verification_url,
mailbox_email=mailbox.email,
),
render(
"transactional/verify-mailbox.html",
user=user,
link=verification_url,
mailbox_email=mailbox.email,
),
)
2020-02-10 17:17:05 +01:00
@dashboard_bp.route("/mailbox_verify")
def mailbox_verify():
s = Signer(MAILBOX_SECRET)
2020-02-10 17:17:05 +01:00
mailbox_id = request.args.get("mailbox_id")
try:
r_id = int(s.unsign(mailbox_id))
except Exception:
2020-02-10 17:17:05 +01:00
flash("Invalid link. Please delete and re-add your mailbox", "error")
return redirect(url_for("dashboard.mailbox_route"))
2020-02-10 17:17:05 +01:00
else:
mailbox = Mailbox.get(r_id)
if not mailbox:
flash("Invalid link", "error")
return redirect(url_for("dashboard.mailbox_route"))
2020-02-10 17:17:05 +01:00
mailbox.verified = True
db.session.commit()
LOG.d("Mailbox %s is verified", mailbox)
2020-03-14 14:45:37 +01:00
return render_template("dashboard/mailbox_validation.html", mailbox=mailbox)