private TeleportClientData PerformFirstMessageAuthentication(EndPoint sender, TeleportReader reader) { TeleportClientData clientData; var header = reader.ReadByte(); var isFirstAuth = (header & 1) == 0; byte authKey; uint clientId; if (isFirstAuth) { authKey = 13; // TODO: Randomize clientId = _nextClientId; _nextClientId++; clientData = new TeleportClientData() { endpoint = sender, isAuthenticated = true, authKey = authKey, clientId = clientId, }; _clientDataByEndpoint[sender] = clientData; _clientDataById[clientId] = clientData; Send((w) => { w.Write(TeleportMsgTypeIds.Handshake); w.Write(authKey); w.Write(clientId); }); OnClientConnected(clientId, sender); } else { authKey = (byte)(header >> 1); clientId = reader.ReadUInt32(); clientData = _clientDataById[clientId]; if (authKey != clientData.authKey) { throw new Exception("Auth key mismatches"); } } return(clientData); }
private void CleanupClientData(TeleportClientData clientData) { _clientDataById.Remove(clientData.clientId); _clientDataByEndpoint.Remove(clientData.endpoint); }