Пример #1
0
        public static Header DeSerialize(Type HeaderType, PayloadReader pr)
        {
            if (pr.Position + 2 > pr.Buffer.Length)
                return null;

            ushort size = pr.ReadUShort();

            if (pr.Position + size > pr.Buffer.Length)
                return null;

            //byte[] data = pr.ReadBytes(size);
            Header header = (Header)Serializer.Deserialize(new MemoryStream(pr.Buffer, pr.Position, size), HeaderType);
            pr.Position += size;
            return header;

            /*FieldInfo[] fields = header.GetType().GetFields();
            for (int i = 0; i < fields.Length; i++)
            {
                //if (fields[i].GetCustomAttributes(typeof(HeaderInfoAttribute), false).Length > 0)
                {
                    object val = pr.ReadObject();
                    fields[i].SetValue(header, val);
                }
            }
            return header;*/
        }
Пример #2
0
        public static Command Parse(Payload payload)
        {
            if (payload.Length < 2)
            {
                throw new ArgumentOutOfRangeException(nameof(payload), "payload must have at least 2 bytes");
            }

            var commandClass = (CommandClass)payload[0];
            var commandID    = payload[1];

            using (var reader = new PayloadReader(payload))
            {
                switch (commandClass)
                {
                case CommandClass.Crc16Encap when Crc16Command.EncapCommandID == commandID:
                    return(reader.ReadObject <Crc16Command>());

                case CommandClass.MultiChannel when MultiChannelCommand.EncapCommandID == commandID:
                    return(reader.ReadObject <MultiChannelCommand>());

                default:
                    return(reader.ReadObject <Command>());
                }
            }
        }
Пример #3
0
        internal ControllerMessage Decode(Message message, bool hasCallbackID)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            // create reader to deserialize the request
            using (var reader = new PayloadReader(message.Payload))
            {
                // read the function
                var function = (Function)reader.ReadByte();

                var callbackID = hasCallbackID ? reader.ReadByte() : default(byte?);

                // read the payload
                var payload = new Payload(reader.ReadBytes(reader.Length - reader.Position));

                if (message is ResponseMessage)
                {
                    return(new ControllerResponse(function, callbackID, payload));
                }
                if (message is EventMessage)
                {
                    return(new ControllerEvent(function, callbackID, payload));
                }

                throw new InvalidOperationException("Unknown message type");
            }
        }
