protected virtual void ValidateRoomAccessRequestHandler(IIncomingMessage message) { // Parse message var data = message.Deserialize(new RoomAccessValidatePacket()); // Trying to find room in list of registered if (!roomsList.TryGetValue(data.RoomId, out RegisteredRoom room)) { message.Respond("Room does not exist", ResponseStatus.Failed); return; } // if this message is not received from owner of room if (message.Peer != room.Peer) { // Wrong peer of room registrar message.Respond("You're not the registrar of the room", ResponseStatus.Unauthorized); return; } // Trying to validate room access token if (!room.ValidateAccess(data.Token, out IPeer playerPeer)) { message.Respond("Failed to confirm the access", ResponseStatus.Unauthorized); return; } var packet = new UsernameAndPeerIdPacket() { PeerId = playerPeer.Id }; // Add username if available var userExt = playerPeer.GetExtension <IUserPeerExtension>(); if (userExt != null) { packet.Username = userExt.Username ?? ""; } // Respond with success and player's peer id message.Respond(packet, ResponseStatus.Success); }
private void ValidateRoomAccessRequestHandler(IIncommingMessage message) { var data = message.Deserialize(new RoomAccessValidatePacket()); if (!roomsList.TryGetValue(data.RoomId, out RegisteredRoom room)) { message.Respond("Room does not exist", ResponseStatus.Failed); return; } if (message.Peer != room.Peer) { // Wrong peer unregistering the room message.Respond("You're not the creator of the room", ResponseStatus.Unauthorized); return; } if (!room.ValidateAccess(data.Token, out IPeer playerPeer)) { message.Respond("Failed to confirm the access", ResponseStatus.Unauthorized); return; } var packet = new UsernameAndPeerIdPacket() { PeerId = playerPeer.Id }; // Add username if available var userExt = playerPeer.GetExtension <IUserPeerExtension>(); if (userExt != null) { packet.Username = userExt.Username ?? ""; } // Respond with success and player's peer id message.Respond(packet, ResponseStatus.Success); }
private void ProvideRoomAccessCheckHandler(IIncomingMessage message) { var provideRoomAccessCheckPacket = message.Deserialize(new ProvideRoomAccessCheckPacket()); var roomController = Mst.Server.Rooms.GetRoomController(provideRoomAccessCheckPacket.RoomId); if (roomController == null) { message.Respond($"There's no room controller with room id {provideRoomAccessCheckPacket.RoomId}", ResponseStatus.NotHandled); return; } var isProviderDone = false; var requester = new UsernameAndPeerIdPacket() { PeerId = provideRoomAccessCheckPacket.PeerId, Username = provideRoomAccessCheckPacket.Username }; // Create access provider check options var roomAccessProviderCheck = new RoomAccessProviderCheck() { PeerId = provideRoomAccessCheckPacket.PeerId, Username = provideRoomAccessCheckPacket.Username, CustomOptions = provideRoomAccessCheckPacket.CustomOptions }; // Invoke the access provider roomController.AccessProvider.Invoke(roomAccessProviderCheck, (access, error) => { // In case provider timed out if (isProviderDone) { return; } isProviderDone = true; if (access == null) { // If access is not provided message.Respond(string.IsNullOrEmpty(error) ? "" : error, ResponseStatus.Failed); return; } message.Respond(access, ResponseStatus.Success); if (Logger.IsLogging(LogLevel.Trace)) { Logger.Trace("Room controller gave address to peer " + provideRoomAccessCheckPacket.PeerId + ":" + access); } }); // Timeout the access provider MstTimer.WaitForSeconds(Mst.Server.Rooms.AccessProviderTimeout, () => { if (!isProviderDone) { isProviderDone = true; message.Respond("Timed out", ResponseStatus.Timeout); Logger.Error($"Access provider took longer than {Mst.Server.Rooms.AccessProviderTimeout} seconds to provide access. " + "If it's intended, increase the threshold at Msf.Server.Rooms.AccessProviderTimeout"); } }); }