protected override void DataReceived(HTTPConnection sender, NetworkBuffer data) { //Console.WriteLine(Data); // Initialize a new session //HTTPConnection HTTP = (HTTPConnection)sender.ExtraObject; //string Data = System.Text.Encoding.Default.GetString(ReceivedData); byte[] msg = data.Read(); var BL = sender.Parse(msg); if (BL == 0) { if (sender.Request.Method == HTTPRequestPacket.HTTPMethod.UNKNOWN) { sender.Close(); return; } if (sender.Request.URL == "") { sender.Close(); return; } } else if (BL == -1) { data.HoldForNextWrite(msg); return; } else if (BL < 0) { data.HoldFor(msg, (uint)(msg.Length - BL)); return; } else if (BL > 0) { if (BL > maxPost) { sender.Send( "<html><body>POST method content is larger than " + maxPost + " bytes.</body></html>"); sender.Close(); } else { data.HoldFor(msg, (uint)(msg.Length + BL)); } return; } else if (BL < 0) // for security { sender.Close(); return; } if (sender.IsWebsocketRequest() & !sender.WSMode) { sender.Upgrade(); //return; } //return; try { foreach (IResource resource in Instance.Children) { if (resource is HTTPFilter) { if ((resource as HTTPFilter).Execute(sender)) { return; } } } sender.Send("Bad Request"); sender.Close(); } catch (Exception ex) { if (ex.Message != "Thread was being aborted.") { Global.Log("HTTPServer", LogType.Error, ex.ToString()); //Console.WriteLine(ex.ToString()); //EventLog.WriteEntry("HttpServer", ex.ToString(), EventLogEntryType.Error); sender.Send(Return500(ex.Message)); } } }
private void Sock_OnReceive(NetworkBuffer buffer) { if (sock.State == SocketState.Closed || sock.State == SocketState.Terminated) { return; } if (buffer.Protected) { return; } if (processing) { return; } var msg = buffer.Read(); if (msg == null) { return; } var wsPacketLength = pkt_receive.Parse(msg, 0, (uint)msg.Length); //Console.WriteLine("WSP: " + wsPacketLength); if (wsPacketLength < 0) { buffer.Protect(msg, 0, (uint)msg.Length + (uint)-wsPacketLength); return; } uint offset = 0; while (wsPacketLength > 0) { if (pkt_receive.Opcode == WebsocketPacket.WSOpcode.ConnectionClose) { Close(); return; } else if (pkt_receive.Opcode == WebsocketPacket.WSOpcode.Ping) { var pkt_pong = new WebsocketPacket(); pkt_pong.FIN = true; pkt_pong.Mask = false; pkt_pong.Opcode = WebsocketPacket.WSOpcode.Pong; pkt_pong.Message = pkt_receive.Message; offset += (uint)wsPacketLength; Send(pkt_pong); } else if (pkt_receive.Opcode == WebsocketPacket.WSOpcode.Pong) { offset += (uint)wsPacketLength; } else if (pkt_receive.Opcode == WebsocketPacket.WSOpcode.BinaryFrame || pkt_receive.Opcode == WebsocketPacket.WSOpcode.TextFrame || pkt_receive.Opcode == WebsocketPacket.WSOpcode.ContinuationFrame) { totalReceived += pkt_receive.Message.Length; //Console.WriteLine("RX " + pkt_receive.Message.Length + "/" + totalReceived);// + " " + DC.ToHex(message, 0, (uint)size)); receiveNetworkBuffer.Write(pkt_receive.Message); offset += (uint)wsPacketLength; //Console.WriteLine("WS IN: " + pkt_receive.Opcode.ToString() + " " + pkt_receive.Message.Length + " | " + offset + " " + string.Join(" ", pkt_receive.Message));// DC.ToHex(pkt_receive.Message)); } else { Console.WriteLine("Unknown WS opcode:" + pkt_receive.Opcode); } if (offset == msg.Length) { // Console.WriteLine("WS IN: " + receiveNetworkBuffer.Available); OnReceive?.Invoke(receiveNetworkBuffer); return; } wsPacketLength = pkt_receive.Parse(msg, offset, (uint)msg.Length); } if (wsPacketLength < 0)//(offset < msg.Length) && (offset > 0)) { //receiveNetworkBuffer.HoldFor(msg, offset, (uint)(msg.Length - offset), (uint)msg.Length + (uint)-wsPacketLength); // save the incomplete packet to the heldBuffer queue buffer.HoldFor(msg, offset, (uint)(msg.Length - offset), (uint)(msg.Length - offset) + (uint)-wsPacketLength); } //Console.WriteLine("WS IN: " + receiveNetworkBuffer.Available); OnReceive?.Invoke(receiveNetworkBuffer); processing = false; if (buffer.Available > 0 && !buffer.Protected) { Sock_OnReceive(buffer); } }
protected override void DataReceived(NetworkBuffer data) { byte[] msg = data.Read(); var BL = Parse(msg); if (BL == 0) { if (Request.Method == HTTPRequestPacket.HTTPMethod.UNKNOWN) { Close(); return; } if (Request.URL == "") { Close(); return; } } else if (BL == -1) { data.HoldForNextWrite(msg); return; } else if (BL < 0) { data.HoldFor(msg, (uint)(msg.Length - BL)); return; } else if (BL > 0) { if (BL > Server.MaxPost) { Send( "<html><body>POST method content is larger than " + Server.MaxPost + " bytes.</body></html>"); Close(); } else { data.HoldFor(msg, (uint)(msg.Length + BL)); } return; } else if (BL < 0) // for security { Close(); return; } if (IsWebsocketRequest(Request) & !WSMode) { Upgrade(); //return; } //return; try { if (!Server.Execute(this)) { Response.Number = HTTPResponsePacket.ResponseCode.InternalServerError; Send("Bad Request"); Close(); } } catch (Exception ex) { if (ex.Message != "Thread was being aborted.") { Global.Log("HTTPServer", LogType.Error, ex.ToString()); //Console.WriteLine(ex.ToString()); //EventLog.WriteEntry("HttpServer", ex.ToString(), EventLogEntryType.Error); Send(Error500(ex.Message)); } } }
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); }