From 45a571b414813a7427137ab24a1a1ecd2f13b15c Mon Sep 17 00:00:00 2001 From: simplonco Date: Wed, 18 Jan 2023 02:22:09 +0100 Subject: [PATCH] fixed double socket initialisation and room settings not updating password --- .../api_back/src/chat/chat.controller.ts | 22 ++++++++- .../nestjs/api_back/src/chat/chat.gateway.ts | 31 +++++++++++- .../nestjs/api_back/src/chat/chat.service.ts | 47 ++++++++++++++++++- .../src/pages/profile/ProfileDisplay.svelte | 2 - .../api_front/src/pieces/chat/Chat.svelte | 2 - .../src/pieces/chat/Layout_room_set.svelte | 5 +- .../src/pieces/chat/Request_rooms.ts | 10 ++++ .../api_front/src/pieces/chat/Socket_chat.ts | 1 + 8 files changed, 111 insertions(+), 9 deletions(-) diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts index e97eb6bb..24272c2c 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.controller.ts @@ -94,6 +94,26 @@ export class ChatController { printCaller("- out "); } + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + @Get('currentroom') + async getCurrentRooms(@Req() req, @Res() res): Promise + { + printCaller("- in "); + + const current_room_name = await this.chatService.getCurrentRoomName(req.user.username); + if (!current_room_name) + { + printCallerError(`controllerror: true, code: 'ROOM_NOT_FOUND', message: 'current room not found for ${req.user.username}'`); + throw new HttpException({ error: true, code: 'ROOM_NOT_FOUND', message: `current room not found for ${req.user.username}` }, HttpStatus.UNPROCESSABLE_ENTITY); + } + const current_room = await this.chatService.getRoomByName(current_room_name); + + const ret_room = this.format_room(current_room); + res.status(HttpStatus.OK).json({ room: ret_room }); + printCaller("- out "); + } + @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) @Get('allrooms') @@ -410,7 +430,7 @@ export class ChatController { let message = `${req.user.username} removed a new password`; room.allowed_users = []; room.protection = false; - await this.chatService.setPassword(req.user.username, message, room); + await this.chatService.removePassword(req.user.username, message, room); // inform other connected users let socket: socketDto = this.chatService.getSocket(req.user.username); diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.gateway.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.gateway.ts index 40a289a4..e97c67cd 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.gateway.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.gateway.ts @@ -31,10 +31,23 @@ implements OnGatewayConnection, OnGatewayDisconnect if (!socket.username) return; + printCaller("--- socket.username:", socket.username); + // save socket and server this.chatService.addSocket(socket.username, socket); socket_server.server = this.server; - printCaller("--- socket.username:", socket.username); + + // check if socket already exist and delete if it does + console.log("---- socket.username", socket.username); + let serveur_console: any = this.server; + await serveur_console.sockets.sockets.forEach((sock: any) => console.log(sock.id, sock.username)); + await serveur_console.sockets.adapter.rooms.forEach((value, key) => + { + console.log(""); + console.log("room name:", key); + console.log("room users id:"); + console.log(value); + }); let not_emit: string = `${socket.username}_not_emit`; socket.join(not_emit); @@ -46,9 +59,23 @@ implements OnGatewayConnection, OnGatewayDisconnect }); let current_room = await this.chatService.getCurrentRoomName(socket.username); - socket.join(current_room); + if (current_room) + socket.join(current_room); } + async handleDisconnect(socket: socketDto) { + printCallerError("handleDisconnect"); + console.log("---- socket.username", socket.username); + let serveur_console: any = this.server; + await serveur_console.sockets.sockets.forEach((sock: any) => console.log(sock.id, sock.username)); + await serveur_console.sockets.adapter.rooms.forEach((value, key) => + { + console.log(""); + console.log("room name:", key); + console.log("room users id:"); + console.log(value); + }); + this.chatService.removeSocket(socket.username); } diff --git a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts index 278cea30..d99f9dca 100644 --- a/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts +++ b/srcs/requirements/nestjs/api_back/src/chat/chat.service.ts @@ -329,6 +329,45 @@ export class ChatService { printCaller("-- out "); } + async removePassword(username: string, message: string, room: roomDto): Promise + { + printCaller("-- in "); + + const room_db = await this.getRoomByName(room.name); + if (!room_db) + { + printCallerError(`ERROR in chat: room not found for ${username}`); + return; + } + console.log("---- room_db:", room_db); + + if (!room_db.admins.includes(username)) + { + console.log("throw error: error: true, code: 'NO_ADMIN', message: 'only admins are allowed to remove password'"); + throw new HttpException({ error: true, code: 'NO_ADMIN', message: `only admins are allowed to remove password` }, HttpStatus.FORBIDDEN); + } + if (!room.password) + { + console.log("throw error: error: true, code: 'NO_PASSWORD', message: 'you must provide a password'"); + throw new HttpException({ error: true, code: 'NO_PASSWORD', message: `you must provide a password` }, HttpStatus.FORBIDDEN); + } + const is_match = await bcrypt.compare(room.password, room_db.hash); + if (!is_match) + { + printCaller(`throw error: error: true, code: 'BAD_PASSWORD', message: 'you provided a bad password'`); + throw new HttpException({ error: true, code: 'BAD_PASSWORD', message: `you provided a bad password` }, HttpStatus.FORBIDDEN); + } + + // add password to chatroom + room_db.allowed_users = room.allowed_users; + room_db.protection = false; + room_db.hash = ""; + room_db.messages.push({ name: "SERVER", message: message }); + await this.chatroomRepository.save(room_db); + + printCaller("-- out "); + } + async setPassword(username: string, message: string, room: roomDto, old_password?: string): Promise { printCaller("-- in "); @@ -357,6 +396,7 @@ export class ChatService { console.log("throw error: error: true, code: 'NO_PASSWORD', message: 'this room has no password protection'"); throw new HttpException({ error: true, code: 'NO_PASSWORD', message: `this room has no password protection` }, HttpStatus.FORBIDDEN); } + console.log("---- room_db:", room_db); if (room_db.protection) { if (room.protection && !old_password) @@ -848,9 +888,14 @@ export class ChatService { } } + console.log("---- socket.username", socket.username); + console.log("---- room_name", room_name); + console.log("---- socket.room", socket.room); + console.log("---- socket.username", socket.username); + let socket_name = `${socket.username}_not_emit`; - await socket.to(socket.room).except(socket_name).emit('message', socket.username, message); await this.addMessageToRoom(room_name, socket.username, message); + await socket.to(room_name).except(socket_name).emit('message', socket.username, message); printCaller("-- out "); } diff --git a/srcs/requirements/svelte/api_front/src/pages/profile/ProfileDisplay.svelte b/srcs/requirements/svelte/api_front/src/pages/profile/ProfileDisplay.svelte index 8553e32b..91a8a24d 100644 --- a/srcs/requirements/svelte/api_front/src/pages/profile/ProfileDisplay.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/profile/ProfileDisplay.svelte @@ -3,8 +3,6 @@ import { onMount } from 'svelte'; import GenerateUserDisplay from '../../pieces/GenerateUserDisplay.svelte'; import { push } from 'svelte-spa-router'; - - import Chat from '../../pieces/chat/Chat.svelte'; import { fetchUser } from "../../pieces/utils"; let user; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Chat.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Chat.svelte index 0fa3fa5f..f3a52299 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Chat.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Chat.svelte @@ -75,8 +75,6 @@ style = style_light; } - init_socket(); - $: change_style($location); $: { $location; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte index 7223478f..4413c29a 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_room_set.svelte @@ -1,7 +1,7 @@