def test_cannot_create_alias_in_trash(flask_client): user = login(flask_client) # create a custom domain CustomDomain.create(user_id=user.id, domain="ab.cd", verified=True, commit=True) signed_suffix = signer.sign("@ab.cd").decode() r = flask_client.post( "/api/v3/alias/custom/new", json={ "alias_prefix": "prefix", "signed_suffix": signed_suffix, "mailbox_ids": [user.default_mailbox_id], }, ) assert r.status_code == 201 assert r.json["alias"] == f"*****@*****.**" # delete alias: it's going to be moved to ab.cd trash alias = Alias.get_by(email="*****@*****.**") assert alias.custom_domain_id delete_alias(alias, user) # try to create the same alias, will fail as the alias is in trash r = flask_client.post( "/api/v3/alias/custom/new", json={ "alias_prefix": "prefix", "signed_suffix": signed_suffix, "mailbox_ids": [user.default_mailbox_id], }, ) assert r.status_code == 409
def test_cannot_create_alias_in_trash(flask_client): user = User.create(email="[email protected]", password="******", name="Test User", activated=True) db.session.commit() # create api_key api_key = ApiKey.create(user.id, "for test") db.session.commit() # create a custom domain CustomDomain.create(user_id=user.id, domain="ab.cd", verified=True) db.session.commit() # create new alias with note suffix = "@ab.cd" suffix = signer.sign(suffix).decode() r = flask_client.post( url_for("api.new_custom_alias_v2", hostname="www.test.com"), headers={"Authentication": api_key.code}, json={ "alias_prefix": "prefix", "signed_suffix": suffix, "note": "test note", }, ) # assert alias creation is successful assert r.status_code == 201 assert r.json["alias"] == "*****@*****.**" # delete alias: it's going to be moved to ab.cd trash alias = Alias.get_by(email="*****@*****.**") assert alias.custom_domain_id delete_alias(alias, user) # try to create the same alias, will fail as the alias is in trash r = flask_client.post( url_for("api.new_custom_alias_v2", hostname="www.test.com"), headers={"Authentication": api_key.code}, json={ "alias_prefix": "prefix", "signed_suffix": suffix, "note": "test note", }, ) assert r.status_code == 409
def test_delete_alias(flask_client): user = User.create(email="[email protected]", password="******", name="Test User", activated=True) db.session.commit() alias = Alias.create(user_id=user.id, email="*****@*****.**", mailbox_id=user.default_mailbox_id) db.session.commit() assert Alias.get_by(email="*****@*****.**") delete_alias(alias, user) assert Alias.get_by(email="*****@*****.**") is None assert DeletedAlias.get_by(email=alias.email)
def delete_alias(alias_id): """ Delete alias Input: alias_id: in url Output: 200 if deleted successfully """ user = g.user alias = Alias.get(alias_id) if not alias or alias.user_id != user.id: return jsonify(error="Forbidden"), 403 alias_utils.delete_alias(alias, user) return jsonify(deleted=True), 200
def test_delete_alias_already_in_trash(flask_client): """delete an alias that's already in alias trash""" user = User.create(email="[email protected]", password="******", name="Test User", activated=True) db.session.commit() alias = Alias.create(user_id=user.id, email="*****@*****.**", mailbox_id=user.default_mailbox_id) db.session.commit() # add the alias to global trash db.session.add(DeletedAlias(email=alias.email)) db.session.commit() delete_alias(alias, user) assert Alias.get_by(email="*****@*****.**") is None
def test_add_alias_in_global_trash(flask_client): user = login(flask_client) Session.commit() another_user = User.create( email="[email protected]", password="******", name="Test User", activated=True, commit=True, ) word = random_word() suffix = f".{word}@{EMAIL_DOMAIN}" alias_suffix = AliasSuffix(is_custom=False, suffix=suffix, is_premium=False, domain=EMAIL_DOMAIN) signed_alias_suffix = signer.sign(alias_suffix.serialize()).decode() # delete an alias: alias should go the DeletedAlias alias = Alias.create( user_id=another_user.id, email=f"prefix{suffix}", mailbox_id=another_user.default_mailbox_id, commit=True, ) assert DeletedAlias.count() == 0 delete_alias(alias, another_user) assert DeletedAlias.count() == 1 # create the same alias, should return error r = flask_client.post( url_for("dashboard.custom_alias"), data={ "prefix": "prefix", "signed-alias-suffix": signed_alias_suffix, "mailboxes": [user.default_mailbox_id], }, follow_redirects=True, ) assert r.status_code == 200 assert f"prefix{suffix} cannot be used" in r.get_data(True)
def test_add_alias_in_custom_domain_trash(flask_client): user = login(flask_client) custom_domain = CustomDomain.create(user_id=user.id, domain="ab.cd", ownership_verified=True, commit=True) # delete a custom-domain alias: alias should go the DomainDeletedAlias alias = Alias.create( user_id=user.id, email="*****@*****.**", custom_domain_id=custom_domain.id, mailbox_id=user.default_mailbox_id, commit=True, ) assert DomainDeletedAlias.count() == 0 delete_alias(alias, user) assert DomainDeletedAlias.count() == 1 # create the same alias, should return error suffix = "@ab.cd" alias_suffix = AliasSuffix(is_custom=False, suffix=suffix, is_premium=False, domain=EMAIL_DOMAIN) signed_alias_suffix = signer.sign(alias_suffix.serialize()).decode() r = flask_client.post( url_for("dashboard.custom_alias"), data={ "prefix": "prefix", "signed-alias-suffix": signed_alias_suffix, "mailboxes": [user.default_mailbox_id], }, follow_redirects=True, ) assert r.status_code == 200 assert "You have deleted this alias before. You can restore it on" in r.get_data( True)
def test_get_custom_domain_trash(flask_client): user = login(flask_client) cd = CustomDomain.create(user_id=user.id, domain="test1.org", verified=True, commit=True) alias = Alias.create( user_id=user.id, email="*****@*****.**", custom_domain_id=cd.id, mailbox_id=user.default_mailbox_id, commit=True, ) delete_alias(alias, user) r = flask_client.get(f"/api/custom_domains/{cd.id}/trash", ) for deleted_alias in r.json["aliases"]: assert deleted_alias["alias"] assert deleted_alias["creation_timestamp"] > 0
def test_add_alias_in_custom_domain_trash(flask_client): user = login(flask_client) db.session.commit() custom_domain = CustomDomain.create(user_id=user.id, domain="ab.cd", verified=True, commit=True) # delete a custom-domain alias: alias should go the DomainDeletedAlias alias = Alias.create( user_id=user.id, email=f"*****@*****.**", custom_domain_id=custom_domain.id, mailbox_id=user.default_mailbox_id, commit=True, ) assert DomainDeletedAlias.query.count() == 0 delete_alias(alias, user) assert DomainDeletedAlias.query.count() == 1 # create the same alias, should return error suffix = f"@ab.cd" signed_suffix = signer.sign(suffix).decode() r = flask_client.post( url_for("dashboard.custom_alias"), data={ "prefix": "prefix", "suffix": signed_suffix, "mailboxes": [user.default_mailbox_id], }, follow_redirects=True, ) assert r.status_code == 200 assert "You have deleted this alias before. You can restore it on" in r.get_data( True)
def index(): query = request.args.get("query") or "" sort = request.args.get("sort") or "" alias_filter = request.args.get("filter") or "" page = 0 if request.args.get("page"): page = int(request.args.get("page")) highlight_alias_id = None if request.args.get("highlight_alias_id"): try: highlight_alias_id = int(request.args.get("highlight_alias_id")) except ValueError: LOG.warning( "highlight_alias_id must be a number, received %s", request.args.get("highlight_alias_id"), ) if request.method == "POST": if request.form.get("form-name") == "create-custom-email": if current_user.can_create_new_alias(): return redirect(url_for("dashboard.custom_alias")) else: flash("You need to upgrade your plan to create new alias.", "warning") elif request.form.get("form-name") == "create-random-email": if current_user.can_create_new_alias(): scheme = int( request.form.get("generator_scheme") or current_user.alias_generator) if not scheme or not AliasGeneratorEnum.has_value(scheme): scheme = current_user.alias_generator alias = Alias.create_new_random(user=current_user, scheme=scheme) alias.mailbox_id = current_user.default_mailbox_id db.session.commit() LOG.d("create new random alias %s for user %s", alias, current_user) flash(f"Alias {alias.email} has been created", "success") return redirect( url_for( "dashboard.index", highlight_alias_id=alias.id, query=query, sort=sort, filter=alias_filter, )) else: flash("You need to upgrade your plan to create new alias.", "warning") elif request.form.get("form-name") in ("delete-alias", "disable-alias"): alias_id = request.form.get("alias-id") alias: Alias = Alias.get(alias_id) if not alias or alias.user_id != current_user.id: flash("Unknown error, sorry for the inconvenience", "error") return redirect( url_for( "dashboard.index", query=query, sort=sort, filter=alias_filter, )) if request.form.get("form-name") == "delete-alias": LOG.d("delete alias %s", alias) email = alias.email alias_utils.delete_alias(alias, current_user) flash(f"Alias {email} has been deleted", "success") elif request.form.get("form-name") == "disable-alias": alias.enabled = False db.session.commit() flash(f"Alias {alias.email} has been disabled", "success") return redirect( url_for("dashboard.index", query=query, sort=sort, filter=alias_filter)) mailboxes = current_user.mailboxes() show_intro = False if not current_user.intro_shown: LOG.d("Show intro to %s", current_user) show_intro = True # to make sure not showing intro to user again current_user.intro_shown = True db.session.commit() stats = get_stats(current_user) alias_infos = get_alias_infos_with_pagination_v3(current_user, page, query, sort, alias_filter) last_page = len(alias_infos) < PAGE_LIMIT return render_template( "dashboard/index.html", alias_infos=alias_infos, highlight_alias_id=highlight_alias_id, query=query, AliasGeneratorEnum=AliasGeneratorEnum, mailboxes=mailboxes, show_intro=show_intro, page=page, last_page=last_page, sort=sort, filter=alias_filter, stats=stats, )
def index(): query = request.args.get("query") or "" sort = request.args.get("sort") or "" alias_filter = request.args.get("filter") or "" page = 0 if request.args.get("page"): page = int(request.args.get("page")) highlight_alias_id = None if request.args.get("highlight_alias_id"): highlight_alias_id = int(request.args.get("highlight_alias_id")) # User generates a new email if request.method == "POST": if request.form.get("form-name") == "create-custom-email": if current_user.can_create_new_alias(): return redirect(url_for("dashboard.custom_alias")) else: flash(f"You need to upgrade your plan to create new alias.", "warning") elif request.form.get("form-name") == "create-random-email": if current_user.can_create_new_alias(): scheme = int( request.form.get("generator_scheme") or current_user.alias_generator) if not scheme or not AliasGeneratorEnum.has_value(scheme): scheme = current_user.alias_generator alias = Alias.create_new_random(user=current_user, scheme=scheme) alias.mailbox_id = current_user.default_mailbox_id db.session.commit() LOG.d("generate new email %s for user %s", alias, current_user) flash(f"Alias {alias.email} has been created", "success") return redirect( url_for( "dashboard.index", highlight_alias_id=alias.id, query=query, sort=sort, filter=alias_filter, )) else: flash(f"You need to upgrade your plan to create new alias.", "warning") elif request.form.get("form-name") == "delete-email": alias_id = request.form.get("alias-id") alias: Alias = Alias.get(alias_id) if not alias: flash("Unknown error, sorry for the inconvenience", "error") return redirect( url_for( "dashboard.index", highlight_alias_id=alias.id, query=query, sort=sort, filter=alias_filter, )) LOG.d("delete gen email %s", alias) email = alias.email alias_utils.delete_alias(alias, current_user) flash(f"Alias {email} has been deleted", "success") return redirect( url_for("dashboard.index", query=query, sort=sort, filter=alias_filter)) client_users = (ClientUser.filter_by(user_id=current_user.id).options( joinedload(ClientUser.client)).options(joinedload( ClientUser.alias)).all()) sorted(client_users, key=lambda cu: cu.client.name) mailboxes = current_user.mailboxes() show_intro = False if not current_user.intro_shown: LOG.d("Show intro to %s", current_user) show_intro = True # to make sure not showing intro to user again current_user.intro_shown = True db.session.commit() stats = get_stats(current_user) alias_infos = get_alias_infos_with_pagination_v2(current_user, page, query, sort, alias_filter) last_page = len(alias_infos) < PAGE_LIMIT return render_template( "dashboard/index.html", client_users=client_users, alias_infos=alias_infos, highlight_alias_id=highlight_alias_id, query=query, AliasGeneratorEnum=AliasGeneratorEnum, mailboxes=mailboxes, show_intro=show_intro, page=page, last_page=last_page, sort=sort, filter=alias_filter, stats=stats, )
def test_export(flask_client): # Create users user1 = login(flask_client) user2 = User.create( email="[email protected]", password="******", name="Wrong user", activated=True ) Session.commit() # Remove onboarding aliases for alias in Alias.filter_by(user_id=user1.id).all(): alias_utils.delete_alias(alias, user1) for alias in Alias.filter_by(user_id=user2.id).all(): alias_utils.delete_alias(alias, user2) Session.commit() # Create domains CustomDomain.create( user_id=user1.id, domain="my-destination-domain.com", verified=True ) CustomDomain.create( user_id=user2.id, domain="bad-destionation-domain.com", verified=True ) Session.commit() # Create mailboxes mailbox1 = Mailbox.create( user_id=user1.id, email="*****@*****.**", verified=True ) mailbox2 = Mailbox.create( user_id=user1.id, email="*****@*****.**", verified=True ) badmailbox1 = Mailbox.create( user_id=user2.id, email="*****@*****.**", verified=True, ) Session.commit() # Create aliases Alias.create( user_id=user1.id, email="*****@*****.**", note="Used on eBay", mailbox_id=mailbox1.id, ) alias2 = Alias.create( user_id=user1.id, email="*****@*****.**", note="Used on Facebook, Instagram.", mailbox_id=mailbox1.id, ) Alias.create( user_id=user2.id, email="*****@*****.**", note="Should not appear", mailbox_id=badmailbox1.id, ) Session.commit() # Add second mailbox to an alias AliasMailbox.create( alias_id=alias2.id, mailbox_id=mailbox2.id, ) Session.commit() # Export r = flask_client.get(url_for("api.export_aliases")) assert r.status_code == 200 assert r.mimetype == "text/csv" assert ( r.data == """alias,note,enabled,mailboxes [email protected],Used on eBay,True,[email protected] [email protected],"Used on Facebook, Instagram.",True,[email protected] [email protected] """.replace( "\n", "\r\n" ).encode() )