diff --git a/back/src/Controller/IoSocketController.ts b/back/src/Controller/IoSocketController.ts index d2a697c9..6b112e9e 100644 --- a/back/src/Controller/IoSocketController.ts +++ b/back/src/Controller/IoSocketController.ts @@ -145,12 +145,14 @@ export class IoSocketController { const userUuid = await jwtTokenManager.getUserUuidFromToken(token); console.log('uuid', userUuid); + let memberTags: string[] = []; if (roomIdentifier.anonymous === false) { - const isGranted = await adminApi.memberIsGrantedAccessToRoom(userUuid, roomIdentifier); - if (!isGranted) { + const grants = await adminApi.memberIsGrantedAccessToRoom(userUuid, roomIdentifier); + if (!grants.granted) { console.log('access not granted for user '+userUuid+' and room '+roomId); throw new Error('Client cannot acces this ressource.') } else { + memberTags = grants.memberTags; console.log('access granted for user '+userUuid+' and room '+roomId); } } @@ -181,7 +183,8 @@ export class IoSocketController { right, bottom, left - } + }, + tags: memberTags }, /* Spell these correctly */ websocketKey, @@ -218,6 +221,7 @@ export class IoSocketController { client.name = ws.name; client.characterLayers = ws.characterLayers; client.roomId = ws.roomId; + client.tags = ws.tags; this.sockets.set(client.userId, client); @@ -353,6 +357,7 @@ export class IoSocketController { } roomJoinedMessage.setCurrentuserid(client.userId); + roomJoinedMessage.setTagList(client.tags); const serverToClientMessage = new ServerToClientMessage(); serverToClientMessage.setRoomjoinedmessage(roomJoinedMessage); diff --git a/back/src/Model/Websocket/ExSocketInterface.ts b/back/src/Model/Websocket/ExSocketInterface.ts index d70205ef..a41d34bb 100644 --- a/back/src/Model/Websocket/ExSocketInterface.ts +++ b/back/src/Model/Websocket/ExSocketInterface.ts @@ -7,7 +7,7 @@ import {WebSocket} from "uWebSockets.js" export interface ExSocketInterface extends WebSocket, Identificable { token: string; roomId: string; - userId: number; // A temporary (autoincremented) identifier for this user + //userId: number; // A temporary (autoincremented) identifier for this user userUuid: string; // A unique identifier for this user name: string; characterLayers: string[]; @@ -19,5 +19,6 @@ export interface ExSocketInterface extends WebSocket, Identificable { emitInBatch: (payload: SubMessage) => void; batchedMessages: BatchMessage; batchTimeout: NodeJS.Timeout|null; - disconnecting: boolean + disconnecting: boolean, + tags: string[] } diff --git a/back/src/Services/AdminApi.ts b/back/src/Services/AdminApi.ts index 0039dc9c..605af738 100644 --- a/back/src/Services/AdminApi.ts +++ b/back/src/Services/AdminApi.ts @@ -10,6 +10,11 @@ export interface AdminApiData { userUuid: string } +export interface GrantedApiData { + granted: boolean, + memberTags: string[] +} + class AdminApi { async fetchMapDetails(organizationSlug: string, worldSlug: string, roomSlug: string|undefined): Promise { @@ -46,7 +51,7 @@ class AdminApi { return res.data; } - async memberIsGrantedAccessToRoom(memberId: string, roomIdentifier: RoomIdentifier): Promise { + async memberIsGrantedAccessToRoom(memberId: string, roomIdentifier: RoomIdentifier): Promise { if (!ADMIN_API_URL) { return Promise.reject('No admin backoffice set!'); } @@ -54,10 +59,13 @@ class AdminApi { const res = await Axios.get(ADMIN_API_URL+'/api/member/is-granted-access', { headers: {"Authorization" : `${ADMIN_API_TOKEN}`}, params: {memberId, organizationSlug: roomIdentifier.organizationSlug, worldSlug: roomIdentifier.worldSlug, roomSlug: roomIdentifier.roomSlug} } ) - return !!res.data; + return res.data; } catch (e) { console.log(e.message) - return false; + return { + granted: false, + memberTags: [] + }; } } } diff --git a/front/src/Connexion/RoomConnection.ts b/front/src/Connexion/RoomConnection.ts index 48f6f9f1..3f0bb84e 100644 --- a/front/src/Connexion/RoomConnection.ts +++ b/front/src/Connexion/RoomConnection.ts @@ -43,6 +43,7 @@ export class RoomConnection implements RoomConnection { private listeners: Map = new Map(); private static websocketFactory: null|((url: string)=>any) = null; // eslint-disable-line @typescript-eslint/no-explicit-any private closed: boolean = false; + private tags: string[] = []; public static setWebsocketFactory(websocketFactory: (url: string)=>any): void { // eslint-disable-line @typescript-eslint/no-explicit-any RoomConnection.websocketFactory = websocketFactory; @@ -124,6 +125,7 @@ export class RoomConnection implements RoomConnection { } this.userId = roomJoinedMessage.getCurrentuserid(); + this.tags = roomJoinedMessage.getTagList(); this.dispatch(EventMessage.START_ROOM, { users, @@ -478,4 +480,8 @@ export class RoomConnection implements RoomConnection { this.socket.send(clientToServerMessage.serializeBinary().buffer); } + + public hasTag(tag: string): boolean { + return this.tags.indexOf(tag) !== -1; + } } diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 490284b4..4e209c42 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -397,9 +397,6 @@ export class GameScene extends ResizableScene implements CenterListener { //create input to move this.userInputManager = new UserInputManager(this); - //TODO check right of user - this.ConsoleGlobalMessageManager = new ConsoleGlobalMessageManager(this.connection, this.userInputManager); - //notify game manager can to create currentUser in map this.createCurrentPlayer(); @@ -530,6 +527,10 @@ export class GameScene extends ResizableScene implements CenterListener { connection.onStartRoom((roomJoinedMessage: RoomJoinedMessageInterface) => { this.initUsersPosition(roomJoinedMessage.users); this.connectionAnswerPromiseResolve(roomJoinedMessage); + // Analyze tags to find if we are admin. If yes, show console. + if (this.connection.hasTag('admin')) { + this.ConsoleGlobalMessageManager = new ConsoleGlobalMessageManager(this.connection, this.userInputManager); + } }); connection.onUserJoins((message: MessageUserJoined) => { diff --git a/messages/messages.proto b/messages/messages.proto index a5134b56..935e033b 100644 --- a/messages/messages.proto +++ b/messages/messages.proto @@ -139,6 +139,7 @@ message RoomJoinedMessage { repeated GroupUpdateMessage group = 2; repeated ItemStateMessage item = 3; int32 currentUserId = 4; + repeated string tag = 5; } message WebRtcStartMessage {