Ejemplo n.º 1
0
def test_login_with_guest(flask_app, clean_database, mocker):
    # Setup
    mocker.patch("randovania.server.user_session._get_now",
                 return_value=datetime.datetime(year=2020, month=9, day=4))
    mock_create_session = mocker.patch(
        "randovania.server.user_session._create_client_side_session",
        autospec=True)
    enc_request = b"encrypted stuff"

    sio = MagicMock()
    sio.guest_encrypt.decrypt.return_value = json.dumps({
        "name":
        "Someone",
        "date":
        '2020-09-05T17:12:09.941661',
    }).encode("utf-8")

    with flask_app.test_request_context():
        flask.request.sid = 7890
        result = user_session.login_with_guest(sio, enc_request)

    # Assert
    sio.guest_encrypt.decrypt.assert_called_once_with(enc_request)
    user: User = User.get_by_id(1)
    assert user.name == "Guest: Someone"

    mock_create_session.assert_called_once_with(sio, user)
    assert result is mock_create_session.return_value
Ejemplo n.º 2
0
 def get_current_user(self) -> User:
     try:
         return User.get_by_id(self.get_session()["user-id"])
     except KeyError:
         raise NotLoggedIn()
     except peewee.DoesNotExist:
         raise InvalidSession()
Ejemplo n.º 3
0
def restore_user_session(sio: ServerApp, encrypted_session: bytes,
                         session_id: Optional[int]):
    try:
        decrypted_session: bytes = sio.fernet_encrypt.decrypt(
            encrypted_session)
        session = json.loads(decrypted_session.decode("utf-8"))

        if "discord-access-token" in session:
            user, result = _create_session_with_discord_token(
                sio, session["discord-access-token"])
        else:
            user = User.get_by_id(session["user-id"])
            sio.save_session(session)
            result = _create_client_side_session(sio, user)

        if session_id is not None:
            sio.join_game_session(
                GameSessionMembership.get_by_ids(user.id, session_id))

        return result

    except UserNotAuthorized:
        raise

    except (KeyError, peewee.DoesNotExist, json.JSONDecodeError,
            InvalidTokenError) as e:
        # InvalidTokenError: discord token expired and couldn't renew
        logger().info("Client at %s was unable to restore session: (%s) %s",
                      sio.current_client_ip(), str(type(e)), str(e))
        raise InvalidSession()

    except Exception:
        logger().exception("Error decoding user session")
        raise InvalidSession()
Ejemplo n.º 4
0
def _create_client_side_session(sio: ServerApp, user: Optional[User]) -> dict:
    """

    :param user: If the session's user was already retrieved, pass it along to avoid an extra query.
    :return:
    """
    session = sio.get_session()
    encrypted_session = sio.fernet_encrypt.encrypt(
        json.dumps(session).encode("utf-8"))
    if user is None:
        user = User.get_by_id(session["user-id"])
    elif user.id != session["user-id"]:
        raise RuntimeError(f"Provided user does not match the session's user")

    logger().info(
        f"Client at {sio.current_client_ip()} is user {user.name} ({user.id})."
    )

    return {
        "user":
        user.as_json,
        "sessions": [
            membership.session.create_list_entry()
            for membership in GameSessionMembership.select().where(
                GameSessionMembership.user == user)
        ],
        "encoded_session_b85":
        base64.b85encode(encrypted_session),
    }
Ejemplo n.º 5
0
def restore_user_session(sio: ServerApp, encrypted_session: bytes,
                         session_id: Optional[int]):
    try:
        decrypted_session: bytes = sio.fernet_encrypt.decrypt(
            encrypted_session)
        session = json.loads(decrypted_session.decode("utf-8"))

        user = User.get_by_id(session["user-id"])

        if "discord-access-token" in session:
            # TODO: test if the discord access token is still valid
            flask.session["DISCORD_OAUTH2_TOKEN"] = session[
                "discord-access-token"]
        sio.get_server().save_session(flask.request.sid, session)

        if session_id is not None:
            sio.join_game_session(
                GameSessionMembership.get_by_ids(user.id, session_id))

        return _create_client_side_session(sio, user)

    except (KeyError, peewee.DoesNotExist, json.JSONDecodeError):
        raise InvalidSession()

    except Exception:
        logger().exception("Error decoding user session")
        raise InvalidSession()