void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var request = new IPRequestPacket1(reader); if (request.Type3 == 0x14) // only type we handle right now? { Log.Debug("Handling IP request from " + request.XUID.ToString("X16")); bool breakNAT = false; if (!Client.IsHostAllowed(request.XUID)) { breakNAT = true; } /*var lclient = Client.Get(request.XUID); * bool breakGame = false; * if (lclient.GameVersion != 0) * { * if (!Client.IsVersionAllowed(lclient.GameVersion, lclient.GameBuild)) * { * breakGame = true; * } * }*/ // we don't have what client thinks is his port, but this is just an override anyway var responsePacket = new IPResponsePacket1(packet.GetSource(), request.Sequence, false, breakNAT); var response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); if (!breakNAT && packet.GetSource().Port >= 28960 && packet.GetSource().Port <= 29960) { responsePacket = new IPResponsePacket1(packet.GetSource(), request.Sequence, true, false); response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); } } // and afterwards, update client's stuff var client = Client.Get(request.XUID); client.SetLastTouched(); }
public void HandleCommand(MatchServer server, Client client, UdpPacket packet, MatchBaseRequestPacket baseRequest) { var reader = packet.GetReader(); var request = new MatchRegisterHostingRequestPacket(reader); var playlist = server.Playlist; var challengePassed = false; if (MatchRequestHostingHandler.Challenges.ContainsKey(client.XUID)) { var oldChallenge = MatchRequestHostingHandler.Challenges[client.XUID]; if (request.Challenge == oldChallenge) { challengePassed = true; } } if (!challengePassed) { Log.Warn(string.Format("Client {0} replied with a wrong host registration challenge.", client.XUID.ToString("X16"))); } var existingMatches = from session in server.Sessions where session.HostXUID == client.XUID select session; if (existingMatches.Count() > 0) { var match = existingMatches.First(); match.GameID = request.Session.GameID; match.SetLastTouched(); Log.Debug(string.Format("Updated match as registered by {0}", client.XUID.ToString("X16"))); } else { if (!Client.IsHostAllowed(client.XUID)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to register lobby", client.XUID.ToString("X16"))); return; } else if (!Client.IsHostAllowed(request.Session.ExternalIP.Address)) { Log.Info(string.Format("Non-allowed client (IP {0}) tried to register lobby", request.Session.ExternalIP)); return; } else { request.Session.Unclean = (CIServer.IsUnclean(client.XUID, packet.GetSource().Address) || CIServer.IsUnclean(client.XUIDAlias, packet.GetSource().Address)); request.Session.HostXUID = client.XUID; request.Session.Country = ""; try { var countrycode = geo.GetCountryCode(request.Session.ExternalIP.Address); Console.WriteLine("Country code of IP address " + request.Session.ExternalIP.ToString() + ": " + countrycode.ToString()); request.Session.Country = countrycode; } catch { } server.Sessions.Add(request.Session); Log.Info(string.Format("Registered session by {0}; lobby at {1}", client.XUID.ToString("X16"), request.Session.ExternalIP)); } } // this response appears wrong for now var responsePacket = new MatchRegisterHostingResponsePacket(request.ReplyType, request.Sequence); var response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); }