Пример #4
0
        public void ReadsEventsFromRawBufferFiles()
        {
            using var tmp = new TempFolder();
            var fn    = tmp.AllocateFilename("json");
            var lines = IOFile.ReadAllText(Path.Combine("Resources", "ThreeBufferedEvents.json.txt"), Encoding.UTF8).Split(new [] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

            using (var f = IOFile.Create(fn))
                using (var fw = new StreamWriter(f, Encoding.UTF8))
                {
                    foreach (var line in lines)
                    {
                        fw.WriteLine(line);
                    }
                }
            var position = new FileSetPosition(0, fn);
            var count    = 0;
            var payload  = PayloadReader.ReadPayload(1000, null, ref position, ref count, out var mimeType);

            Assert.Equal(SeqIngestionApi.RawEventFormatMediaType, mimeType);

            Assert.Equal(3, count);
            Assert.Equal(576 + 3 * (Environment.NewLine.Length - 1), position.NextLineStart);
            Assert.Equal(fn, position.File);

            var data   = JsonConvert.DeserializeObject <dynamic>(payload);
            var events = data["Events"];

            Assert.NotNull(events);
            Assert.Equal(3, events.Count);
        }
 protected override void Read(PayloadReader reader)
 {
     EndpointID              = (byte)(reader.ReadByte() & 0x7F);
     GenericType             = (GenericType)reader.ReadByte();
     SpecificType            = reader.ReadSpecificType(GenericType);
     SupportedCommandClasses = reader.ReadBytes(reader.Length - reader.Position).Select(element => (CommandClass)element).ToArray();
 }
        /// <summary>
        /// This method is used to receive data from anyone
        /// The main function of this method is establishing udp-hole connections
        /// </summary>
        private void UdpAsyncSocketCallback(object o, SocketAsyncEventArgs e)
        {
            if (e.LastOperation == SocketAsyncOperation.ReceiveFrom)
            {
                try
                {
                    if (e.BytesTransferred >= 21)
                    {
                        PayloadReader pr       = new PayloadReader(e.Buffer);
                        decimal       ClientId = pr.ReadDecimal();

                        lock (Clients)
                        {
                            if (Clients.ContainsKey(ClientId))
                            {
                                SSPClient client = Clients[ClientId];
                                client.AsyncSocketCallback(o, e);
                            }
                        }
                    }
                }
                catch { }

                if (!UdpServer.ReceiveFromAsync(udpAsyncSocket))
                {
                    UdpAsyncSocketCallback(null, udpAsyncSocket);
                }
            }
        }
        protected override void Read(PayloadReader reader)
        {
            var commandClass = reader.ReadByte();

            CommandClass = (CommandClass)commandClass;
            Version      = reader.ReadByte();
        }
Пример #8
0
        internal static T Create <T>(Node node, Endpoint endpoint, Payload payload) where T : Report, new()
        {
            if (node == null)
            {
                throw new ArgumentNullException(nameof(node));
            }
            if (endpoint == null)
            {
                throw new ArgumentNullException(nameof(endpoint));
            }
            if (payload == null)
            {
                throw new ArgumentNullException(nameof(payload));
            }

            var report = new T()
            {
                Sender = new ReportSender(node, endpoint),
            };

            using (var reader = new PayloadReader(payload))
            {
                report.Read(reader);
            }
            return(report);
        }
Пример #9
0
        public void ReadSatoshis()
        {
            var spanToRead = new byte[50];
            BitConverter.TryWriteBytes(spanToRead, 20000UL);

            Assert.Equal(20000UL, PayloadReader.GetSatoshis(spanToRead));
        }
Пример #10
0
        public static Header DeSerialize(Type HeaderType, PayloadReader pr)
        {
            if (pr.Position + 2 > pr.Buffer.Length)
            {
                return(null);
            }

            ushort size = pr.ReadUShort();

            if (pr.Position + size > pr.Buffer.Length)
            {
                return(null);
            }

            //byte[] data = pr.ReadBytes(size);
            Header header = (Header)Serializer.Deserialize(new MemoryStream(pr.Buffer, pr.Position, size), HeaderType);

            pr.Position += size;
            return(header);

            /*FieldInfo[] fields = header.GetType().GetFields();
             * for (int i = 0; i < fields.Length; i++)
             * {
             *  //if (fields[i].GetCustomAttributes(typeof(HeaderInfoAttribute), false).Length > 0)
             *  {
             *      object val = pr.ReadObject();
             *      fields[i].SetValue(header, val);
             *  }
             * }
             * return header;*/
        }
Пример #11
0
        public void ReadsEventsFromBufferFiles()
        {
            using var tmp = new TempFolder();
            var fn    = tmp.AllocateFilename("clef");
            var lines = IOFile.ReadAllText(Path.Combine("Resources", "ThreeBufferedEvents.clef.txt"), Encoding.UTF8).Split(new [] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

            using (var f = IOFile.Create(fn))
                using (var fw = new StreamWriter(f, Encoding.UTF8))
                {
                    foreach (var line in lines)
                    {
                        fw.WriteLine(line);
                    }
                }
            var position = new FileSetPosition(0, fn);
            var count    = 0;

            PayloadReader.ReadPayload(1000, null, ref position, ref count, out var mimeType);

            Assert.Equal(SeqIngestionApi.CompactLogEventFormatMediaType, mimeType);

            Assert.Equal(3, count);
            Assert.Equal(465 + 3 * (Environment.NewLine.Length - 1), position.NextLineStart);
            Assert.Equal(fn, position.File);
        }
Пример #12
0
 protected override void Read(PayloadReader reader)
 {
     CommandClass     = (CommandClass)reader.ReadByte();
     CommandID        = reader.ReadByte();
     SourceEndpointID = reader.ReadByte();
     TargetEndpointID = reader.ReadByte();
     Payload          = reader.ReadObject <Payload>();
 }
Пример #13
0
        public override void OnPacket(byte[] packetData)
        {
            try
            {
                InPacket      iPacket = new InPacket(packetData, _CryptoHandler);
                PayloadReader pReader = new PayloadReader(iPacket.Payload);

                CenterOpcodes opcode = (CenterOpcodes)pReader.Id;

                bool isCompressed = pReader.CompressionFlag;

                if (isCompressed)
                {
                    Log.Packet("Pacote comprimido recebido: 0x{0:X2} ({1})", (int)opcode, opcode.ToString());
                }
                else
                {
                    Log.Packet("Opcode: 0x{0:X2} ({1})", (int)opcode, opcode.ToString());
                }

                switch (opcode)
                {
                case CenterOpcodes.HEART_BIT_NOT:
                    OnHeartBeatNot();
                    break;

                case CenterOpcodes.ENU_VERIFY_ACCOUNT_REQ:
                    MyUser.OnLogin(this, iPacket);
                    break;

                case CenterOpcodes.ENU_GUIDE_BOOK_LIST_REQ:
                    MyUser.OnGuideBookList(this);
                    break;

                case CenterOpcodes.ENU_CLIENT_CONTENTS_FIRST_INIT_INFO_REQ:
                    MyLoading.NotifyContentInfo(this);
                    break;

                case CenterOpcodes.ENU_CLIENT_PING_CONFIG_REQ:
                    OnClientPingConfig();
                    break;

                case CenterOpcodes.ENU_SHAFILENAME_LIST_REQ:
                    MyLoading.NotifySHAFile(this);
                    break;

                default:
                    Log.Warn("Pacote indefinido recebido. Opcode: {0:X} ({1})", (int)opcode, opcode.ToString());
                    Log.Hex("Payload:", iPacket.Payload);
                    break;
                }
            }
            catch (Exception e)
            {
                Log.Error(e.Message);
                Close();
            }
        }
Пример #14
0
        public void ReadUdpPacket(IMessage message, PayloadReader pr)
        {
            FieldInfo[] fields = message.GetType().GetFields();

            for (int i = 0; i < fields.Length; i++)
            {
                fields[i].SetValue(message, pr.ReadObject());
            }
        }
Пример #15
0
        protected override void Read(PayloadReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            Value = reader.ReadByte();
        }
Пример #16
0
        protected override void Read(PayloadReader reader)
        {
            var libraryType = reader.ReadByte();

            LibraryType = Enum.IsDefined(typeof(LibraryType), libraryType) ? (LibraryType)libraryType : LibraryType.NotApplicable;

            ProtocolVersion    = reader.ReadByte().ToString("d") + "." + reader.ReadByte().ToString("d2");
            ApplicationVersion = reader.ReadByte().ToString("d") + "." + reader.ReadByte().ToString("d2");
        }
        protected override void Read(PayloadReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            SupportedGroupings = reader.ReadByte();
        }
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest request,
            ILogger logger)
        {
            string token             = request.Headers.GetValueOrDefault("X-Ahk-Token");
            string receivedSignature = request.Headers.GetValueOrDefault("X-Ahk-Sha256");
            string deliveryId        = request.Headers.GetValueOrDefault("X-Ahk-Delivery");
            string dateStr           = request.Headers.GetValueOrDefault(HeaderNames.Date);

            logger.LogInformation("evaluation-result request with X-Ahk-Delivery='{DeliveryId}', X-Ahk-Token = '{Token}'", deliveryId, token);

            if (string.IsNullOrEmpty(dateStr))
            {
                return(new BadRequestObjectResult(new { error = "Date header missing" }));
            }
            if (!DateTime.TryParseExact(dateStr, "R", provider: System.Globalization.CultureInfo.InvariantCulture, style: System.Globalization.DateTimeStyles.AdjustToUniversal | System.Globalization.DateTimeStyles.AssumeUniversal, out var date))
            {
                return(new BadRequestObjectResult(new { error = "Date header value not valid RFC1123 string" }));
            }
            var now = dateTimeProvider.GetUtcNow();

            if (date < now.AddMinutes(-10) || date > now.AddMinutes(10))
            {
                return(new BadRequestObjectResult(new { error = "Date header value is not close enough to current date" }));
            }

            if (string.IsNullOrEmpty(receivedSignature))
            {
                return(new BadRequestObjectResult(new { error = "X-Ahk-Sha256 header missing" }));
            }

            if (string.IsNullOrEmpty(token))
            {
                return(new BadRequestObjectResult(new { error = "X-Ahk-Token header missing" }));
            }
            var secret = await service.GetSecretForToken(token);

            if (string.IsNullOrEmpty(secret))
            {
                return(new BadRequestObjectResult(new { error = "X-Ahk-Token invalid" }));
            }

            string requestBody = await request.ReadAsStringAsync();

            if (!HmacSha256Validator.IsSignatureValid(request.Method, request.GetDisplayUrl(), date, requestBody, receivedSignature, secret))
            {
                return(new BadRequestObjectResult(new { error = "X-Ahk-Sha256 signature not valid" }));
            }

            if (!PayloadReader.TryGetPayload <AhkProcessResult>(requestBody, out var requestDeserialized, out var deserializationError))
            {
                return(new BadRequestObjectResult(new { error = deserializationError }));
            }

            return(await runCore(logger, deliveryId, requestDeserialized, date));
        }
Пример #19
0
 /// <summary>
 /// Generates the key after a response is received.
 /// </summary>
 /// <param name="response">The string representation of the response.</param>
 public void HandleResponse(PayloadReader pr)
 {
     // Get the response and modpow it with the stored prime.
     using (BigInteger given = pr.ReadBigInteger())
         using (BigInteger key = given.modPow(mine, prime))
         {
             this.key = key.getBytes();
         }
     Dispose();
 }
Пример #20
0
        void IPayloadSerializable.Read(PayloadReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            TransmissionState = (TransmissionState)reader.ReadByte();
            Unknown1          = reader.ReadByte();
            Unknown2          = reader.ReadByte();
        }
Пример #21
0
        protected virtual void Read(PayloadReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            CommandClass = (CommandClass)reader.ReadByte();
            CommandID    = reader.ReadByte();
            Payload      = new Payload(reader.ReadBytes(reader.Length - reader.Position));
        }
Пример #22
0
        protected override void Read(PayloadReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            Type  = (SensorType)reader.ReadByte();
            Value = reader.ReadDouble(out var scale);
            Unit  = GetUnit(Type, scale);
            Scale = scale;
        }
Пример #23
0
        protected override void Read(PayloadReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            GroupID           = reader.ReadByte();
            MaxNodesSupported = reader.ReadByte();
            ReportsToFollow   = reader.ReadByte();
            Nodes             = reader.ReadBytes(reader.Length - reader.Position);
        }
Пример #24
0
        public void ReadData()
        {
            var spanToRead = new byte[50];
            BitConverter.TryWriteBytes(new Span<byte>(spanToRead).Slice(sizeof(ulong)), 20);
            spanToRead[sizeof(ulong) + sizeof(int)] = 25;
            spanToRead[sizeof(ulong) + sizeof(int) + 19] = 26;

            var data = PayloadReader.GetData(spanToRead);

            Assert.Equal(20, data.Length);
            Assert.Equal(25, data[0]);
            Assert.Equal(26, data[19]);
        }
        protected override void Read(PayloadReader reader)
        {
            var endpointsInfo = reader.ReadByte();

            IsDynamicNumberOfEndpoints  = (endpointsInfo & 0x80) > 0;
            AllEndpointsAreIdentical    = (endpointsInfo & 0x40) > 0;
            NumberOfIndividualEndpoints = (byte)(reader.ReadByte() & 0x7F);

            // For version 4 only.
            if (reader.Position < reader.Length)
            {
                NumberOfAggregatedEndpoints = (byte)(reader.ReadByte() & 0x7F);
            }
        }
Пример #26
0
        protected override void Read(PayloadReader reader)
        {
            CommandClass = (CommandClass)reader.ReadByte();
            CommandID    = reader.ReadByte();
            Payload      = new Payload(reader.ReadBytes(reader.Length - reader.Position - 2));

            var actualChecksum = reader.ReadInt16();
            var expectedChecksum = new byte[] { (byte)CommandClass, CommandID }.Concat(Payload.ToArray()).CalculateCrc16Checksum();

            if (actualChecksum != expectedChecksum)
            {
                throw new ChecksumException("CRC-16 encapsulated command checksum failure");
            }
        }
Пример #27
0
        /*public IMessage HandleMessage(PayloadReader reader, uint MessageId)
         * {
         *  lock (Messages)
         *  {
         *      Type type = null;
         *      if (!Messages.TryGetValue(MessageId, out type))
         *          return null;
         *
         *      IMessage message = null;//IMessage.DeSerialize(type, reader);
         *      return message;
         *  }
         * }*/

        public IMessage HandleUdpMessage(PayloadReader reader, uint MessageId)
        {
            lock (Messages)
            {
                Type type = null;
                if (!Messages.TryGetValue(MessageId, out type))
                {
                    return(null);
                }

                IMessage message = null;//IMessage.DeSerialize(type, reader);
                message.RawSize = reader.Length;
                return(message);
            }
        }
Пример #28
0
        internal IMessage DeSerialize(PayloadReader pr, uint MessageId)
        {
            Type type = null;

            if (!Messages.TryGetValue(MessageId, out type))
            {
                return(null);
            }

            int      len     = pr.Length - pr.Position;
            IMessage message = (IMessage)Serializer.Deserialize(new MemoryStream(pr.Buffer, pr.Position, len), type);

            pr.Position += len;
            return(message);
        }
Пример #29
0
        public void ReadDnsFile(string FilePath)
        {
            DnsNames.Clear();
            if (File.Exists(FilePath) && new FileInfo(FilePath).Length > 0)
            {
                PayloadReader pr = new PayloadReader(File.ReadAllBytes(FilePath));

                for (int i = 0; pr.Offset < pr.Length; i++)
                {
                    string name  = pr.ReadString();
                    uint   DnsId = pr.ReadUInteger();
                    DnsNames.Add(DnsId, new RootDnsInfo(name, DnsId));
                }
            }
        }
Пример #30
0
        private UnknownData ReadUnknownData(byte[] data)
        {
            MemoryStream stream = new MemoryStream(data);
            BinaryReader reader = new BinaryReader(stream);

            Serializer dataReader = new PayloadReader(reader);

            UnknownData unknownData = new UnknownData();

            unknownData.Serialize(dataReader);

            reader.Close();
            stream.Close();

            return(unknownData);
        }
        public IMessage HandleUdpMessage(PayloadReader reader, uint MessageId)
        {
            lock (Messages)
            {
                Type type = null;
                if (!Messages.TryGetValue(MessageId, out type))
                {
                    return(null);
                }

                IMessage message = (IMessage)Activator.CreateInstance(type, new object[0]);
                message.ReadUdpPacket(message, reader);
                message.RawSize = reader.Length;
                return(message);
            }
        }
        public object Deserialize(byte[] data)
        {
            PayloadReader pr = new PayloadReader(data);
            ObjectTypes Id = (ObjectTypes)pr.ReadByte();

            switch (Id)
            {
                case ObjectTypes.Null: return null;
                case ObjectTypes.Other:
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Binder = new DeserializationBinder();
                    return bf.Deserialize(new MemoryStream(pr.ReadBytes(pr.Length - pr.Position)));
                }
                case ObjectTypes.Byte: return pr.ReadByte();
                case ObjectTypes.Short: return pr.ReadShort();
                case ObjectTypes.UShort: return pr.ReadUShort();
                case ObjectTypes.Int: return pr.ReadInteger();
                case ObjectTypes.UINT: return pr.ReadUInteger();
                case ObjectTypes.Long: return pr.ReadLong();
                case ObjectTypes.Bool: return pr.ReadByte() == 1;
                case ObjectTypes.String: return pr.ReadString();
                case ObjectTypes.SolidBrush: return new SolidBrush(Color.FromArgb(pr.ReadByte(), pr.ReadByte(), pr.ReadByte(), pr.ReadByte()));
                case ObjectTypes.Rectangle: return new Rectangle(pr.ReadInteger(), pr.ReadInteger(), pr.ReadInteger(), pr.ReadInteger());
                case ObjectTypes.Size: return new Size(pr.ReadInteger(), pr.ReadInteger());
                case ObjectTypes.ByteArray: return pr.ReadBytes(pr.ReadInteger());
                case ObjectTypes.Bitmap:
                {
                    using (MemoryStream stream = new MemoryStream(pr.Buffer, pr.Position, pr.Length - pr.Position))
                    {
                        long oldPos = stream.Position;
                        Bitmap bmp = (Bitmap)Bitmap.FromStream(stream);
                        pr.Position += (int)(stream.Position - oldPos);
                        return bmp;
                    }
                }
                default: throw new Exception("Error deserializing");
            }
        }
        internal IMessage DeSerialize(PayloadReader pr, uint MessageId)
        {
            Type type = null;
            if (!Messages.TryGetValue(MessageId, out type))
                return null;

            int len = pr.Length - pr.Position;
            IMessage message = (IMessage)Serializer.Deserialize(new MemoryStream(pr.Buffer, pr.Position, len), type);
            pr.Position += len;
            return message;
        }
        /*public IMessage HandleMessage(PayloadReader reader, uint MessageId)
        {
            lock (Messages)
            {
                Type type = null;
                if (!Messages.TryGetValue(MessageId, out type))
                    return null;

                IMessage message = null;//IMessage.DeSerialize(type, reader);
                return message;
            }
        }*/
        public IMessage HandleUdpMessage(PayloadReader reader, uint MessageId)
        {
            lock (Messages)
            {
                Type type = null;
                if (!Messages.TryGetValue(MessageId, out type))
                    return null;

                IMessage message = null;//IMessage.DeSerialize(type, reader);
                message.RawSize = reader.Length;
                return message;
            }
        }
