Example #1
0
        private uint processPacket(byte[] msg, uint offset, uint ends, NetworkBuffer data, int chunkId)
        {
            var packet = new IIPPacket();



            // packets++;

            if (ready)
            {
                var rt = packet.Parse(msg, offset, ends);
                //Console.WriteLine("Rec: " + chunkId + " " + packet.ToString());

                /*
                 * if (packet.Command == IIPPacketCommand.Event)
                 *  Console.WriteLine("Rec: " + packet.Command.ToString() + " " + packet.Event.ToString());
                 * else if (packet.Command == IIPPacketCommand.Report)
                 *  Console.WriteLine("Rec: " + packet.Command.ToString() + " " + packet.Report.ToString());
                 * else
                 *  Console.WriteLine("Rec: " + packet.Command.ToString() + " " + packet.Action.ToString() + " " + packet.ResourceId + " " + offset + "/" + ends);
                 */


                //packs.Add(packet.Command.ToString() + " " + packet.Action.ToString() + " " + packet.Event.ToString());

                //if (packs.Count > 1)
                //  Console.WriteLine("P2");

                if (rt <= 0)
                {
                    var size = ends - offset;
                    data.HoldFor(msg, offset, size, size + (uint)(-rt));
                    return(ends);
                }
                else
                {
                    offset += (uint)rt;

                    if (packet.Command == IIPPacket.IIPPacketCommand.Event)
                    {
                        switch (packet.Event)
                        {
                        case IIPPacket.IIPPacketEvent.ResourceReassigned:
                            IIPEventResourceReassigned(packet.ResourceId, packet.NewResourceId);
                            break;

                        case IIPPacket.IIPPacketEvent.ResourceDestroyed:
                            IIPEventResourceDestroyed(packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketEvent.PropertyUpdated:
                            IIPEventPropertyUpdated(packet.ResourceId, packet.MethodIndex, packet.Content);
                            break;

                        case IIPPacket.IIPPacketEvent.EventOccurred:
                            IIPEventEventOccurred(packet.ResourceId, packet.MethodIndex, packet.Content);
                            break;

                        case IIPPacketEvent.ChildAdded:
                            IIPEventChildAdded(packet.ResourceId, packet.ChildId);
                            break;

                        case IIPPacketEvent.ChildRemoved:
                            IIPEventChildRemoved(packet.ResourceId, packet.ChildId);
                            break;

                        case IIPPacketEvent.Renamed:
                            IIPEventRenamed(packet.ResourceId, packet.Content);
                            break;

                        case IIPPacketEvent.AttributesUpdated:
                            IIPEventAttributesUpdated(packet.ResourceId, packet.Content);
                            break;
                        }
                    }
                    else if (packet.Command == IIPPacket.IIPPacketCommand.Request)
                    {
                        switch (packet.Action)
                        {
                        // Manage
                        case IIPPacket.IIPPacketAction.AttachResource:
                            IIPRequestAttachResource(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketAction.ReattachResource:
                            IIPRequestReattachResource(packet.CallbackId, packet.ResourceId, packet.ResourceAge);
                            break;

                        case IIPPacket.IIPPacketAction.DetachResource:
                            IIPRequestDetachResource(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketAction.CreateResource:
                            IIPRequestCreateResource(packet.CallbackId, packet.StoreId, packet.ResourceId, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.DeleteResource:
                            IIPRequestDeleteResource(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacketAction.AddChild:
                            IIPRequestAddChild(packet.CallbackId, packet.ResourceId, packet.ChildId);
                            break;

                        case IIPPacketAction.RemoveChild:
                            IIPRequestRemoveChild(packet.CallbackId, packet.ResourceId, packet.ChildId);
                            break;

                        case IIPPacketAction.RenameResource:
                            IIPRequestRenameResource(packet.CallbackId, packet.ResourceId, packet.Content);
                            break;

                        // Inquire
                        case IIPPacket.IIPPacketAction.TemplateFromClassName:
                            IIPRequestTemplateFromClassName(packet.CallbackId, packet.ClassName);
                            break;

                        case IIPPacket.IIPPacketAction.TemplateFromClassId:
                            IIPRequestTemplateFromClassId(packet.CallbackId, packet.ClassId);
                            break;

                        case IIPPacket.IIPPacketAction.TemplateFromResourceId:
                            IIPRequestTemplateFromResourceId(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacketAction.QueryLink:
                            IIPRequestQueryResources(packet.CallbackId, packet.ResourceLink);
                            break;

                        case IIPPacketAction.ResourceChildren:
                            IIPRequestResourceChildren(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacketAction.ResourceParents:
                            IIPRequestResourceParents(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketAction.ResourceHistory:
                            IIPRequestInquireResourceHistory(packet.CallbackId, packet.ResourceId, packet.FromDate, packet.ToDate);
                            break;

                        // Invoke
                        case IIPPacket.IIPPacketAction.InvokeFunction:
                            IIPRequestInvokeFunction(packet.CallbackId, packet.ResourceId, packet.MethodIndex, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.GetProperty:
                            IIPRequestGetProperty(packet.CallbackId, packet.ResourceId, packet.MethodIndex);
                            break;

                        case IIPPacket.IIPPacketAction.GetPropertyIfModified:
                            IIPRequestGetPropertyIfModifiedSince(packet.CallbackId, packet.ResourceId, packet.MethodIndex, packet.ResourceAge);
                            break;

                        case IIPPacket.IIPPacketAction.SetProperty:
                            IIPRequestSetProperty(packet.CallbackId, packet.ResourceId, packet.MethodIndex, packet.Content);
                            break;

                        // Attribute
                        case IIPPacketAction.GetAllAttributes:
                            IIPRequestGetAttributes(packet.CallbackId, packet.ResourceId, packet.Content, true);
                            break;

                        case IIPPacketAction.UpdateAllAttributes:
                            IIPRequestUpdateAttributes(packet.CallbackId, packet.ResourceId, packet.Content, true);
                            break;

                        case IIPPacketAction.ClearAllAttributes:
                            IIPRequestClearAttributes(packet.CallbackId, packet.ResourceId, packet.Content, true);
                            break;

                        case IIPPacketAction.GetAttributes:
                            IIPRequestGetAttributes(packet.CallbackId, packet.ResourceId, packet.Content, false);
                            break;

                        case IIPPacketAction.UpdateAttributes:
                            IIPRequestUpdateAttributes(packet.CallbackId, packet.ResourceId, packet.Content, false);
                            break;

                        case IIPPacketAction.ClearAttributes:
                            IIPRequestClearAttributes(packet.CallbackId, packet.ResourceId, packet.Content, false);
                            break;
                        }
                    }
                    else if (packet.Command == IIPPacket.IIPPacketCommand.Reply)
                    {
                        switch (packet.Action)
                        {
                        // Manage
                        case IIPPacket.IIPPacketAction.AttachResource:
                            IIPReply(packet.CallbackId, packet.ClassId, packet.ResourceAge, packet.ResourceLink, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.ReattachResource:
                            IIPReply(packet.CallbackId, packet.ResourceAge, packet.Content);

                            break;

                        case IIPPacket.IIPPacketAction.DetachResource:
                            IIPReply(packet.CallbackId);
                            break;

                        case IIPPacket.IIPPacketAction.CreateResource:
                            IIPReply(packet.CallbackId, packet.ResourceId);
                            break;

                        case IIPPacket.IIPPacketAction.DeleteResource:
                        case IIPPacketAction.AddChild:
                        case IIPPacketAction.RemoveChild:
                        case IIPPacketAction.RenameResource:
                            IIPReply(packet.CallbackId);
                            break;

                        // Inquire

                        case IIPPacket.IIPPacketAction.TemplateFromClassName:
                        case IIPPacket.IIPPacketAction.TemplateFromClassId:
                        case IIPPacket.IIPPacketAction.TemplateFromResourceId:
                            IIPReply(packet.CallbackId, ResourceTemplate.Parse(packet.Content));
                            break;

                        case IIPPacketAction.QueryLink:
                        case IIPPacketAction.ResourceChildren:
                        case IIPPacketAction.ResourceParents:
                        case IIPPacketAction.ResourceHistory:
                            IIPReply(packet.CallbackId, packet.Content);
                            break;

                        // Invoke
                        case IIPPacket.IIPPacketAction.InvokeFunction:
                            IIPReplyInvoke(packet.CallbackId, packet.Content);

                            break;

                        case IIPPacket.IIPPacketAction.GetProperty:
                            IIPReply(packet.CallbackId, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.GetPropertyIfModified:
                            IIPReply(packet.CallbackId, packet.Content);
                            break;

                        case IIPPacket.IIPPacketAction.SetProperty:
                            IIPReply(packet.CallbackId);
                            break;

                        // Attribute
                        case IIPPacketAction.GetAllAttributes:
                        case IIPPacketAction.GetAttributes:
                            IIPReply(packet.CallbackId, packet.Content);
                            break;

                        case IIPPacketAction.UpdateAllAttributes:
                        case IIPPacketAction.UpdateAttributes:
                        case IIPPacketAction.ClearAllAttributes:
                        case IIPPacketAction.ClearAttributes:
                            IIPReply(packet.CallbackId);
                            break;
                        }
                    }
                    else if (packet.Command == IIPPacketCommand.Report)
                    {
                        switch (packet.Report)
                        {
                        case IIPPacketReport.ManagementError:
                            IIPReportError(packet.CallbackId, AsyncReply.ErrorType.Management, packet.ErrorCode, null);
                            break;

                        case IIPPacketReport.ExecutionError:
                            IIPReportError(packet.CallbackId, AsyncReply.ErrorType.Exception, packet.ErrorCode, packet.ErrorMessage);
                            break;

                        case IIPPacketReport.ProgressReport:
                            IIPReportProgress(packet.CallbackId, AsyncReply.ProgressType.Execution, packet.ProgressValue, packet.ProgressMax);
                            break;

                        case IIPPacketReport.ChunkStream:
                            IIPReportChunk(packet.CallbackId, packet.Content);

                            break;
                        }
                    }
                }
            }

            else
            {
                var rt = authPacket.Parse(msg, offset, ends);

                //Console.WriteLine(session.LocalAuthentication.Type.ToString() + " " + offset + " " + ends + " " + rt + " " + authPacket.ToString());

                if (rt <= 0)
                {
                    data.HoldFor(msg, ends + (uint)(-rt));
                    return(ends);
                }
                else
                {
                    offset += (uint)rt;

                    if (session.LocalAuthentication.Type == AuthenticationType.Host)
                    {
                        if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Declare)
                        {
                            if (authPacket.RemoteMethod == IIPAuthPacket.IIPAuthPacketMethod.Credentials && authPacket.LocalMethod == IIPAuthPacket.IIPAuthPacketMethod.None)
                            {
                                Server.Membership.UserExists(authPacket.RemoteUsername, authPacket.Domain).Then(x =>
                                {
                                    if (x)
                                    {
                                        session.RemoteAuthentication.Username = authPacket.RemoteUsername;
                                        remoteNonce = authPacket.RemoteNonce;
                                        session.RemoteAuthentication.Domain = authPacket.Domain;
                                        SendParams((byte)0xa0, localNonce);
                                    }
                                    else
                                    {
                                        //Console.WriteLine("User not found");
                                        SendParams((byte)0xc0, (byte)1, (ushort)14, DC.ToBytes("User not found"));
                                    }
                                });
                            }
                        }
                        else if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Action)
                        {
                            if (authPacket.Action == IIPAuthPacket.IIPAuthPacketAction.AuthenticateHash)
                            {
                                var remoteHash = authPacket.Hash;

                                Server.Membership.GetPassword(session.RemoteAuthentication.Username,
                                                              session.RemoteAuthentication.Domain).Then((pw) =>
                                {
                                    if (pw != null)
                                    {
                                        var hashFunc = SHA256.Create();
                                        var hash     = hashFunc.ComputeHash(BinaryList.ToBytes(pw, remoteNonce, localNonce));
                                        if (hash.SequenceEqual(remoteHash))
                                        {
                                            // send our hash
                                            var localHash = hashFunc.ComputeHash(BinaryList.ToBytes(localNonce, remoteNonce, pw));

                                            SendParams((byte)0, localHash);

                                            readyToEstablish = true;
                                        }
                                        else
                                        {
                                            Global.Log("auth", LogType.Warning, "U:" + RemoteUsername + " IP:" + Socket.RemoteEndPoint.Address.ToString() + " S:DENIED");
                                            //Console.WriteLine("Incorrect password");
                                            SendParams((byte)0xc0, (byte)1, (ushort)5, DC.ToBytes("Error"));
                                        }
                                    }
                                });
                            }
                            else if (authPacket.Action == IIPAuthPacket.IIPAuthPacketAction.NewConnection)
                            {
                                if (readyToEstablish)
                                {
                                    var r = new Random();
                                    session.Id = new byte[32];
                                    r.NextBytes(session.Id);
                                    SendParams((byte)0x28, session.Id);
                                    ready = true;
                                    OnReady?.Invoke(this);
                                    Server.Membership.Login(session);

                                    Global.Log("auth", LogType.Warning, "U:" + RemoteUsername + " IP:" + Socket.RemoteEndPoint.Address.ToString() + " S:AUTH");
                                }
                            }
                        }
                    }
                    else if (session.LocalAuthentication.Type == AuthenticationType.Client)
                    {
                        if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Acknowledge)
                        {
                            remoteNonce = authPacket.RemoteNonce;

                            // send our hash
                            var hashFunc  = SHA256.Create();
                            var localHash = hashFunc.ComputeHash(BinaryList.ToBytes(localPassword, localNonce, remoteNonce));

                            SendParams((byte)0, localHash);
                        }
                        else if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Action)
                        {
                            if (authPacket.Action == IIPAuthPacket.IIPAuthPacketAction.AuthenticateHash)
                            {
                                // check if the server knows my password
                                var hashFunc   = SHA256.Create();
                                var remoteHash = hashFunc.ComputeHash(BinaryList.ToBytes(remoteNonce, localNonce, localPassword));

                                if (remoteHash.SequenceEqual(authPacket.Hash))
                                {
                                    // send establish request
                                    SendParams((byte)0x20, (ushort)0);
                                }
                                else
                                {
                                    SendParams((byte)0xc0, 1, (ushort)5, DC.ToBytes("Error"));
                                }
                            }
                            else if (authPacket.Action == IIPAuthPacket.IIPAuthPacketAction.ConnectionEstablished)
                            {
                                session.Id = authPacket.SessionId;

                                ready = true;
                                OnReady?.Invoke(this);
                            }
                        }
                        else if (authPacket.Command == IIPAuthPacket.IIPAuthPacketCommand.Error)
                        {
                            OnError?.Invoke(this, authPacket.ErrorCode, authPacket.ErrorMessage);
                            Close();
                        }
                    }
                }
            }

            return(offset);

            //if (offset < ends)
            //  processPacket(msg, offset, ends, data, chunkId);
        }