Exemple #1
0
        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();
        }