Merge pull request #14 from ThomasRubini/flask_sessions
This commit is contained in:
commit
b383a4cfbe
@ -15,7 +15,6 @@ test_app = app.test_client()
|
|||||||
class User:
|
class User:
|
||||||
def __init__(self,username):
|
def __init__(self,username):
|
||||||
self.username = username
|
self.username = username
|
||||||
self.jwt = ""
|
|
||||||
self.isAdmin = False
|
self.isAdmin = False
|
||||||
|
|
||||||
def createGame(user:User):
|
def createGame(user:User):
|
||||||
@ -31,7 +30,6 @@ def createGame(user:User):
|
|||||||
if content["status"] != "ok":
|
if content["status"] != "ok":
|
||||||
print(content["status"])
|
print(content["status"])
|
||||||
raise Exception("Status is not ok")
|
raise Exception("Status is not ok")
|
||||||
user.jwt = content["jwt"]
|
|
||||||
user.isAdmin = True
|
user.isAdmin = True
|
||||||
return content["game_id"]
|
return content["game_id"]
|
||||||
|
|
||||||
@ -48,12 +46,10 @@ def joinGame(user:User,game_id:str):
|
|||||||
if content["status"] != "ok":
|
if content["status"] != "ok":
|
||||||
print(content["status"])
|
print(content["status"])
|
||||||
raise Exception("Status is not ok")
|
raise Exception("Status is not ok")
|
||||||
user.jwt = content["jwt"]
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def startGame(user:User):
|
def startGame(user:User):
|
||||||
data = {"jwt":user.jwt}
|
responseObject = test_app.post("/api/v1/startGame")
|
||||||
responseObject = test_app.post("/api/v1/startGame",data=data)
|
|
||||||
if responseObject.status_code != 200:
|
if responseObject.status_code != 200:
|
||||||
print("status code is not 200")
|
print("status code is not 200")
|
||||||
raise Exception("status code is not 200")
|
raise Exception("status code is not 200")
|
||||||
@ -76,7 +72,7 @@ def startGame(user:User):
|
|||||||
#
|
#
|
||||||
# Cette requete api crée une salle de jeu multijoueur dans le serveur, elle
|
# Cette requete api crée une salle de jeu multijoueur dans le serveur, elle
|
||||||
# octroie ensuite les droit de creation de la salle a l'utilisateur dont le
|
# octroie ensuite les droit de creation de la salle a l'utilisateur dont le
|
||||||
# pseudo est donné en parametre post et lui retourne son token jwt"
|
# pseudo est donné en parametre post
|
||||||
|
|
||||||
def test_that_people_can_create_a_game():
|
def test_that_people_can_create_a_game():
|
||||||
user = User("neotaku")
|
user = User("neotaku")
|
||||||
@ -127,8 +123,7 @@ def test_that_username_that_contains_non_alphanumerics_results_in_an_error():
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Cette requete ajoute dans la partie identifié par l'identifiant de jeu
|
# Cette requete ajoute dans la partie identifié par l'identifiant de jeu
|
||||||
# (game_id) l'utilisateur indentifié par son pseudo (username) et lui retourne
|
# (game_id) l'utilisateur indentifié par son pseudo (username)
|
||||||
# son token jwt
|
|
||||||
|
|
||||||
def test_that_people_can_join_a_game():
|
def test_that_people_can_join_a_game():
|
||||||
game_id = createGame(User("neoracle"))
|
game_id = createGame(User("neoracle"))
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import string
|
import string
|
||||||
import random
|
import random
|
||||||
import jwt
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import truthseeker
|
import truthseeker
|
||||||
|
|
||||||
@ -52,28 +51,15 @@ class Game:
|
|||||||
self.owner = None
|
self.owner = None
|
||||||
self.members = []
|
self.members = []
|
||||||
|
|
||||||
def _gen_jwt(self, username, owner):
|
|
||||||
return jwt.encode(
|
|
||||||
payload={
|
|
||||||
"game_type": "multi",
|
|
||||||
"game_id": self.game_id,
|
|
||||||
"username": username,
|
|
||||||
"owner": owner,
|
|
||||||
"exp": datetime.utcnow() + timedelta(hours = 1) # handled automatically on jwt.decode
|
|
||||||
},
|
|
||||||
key=truthseeker.app.config["SECRET_KEY"],
|
|
||||||
algorithm="HS256"
|
|
||||||
)
|
|
||||||
|
|
||||||
def set_owner(self, username):
|
def set_owner(self, username):
|
||||||
self.owner = Member(username)
|
self.owner = Member(username)
|
||||||
self.members.append(self.owner)
|
self.members.append(self.owner)
|
||||||
return self.owner, self._gen_jwt(username, owner=True)
|
return self.owner
|
||||||
|
|
||||||
def add_member(self, username):
|
def add_member(self, username):
|
||||||
member = Member(username)
|
member = Member(username)
|
||||||
self.members.append(member)
|
self.members.append(member)
|
||||||
return member, self._gen_jwt(username, owner=False)
|
return member
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return "Game[game_id={}, owner={}, members={}]".format(self.game_id, self.owner, self.members)
|
return "Game[game_id={}, owner={}, members={}]".format(self.game_id, self.owner, self.members)
|
||||||
@ -81,7 +67,7 @@ class Game:
|
|||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return self.__str__()
|
return self.__str__()
|
||||||
|
|
||||||
def create_game():
|
def create_game(owner):
|
||||||
"""
|
"""
|
||||||
This function creates a new game by creating a Game object and stores
|
This function creates a new game by creating a Game object and stores
|
||||||
it into the games_list dictionnary
|
it into the games_list dictionnary
|
||||||
@ -90,8 +76,9 @@ def create_game():
|
|||||||
: return type : Game
|
: return type : Game
|
||||||
"""
|
"""
|
||||||
game = Game()
|
game = Game()
|
||||||
|
game.owner = owner
|
||||||
|
game.members.append(Member(owner))
|
||||||
game.game_id = random_string(6)
|
game.game_id = random_string(6)
|
||||||
game.start_token = random_string(64)
|
|
||||||
games_list[game.game_id] = game
|
games_list[game.game_id] = game
|
||||||
#TODO ADD A WEBSOCKET IF THE GAME IS KNOWN TO BE MULTIPLAYER
|
#TODO ADD A WEBSOCKET IF THE GAME IS KNOWN TO BE MULTIPLAYER
|
||||||
return game
|
return game
|
||||||
|
@ -1,34 +1,11 @@
|
|||||||
import flask
|
import flask
|
||||||
import jwt
|
|
||||||
|
|
||||||
import truthseeker
|
import truthseeker
|
||||||
from truthseeker.logic import game_logic
|
from truthseeker.logic import game_logic
|
||||||
from functools import wraps
|
|
||||||
|
|
||||||
|
|
||||||
routes_api = flask.Blueprint("api", __name__)
|
routes_api = flask.Blueprint("api", __name__)
|
||||||
|
|
||||||
# Auth decorator
|
|
||||||
def jwt_required(f):
|
|
||||||
@wraps(f)
|
|
||||||
def decorator(*args, **kwargs):
|
|
||||||
jwt_str = flask.request.values.get("jwt")
|
|
||||||
if not jwt_str:
|
|
||||||
return {"status": "Error, JWT token missing"}
|
|
||||||
|
|
||||||
try:
|
|
||||||
claims = jwt.decode(jwt_str, truthseeker.app.config['SECRET_KEY'], algorithms=['HS256'])
|
|
||||||
except jwt.exceptions.InvalidTokenError as e:
|
|
||||||
print("Caught exception while decoding JWT token :", e)
|
|
||||||
return {"status": "Error, invalid JWT"}
|
|
||||||
|
|
||||||
return f(claims, *args, **kwargs)
|
|
||||||
return decorator
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@routes_api.route("/createGame", methods=["GET", "POST"])
|
@routes_api.route("/createGame", methods=["GET", "POST"])
|
||||||
def create_game():
|
def create_game():
|
||||||
username = flask.request.values.get("username")
|
username = flask.request.values.get("username")
|
||||||
@ -38,10 +15,13 @@ def create_game():
|
|||||||
|
|
||||||
response = {}
|
response = {}
|
||||||
response["status"] = "ok"
|
response["status"] = "ok"
|
||||||
game = game_logic.create_game()
|
game = game_logic.create_game(owner=username)
|
||||||
response["game_id"] = game.game_id
|
response["game_id"] = game.game_id
|
||||||
owner, owner_jwt = game.set_owner(username=username)
|
|
||||||
response["jwt"] = owner_jwt
|
flask.session["game_id"] = game.game_id
|
||||||
|
flask.session["is_owner"] = True
|
||||||
|
flask.session["username"] = username
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@routes_api.route("/joinGame", methods=["GET", "POST"])
|
@routes_api.route("/joinGame", methods=["GET", "POST"])
|
||||||
@ -55,11 +35,15 @@ def join_game():
|
|||||||
if game == None:
|
if game == None:
|
||||||
return {"status": "error, game does not exist"}
|
return {"status": "error, game does not exist"}
|
||||||
|
|
||||||
member, member_jwt = game.add_member(username)
|
|
||||||
|
game.add_member(username)
|
||||||
|
|
||||||
|
flask.session["game_id"] = game.game_id
|
||||||
|
flask.session["is_owner"] = False
|
||||||
|
flask.session["username"] = username
|
||||||
|
|
||||||
response = {}
|
response = {}
|
||||||
response["status"] = "ok"
|
response["status"] = "ok"
|
||||||
response["jwt"] = member_jwt
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@routes_api.route("/getGameInfo", methods=["GET", "POST"])
|
@routes_api.route("/getGameInfo", methods=["GET", "POST"])
|
||||||
@ -80,12 +64,12 @@ def get_game_info(): # DEPRECATED, SHOULD BE REMOVED
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
@routes_api.route("/startGame", methods=["GET", "POST"])
|
@routes_api.route("/startGame", methods=["GET", "POST"])
|
||||||
@jwt_required
|
def start_game():
|
||||||
def start_game(claims):
|
if not flask.session:
|
||||||
if not claims["owner"]:
|
return {"status": "No session"}
|
||||||
|
if not flask.session["is_owner"]:
|
||||||
return {"status": "Error, you are not the owner of this game"}
|
return {"status": "Error, you are not the owner of this game"}
|
||||||
|
if game_logic.get_game(flask.session["game_id"]) == None:
|
||||||
if game_logic.get_game(claims["game_id"]) == None:
|
|
||||||
return {"status": "Error, this game doesn't exist"}
|
return {"status": "Error, this game doesn't exist"}
|
||||||
|
|
||||||
return {"status": "ok"}
|
return {"status": "ok"}
|
||||||
|
Loading…
Reference in New Issue
Block a user