Esempio n. 1
0
    def _login_app_user(cls, user_data):
        user = UserDatabaseClient.get_user_by_email(user_data.email)

        if user:
            try:
                if hashing.verify(user_data.password, user.password):
                    cls.logger().debug(f"Generating token for user {user.id}")
                    user.token = Authenticator.generate(
                        user.id, user_data.password)
                    user.online = True
                    UserDatabaseClient.update_user(user)
                    DatabaseClient.commit()
                    cls.logger().info(f"User #{user.id} logged in")
                    headers = {"auth_token": user.token}
                    return SuccessfulUserResponse(user, headers)
                else:
                    cls.logger().info(
                        f"Wrong credentials while attempting to log in user #{user_data.email}"
                    )
                    return SuccessfulUserMessageResponse(
                        "Wrong email or password.",
                        UserResponseStatus.WRONG_CREDENTIALS.value)
            except ValueError:
                cls.logger().info(
                    f"Wrong credentials while attempting to log in user #{user_data.email}"
                )
                return SuccessfulUserMessageResponse(
                    "Wrong email or password.",
                    UserResponseStatus.WRONG_CREDENTIALS.value)
        else:
            cls.logger().info(f"User #{user_data.email} not found.")
            raise UserNotFoundError("User not found.",
                                    UserResponseStatus.USER_NOT_FOUND.value)
Esempio n. 2
0
 def set_user_offline(cls, user_data):
     user = Authenticator.authenticate(user_data)
     user.online = False
     UserDatabaseClient.update_user(user)
     DatabaseClient.commit()
     cls.logger().info(f"User #{user.id} set offline.")
     return SuccessfulUserResponse(user)
Esempio n. 3
0
 def logout_user(cls, user_data):
     user = Authenticator.authenticate(user_data)
     user.token = None
     user.online = False
     UserDatabaseClient.update_user(user)
     DatabaseClient.commit()
     cls.logger().info(f"User #{user.id} logged out.")
     return SuccessfulUserMessageResponse(
         "User logged out.", UserResponseStatus.LOGGED_OUT.value)
Esempio n. 4
0
    def update_user(cls, update_data):
        user = Authenticator.authenticate(update_data)

        user.username = \
            update_data.updated_user["username"] if "username" in update_data.updated_user else user.username
        user.email = \
            update_data.updated_user["email"] if "email" in update_data.updated_user else user.email
        user.password = \
            hashing.hash(
                update_data.updated_user["password"]) if "password" in update_data.updated_user else user.password
        user.first_name = \
            update_data.updated_user["first_name"] if "first_name" in update_data.updated_user else user.first_name
        user.last_name = \
            update_data.updated_user["last_name"] if "last_name" in update_data.updated_user else user.last_name
        user.profile_pic = \
            update_data.updated_user["profile_pic"] if "profile_pic" in update_data.updated_user else user.profile_pic

        try:
            UserDatabaseClient.update_user(user)
            DatabaseClient.commit()
            cls.logger().info(f"User {user.id} information updated.")
            return SuccessfulUserResponse(user)
        except IntegrityError:
            DatabaseClient.rollback()
            new_username = update_data.updated_user.get("username")
            new_email = update_data.updated_user.get("email")

            if UserDatabaseClient.get_user_by_username(
                    new_username) is not None:
                cls.logger().info(
                    f"Name {new_email} is taken for another user.")
                return BadRequestUserMessageResponse(
                    f"Name {new_username} is already in use!",
                    UserResponseStatus.ALREADY_REGISTERED.value)
            elif UserDatabaseClient.get_user_by_email(new_email) is not None:
                cls.logger().info(
                    f"Email {new_email} is taken for another user.")
                return BadRequestUserMessageResponse(
                    f"Email {new_email} is already in use!",
                    UserResponseStatus.ALREADY_REGISTERED.value)
            else:
                cls.logger().error(
                    f"Couldn't update user {user.id} information.")
                return UnsuccessfulClientResponse(
                    "Couldn't update user information!")
Esempio n. 5
0
    def _login_facebook_user(cls, user_data):
        try:
            facebook_user = FacebookService.get_user_from_facebook(user_data)
            user = UserDatabaseClient.get_user_by_facebook_id(
                facebook_user.facebook_id)

            if user is not None:
                cls.logger().info(
                    f"Logging in Facebook user with Facebook ID #{facebook_user.facebook_id}."
                )
                cls.logger().debug(f"Generating token for user {user.id}")
                user.token = Authenticator.generate(user.id)
                user.online = True
                UserDatabaseClient.update_user(user)
                DatabaseClient.commit()
                cls.logger().info(f"User #{user.id} logged in.")
                headers = {"auth_token": user.token}
                return SuccessfulUserResponse(user, headers)
            else:
                cls.logger().info(
                    f"Creating new Facebook user with Facebook ID #{facebook_user.facebook_id}."
                )
                new_client = UserDatabaseClient.add_client()
                new_user = User(user_id=new_client.id,
                                facebook_id=facebook_user.facebook_id,
                                username=facebook_user.username,
                                email=facebook_user.email,
                                first_name=facebook_user.first_name,
                                last_name=facebook_user.last_name,
                                profile_pic=facebook_user.profile_pic,
                                role=UserRoles.USER.value,
                                token=Authenticator.generate(new_client.id))
                UserDatabaseClient.add_user(new_user)
                DatabaseClient.commit()
                cls.logger().info(f"User #{new_client.id} logged in.")
                headers = {"auth_token": new_user.token}
                return SuccessfulUserResponse(new_user, headers)
        except FacebookWrongTokenError:
            cls.logger().info(
                f"Failing to logging in user with Facebook token #{user_data.facebook_token}."
            )
            return UnsuccessfulClientResponse("Couldn't perform login.")
Esempio n. 6
0
    def regenerate_token(cls, regenerate_data):
        user = UserDatabaseClient.get_user_by_email(regenerate_data.email)

        if user:
            password_recovery = UserDatabaseClient.get_password_recovery_by_id(
                user.id)

            if password_recovery:
                try:
                    UserDatabaseClient.delete_password_recovery(
                        password_recovery)
                    cls.logger().debug(
                        f"Deleting token recover entry for user {user.id}")
                    user.token = Authenticator.generate(user.id)
                    cls.logger().debug(
                        f"Regenerating token for user {user.id}")
                    user.online = True
                    UserDatabaseClient.update_user(user)
                    DatabaseClient.commit()
                    cls.logger().info(f"Logging in user {user.id}")
                    headers = {"auth_token": user.token}
                    return SuccessfulUserResponse(user, headers)
                except IntegrityError:
                    DatabaseClient.rollback()
                    cls.logger().error(
                        f"Couldn't regenerate token for user #{user.id}.")
                    return UnsuccessfulClientResponse(
                        "Couldn't regenerate token.")
            else:
                cls.logger().info(
                    f"Attempting to recover password for user #{user.id} with no password recovery token."
                )
                return BadRequestUserMessageResponse(
                    "You haven't ask for password recovery!",
                    UserResponseStatus.WRONG_CREDENTIALS.value)
        else:
            cls.logger().info(f"User {regenerate_data.email} not found.")
            raise UserNotFoundError("User not found.",
                                    UserResponseStatus.USER_NOT_FOUND.value)