def login_with_guest(sio: ServerApp, encrypted_login_request: bytes): if sio.guest_encrypt is None: raise NotAuthorizedForAction() try: login_request_bytes = sio.guest_encrypt.decrypt(encrypted_login_request) except cryptography.fernet.InvalidToken: raise NotAuthorizedForAction() try: login_request = json.loads(login_request_bytes.decode("utf-8")) name = login_request["name"] date = datetime.datetime.fromisoformat(login_request["date"]) except (UnicodeDecodeError, json.JSONDecodeError, KeyError, ValueError) as e: raise InvalidAction(str(e)) if _get_now() - date > datetime.timedelta(days=1): raise NotAuthorizedForAction() user: User = User.create(name=f"Guest: {name}") with sio.session() as session: session["user-id"] = user.id return _create_client_side_session(sio, user)
def login_with_discord(sio: ServerApp, code: str): oauth = OAuth2Session( client_id=sio.app.config["DISCORD_CLIENT_ID"], scope=["identify"], redirect_uri=sio.app.config["DISCORD_REDIRECT_URI"], ) access_token = oauth.fetch_token( "https://discord.com/api/oauth2/token", code=code, client_secret=sio.app.config["DISCORD_CLIENT_SECRET"], ) flask.session["DISCORD_OAUTH2_TOKEN"] = access_token discord_user = sio.discord.fetch_user() user: User = User.get_or_create(discord_id=discord_user.id, defaults={"name": discord_user.name})[0] if user.name != discord_user.name: user.name = discord_user.name user.save() with sio.session() as session: session["user-id"] = user.id session["discord-access-token"] = access_token return _create_client_side_session(sio, user)
def logout(sio: ServerApp): sio.leave_game_session() flask.session.pop("DISCORD_OAUTH2_TOKEN", None) with sio.session() as session: session.pop("discord-access-token", None) session.pop("user-id", None) _emit_user_session_update(sio)
def _create_session_with_discord_token(sio: ServerApp, access_token: str) -> Tuple[User, dict]: flask.session["DISCORD_OAUTH2_TOKEN"] = access_token discord_user = sio.discord.fetch_user() user: User = User.get_or_create(discord_id=discord_user.id, defaults={"name": discord_user.name})[0] if user.name != discord_user.name: user.name = discord_user.name user.save() if sio.enforce_role is not None: if not sio.enforce_role.verify_user(discord_user.id): logger().info( "User %s is not authorized for connecting to the server", discord_user.name) raise UserNotAuthorized() with sio.session() as session: session["user-id"] = user.id session["discord-access-token"] = access_token return user, _create_client_side_session(sio, user)