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()
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()
def create_game_session(sio: ServerApp, session_name: str): current_user = sio.get_current_user() with database.db.atomic(): new_session = GameSession.create( name=session_name, password=None, creator=current_user, ) GameSessionPreset.create( session=new_session, row=0, preset=json.dumps(PresetManager(None).default_preset.as_json)) membership = GameSessionMembership.create(user=sio.get_current_user(), session=new_session, row=0, admin=True) sio.join_game_session(membership) return new_session.create_session_entry()
def join_game_session(sio: ServerApp, session_id: int, password: Optional[str]): session = GameSession.get_by_id(session_id) if session.password is not None: if password is None or _hash_password(password) != session.password: raise WrongPassword() elif password is not None: raise WrongPassword() membership = GameSessionMembership.get_or_create( user=sio.get_current_user(), session=session, defaults={ "row": None, "admin": False })[0] _emit_session_update(session) sio.join_game_session(membership) return session.create_session_entry()