Пример #1
0
        public static bool TryDecrypt(byte[] data, out ZoneTicket ticket)
        {
            ticket = default(ZoneTicket);

            using (var ms = new MemoryStream())
            {
                var decryptor = _rijndael.CreateDecryptor(_rijndael.Key, _rijndael.IV);

                using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
                {
                    cs.Write(data, 0, data.Length);
                }

                var decryptedData = ms.ToArray();
                var ticketData    = decryptedData.Skip(_md5HashSize).ToArray();

                var size = Marshal.SizeOf(ticket);

                if (ticketData.Length != size)
                {
                    return(false);
                }

                if (!decryptedData.Take(_md5HashSize).SequenceEqual(_md5.ComputeHash(ticketData)))
                {
                    return(false);
                }

                ticket = ticketData.ToStruct <ZoneTicket>();
                return(true);
            }
        }
Пример #2
0
        public void SendReplyCommand(Character character, Player player, Command replyCommand)
        {
            Logger.Info("[Zone EQ] start sending reply command. player: " + player.Eid + " character:" + character.Id + " reply:" + replyCommand);

            var result = new Dictionary <string, object>
            {
                { k.characterID, character.Id },
                { k.rootEID, character.Eid },
                { k.corporationEID, character.CorporationEid },
                { k.allianceEID, character.AllianceEid },
                {
                    k.zone, new Dictionary <string, object>
                    {
                        { k.robot, player.ToDictionary() },
                        { k.guid, ZoneTicket.CreateAndEncryptFor(character) },
                        { k.plugin, _zone.Configuration.PluginName },
                        { k.decor, _zone.DecorHandler.DecorObjectsToDictionary() },
                        { k.plants, _zone.Configuration.PlantRules.GetPlantInfoForClient() },
                        { k.buildings, _zone.GetBuildingsDictionaryForCharacter(player.Character) }
                    }
                }
            };

            Message.Builder.SetCommand(replyCommand)
            .WithData(result)
            .WrapToResult()
            .ToCharacter(character)
            .Send();

            Logger.Info("[Zone EQ] end sending reply command. player: " + player.Eid + " character:" + character.Id + " reply:" + replyCommand);
        }
Пример #3
0
        private static byte[] Encrypt(ZoneTicket ticket)
        {
            using (var ms = new MemoryStream())
            {
                var encryptor = _rijndael.CreateEncryptor(_rijndael.Key, _rijndael.IV);

                using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    var e = ticket.ToByteArray();
                    var h = _md5.ComputeHash(e);
                    cs.Write(h, 0, h.Length);
                    cs.Write(e, 0, e.Length);
                }

                return(ms.ToArray());
            }
        }
Пример #4
0
        private void HandleAuth(Packet packet)
        {
            packet.ReadInt(); // mar nem kell
            var count     = (int)(packet.Length - packet.Position) - sizeof(long);
            var encrypted = packet.ReadBytes(count);

            var character = ZoneTicket.GetCharacterFromEncryptedTicket(encrypted);

            character.ThrowIfEqual(null, ErrorCodes.WTFErrorMedicalAttentionSuggested);
            Logger.Info($"Socket authentication successful. zone: {_zone.Id} character: {character.Id}");
            Character   = character;
            AccessLevel = character.AccessLevel;

            if (!_zone.TryGetPlayer(character, out Player player))
            {
                // nincs kint a terepen ezert betoltjuk
                player = Player.LoadPlayerAndAddToZone(_zone, character);
            }

            var session = player.Session as ZoneSession;

            session?.OnStopped();

            _beamsMonitor = new BeamsMonitor(this);
            _beamsMonitor.Subscribe(_zone.Beams);

            _weatherMonitor = Observer <Packet> .Create(OnWeatherUpdated);

            _zone.Weather.Subscribe(_weatherMonitor);

            _terrainUpdateNotifier = CreateTerrainNotifier(player);

            player.SetSession(this);
            player.SendInitSelf();
            player.ApplyTeleportSicknessEffect();
            player.ApplyInvulnerableEffect();

            _player = player;
        }