Пример #35
0
        public object onRequest(AClient connection, PayloadReader pr)
        {
            ReturnResult result = new ReturnResult(null, false);
            bool isDelegate = false;
            bool ReadFullHeader = false;

            try
            {
                int SharedClassId = pr.ReadInteger();
                int MethodId = pr.ReadInteger();
                isDelegate = pr.ReadByte() == 1;
                int DelegateId = isDelegate ? pr.ReadInteger() : 0;
                int DelegateClassId = isDelegate ? pr.ReadInteger() : 0;
                ReadFullHeader = true;

                if (connection.RemoteSharedClasses.ContainsKey(SharedClassId) ||
                    (isDelegate && connection.LocalSharedClasses.ContainsKey(DelegateClassId)))
                {
                    SharedClass sClass = isDelegate ? connection.LocalSharedClasses[SharedClassId] : connection.RemoteSharedClasses[SharedClassId];
                    SharedMethod sharedMethod = sClass.GetMethod(MethodId);

                    if (sharedMethod != null)
                    {
                        List<object> args = new List<object>();
                        List<Type> types = new List<Type>();
                        SortedList<int, SharedDelegate> SharedDelegates = new SortedList<int, SharedDelegate>();
                        SmartSerializer serializer = new SmartSerializer();

                        lock(sharedMethod.Delegates)
                        {
                            if(sharedMethod.Delegates.ContainsKey(DelegateId))
                            {
                                for (int i = 0; i < sharedMethod.Delegates[DelegateId].sharedMethod.ArgumentTypes.Length; i++)
                                {
                                    args.Add(serializer.Deserialize(pr.ReadBytes(pr.ReadInteger())));
                                }
                            }
                            else
                            {
                                for (int i = 0; i < sharedMethod.ArgumentTypes.Length; i++)
                                {
                                    args.Add(serializer.Deserialize(pr.ReadBytes(pr.ReadInteger())));
                                }
                            }
                        }

                        if (!isDelegate) //atm no support yet for delegate inside another delegate
                        {
                            for (int i = 0; i < sharedMethod.DelegateIndex.Count; i++)
                            {
                                if (pr.ReadByte() == 1)
                                {
                                    SharedDelegate del = pr.ReadObject<SharedDelegate>();
                                    del.sharedMethod.sharedClass = sClass;
                                    args[sharedMethod.DelegateIndex.Keys[i]] = DynamicDelegateCreator.CreateDelegate(del);
                                    SharedDelegates.Add(del.sharedMethod.DelegateId, del);
                                }
                            }
                        }

                        if (isDelegate)
                        {
                            //only show the result and not the actual ReturnResult type
                            return sharedMethod.Delegates[DelegateId].Delegate.DynamicInvoke(args.ToArray());
                        }
                        else
                        {
                            MethodInfo m = sClass.InitializedClass.GetType().GetMethod(sharedMethod.Name, sharedMethod.ArgumentTypes);

                            if (m.GetCustomAttributes(typeof(RemoteExecutionAttribute), false).Length == 0 &&
                                m.GetCustomAttributes(typeof(UncheckedRemoteExecutionAttribute), false).Length == 0)
                            {
                                return null;
                            }
                            result.ReturnValue = m.Invoke(sClass.InitializedClass, args.ToArray());
                        }
                    }
                }
            } catch (Exception ex)
            {
                if (isDelegate && ReadFullHeader)
                    throw ex;

                result.exceptionMessage = ex.InnerException != null ? ex.InnerException.Message : ex.Message;
                result.ExceptionOccured = true;
            }
            return result;
        }
