diff --git a/back/src/RoomManager.ts b/back/src/RoomManager.ts index 4302a141..256c904e 100644 --- a/back/src/RoomManager.ts +++ b/back/src/RoomManager.ts @@ -176,7 +176,7 @@ const roomManager: IRoomManagerServer = { }, ban(call: ServerUnaryCall, callback: sendUnaryData): void { // FIXME Work in progress - socketManager.banUser(call.request.getRoomid(), call.request.getRecipientuuid(), 'foo bar TODO change this'); + socketManager.banUser(call.request.getRoomid(), call.request.getRecipientuuid(), call.request.getMessage()); callback(null, new EmptyMessage()); }, diff --git a/back/src/Services/SocketManager.ts b/back/src/Services/SocketManager.ts index 907036e1..6317a46d 100644 --- a/back/src/Services/SocketManager.ts +++ b/back/src/Services/SocketManager.ts @@ -690,7 +690,7 @@ export class SocketManager { public sendAdminMessage(roomId: string, recipientUuid: string, message: string): void { const room = this.rooms.get(roomId); if (!room) { - console.error("In sendAdminMessage, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?"); + console.error("In sendAdminMessage, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?"); return; } @@ -704,10 +704,10 @@ export class SocketManager { sendUserMessage.setMessage(message); sendUserMessage.setType('ban'); //todo: is the type correct? - const subToPusherMessage = new SubToPusherMessage(); - subToPusherMessage.setSendusermessage(sendUserMessage); + const serverToClientMessage = new ServerToClientMessage(); + serverToClientMessage.setSendusermessage(sendUserMessage); - recipient.socket.write(subToPusherMessage); + recipient.socket.write(serverToClientMessage); } public banUser(roomId: string, recipientUuid: string, message: string): void { @@ -726,16 +726,15 @@ export class SocketManager { // Let's leave the room now. room.leave(recipient); - const sendUserMessage = new SendUserMessage(); - sendUserMessage.setMessage(message); - sendUserMessage.setType('banned'); + const banUserMessage = new BanUserMessage(); + banUserMessage.setMessage(message); + banUserMessage.setType('banned'); - const subToPusherMessage = new SubToPusherMessage(); - subToPusherMessage.setSendusermessage(sendUserMessage); - - recipient.socket.write(subToPusherMessage); + const serverToClientMessage = new ServerToClientMessage(); + serverToClientMessage.setBanusermessage(banUserMessage); // Let's close the connection when the user is banned. + recipient.socket.write(serverToClientMessage); recipient.socket.end(); } diff --git a/front/src/Connexion/AdminMessagesService.ts b/front/src/Connexion/AdminMessagesService.ts index a1e7fc21..7f96a673 100644 --- a/front/src/Connexion/AdminMessagesService.ts +++ b/front/src/Connexion/AdminMessagesService.ts @@ -1,5 +1,5 @@ import {Subject} from "rxjs"; -import {SendUserMessage} from "../Messages/generated/messages_pb"; +import {BanUserMessage, SendUserMessage} from "../Messages/generated/messages_pb"; export enum AdminMessageEventTypes { admin = 'message', @@ -23,7 +23,7 @@ class AdminMessagesService { this.messageStream.subscribe((event) => console.log('message', event)) } - onSendusermessage(message: SendUserMessage) { + onSendusermessage(message: SendUserMessage|BanUserMessage) { this._messageStream.next({ type: message.getType() as unknown as AdminMessageEventTypes, text: message.getMessage(), diff --git a/front/src/Connexion/RoomConnection.ts b/front/src/Connexion/RoomConnection.ts index afc7abde..5951d078 100644 --- a/front/src/Connexion/RoomConnection.ts +++ b/front/src/Connexion/RoomConnection.ts @@ -27,7 +27,7 @@ import { SendJitsiJwtMessage, CharacterLayerMessage, PingMessage, - SendUserMessage + SendUserMessage, BanUserMessage } from "../Messages/generated/messages_pb" import {UserSimplePeerInterface} from "../WebRtc/SimplePeer"; @@ -177,6 +177,8 @@ export class RoomConnection implements RoomConnection { this.dispatch(EventMessage.START_JITSI_ROOM, message.getSendjitsijwtmessage()); } else if (message.hasSendusermessage()) { adminMessagesService.onSendusermessage(message.getSendusermessage() as SendUserMessage); + } else if (message.hasBanusermessage()) { + adminMessagesService.onSendusermessage(message.getSendusermessage() as BanUserMessage); } else { throw new Error('Unknown message received'); } diff --git a/front/src/Phaser/Menu/ReportMenu.ts b/front/src/Phaser/Menu/ReportMenu.ts index 1c3e8fd8..0795debe 100644 --- a/front/src/Phaser/Menu/ReportMenu.ts +++ b/front/src/Phaser/Menu/ReportMenu.ts @@ -104,8 +104,7 @@ export class ReportMenu extends Phaser.GameObjects.DOMElement { gamePError.innerText = ''; gamePError.style.display = 'none'; const gameTextArea = this.getChildByID('gameReportInput') as HTMLInputElement; - const gameIdUserReported = this.getChildByID('idUserReported') as HTMLInputElement; - if(!gameTextArea || !gameTextArea.value ){ + if(!gameTextArea || !gameTextArea.value){ gamePError.innerText = 'Report message cannot to be empty.'; gamePError.style.display = 'block'; return; @@ -116,4 +115,4 @@ export class ReportMenu extends Phaser.GameObjects.DOMElement { ); this.close(); } -} +} \ No newline at end of file diff --git a/messages/protos/messages.proto b/messages/protos/messages.proto index 36247aef..6c747768 100644 --- a/messages/protos/messages.proto +++ b/messages/protos/messages.proto @@ -350,6 +350,7 @@ message AdminMessage { string message = 1; string recipientUuid = 2; string roomId = 3; + string type = 4; } // A message sent by an administrator to everyone in a specific room @@ -366,6 +367,8 @@ message AdminGlobalMessage { message BanMessage { string recipientUuid = 1; string roomId = 2; + string type = 3; + string message = 4; } message EmptyMessage { diff --git a/pusher/src/Controller/IoSocketController.ts b/pusher/src/Controller/IoSocketController.ts index 38e3ef5b..82d0707a 100644 --- a/pusher/src/Controller/IoSocketController.ts +++ b/pusher/src/Controller/IoSocketController.ts @@ -76,10 +76,10 @@ export class IoSocketController { if(message.event === 'user-message') { const messageToEmit = (message.message as { message: string, type: string, userUuid: string }); if(messageToEmit.type === 'banned'){ - socketManager.emitBan(messageToEmit.userUuid, messageToEmit.message, messageToEmit.type); + socketManager.emitBan(messageToEmit.userUuid, messageToEmit.message, messageToEmit.type, ws.roomId as string); } if(messageToEmit.type === 'ban') { - socketManager.emitSendUserMessage(messageToEmit.userUuid, messageToEmit.message, messageToEmit.type); + socketManager.emitSendUserMessage(messageToEmit.userUuid, messageToEmit.message, messageToEmit.type, ws.roomId as string); } } }catch (err) { diff --git a/pusher/src/Services/SocketManager.ts b/pusher/src/Services/SocketManager.ts index 77a60f66..29760cd0 100644 --- a/pusher/src/Services/SocketManager.ts +++ b/pusher/src/Services/SocketManager.ts @@ -22,7 +22,7 @@ import { AdminPusherToBackMessage, ServerToAdminClientMessage, SendUserMessage, - BanUserMessage, UserJoinedRoomMessage, UserLeftRoomMessage + BanUserMessage, UserJoinedRoomMessage, UserLeftRoomMessage, AdminMessage, BanMessage } from "../Messages/generated/messages_pb"; import {ProtobufUtils} from "../Model/Websocket/ProtobufUtils"; import {JITSI_ISS, SECRET_JITSI_KEY} from "../Enum/EnvironmentVariable"; @@ -434,90 +434,94 @@ export class SocketManager implements ZoneEventListener { public handleQueryJitsiJwtMessage(client: ExSocketInterface, queryJitsiJwtMessage: QueryJitsiJwtMessage) { - const room = queryJitsiJwtMessage.getJitsiroom(); - const tag = queryJitsiJwtMessage.getTag(); // FIXME: this is not secure. We should load the JSON for the current room and check rights associated to room instead. + try { + const room = queryJitsiJwtMessage.getJitsiroom(); + const tag = queryJitsiJwtMessage.getTag(); // FIXME: this is not secure. We should load the JSON for the current room and check rights associated to room instead. - if (SECRET_JITSI_KEY === '') { - throw new Error('You must set the SECRET_JITSI_KEY key to the secret to generate JWT tokens for Jitsi.'); + if (SECRET_JITSI_KEY === '') { + throw new Error('You must set the SECRET_JITSI_KEY key to the secret to generate JWT tokens for Jitsi.'); + } + + // Let's see if the current client has + const isAdmin = client.tags.includes(tag); + + const jwt = Jwt.sign({ + "aud": "jitsi", + "iss": JITSI_ISS, + "sub": JITSI_URL, + "room": room, + "moderator": isAdmin + }, SECRET_JITSI_KEY, { + expiresIn: '1d', + algorithm: "HS256", + header: + { + "alg": "HS256", + "typ": "JWT" + } + }); + + const sendJitsiJwtMessage = new SendJitsiJwtMessage(); + sendJitsiJwtMessage.setJitsiroom(room); + sendJitsiJwtMessage.setJwt(jwt); + + const serverToClientMessage = new ServerToClientMessage(); + serverToClientMessage.setSendjitsijwtmessage(sendJitsiJwtMessage); + + client.send(serverToClientMessage.serializeBinary().buffer, true); + } catch (e) { + console.error('An error occured while generating the Jitsi JWT token: ', e); + } + } + + public async emitSendUserMessage(userUuid: string, message: string, type: string, roomId: string) { + const client = this.searchClientByUuid(userUuid); + if(client) { + const adminMessage = new SendUserMessage(); + adminMessage.setMessage(message); + adminMessage.setType(type); + const pusherToBackMessage = new PusherToBackMessage(); + pusherToBackMessage.setSendusermessage(adminMessage); + client.backConnection.write(pusherToBackMessage); + return; } - // Let's see if the current client has - const isAdmin = client.tags.includes(tag); - - const jwt = Jwt.sign({ - "aud": "jitsi", - "iss": JITSI_ISS, - "sub": JITSI_URL, - "room": room, - "moderator": isAdmin - }, SECRET_JITSI_KEY, { - expiresIn: '1d', - algorithm: "HS256", - header: - { - "alg": "HS256", - "typ": "JWT" - } + const backConnection = await apiClientRepository.getClient(roomId); + const backAdminMessage = new AdminMessage(); + backAdminMessage.setMessage(message); + backAdminMessage.setRoomid(roomId); + backAdminMessage.setRecipientuuid(userUuid); + backAdminMessage.setType(type); + backConnection.sendAdminMessage(backAdminMessage, (error) => { + if (error !== null) { + console.error('Error while sending admin message', error); + } }); - - const sendJitsiJwtMessage = new SendJitsiJwtMessage(); - sendJitsiJwtMessage.setJitsiroom(room); - sendJitsiJwtMessage.setJwt(jwt); - - const serverToClientMessage = new ServerToClientMessage(); - serverToClientMessage.setSendjitsijwtmessage(sendJitsiJwtMessage); - - client.send(serverToClientMessage.serializeBinary().buffer, true); } - public emitSendUserMessage(userUuid: string, message: string, type: string): void { + public async emitBan(userUuid: string, message: string, type: string, roomId: string) { const client = this.searchClientByUuid(userUuid); - if(!client){ - throw Error('client not found'); + if(client) { + const banUserMessage = new BanUserMessage(); + banUserMessage.setMessage(message); + banUserMessage.setType(type); + const pusherToBackMessage = new PusherToBackMessage(); + pusherToBackMessage.setBanusermessage(banUserMessage); + client.backConnection.write(pusherToBackMessage); + return; } - const adminMessage = new SendUserMessage(); - adminMessage.setMessage(message); - adminMessage.setType(type); - const pusherToBackMessage = new PusherToBackMessage(); - pusherToBackMessage.setSendusermessage(adminMessage); - client.backConnection.write(pusherToBackMessage); - - /*const backConnection = await apiClientRepository.getClient(client.roomId); - const adminMessage = new AdminMessage(); - adminMessage.setMessage(message); - adminMessage.setRoomid(client.roomId); - adminMessage.setRecipientuuid(client.userUuid); - backConnection.sendAdminMessage(adminMessage, (error) => { + const backConnection = await apiClientRepository.getClient(roomId); + const banMessage = new BanMessage(); + banMessage.setMessage(message); + banMessage.setRoomid(roomId); + banMessage.setRecipientuuid(userUuid); + banMessage.setType(type); + backConnection.ban(banMessage, (error) => { if (error !== null) { console.error('Error while sending admin message', error); } - });*/ - } - - public emitBan(userUuid: string, message: string, type: string): void { - const client = this.searchClientByUuid(userUuid); - if(!client){ - throw Error('client not found'); - } - - const banUserMessage = new BanUserMessage(); - banUserMessage.setMessage(message); - banUserMessage.setType(type); - const pusherToBackMessage = new PusherToBackMessage(); - pusherToBackMessage.setBanusermessage(banUserMessage); - client.backConnection.write(pusherToBackMessage); - - /*const backConnection = await apiClientRepository.getClient(client.roomId); - const adminMessage = new AdminMessage(); - adminMessage.setMessage(message); - adminMessage.setRoomid(client.roomId); - adminMessage.setRecipientuuid(client.userUuid); - backConnection.sendAdminMessage(adminMessage, (error) => { - if (error !== null) { - console.error('Error while sending admin message', error); - } - });*/ + }); } /**