Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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
Ejemplo n.º 9
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)
Ejemplo n.º 10
0
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,
    )
Ejemplo n.º 11
0
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,
    )
Ejemplo n.º 12
0
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()
    )