G2ReceivedPacket LastPacket; //crit delete void ReceivePackets() { int Start = 0; G2ReadResult streamStatus = G2ReadResult.PACKET_GOOD; while (streamStatus == G2ReadResult.PACKET_GOOD) { G2ReceivedPacket packet = new G2ReceivedPacket(); packet.Root = new G2Header(FinalRecvBuffer); streamStatus = G2Protocol.ReadNextPacket(packet.Root, ref Start, ref FinalRecvBuffSize); if (streamStatus != G2ReadResult.PACKET_GOOD) { break; } packet.Tcp = this; packet.Source = new DhtContact(this, RemoteIP); // extract data from final recv buffer so it can be referenced without being overwritten by this thread byte[] extracted = Utilities.ExtractBytes(packet.Root.Data, packet.Root.PacketPos, packet.Root.PacketSize); packet.Root = new G2Header(extracted); G2Protocol.ReadPacket(packet.Root); LastPacket = packet; PacketLogEntry logEntry = new PacketLogEntry(Core.TimeNow, TransportProtocol.Tcp, DirectionType.In, packet.Source, packet.Root.Data); Network.LogPacket(logEntry); Network.IncomingPacket(packet); } // re-align buffer if (Start > 0 && FinalRecvBuffSize > 0) { Buffer.BlockCopy(FinalRecvBuffer, Start, FinalRecvBuffer, 0, FinalRecvBuffSize); //Network.UpdateConsole(PacketBytesReady.ToString() + " bytes moved to front of receive buffer"); } }
public void OnReceive() { if (ReceiveBuffer == null) { ReceiveBuffer = new byte[BUFF_SIZE]; } int recvd = Comm.Receive(ReceiveBuffer, RecvBuffSize, BUFF_SIZE - RecvBuffSize); if (recvd <= 0) { return; } int start = 0; RecvBuffSize += recvd; // get next packet G2ReadResult streamStatus = G2ReadResult.PACKET_GOOD; while (streamStatus == G2ReadResult.PACKET_GOOD) { G2ReceivedPacket packet = new G2ReceivedPacket(); start = 0; // if encryption off if (RecvDecryptor == null) { packet.Root = new G2Header(ReceiveBuffer); streamStatus = G2Protocol.ReadNextPacket(packet.Root, ref start, ref RecvBuffSize); if (streamStatus != G2ReadResult.PACKET_GOOD) { break; } PacketLogEntry logEntry = new PacketLogEntry(Core.TimeNow, TransportProtocol.Rudp, DirectionType.In, Comm.PrimaryAddress.Address, Utilities.ExtractBytes(packet.Root.Data, packet.Root.PacketPos, packet.Root.PacketSize)); Core.Network.LogPacket(logEntry); ReceivePacket(packet); if (start > 0 && RecvBuffSize > 0) { Buffer.BlockCopy(ReceiveBuffer, start, ReceiveBuffer, 0, RecvBuffSize); } } // else if encryption on else { // if data needs to be decrypted from receive buffer if (RecvBuffSize >= RecvBlockSize) { int transLength = RecvBuffSize - (RecvBuffSize % RecvBlockSize); int spaceAvail = BUFF_SIZE - DecryptBuffSize; if (spaceAvail < transLength) { transLength = spaceAvail - (spaceAvail % RecvBlockSize); } if (transLength >= RecvBlockSize) { if (DecryptBuffer == null) { DecryptBuffer = new byte[BUFF_SIZE]; } int transformed = RecvDecryptor.TransformBlock(ReceiveBuffer, 0, transLength, DecryptBuffer, DecryptBuffSize); Debug.Assert(transformed == transLength); DecryptBuffSize += transformed; RecvBuffSize -= transLength; Buffer.BlockCopy(ReceiveBuffer, transLength, ReceiveBuffer, 0, RecvBuffSize); } } // read packets from decrypt buffer packet.Root = new G2Header(DecryptBuffer); //crit - delete //int lastStart = start; //int lastBuffSize = DecryptBuffSize; //byte[] lastBuffer = Utilities.ExtractBytes(DecryptBuffer, 0, DecryptBuffSize); streamStatus = G2Protocol.ReadNextPacket(packet.Root, ref start, ref DecryptBuffSize); if (streamStatus == G2ReadResult.PACKET_ERROR) { //crit - debug this Send_Close("Session Packet Error"); break; } if (streamStatus != G2ReadResult.PACKET_GOOD) { break; } PacketLogEntry logEntry = new PacketLogEntry(Core.TimeNow, TransportProtocol.Rudp, DirectionType.In, Comm.PrimaryAddress.Address, Utilities.ExtractBytes(packet.Root.Data, packet.Root.PacketPos, packet.Root.PacketSize)); Core.Network.LogPacket(logEntry); ReceivePacket(packet); if (start > 0 && DecryptBuffSize > 0) { Buffer.BlockCopy(DecryptBuffer, start, DecryptBuffer, 0, DecryptBuffSize); } } } }
private static string LoadProfile(ProfileService service, OpProfile profile, string tempPath, Dictionary <string, string> textFields, Dictionary <string, string> fileFields) { string template = null; textFields.Clear(); textFields["local_help"] = (profile.UserID == service.Core.UserID) ? "<font size=2>Right-click or click <a href='http://edit'>here</a> to Edit</font>" : ""; if (fileFields != null) { fileFields.Clear(); } if (!profile.Loaded) { service.LoadProfile(profile.UserID); } try { using (TaggedStream stream = new TaggedStream(service.GetFilePath(profile), service.Core.GuiProtocol)) using (IVCryptoStream crypto = IVCryptoStream.Load(stream, profile.File.Header.FileKey)) { int buffSize = 4096; byte[] buffer = new byte[4096]; long bytesLeft = profile.EmbeddedStart; while (bytesLeft > 0) { int readSize = (bytesLeft > (long)buffSize) ? buffSize : (int)bytesLeft; int read = crypto.Read(buffer, 0, readSize); bytesLeft -= (long)read; } // load file foreach (ProfileAttachment attached in profile.Attached) { if (attached.Name.StartsWith("template")) { byte[] html = new byte[attached.Size]; crypto.Read(html, 0, (int)attached.Size); UTF8Encoding utf = new UTF8Encoding(); template = utf.GetString(html); } else if (attached.Name.StartsWith("fields")) { byte[] data = new byte[attached.Size]; crypto.Read(data, 0, (int)attached.Size); int start = 0, length = data.Length; G2ReadResult streamStatus = G2ReadResult.PACKET_GOOD; while (streamStatus == G2ReadResult.PACKET_GOOD) { G2ReceivedPacket packet = new G2ReceivedPacket(); packet.Root = new G2Header(data); streamStatus = G2Protocol.ReadNextPacket(packet.Root, ref start, ref length); if (streamStatus != G2ReadResult.PACKET_GOOD) { break; } if (packet.Root.Name == ProfilePacket.Field) { ProfileField field = ProfileField.Decode(packet.Root); if (field.Value == null) { continue; } if (field.FieldType == ProfileFieldType.Text) { textFields[field.Name] = UTF8Encoding.UTF8.GetString(field.Value); } else if (field.FieldType == ProfileFieldType.File && fileFields != null) { fileFields[field.Name] = UTF8Encoding.UTF8.GetString(field.Value); } } } } else if (attached.Name.StartsWith("file=") && fileFields != null) { string name = attached.Name.Substring(5); try { string fileKey = null; foreach (string key in fileFields.Keys) { if (name == fileFields[key]) { fileKey = key; break; } } fileFields[fileKey] = tempPath + Path.DirectorySeparatorChar + name; using (FileStream extract = new FileStream(fileFields[fileKey], FileMode.CreateNew, FileAccess.Write)) { long remaining = attached.Size; byte[] buff = new byte[2096]; while (remaining > 0) { int read = (remaining > 2096) ? 2096 : (int)remaining; remaining -= read; crypto.Read(buff, 0, read); extract.Write(buff, 0, read); } } } catch { } } } } } catch (Exception) { } return(template); }