Ejemplo n.º 1
0
def supplement_user(user: User, subscription: Subscription):
    user.user_id = create_user_id_from_email(user.email)

    client_id, client_secret = create_secret()
    user.user_metadata.client_id = subscription.client_id or client_id
    user.user_metadata.client_secret = subscription.client_secret or client_secret
    user.password = util.generate_temp_password()

    return user
Ejemplo n.º 2
0
    def add_subscription(self,
                         service_id: str,
                         subscription: Subscription,
                         token: str,
                         prefer: str = "resolution=merge-duplicates"):
        user_id = util.create_user_id_from_email(subscription.email)
        user = self._get_user(user_id=user_id, raising=False, token=token)
        new_user = False
        if user is None:
            new_user = True
            user = User()
            user.user_id = util.create_user_id_from_email(subscription.email)
            user.username = util.create_user_id_from_email(subscription.email)
            user.email = subscription.email
            user.first_name = subscription.first_name
            user.last_name = subscription.last_name
            user.user_metadata = UserUserMetadata(subscriptions={})
            user = users.supplement_user(user=user, subscription=subscription)
            user.blocked = False
            user.email_verified = True
            user.connection = "Username-Password-Xcube"

        if user.app_metadata is None:
            user.app_metadata = UserAppMetadata()

        subscription.subscription_id = user.username
        subscription.client_id = subscription.client_id or user.user_metadata.client_id
        subscription.client_secret = subscription.client_secret or user.user_metadata.client_secret
        if subscription.start_date is None:
            subscription.start_date = datetime.datetime.now().strftime(
                "%Y-%m-%d")

        # EOX requires idempotent adding. However, we should think about reintroducing that as returning 409 would
        # if service_id in user.user_metadata.subscriptions:
        #     raise api.ApiError(409, f"The subscription {subscription.subscription_id} exists for service {service_id}.")

        role_id = None
        if service_id == "xcube_geodb":
            role_id_manage = util.maybe_raise_for_env(
                "GEODB_AUTH_ROLE_ID_MANAGE")
            role_id_free = util.maybe_raise_for_env("GEODB_AUTH_ROLE_ID_FREE")
            role_id_user = util.maybe_raise_for_env("GEODB_AUTH_ROLE_ID_USER")

            if subscription.unit != "cells":
                raise api.ApiError(400, "Wrong unit for a geodb subscription")

            if subscription.plan == "manage":
                role_id = role_id_manage
            elif subscription.plan == "freetrial":
                role_id = role_id_free
            else:
                role_id = role_id_user

            user.app_metadata = UserAppMetadata(geodb_role="geodb_" +
                                                subscription.guid)
            geodb.register(subscription=subscription, raise_on_exist=False)
            roles = {"roles": [role_id_manage, role_id_free, role_id_user]}

            requests.delete(
                f"https://{self._domain}/users/auth0|{user_id}/roles",
                json=roles,
                headers=self._get_header(token=token))

        if service_id == "xcube_gen":
            if subscription.unit != "punits":
                raise api.ApiError(400,
                                   "Wrong unit for a xcube gen subscription")

            role_id = util.maybe_raise_for_env("XCUBE_GEN_ROLE_ID")
            try:
                punits.override_punits(
                    user_id=user.email,
                    punits_request=dict(punits=dict(
                        total_count=int(subscription.units))))
            except (DatabaseError, ClientError) as e:
                raise api.ApiError(400, str(e))

        if service_id == "xcube_geoserv":
            role_id = util.maybe_raise_for_env("XCUBE_GEOSERV_ID")

        subscription.role = role_id

        if new_user:
            user.user_metadata.subscriptions[service_id] = subscription
            user_dict = get_request_body_from_user(user)
            r = requests.post(f"https://{self._domain}/users",
                              json=user_dict,
                              headers=self._get_header(token=token))
        else:
            user.user_metadata.subscriptions[service_id] = subscription
            user_dict = dict(user_metadata=user.user_metadata.to_dict(),
                             app_metadata=user.app_metadata.to_dict())
            r = requests.patch(f"https://{self._domain}/users/auth0|{user_id}",
                               json=user_dict,
                               headers=self._get_header(token=token))

        with open('debug.txt', 'a') as f:
            f.write('__________________________________\n\n')
            f.write(json.dumps(self._get_header(token=token)) + '\n\n')
            f.write(self._domain + '\n\n')
            f.write('\n\n')

        try:
            r.raise_for_status()
        except HTTPError as e:
            raise api.ApiError(r.status_code, str(e))

        if new_user:
            role = {"roles": [role_id]}
            r = requests.post(
                f"https://{self._domain}/users/auth0|{user_id}/roles",
                json=role,
                headers=self._get_header(token=token))
        else:
            role = {"roles": [role_id]}
            r = requests.post(
                f"https://{self._domain}/users/auth0|{user_id}/roles",
                json=role,
                headers=self._get_header(token=token))

        try:
            r.raise_for_status()
        except HTTPError as e:
            raise api.ApiError(r.status_code, str(e))

        return subscription