def test_generate_reply_email_include_sender_in_reverse_alias(flask_client): # user enables include_sender_in_reverse_alias user = User.create( email="[email protected]", password="******", name="Test User", activated=True, include_sender_in_reverse_alias=True, ) reply_email = generate_reply_email("*****@*****.**", user) # return something like # [email protected] assert reply_email.startswith("ra+test.at.example.org+") assert reply_email.endswith(EMAIL_DOMAIN) reply_email = generate_reply_email("", user) # return something like # [email protected] assert reply_email.startswith("ra+") assert reply_email.endswith(EMAIL_DOMAIN) reply_email = generate_reply_email("👌汉å—@example.org", user) assert reply_email.startswith("ra+yizi.at.example.org+") # make sure reply_email only contain lowercase reply_email = generate_reply_email("*****@*****.**", user) assert reply_email.startswith("ra+test.at.example.org")
def test_generate_reply_email(flask_client): user = User.create( email="[email protected]", password="******", name="Test User", activated=True, ) reply_email = generate_reply_email("*****@*****.**", user) assert reply_email.endswith(EMAIL_DOMAIN) reply_email = generate_reply_email("", user) assert reply_email.endswith(EMAIL_DOMAIN)
def test_generate_reply_email(flask_client): user = User.create( email="[email protected]", password="******", name="Test User", activated=True, ) reply_email = generate_reply_email("*****@*****.**", user) # return something like # ra+<random>@sl.local assert reply_email.endswith(EMAIL_DOMAIN) reply_email = generate_reply_email("", user) # return something like # [email protected] assert reply_email.startswith("ra+") assert reply_email.endswith(EMAIL_DOMAIN)
def create_contact_route(alias_id): """ Create contact for an alias Input: alias_id: in url contact: in body Output: 201 if success 409 if contact already added """ data = request.get_json() if not data: return jsonify(error="request body cannot be empty"), 400 user = g.user alias: Alias = Alias.get(alias_id) if alias.user_id != user.id: return jsonify(error="Forbidden"), 403 contact_addr = data.get("contact") if not contact_addr: return jsonify(error="Contact cannot be empty"), 400 full_address: EmailAddress = address.parse(contact_addr) if not full_address: return jsonify(error=f"invalid contact email {contact_addr}"), 400 contact_name, contact_email = full_address.display_name, full_address.address contact_email = sanitize_email(contact_email, not_lower=True) # already been added contact = Contact.get_by(alias_id=alias.id, website_email=contact_email) if contact: return jsonify(**serialize_contact(contact, existed=True)), 200 try: contact = Contact.create( user_id=alias.user_id, alias_id=alias.id, website_email=contact_email, name=contact_name, reply_email=generate_reply_email(contact_email, user), ) except CannotCreateContactForReverseAlias: return jsonify( error="You can't create contact for a reverse alias"), 400 LOG.d("create reverse-alias for %s %s", contact_addr, alias) Session.commit() return jsonify(**serialize_contact(contact)), 201
def test_generate_reply_email(flask_client): reply_email = generate_reply_email("*****@*****.**") # return something like # [email protected] assert reply_email.startswith("ra+test.at.example.org+") assert reply_email.endswith(EMAIL_DOMAIN) reply_email = generate_reply_email("") # return something like # [email protected] assert reply_email.startswith("ra+") assert reply_email.endswith(EMAIL_DOMAIN) reply_email = generate_reply_email("👌汉å—@example.org") assert reply_email.startswith("ra+yizi.at.example.org+") # make sure reply_email only contain lowercase reply_email = generate_reply_email("*****@*****.**") assert reply_email.startswith("ra+test.at.example.org")
def test_generate_reply_email_include_sender_in_reverse_alias(flask_client): # user enables include_sender_in_reverse_alias user = User.create( email="[email protected]", password="******", name="Test User", activated=True, include_sender_in_reverse_alias=True, ) reply_email = generate_reply_email("*****@*****.**", user) assert reply_email.startswith("test.at.example.org") assert reply_email.endswith(EMAIL_DOMAIN) reply_email = generate_reply_email("", user) assert reply_email.endswith(EMAIL_DOMAIN) reply_email = generate_reply_email("👌汉å—@example.org", user) assert reply_email.startswith("yizi.at.example.org") # make sure reply_email only contain lowercase reply_email = generate_reply_email("*****@*****.**", user) assert reply_email.startswith("test.at.example.org")
def create_contact_route(alias_id): """ Create contact for an alias Input: alias_id: in url contact: in body Output: 201 if success 409 if contact already added """ data = request.get_json() if not data: return jsonify(error="request body cannot be empty"), 400 user = g.user alias: Alias = Alias.get(alias_id) if alias.user_id != user.id: return jsonify(error="Forbidden"), 403 contact_addr = data.get("contact") if not contact_addr: return jsonify(error="Contact cannot be empty"), 400 contact_name, contact_email = parseaddr_unicode(contact_addr) if not is_valid_email(contact_email): return jsonify(error=f"invalid contact email {contact_email}"), 400 contact_email = sanitize_email(contact_email) # already been added contact = Contact.get_by(alias_id=alias.id, website_email=contact_email) if contact: return jsonify(**serialize_contact(contact, existed=True)), 200 contact = Contact.create( user_id=alias.user_id, alias_id=alias.id, website_email=contact_email, name=contact_name, reply_email=generate_reply_email(contact_email, user), ) LOG.d("create reverse-alias for %s %s", contact_addr, alias) db.session.commit() return jsonify(**serialize_contact(contact)), 201
def alias_contact_manager(alias_id): highlight_contact_id = None if request.args.get("highlight_contact_id"): highlight_contact_id = int(request.args.get("highlight_contact_id")) alias = Alias.get(alias_id) page = 0 if request.args.get("page"): page = int(request.args.get("page")) query = request.args.get("query") or "" # sanity check if not alias: flash("You do not have access to this page", "warning") return redirect(url_for("dashboard.index")) if alias.user_id != current_user.id: flash("You do not have access to this page", "warning") return redirect(url_for("dashboard.index")) new_contact_form = NewContactForm() if request.method == "POST": if request.form.get("form-name") == "create": if new_contact_form.validate(): contact_addr = new_contact_form.email.data.strip() try: contact_name, contact_email = parseaddr_unicode( contact_addr) contact_email = sanitize_email(contact_email) except Exception: flash(f"{contact_addr} is invalid", "error") return redirect( url_for( "dashboard.alias_contact_manager", alias_id=alias_id, )) if not is_valid_email(contact_email): flash(f"{contact_email} is invalid", "error") return redirect( url_for( "dashboard.alias_contact_manager", alias_id=alias_id, )) contact = Contact.get_by(alias_id=alias.id, website_email=contact_email) # already been added if contact: flash(f"{contact_email} is already added", "error") return redirect( url_for( "dashboard.alias_contact_manager", alias_id=alias_id, highlight_contact_id=contact.id, )) contact = Contact.create( user_id=alias.user_id, alias_id=alias.id, website_email=contact_email, name=contact_name, reply_email=generate_reply_email(contact_email, current_user), ) LOG.d("create reverse-alias for %s", contact_addr) db.session.commit() flash(f"Reverse alias for {contact_addr} is created", "success") return redirect( url_for( "dashboard.alias_contact_manager", alias_id=alias_id, highlight_contact_id=contact.id, )) elif request.form.get("form-name") == "delete": contact_id = request.form.get("contact-id") contact = Contact.get(contact_id) if not contact: flash("Unknown error. Refresh the page", "warning") return redirect( url_for("dashboard.alias_contact_manager", alias_id=alias_id)) elif contact.alias_id != alias.id: flash("You cannot delete reverse-alias", "warning") return redirect( url_for("dashboard.alias_contact_manager", alias_id=alias_id)) delete_contact_email = contact.website_email Contact.delete(contact_id) db.session.commit() flash(f"Reverse-alias for {delete_contact_email} has been deleted", "success") return redirect( url_for("dashboard.alias_contact_manager", alias_id=alias_id)) elif request.form.get("form-name") == "search": query = request.form.get("query") return redirect( url_for( "dashboard.alias_contact_manager", alias_id=alias_id, query=query, highlight_contact_id=highlight_contact_id, )) contact_infos = get_contact_infos(alias, page, query=query) last_page = len(contact_infos) < PAGE_LIMIT # if highlighted contact isn't included, fetch it # make sure highlighted contact is at array start contact_ids = [contact_info.contact.id for contact_info in contact_infos] if highlight_contact_id and highlight_contact_id not in contact_ids: contact_infos = (get_contact_infos( alias, contact_id=highlight_contact_id, query=query) + contact_infos) return render_template( "dashboard/alias_contact_manager.html", contact_infos=contact_infos, alias=alias, new_contact_form=new_contact_form, highlight_contact_id=highlight_contact_id, page=page, last_page=last_page, query=query, )