From 8ead51062715594c28747aa5be7a228218f9731c Mon Sep 17 00:00:00 2001 From: tomoron Date: Thu, 22 Aug 2024 20:37:48 +0200 Subject: [PATCH] start convertion to channels websocket and start using django sessions --- .../requirements/djangoserver/Dockerfile | 7 +- .../djangoserver/file/server/server/asgi.py | 3 +- .../file/server/server/settings.py | 7 ++ .../file/server/server}/typeRequets/.DS_Store | Bin .../server/typeRequets/createAccount.py | 75 ++++++++++++ .../typeRequets/getPrivateListMessage.py | 69 +++++++++++ .../server/typeRequets/getPrivateListUser.py | 60 ++++++++++ .../file/server/server/typeRequets/login.py | 110 ++++++++++++++++++ .../server}/typeRequets/login42/.DS_Store | Bin .../server/typeRequets/login42/login42.py | 72 ++++++++++++ .../server/typeRequets/sendPrivateMessage.py | 35 ++++++ .../djangoserver/file/server/server/views.py | 4 + .../file/server/server/websocket.py | 109 ++++++++++++++++- .../file/server/server/ws}/Class/.DS_Store | Bin .../file/server/server/ws}/Class/User.py | 4 +- .../file/server/server/ws}/main.py | 10 +- .../server/server/ws/typeRequets}/.DS_Store | Bin 6148 -> 6148 bytes .../server/ws}/typeRequets/createAccount.py | 0 .../ws}/typeRequets/getPrivateListMessage.py | 0 .../ws}/typeRequets/getPrivateListUser.py | 0 .../server/server/ws}/typeRequets/login.py | 0 .../server/ws/typeRequets/login42/.DS_Store | Bin 0 -> 6148 bytes .../server/ws}/typeRequets/login42/login42.py | 0 .../ws}/typeRequets/sendPrivateMessage.py | 0 24 files changed, 549 insertions(+), 16 deletions(-) rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server}/typeRequets/.DS_Store (100%) create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequets/createAccount.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequets/getPrivateListMessage.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequets/getPrivateListUser.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequets/login.py rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server}/typeRequets/login42/.DS_Store (100%) create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequets/login42/login42.py create mode 100644 docker-compose/requirements/djangoserver/file/server/server/typeRequets/sendPrivateMessage.py rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws}/Class/.DS_Store (100%) rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws}/Class/User.py (97%) rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws}/main.py (90%) rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws/typeRequets}/.DS_Store (81%) rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws}/typeRequets/createAccount.py (100%) rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws}/typeRequets/getPrivateListMessage.py (100%) rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws}/typeRequets/getPrivateListUser.py (100%) rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws}/typeRequets/login.py (100%) create mode 100644 docker-compose/requirements/djangoserver/file/server/server/ws/typeRequets/login42/.DS_Store rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws}/typeRequets/login42/login42.py (100%) rename {websocket-server => docker-compose/requirements/djangoserver/file/server/server/ws}/typeRequets/sendPrivateMessage.py (100%) diff --git a/docker-compose/requirements/djangoserver/Dockerfile b/docker-compose/requirements/djangoserver/Dockerfile index b37a9d2..3e2c7d7 100644 --- a/docker-compose/requirements/djangoserver/Dockerfile +++ b/docker-compose/requirements/djangoserver/Dockerfile @@ -4,14 +4,19 @@ RUN apt update RUN apt upgrade -y RUN apt install -y python3 python3-pip postgresql-client -RUN pip3 install django psycopg "channels[daphne]" +RUN pip3 install requests django psycopg "channels[daphne]" ARG DB_HOST=; ARG DB_NAME=; ARG DB_USERNAME=; ARG DB_PASSWORD=; +ARG SECRET_42=; +ARG SECRET_42=; ENV DB_HOST=${DB_HOST} +ENV PYTHONUNBUFFERED=1 +ENV UID_42=${UID_42} +ENV SECRET_42=${SECRET_42} RUN mkdir -p /var/www/djangoserver/ RUN mkdir -p /var/www/djangoserver/static/ diff --git a/docker-compose/requirements/djangoserver/file/server/server/asgi.py b/docker-compose/requirements/djangoserver/file/server/server/asgi.py index 351ed8c..e424ae7 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/asgi.py +++ b/docker-compose/requirements/djangoserver/file/server/server/asgi.py @@ -12,6 +12,7 @@ import os from channels.routing import ProtocolTypeRouter, URLRouter from django.urls import path from django.core.asgi import get_asgi_application +from channels.sessions import SessionMiddlewareStack from .websocket import WebsocketHandler @@ -21,5 +22,5 @@ django = get_asgi_application() application = ProtocolTypeRouter({ "http": django, - "websocket":URLRouter({path("ws",WebsocketHandler.as_asgi())}) + "websocket":SessionMiddlewareStack(URLRouter({path("ws",WebsocketHandler.as_asgi())})) }) diff --git a/docker-compose/requirements/djangoserver/file/server/server/settings.py b/docker-compose/requirements/djangoserver/file/server/server/settings.py index aa06a99..413abc0 100644 --- a/docker-compose/requirements/djangoserver/file/server/server/settings.py +++ b/docker-compose/requirements/djangoserver/file/server/server/settings.py @@ -129,3 +129,10 @@ STATIC_URL = 'static/' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' ASGI_APPLICATION = 'server.asgi.applicatio' +SESSION_SAVE_EVERY_REQUEST = True +SESSION_COOKIE_NAME = 'sessionid' +SESSION_COOKIE_SECURE = False +SESSION_COOKIE_HTTPONLY = True +SESSION_COOKIE_SAMESITE = 'Lax' +SESSION_EXPIRE_AT_BROWSER_CLOSE = False + diff --git a/websocket-server/typeRequets/.DS_Store b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/.DS_Store similarity index 100% rename from websocket-server/typeRequets/.DS_Store rename to docker-compose/requirements/djangoserver/file/server/server/typeRequets/.DS_Store diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequets/createAccount.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/createAccount.py new file mode 100644 index 0000000..741b34a --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/createAccount.py @@ -0,0 +1,75 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# createAccount.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: edbernar 20): + await socket.sendError("Username must be at most 20 characters long", 9009) + return + if (content["username"].find(' ') != -1): + await socket.sendError("Username must not contain spaces", 9011) + return + if (content["username"].isalnum() == False): + await socket.sendError("Username must contain only letters and numbers", 9012) + return + if (len(content["password"]) < 8): + await socket.sendError("Password must be at least 8 characters long", 9013) + return + if (bool(re.match(pattern, content["password"]))): + await socket.sendError("Password must contain at least one lowercase letter, one uppercase letter and one special character", 9014) + return + if (content["password"].find(content["username"]) != -1): + await socket.sendError("Password must not contain the username", 9015) + return + # |Tom| Au lieu d'utiliser userList, faire une requête à la base de donnée pour savoir si on a un utilisateur avec cet email ou cet username + if (content["mail"] in userList): + await socket.sendError("Mail already used", 9016) + return + if (content["username"] in userList): + await socket.sendError("Username already used", 9017) + return + content["token"] = generateToken() + while (True): + content["id"] = random.randint(1000000, 9999999) + if (content["id"] not in userList): + break + userList.append(content) + await socket.send({"type": "create_account", "content": "Account created"}) + except Exception as e: + await socket.sendError("Error create account", 9005, e) + +def generateToken(): + list = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + token = "" + + for i in range(0, 35): + token += list[random.randint(0, len(list) - 1)] + return token diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequets/getPrivateListMessage.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/getPrivateListMessage.py new file mode 100644 index 0000000..b0adbdf --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/getPrivateListMessage.py @@ -0,0 +1,69 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# getPrivateListMessage.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: edbernar +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/08/03 15:10:23 by edbernar #+# #+# # +# Updated: 2024/08/22 19:13:09 by tomoron ### ########.fr # +# # +# **************************************************************************** # + +import asyncio +import json + +data = [ + { + "name": "Nessundorma", + "status": "online", + "pfp": "https://wallpapers-clan.com/wp-content/uploads/2023/05/cool-pfp-02.jpg", + "id": 145564 + }, + { + "name": "Succotash", + "status": "offline", + "pfp": "https://i.pinimg.com/200x/28/75/96/287596f98304bf1adc2c411619ae8fef.jpg", + "id": 256981 + }, + { + "name": "Astropower", + "status": "online", + "pfp": "https://ashisheditz.com/wp-content/uploads/2024/03/cool-anime-pfp-demon-slayer-HD.jpg", + "id": 301547 + }, + { + "name": "Assaultive", + "status": "offline", + "pfp": "https://i1.sndcdn.com/artworks-1Li0JIJrQGlojD3y-AEiNkw-t500x500.jpg", + "id": 432448 + }, + { + "name": "Redshock", + "status": "offline", + "pfp": "https://cdn.pfps.gg/pfps/7094-boy-pfp.png", + "id": 543211 + }, + { + "name": "Parley", + "status": "offline", + "pfp": "https://pbs.twimg.com/media/EscE6ckU0AA-Uhe.png", + "id": 654123 + } +] + +async def getPrivateListUser(socket, content=None): + # |TOM| Faire une requête à la base de données pour récupérer la liste des + # utilisateurs qui doivent apparaitre dans la liste du chat privé + # (ceux qui ont eu conversation avec l'utilisateur) + # Si user existe pas, faire ça : await socket.sendError("User not found", 9008) + await socket.send({"type": "private_list_user", "content": data}) diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequets/login.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/login.py new file mode 100644 index 0000000..54af3d8 --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/login.py @@ -0,0 +1,110 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# login.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: edbernar {"type" : "login", "content" : {"username": "". "token": "", "id": 0}} + +userList = [ + { + "username": "Eddy", + "token": "54dsadw8f4a6w5f4a62s4f984fa62f4as65", + "mail": "aaaaa", + "password": "ed968e840d10d2d313a870bc131a4e2c311d7ad09bdf32b3418147221f51a6e2", # not hashed : aaaaa + "id": 2135421, + "id42": -1 + }, + { + "username": "Hugo", + "token": "dsa4d6sa4sa1hfd1jhgk6g4k21bn65m4nb4", + "mail": "bbbbb", + "password": "bbbbb", + "id": 9892154, + "id42": -1 + }, + { + "username": "Mathis", + "token": "8cb1qjlfndc12mn2l1mn654xzkkhad54cxz", + "mail": "ccccc", + "password": "6304fbfe2b22557c34c42a70056616786a733b3d09fb326308c813d6ab712ec0", # not hashed : ccccc + "id": 2371234, + "id42": -1 + }, + { + "username": "Tom", + "token": "poiuygfvbdsv5c21vcxvcxhgbjqnkmds546", + "mail": "ddddd", + "password": "ddddd", + "id": 6423457, + "id42": -1 + } +] + +async def loginByToken(socket, content): + # |TOM| Requete pour savoir si le token est valide + for user in userList: + if (user["token"] == content["token"]): + jsonVar = {"type": "login", "content": {"username": user["username"], "token": user["token"], "id": user["id"]}} + socket.username = jsonVar["content"]["username"] + socket.token = jsonVar["content"]["token"] + socket.id = jsonVar["content"]["id"] + await socket.send(jsonVar) + return + jsonVar = {"type": "error", "content": "Invalid token", "code": 9001} + await socket.send(json.dumps(jsonVar)) + +async def loginByPass(socket, content): + # |TOM| Requete pour savoir si le mail et le mot de passe sont valides + # et créer un token si celui-ci n'existe pas + for user in userList: + if (user["mail"] == content["mail"] and user["password"] == content["password"]): + jsonVar = {"type": "login", "content": {"username": user["username"], "token": user["token"], "id": user["id"]}} + socket.username = jsonVar["content"]["username"] + socket.token = jsonVar["content"]["token"] + socket.id = jsonVar["content"]["id"] + await socket.send(jsonVar) + return + await socket.send({"type": "error", "content": "Invalid username or password", "code": 9007}) + + + +async def loginBy42(socket, content): + # |TOM| Requete pour récuperer les informations de l'utilisateur selon l'intra de la personne + # et créer un token si celui-ci n'existe pas + try: + await main42login(socket, content, userList) + except Exception as e: + await socket.sendError("Invalid 42 token", 9010, e) + +async def login(socket, content): + # |TOM| Faire 3 types de requêtes: + # - byToken: Récupérer les informations de l'utilisateur en fonction de son token + # - byPass: Récupérer les informations de l'utilisateur en fonction de mail et de son mot de passe + # - by42: Récupérer les informations de l'utilisateur en fonction de son token42 (qui sera different du token) + try: + if (content["type"] == "byToken"): + await loginByToken(socket, content) + elif (content["type"] == "byPass"): + await loginByPass(socket, content) + elif (content["type"] == "by42"): + await loginBy42(socket, content) + else: + await socket.sendError("Invalid login type", 9006) + except Exception as e: + await socket.sendError("Invalid request", 9005, e) diff --git a/websocket-server/typeRequets/login42/.DS_Store b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/login42/.DS_Store similarity index 100% rename from websocket-server/typeRequets/login42/.DS_Store rename to docker-compose/requirements/djangoserver/file/server/server/typeRequets/login42/.DS_Store diff --git a/docker-compose/requirements/djangoserver/file/server/server/typeRequets/login42/login42.py b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/login42/login42.py new file mode 100644 index 0000000..6e04e8f --- /dev/null +++ b/docker-compose/requirements/djangoserver/file/server/server/typeRequets/login42/login42.py @@ -0,0 +1,72 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# login42.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: edbernar +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/08/03 08:10:40 by edbernar #+# #+# # -# Updated: 2024/08/09 09:03:31 by edbernar ### ########.fr # +# Updated: 2024/08/22 15:54:03 by tomoron ### ########.fr # # # # **************************************************************************** # @@ -31,10 +31,6 @@ functionRequest = [login, getPrivateListUser, getPrivateListMessage, sendPrivateMessage, createAccount] async def handler(websocket, path): - if (path != "/"): - await websocket.sendError("Invalid path", 9003) - await websocket.close() - return userClass = User(websocket) try: async for resquet in userClass.websocket: @@ -66,4 +62,4 @@ start_server = websockets.serve(handler, "localhost", 8000, subprotocols=['12345 asyncio.get_event_loop().run_until_complete(start_server) print("Server started") -asyncio.get_event_loop().run_forever() \ No newline at end of file +asyncio.get_event_loop().run_forever() diff --git a/websocket-server/.DS_Store b/docker-compose/requirements/djangoserver/file/server/server/ws/typeRequets/.DS_Store similarity index 81% rename from websocket-server/.DS_Store rename to docker-compose/requirements/djangoserver/file/server/server/ws/typeRequets/.DS_Store index 2f52916091ec149fdc13076146c3e675cc87ae4e..fce099316f6e9c5a396d3fc547b98316256d0535 100644 GIT binary patch delta 395 zcmZoMXfc@JFUrBdz`)4BAi%&-!jQ_~$dC+#`I`kfmNUzPqy&K6BA`SfvNS^}LmorP z?znUkNKl#`zXb_)YzH;~r*4+cOM0|N&`4nscBv`nCju&Muvrk)+7o(rnMgu!UC z6pK7RSP)4}f$exQnpjzIQC?1dUOLb?U}!Ojf}NPhkb>rMEFMPn029ars0TI{wli*K I=lIJH0C&h-g8%>k delta 513 zcmZoMXfc@JFU-%tz`)4BAi%&-?3t6FoRpKFv{{g2B{M%rf|bFUA%`K6p_rj~vIeU> zH!?qr^>{rJKPTNVI5|JJ0H_NH1T=vJl5B3iiwnqTpeTpzg4KzV#>X7dRiqG5QILUb zg91>y05Ukb<4oxmJoG%a*KVUe{z}O#<^FV~fH8C*T$nWycwEBT~>RIt4bz}7Fj3t$CcNq5AX4|DT<_n944#E5jB@q{Z};vCO-on;>mIQIktMm*s0 zJO5@F@3+IaEIA80CB-^80XPT5Ss^xy>Loogl0)4Ce^CNu%t8IDz6t#iAjgW%{-@Ww(3wU zZfCqjI;XIIp#henA`l3oplKk(7DO=iKjwQ)18=4?0ml1Fnlq3jDPKpXiPn^8f$< literal 0 HcmV?d00001 diff --git a/websocket-server/typeRequets/login42/login42.py b/docker-compose/requirements/djangoserver/file/server/server/ws/typeRequets/login42/login42.py similarity index 100% rename from websocket-server/typeRequets/login42/login42.py rename to docker-compose/requirements/djangoserver/file/server/server/ws/typeRequets/login42/login42.py diff --git a/websocket-server/typeRequets/sendPrivateMessage.py b/docker-compose/requirements/djangoserver/file/server/server/ws/typeRequets/sendPrivateMessage.py similarity index 100% rename from websocket-server/typeRequets/sendPrivateMessage.py rename to docker-compose/requirements/djangoserver/file/server/server/ws/typeRequets/sendPrivateMessage.py