Пример #36
0
        private void AynsReceive(IAsyncResult result)
        {
            int BytesTransferred = -1;
            try
            {
                BytesTransferred = Handle.EndReceive(result);

                SysLogger.Log("Received " + BytesTransferred, SysLogType.Network);

                if (BytesTransferred <= 0)
                {
                    Disconnect();
                    return;
                }
            }
            catch(Exception ex)
            {
                SysLogger.Log(ex.Message, SysLogType.Error);
                Disconnect();
                return;
            }

            try
            {
                //let's check the certificate
                if (Client.Server != null && Client.Server.serverProperties != null)
                {
                    if (Client.ConnectionTime > Client.Server.serverProperties.ClientTimeConnected)
                    {
                        //we need to wait till the time is right
                        Disconnect();
                        return;
                    }
                }

                this.LastPacketRecvSW = Stopwatch.StartNew();
                ReadableDataLen += BytesTransferred;
                DataIn += (ulong)BytesTransferred;
                bool Process = true;

                while (Process)
                {
                    if (ReceiveState == ReceiveType.Header)
                    {
                        Process = ReadableDataLen >= HEADER_SIZE;
                        if (ReadableDataLen >= HEADER_SIZE)
                        {
                            lock (HeaderEncryption)
                            {
                                headerConfuser.Deobfuscate(ref Buffer, ReadOffset);
                                HeaderEncryption.Decrypt(Buffer, ReadOffset, HEADER_SIZE);
                            }

                            using(PayloadReader pr = new PayloadReader(Buffer))
                            {
                                pr.Position = ReadOffset;
                                PayloadLen = pr.ReadThreeByteInteger();
                                CurPacketId = pr.ReadByte();
                                ConnectionId = pr.ReadUShort();
                                HeaderId = pr.ReadUShort();
                                HeaderChecksum = pr.ReadByte();
                                FeatureId = pr.ReadInteger();
                            }

                            byte ReChecksum = 0; //re-calculate the checksum
                            ReChecksum += (byte)PayloadLen;
                            ReChecksum += CurPacketId;
                            ReChecksum += (byte)ConnectionId;
                            ReChecksum += (byte)HeaderId;
                            ReChecksum += (byte)FeatureId;

                            if (ReChecksum != HeaderChecksum ||
                                PayloadLen >= MAX_PACKET_SIZE ||
                                PayloadLen < 0)
                            {
                                Disconnect();
                                return;
                            }

                            if(PayloadLen > Buffer.Length)
                            {
                                ResizeBuffer(PayloadLen);
                            }

                            TotalReceived = HEADER_SIZE;
                            ReadableDataLen -= HEADER_SIZE;
                            ReadOffset += HEADER_SIZE;
                            ReceiveState = ReceiveType.Payload;
                        }
                    }
                    else if (ReceiveState == ReceiveType.Payload)
                    {
                        Process = ReadableDataLen >= PayloadLen;
                        if (ReadableDataLen >= PayloadLen)
                        {
                            byte[] DecryptedBuffer = null;
                            int DecryptedBuffLen = 0;

                            messageHandler.DecryptMessage(this, Buffer, ReadOffset, PayloadLen, ref DecryptedBuffer, ref DecryptedBuffLen);

                            if (DecryptedBuffer == null)
                            {
                                //failed to decrypt data
                                Disconnect();
                                return;
                            }

                            TotalReceived += PayloadLen;

                            using (PayloadReader pr = new PayloadReader(DecryptedBuffer))
                            {
                                OperationalSocket OpSocket = null;
                                if (ConnectionId > 0)
                                {
                                    lock(OperationalSockets)
                                    {
                                        if (!OperationalSockets.TryGetValue(ConnectionId, out OpSocket))
                                        {
                                            //strange...
                                            Disconnect();
                                            return;
                                        }
                                    }
                                }

                                Type type = Headers.GetHeaderType(HeaderId);

                                if (type != null)
                                {
                                    Header header = Header.DeSerialize(type, pr);

                                    if(header == null)
                                    {
                                        Disconnect();
                                        return;
                                    }

                                    uint MessageId = pr.ReadUInteger();
                                    IMessage message = OpSocket != null ? OpSocket.MessageHandler.DeSerialize(pr, MessageId) : messageHandler.DeSerialize(pr, MessageId);

                                    if (message != null)
                                    {
                                        message.RawSize = TotalReceived;
                                        message.Header = header;

                                        if (!HandShakeCompleted)
                                        {
                                            if (message.GetType() == typeof(MsgHandshake))
                                            {
                                                //process the handshake messages straight away
                                                message.ProcessPayload(Client, null);
                                            }
                                        }
                                        else
                                        {
                                            ProcessMessage(new SystemPacket(header, message, ConnectionId, OpSocket));
                                        }
                                    }
                                }
                                else
                                {
                                    Disconnect();
                                    return;
                                }
                            }
                            TotalReceived = 0;

                            PacketsIn++;
                            ReadOffset += PayloadLen;
                            ReadableDataLen -= PayloadLen;
                            ReceiveState = ReceiveType.Header;
                        }
                    }
                }

                int len = ReceiveState == ReceiveType.Header ? HEADER_SIZE : PayloadLen;
                if (ReadOffset + len >= this.Buffer.Length)
                {
                    //no more room for this data size, at the end of the buffer ?

                    //copy the buffer to the beginning
                    Array.Copy(this.Buffer, ReadOffset, this.Buffer, 0, ReadableDataLen);

                    WriteOffset = ReadableDataLen;
                    ReadOffset = 0;
                }
                else
                {
                    //payload fits in the buffer from the current offset
                    //use BytesTransferred to write at the end of the payload
                    //so that the data is not split
                    WriteOffset += BytesTransferred;
                }

                if (Buffer.Length - WriteOffset > 0)
                {
                    Handle.BeginReceive(this.Buffer, WriteOffset, Buffer.Length - WriteOffset, SocketFlags.None, AynsReceive, null);
                }
                else
                {
                    //Shoudln't be even possible... very strange
                    Disconnect();
                }
            }
            catch(Exception ex)
            {
                //unexpected error, client might have disconnected itself, or else report this error
                SysLogger.Log(ex.Message, SysLogType.Error);
                Disconnect();
                return;
            }
        }