From 0bbaef0cb5288504ce95d44f29ec2d2910cf9833 Mon Sep 17 00:00:00 2001 From: Gregoire Parant Date: Sun, 17 Jan 2021 03:07:46 +0100 Subject: [PATCH] Fix send message and ban message --- back/src/RoomManager.ts | 20 +++-- back/src/Services/SocketManager.ts | 49 +++++++++---- messages/protos/messages.proto | 9 +++ pusher/src/Controller/IoSocketController.ts | 17 ++--- pusher/src/Services/JWTTokenManager.ts | 4 +- pusher/src/Services/SocketManager.ts | 81 ++++++++++----------- 6 files changed, 101 insertions(+), 79 deletions(-) diff --git a/back/src/RoomManager.ts b/back/src/RoomManager.ts index 3c038998..ca7198fd 100644 --- a/back/src/RoomManager.ts +++ b/back/src/RoomManager.ts @@ -2,25 +2,21 @@ import {IRoomManagerServer} from "./Messages/generated/messages_grpc_pb"; import { AdminGlobalMessage, AdminMessage, - AdminPusherToBackMessage, BanMessage, - ClientToServerMessage, EmptyMessage, + AdminPusherToBackMessage, + EmptyMessage, ItemEventMessage, JoinRoomMessage, PlayGlobalMessage, PusherToBackMessage, QueryJitsiJwtMessage, - ReportPlayerMessage, - RoomJoinedMessage, ServerToAdminClientMessage, ServerToClientMessage, SilentMessage, UserMovesMessage, - ViewportMessage, WebRtcSignalToServerMessage, ZoneMessage } from "./Messages/generated/messages_pb"; -import grpc, {sendUnaryData, ServerDuplexStream, ServerUnaryCall, ServerWritableStream} from "grpc"; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {sendUnaryData, ServerDuplexStream, ServerUnaryCall, ServerWritableStream} from "grpc"; import {socketManager} from "./Services/SocketManager"; import {emitError} from "./Services/MessageHelpers"; import {User, UserSocket} from "./Model/User"; @@ -74,6 +70,16 @@ const roomManager: IRoomManagerServer = { socketManager.handleReportMessage(client, message.getReportplayermessage() as ReportPlayerMessage);*/ } else if (message.hasQueryjitsijwtmessage()){ socketManager.handleQueryJitsiJwtMessage(user, message.getQueryjitsijwtmessage() as QueryJitsiJwtMessage); + }else if (message.hasSendusermessage()) { + const sendUserMessage = message.getSendusermessage(); + if(sendUserMessage !== undefined) { + socketManager.handlerSendUserMessage(user, sendUserMessage); + } + }else if (message.hasBanusermessage()) { + const banUserMessage = message.getBanusermessage(); + if(banUserMessage !== undefined) { + socketManager.handlerBanUserMessage(room, user, banUserMessage); + } } else { throw new Error('Unhandled message type'); } diff --git a/back/src/Services/SocketManager.ts b/back/src/Services/SocketManager.ts index bfc43050..c90b51cf 100644 --- a/back/src/Services/SocketManager.ts +++ b/back/src/Services/SocketManager.ts @@ -1,24 +1,16 @@ import {GameRoom} from "../Model/GameRoom"; import {CharacterLayer} from "_Model/Websocket/CharacterLayer"; import { - GroupDeleteMessage, - GroupUpdateMessage, ItemEventMessage, ItemStateMessage, PlayGlobalMessage, PointMessage, - PositionMessage, RoomJoinedMessage, ServerToClientMessage, - SetPlayerDetailsMessage, SilentMessage, SubMessage, - ReportPlayerMessage, - UserJoinedMessage, - UserLeftMessage, UserMovedMessage, UserMovesMessage, - ViewportMessage, WebRtcDisconnectMessage, WebRtcSignalToClientMessage, WebRtcSignalToServerMessage, @@ -28,24 +20,23 @@ import { SendUserMessage, JoinRoomMessage, Zone as ProtoZone, - BatchMessage, BatchToPusherMessage, SubToPusherMessage, - UserJoinedZoneMessage, GroupUpdateZoneMessage, GroupLeftZoneMessage, UserLeftZoneMessage, AdminMessage, BanMessage + UserJoinedZoneMessage, GroupUpdateZoneMessage, GroupLeftZoneMessage, UserLeftZoneMessage, BanUserMessage } from "../Messages/generated/messages_pb"; import {User, UserSocket} from "../Model/User"; import {ProtobufUtils} from "../Model/Websocket/ProtobufUtils"; import {Group} from "../Model/Group"; import {cpuTracker} from "./CpuTracker"; -import {ADMIN_API_URL, GROUP_RADIUS, JITSI_ISS, MINIMUM_DISTANCE, SECRET_JITSI_KEY} from "../Enum/EnvironmentVariable"; +import {GROUP_RADIUS, JITSI_ISS, MINIMUM_DISTANCE, SECRET_JITSI_KEY} from "../Enum/EnvironmentVariable"; import {Movable} from "../Model/Movable"; import {PositionInterface} from "../Model/PositionInterface"; -import {adminApi, CharacterTexture, FetchMemberDataByUuidResponse} from "./AdminApi"; +import {adminApi, CharacterTexture} from "./AdminApi"; import Jwt from "jsonwebtoken"; import {JITSI_URL} from "../Enum/EnvironmentVariable"; import {clientEventsEmitter} from "./ClientEventsEmitter"; import {gaugeManager} from "./GaugeManager"; -import {AdminSocket, ZoneSocket} from "../RoomManager"; +import {ZoneSocket} from "../RoomManager"; import {Zone} from "_Model/Zone"; import Debug from "debug"; import {Admin} from "_Model/Admin"; @@ -119,7 +110,7 @@ export class SocketManager { //const things = room.setViewport(client, viewport); const roomJoinedMessage = new RoomJoinedMessage(); - + roomJoinedMessage.setTagList(joinRoomMessage.getTagList()); /*for (const thing of things) { if (thing instanceof User) { const player: ExSocketInterface|undefined = this.sockets.get(thing.id); @@ -626,6 +617,33 @@ export class SocketManager { user.socket.write(serverToClientMessage); } + public handlerSendUserMessage(user: User, sendUserMessageToSend: SendUserMessage){ + const sendUserMessage = new SendUserMessage(); + sendUserMessage.setMessage(sendUserMessageToSend.getMessage()); + sendUserMessage.setType(sendUserMessageToSend.getType()); + + const serverToClientMessage = new ServerToClientMessage(); + serverToClientMessage.setSendusermessage(sendUserMessage); + user.socket.write(serverToClientMessage); + } + + public handlerBanUserMessage(room: GameRoom, user: User, banUserMessageToSend: BanUserMessage){ + const banUserMessage = new BanUserMessage(); + banUserMessage.setMessage(banUserMessageToSend.getMessage()); + banUserMessage.setType(banUserMessageToSend.getType()); + + const serverToClientMessage = new ServerToClientMessage(); + serverToClientMessage.setSendusermessage(banUserMessage); + user.socket.write(serverToClientMessage); + + setTimeout(() => { + // Let's leave the room now. + room.leave(user); + // Let's close the connection when the user is banned. + user.socket.end(); + }, 10000); + } + /** * Merges the characterLayers received from the front (as an array of string) with the custom textures from the back. */ @@ -748,7 +766,7 @@ export class SocketManager { recipient.socket.write(subToPusherMessage); } - public banUser(roomId: string, recipientUuid: string): void { + public banUser(roomId: string, recipientUuid: string, message: string): void { const room = this.rooms.get(roomId); if (!room) { console.error("In banUser, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?"); @@ -765,6 +783,7 @@ export class SocketManager { room.leave(recipient); const sendUserMessage = new SendUserMessage(); + sendUserMessage.setMessage(message); sendUserMessage.setType('banned'); const subToPusherMessage = new SubToPusherMessage(); diff --git a/messages/protos/messages.proto b/messages/protos/messages.proto index 0e92f381..64f18f13 100644 --- a/messages/protos/messages.proto +++ b/messages/protos/messages.proto @@ -193,6 +193,11 @@ message SendUserMessage{ string message = 2; } +message BanUserMessage{ + string type = 1; + string message = 2; +} + message ServerToClientMessage { oneof message { BatchMessage batchMessage = 1; @@ -207,6 +212,7 @@ message ServerToClientMessage { TeleportMessageMessage teleportMessageMessage = 10; SendJitsiJwtMessage sendJitsiJwtMessage = 11; SendUserMessage sendUserMessage = 12; + BanUserMessage banUserMessage = 13; } } @@ -273,6 +279,8 @@ message PusherToBackMessage { StopGlobalMessage stopGlobalMessage = 9; ReportPlayerMessage reportPlayerMessage = 10; QueryJitsiJwtMessage queryJitsiJwtMessage = 11; + SendUserMessage sendUserMessage = 12; + BanUserMessage banUserMessage = 13; } } @@ -289,6 +297,7 @@ message SubToPusherMessage { UserLeftZoneMessage userLeftZoneMessage = 5; ItemEventMessage itemEventMessage = 6; SendUserMessage sendUserMessage = 7; + BanUserMessage banUserMessage = 8; } } diff --git a/pusher/src/Controller/IoSocketController.ts b/pusher/src/Controller/IoSocketController.ts index 63019b7d..a43f43ba 100644 --- a/pusher/src/Controller/IoSocketController.ts +++ b/pusher/src/Controller/IoSocketController.ts @@ -91,18 +91,11 @@ export class IoSocketController { if(message.event === 'user-message') { const messageToEmit = (message.message as { message: string, type: string, userUuid: string }); - switch (message.message.type) { - case 'ban': { - socketManager.emitSendUserMessage(messageToEmit.userUuid, messageToEmit.message, roomId); - break; - } - case 'banned': { - socketManager.emitBan(messageToEmit.userUuid, messageToEmit.message, roomId); - break; - } - default: { - break; - } + if(messageToEmit.type === 'banned'){ + socketManager.emitBan(messageToEmit.userUuid, messageToEmit.message, messageToEmit.type); + } + if(messageToEmit.type === 'ban') { + socketManager.emitSendUserMessage(messageToEmit.userUuid, messageToEmit.message, messageToEmit.type); } } }catch (err) { diff --git a/pusher/src/Services/JWTTokenManager.ts b/pusher/src/Services/JWTTokenManager.ts index 68b07735..6605ec4e 100644 --- a/pusher/src/Services/JWTTokenManager.ts +++ b/pusher/src/Services/JWTTokenManager.ts @@ -76,8 +76,8 @@ class JWTTokenManager { } private verifyBanUser(userUuid: string, ipAddress: string, room: string): Promise { - room = room.split('/').join('_'); - return adminApi.verifyBanUser(userUuid, ipAddress, room).then((data: AdminBannedData) => { + const world = room.split('/')[1]; //check by world + return adminApi.verifyBanUser(userUuid, ipAddress, world).then((data: AdminBannedData) => { if (data && data.is_banned) { throw new Error('User was banned'); } diff --git a/pusher/src/Services/SocketManager.ts b/pusher/src/Services/SocketManager.ts index df944b9e..ff5d25cf 100644 --- a/pusher/src/Services/SocketManager.ts +++ b/pusher/src/Services/SocketManager.ts @@ -2,11 +2,8 @@ import {PusherRoom} from "../Model/PusherRoom"; import {CharacterLayer, ExSocketInterface} from "../Model/Websocket/ExSocketInterface"; import { GroupDeleteMessage, - GroupUpdateMessage, ItemEventMessage, - ItemStateMessage, PlayGlobalMessage, - PointMessage, PositionMessage, RoomJoinedMessage, ServerToClientMessage, @@ -14,23 +11,18 @@ import { SilentMessage, SubMessage, ReportPlayerMessage, - UserJoinedMessage, UserLeftMessage, - UserMovedMessage, UserMovesMessage, ViewportMessage, - WebRtcDisconnectMessage, - WebRtcSignalToClientMessage, WebRtcSignalToServerMessage, - WebRtcStartMessage, QueryJitsiJwtMessage, SendJitsiJwtMessage, - SendUserMessage, JoinRoomMessage, CharacterLayerMessage, PusherToBackMessage, AdminPusherToBackMessage, - ServerToAdminClientMessage, AdminMessage, BanMessage + ServerToAdminClientMessage, + AdminMessage, SendUserMessage, BanUserMessage } from "../Messages/generated/messages_pb"; import {PointInterface} from "../Model/Websocket/PointInterface"; import {ProtobufUtils} from "../Model/Websocket/ProtobufUtils"; @@ -142,7 +134,6 @@ export class SocketManager implements ZoneEventListener { } async handleJoinRoom(client: ExSocketInterface): Promise { - const position = client.position; const viewport = client.viewport; try { @@ -152,6 +143,7 @@ export class SocketManager implements ZoneEventListener { joinRoomMessage.setRoomid(client.roomId); joinRoomMessage.setName(client.name); joinRoomMessage.setPositionmessage(ProtobufUtils.toPositionMessage(client.position)); + joinRoomMessage.setTagList(client.tags); for (const characterLayer of client.characterLayers) { const characterLayerMessage = new CharacterLayerMessage(); characterLayerMessage.setName(characterLayer.name); @@ -538,51 +530,54 @@ export class SocketManager implements ZoneEventListener { client.send(serverToClientMessage.serializeBinary().buffer, true); } - public async emitSendUserMessage(userUuid: string, message: string, roomId: string): Promise { + public async emitSendUserMessage(userUuid: string, message: string, type: string): Promise { + const client = this.searchClientByUuid(userUuid); + if(!client){ + throw Error('client not found'); + } - const backConnection = await apiClientRepository.getClient(roomId); - - const adminMessage = new AdminMessage(); - adminMessage.setRecipientuuid(userUuid); + const adminMessage = new SendUserMessage(); adminMessage.setMessage(message); - adminMessage.setRoomid(roomId); + 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) => { if (error !== null) { console.error('Error while sending admin message', error); } - }); -/* - const socket = this.searchClientByUuid(messageToSend.userUuid); - if(!socket){ - throw 'socket was not found'; - } - - const sendUserMessage = new SendUserMessage(); - sendUserMessage.setMessage(messageToSend.message); - sendUserMessage.setType(messageToSend.type); - - const serverToClientMessage = new ServerToClientMessage(); - serverToClientMessage.setSendusermessage(sendUserMessage); - - if (!socket.disconnecting) { - socket.send(serverToClientMessage.serializeBinary().buffer, true); - } - return socket;*/ + });*/ } - public async emitBan(userUuid: string, message: string, roomId: string): Promise { - const backConnection = await apiClientRepository.getClient(roomId); + public async emitBan(userUuid: string, message: string, type: string): Promise { + const client = this.searchClientByUuid(userUuid); + if(!client){ + throw Error('client not found'); + } - const banMessage = new BanMessage(); - banMessage.setRecipientuuid(userUuid); - banMessage.setRoomid(roomId); + const banUserMessage = new BanUserMessage(); + banUserMessage.setMessage(message); + banUserMessage.setType(type); + const pusherToBackMessage = new PusherToBackMessage(); + pusherToBackMessage.setBanusermessage(banUserMessage); + client.backConnection.write(pusherToBackMessage); - backConnection.ban(banMessage, (error) => { + /*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 ban message', error); + console.error('Error while sending admin message', error); } - }); + });*/ } /**