Ejemplo n.º 1
0
def ua_contracts_api_authentication_error_view(error):
    flask.current_app.extensions["sentry"].captureException(
        extra={
            "session_keys": flask.session.keys(),
            "request_url": error.request.url,
            "request_headers": error.request.headers,
            "response_headers": error.response.headers,
            "response_body": error.response.json(),
            "response_code": error.response.json()["code"],
            "response_message": error.response.json()["message"],
        })

    empty_session(flask.session)

    return flask.redirect(flask.request.url)
Ejemplo n.º 2
0
def ua_contracts_api_error_view(error):
    sentry.captureException(
        extra={
            "user_info": user_info(flask.session),
            "request_url": error.request.url,
            "request_headers": error.request.headers,
            "response_headers": error.response.headers,
            "response_body": error.response.json(),
        })

    if error.response.status_code == 401:
        empty_session(flask.session)

        return flask.redirect(flask.request.url)

    return flask.render_template("500.html"), 500
Ejemplo n.º 3
0
def ua_contracts_api_error(error):
    sentry.captureException(
        extra={
            "user_info": user_info(flask.session),
            "request_url": error.request.url,
            "request_headers": error.request.headers,
            "response_headers": error.response.headers,
            "response_body": error.response.json(),
        })

    if error.response.status_code == 401:
        empty_session(flask.session)

    return (
        flask.jsonify({"errors": error.response.json()["message"]}),
        error.response.status_code or 500,
    )
Ejemplo n.º 4
0
def advantage_view():
    accounts = None
    personal_account = None
    enterprise_contracts = {}
    entitlements = {}
    open_subscription = flask.request.args.get("subscription", None)
    stripe_publishable_key = os.getenv(
        "STRIPE_PUBLISHABLE_KEY", "pk_live_68aXqowUeX574aGsVck8eiIE"
    )

    if user_info(flask.session):
        advantage = AdvantageContracts(
            session,
            flask.session["authentication_token"],
            api_url=flask.current_app.config["CONTRACTS_API_URL"],
        )

        try:
            accounts = advantage.get_accounts()
        except HTTPError as http_error:
            if http_error.response.status_code == 401:
                # We got an unauthorized request, so we likely
                # need to re-login to refresh the macaroon
                flask.current_app.extensions["sentry"].captureException(
                    extra={
                        "session_keys": flask.session.keys(),
                        "request_url": http_error.request.url,
                        "request_headers": http_error.request.headers,
                        "response_headers": http_error.response.headers,
                        "response_body": http_error.response.json(),
                        "response_code": http_error.response.json()["code"],
                        "response_message": http_error.response.json()[
                            "message"
                        ],
                    }
                )

                empty_session(flask.session)

                return flask.render_template("advantage/index.html")

            raise http_error

        for account in accounts:
            account["contracts"] = advantage.get_account_contracts(account)

            for contract in account["contracts"]:
                contract["token"] = advantage.get_contract_token(contract)

                machines = advantage.get_contract_machines(contract).get(
                    "machines"
                )
                contract["machineCount"] = 0

                if machines:
                    contract["machineCount"] = len(machines)

                if contract["contractInfo"].get("origin", "") == "free":
                    personal_account = account
                    personal_account["free_token"] = contract["token"]
                    for entitlement in contract["contractInfo"][
                        "resourceEntitlements"
                    ]:
                        if entitlement["type"] == "esm-infra":
                            entitlements["esm-infra"] = True
                        elif entitlement["type"] == "esm-apps":
                            entitlements["esm-apps"] = True
                        elif entitlement["type"] == "livepatch":
                            entitlements["livepatch"] = True
                        elif entitlement["type"] == "fips":
                            entitlements["fips"] = True
                        elif entitlement["type"] == "cc-eal":
                            entitlements["cc-eal"] = True
                    personal_account["entitlements"] = entitlements
                else:
                    entitlements = {}
                    for entitlement in contract["contractInfo"][
                        "resourceEntitlements"
                    ]:
                        contract["supportLevel"] = "-"
                        if entitlement["type"] == "esm-infra":
                            entitlements["esm-infra"] = True
                        elif entitlement["type"] == "esm-apps":
                            entitlements["esm-apps"] = True
                        elif entitlement["type"] == "livepatch":
                            entitlements["livepatch"] = True
                        elif entitlement["type"] == "fips":
                            entitlements["fips"] = True
                        elif entitlement["type"] == "cc-eal":
                            entitlements["cc-eal"] = True
                        elif entitlement["type"] == "support":
                            contract["supportLevel"] = entitlement[
                                "affordances"
                            ]["supportLevel"]
                    contract["entitlements"] = entitlements
                    created_at = dateutil.parser.parse(
                        contract["contractInfo"]["createdAt"]
                    )
                    contract["contractInfo"][
                        "createdAtFormatted"
                    ] = created_at.strftime("%d %B %Y")
                    contract["contractInfo"]["status"] = "active"

                    if "effectiveTo" in contract["contractInfo"]:
                        effective_to = dateutil.parser.parse(
                            contract["contractInfo"]["effectiveTo"]
                        )
                        contract["contractInfo"][
                            "effectiveToFormatted"
                        ] = effective_to.strftime("%d %B %Y")

                        time_now = datetime.utcnow().replace(tzinfo=pytz.utc)

                        if effective_to < time_now:
                            contract["contractInfo"]["status"] = "expired"
                            contract["contractInfo"][
                                "expired_restart_date"
                            ] = time_now - timedelta(days=1)

                        date_difference = effective_to - time_now
                        contract["expiring"] = date_difference.days <= 30
                        contract["contractInfo"][
                            "daysTillExpiry"
                        ] = date_difference.days

                    contract["renewal"] = make_renewal(
                        advantage, contract["contractInfo"]
                    )

                    enterprise_contract = enterprise_contracts.setdefault(
                        contract["accountInfo"]["name"], []
                    )
                    # If a subscription id is present and this contract
                    # matches add it to the start of the list
                    if contract["contractInfo"]["id"] == open_subscription:
                        enterprise_contract.insert(0, contract)
                    else:
                        enterprise_contract.append(contract)

    return flask.render_template(
        "advantage/index.html",
        accounts=accounts,
        enterprise_contracts=enterprise_contracts,
        personal_account=personal_account,
        open_subscription=open_subscription,
        stripe_publishable_key=stripe_publishable_key,
    )
Ejemplo n.º 5
0
def advantage_shop_view():
    account = previous_purchase_id = None
    is_test_backend = flask.request.args.get("test_backend", False)

    stripe_publishable_key = os.getenv("STRIPE_LIVE_PUBLISHABLE_KEY",
                                       "pk_live_68aXqowUeX574aGsVck8eiIE")
    api_url = flask.current_app.config["CONTRACTS_LIVE_API_URL"]

    if is_test_backend:
        stripe_publishable_key = os.getenv(
            "STRIPE_TEST_PUBLISHABLE_KEY",
            "pk_test_yndN9H0GcJffPe0W58Nm64cM00riYG4N46",
        )
        api_url = flask.current_app.config["CONTRACTS_TEST_API_URL"]

    if user_info(flask.session):
        advantage = AdvantageContracts(
            session,
            flask.session["authentication_token"],
            api_url=api_url,
        )
        if flask.session.get("guest_authentication_token"):
            flask.session.pop("guest_authentication_token")

        try:
            account = advantage.get_purchase_account()
        except HTTPError as err:
            code = err.response.status_code
            if code == 401:
                # We got an unauthorized request, so we likely
                # need to re-login to refresh the macaroon
                flask.current_app.extensions["sentry"].captureException(
                    extra={
                        "session_keys": flask.session.keys(),
                        "request_url": err.request.url,
                        "request_headers": err.request.headers,
                        "response_headers": err.response.headers,
                        "response_body": err.response.json(),
                        "response_code": err.response.json()["code"],
                        "response_message": err.response.json()["message"],
                    })

                empty_session(flask.session)

                return flask.render_template(
                    "advantage/subscribe/index.html",
                    account=None,
                    previous_purchase_id=None,
                    product_listings=[],
                    stripe_publishable_key=stripe_publishable_key,
                    is_test_backend=is_test_backend,
                )
            if code != 404:
                raise
            # There is no purchase account yet for this user.
            # One will need to be created later, but this is an expected
            # condition.
    else:
        advantage = AdvantageContracts(session, None, api_url=api_url)

    if account is not None:
        resp = advantage.get_account_subscriptions_for_marketplace(
            account["id"], "canonical-ua")
        subs = resp.get("subscriptions")
        if subs:
            previous_purchase_id = subs[0].get("lastPurchaseID")

    listings_response = advantage.get_marketplace_product_listings(
        "canonical-ua")
    product_listings = listings_response.get("productListings")
    if not product_listings:
        # For the time being, no product listings means the shop has not been
        # activated, so fallback to shopify. This should become an error later.
        return flask.redirect("https://buy.ubuntu.com/")

    products = {pr["id"]: pr for pr in listings_response["products"]}
    listings = []
    for listing in product_listings:
        if "price" not in listing:
            continue
        listing["product"] = products[listing["productID"]]
        listings.append(listing)

    return flask.render_template(
        "advantage/subscribe/index.html",
        account=account,
        previous_purchase_id=previous_purchase_id,
        product_listings=listings,
        stripe_publishable_key=stripe_publishable_key,
        is_test_backend=is_test_backend,
    )