예제 #1
0
        private void ExtractFileData(FileTransfer.FileStreamAssembler assembler, FileTransfer.FileStreamAssemblerList fileStreamAssemblerList, NetworkHost sourceHost, ushort sourcePort, NetworkHost destinationHost, ushort destinationPort, Packets.TftpPacket tftpPacket)
        {
            if (tftpPacket.OpCode == Packets.TftpPacket.OpCodes.Data)
            {
                if (!assembler.IsActive)
                {
                    //create a new active assembler if ports need to be changed!
                    if (assembler.SourcePort != sourcePort || assembler.DestinationPort != destinationPort)
                    {
                        fileStreamAssemblerList.Remove(assembler, true);
                        //now change the port number in the AssemblerPool
                        FiveTuple tmpFiveTuple = new FiveTuple(sourceHost, sourcePort, destinationHost, destinationPort, FiveTuple.TransportProtocol.UDP);
                        assembler = new FileTransfer.FileStreamAssembler(fileStreamAssemblerList, tmpFiveTuple, true, FileTransfer.FileStreamTypes.TFTP, assembler.Filename, assembler.FileLocation, assembler.Details, tftpPacket.ParentFrame.FrameNumber, tftpPacket.ParentFrame.Timestamp);
                        fileStreamAssemblerList.Add(assembler);
                    }
                    //activate the assembler
                    assembler.TryActivate();
                }

                if (assembler.SourceHost == sourceHost && assembler.SourcePort == sourcePort && assembler.DestinationHost == destinationHost && assembler.DestinationPort == destinationPort)
                {
                    assembler.AddData(tftpPacket.DataBlock, tftpPacket.DataBlockNumber);
                    if (tftpPacket.DataBlockIsLast)
                    {
                        assembler.FinishAssembling();//we now have the complete file
                    }
                }
            }
        }
 private FileSegmentAssembler(string fileOutputDirectory, string filePath, string uniqueFileId, FileTransfer.FileStreamAssemblerList fileStreamAssemblerList, PopularityList <string, PacketParser.FileTransfer.FileSegmentAssembler> parentAssemblerList, FileStreamTypes fileStreamType, string details, string serverHostname)
 {
     this.fileOutputDirectory = fileOutputDirectory;
     //this.fileTransferIsServerToClient = fileTransferIsServerToClient;
     this.filePath                = filePath;
     this.uniqueFileId            = uniqueFileId;
     this.parentAssemblerList     = parentAssemblerList;
     this.fileStreamAssemblerList = fileStreamAssemblerList;
     this.fileStreamType          = fileStreamType;
     this.details        = details;
     this.serverHostname = serverHostname;
 }
예제 #3
0
        private bool TryGetTftpFileStreamAssembler(out FileTransfer.FileStreamAssembler assembler, FileTransfer.FileStreamAssemblerList fileStreamAssemblerList, NetworkHost sourceHost, ushort sourcePort, NetworkHost destinationHost, ushort destinationPort)
        {
            FiveTuple tmpFiveTuple = new FiveTuple(sourceHost, sourcePort, destinationHost, destinationPort, FiveTuple.TransportProtocol.UDP);

            if (fileStreamAssemblerList.ContainsAssembler(tmpFiveTuple, true))
            {
                //already activated read or write request data
                assembler = fileStreamAssemblerList.GetAssembler(tmpFiveTuple, true);
                if (assembler.FileStreamType == FileTransfer.FileStreamTypes.TFTP)
                {
                    return(true);
                }
                else
                {
                    assembler = null;
                }
            }
            tmpFiveTuple = new FiveTuple(sourceHost, Packets.TftpPacket.DefaultUdpPortNumber, destinationHost, destinationPort, FiveTuple.TransportProtocol.UDP);
            if (fileStreamAssemblerList.ContainsAssembler(tmpFiveTuple, true))
            {
                //first read request data
                assembler = fileStreamAssemblerList.GetAssembler(tmpFiveTuple, true);
                if (assembler.FileStreamType == FileTransfer.FileStreamTypes.TFTP)
                {
                    return(true);
                }
                else
                {
                    assembler = null;
                }
            }
            tmpFiveTuple = new FiveTuple(sourceHost, sourcePort, destinationHost, Packets.TftpPacket.DefaultUdpPortNumber, FiveTuple.TransportProtocol.UDP);
            if (fileStreamAssemblerList.ContainsAssembler(tmpFiveTuple, true))
            {
                //check for write request data
                assembler = fileStreamAssemblerList.GetAssembler(tmpFiveTuple, true);
                if (assembler.FileStreamType == FileTransfer.FileStreamTypes.TFTP)
                {
                    return(true);
                }
                else
                {
                    assembler = null;
                }
            }
            assembler = null;
            return(false);//no assembler found...
        }
예제 #4
0
        private bool TryCreateNewAssembler(out FileTransfer.FileStreamAssembler assembler, FileTransfer.FileStreamAssemblerList fileStreamAssemblerList, Packets.TftpPacket tftpPacket, NetworkHost sourceHost, ushort sourcePort, NetworkHost destinationHost)  //destinationPort is not needed
        {
            assembler = null;

            //create new assembler if it is a RRQ or WRQ
            if (tftpPacket.OpCode == Packets.TftpPacket.OpCodes.ReadRequest)
            {
                try {
                    FiveTuple tmpFiveTuple = new FiveTuple(destinationHost, Packets.TftpPacket.DefaultUdpPortNumber, sourceHost, sourcePort, FiveTuple.TransportProtocol.UDP);
                    assembler = new FileTransfer.FileStreamAssembler(fileStreamAssemblerList, tmpFiveTuple, true, FileTransfer.FileStreamTypes.TFTP, tftpPacket.Filename, "", tftpPacket.OpCode.ToString() + " " + tftpPacket.Mode.ToString() + " " + tftpPacket.Filename, tftpPacket.ParentFrame.FrameNumber, tftpPacket.ParentFrame.Timestamp);
                    fileStreamAssemblerList.Add(assembler);
                }
                catch (Exception e) {
                    //throw new Exception("Error creating assembler for TFTP file transfer", e);
                    //this.parentForm.ShowError("Error creating assembler for TFTP file transfer: "+e.Message);
                    if (assembler != null)
                    {
                        assembler.Clear();
                        assembler = null;
                    }
                    return(false);
                }
                return(true);
            }
            else if (tftpPacket.OpCode == Packets.TftpPacket.OpCodes.WriteRequest)
            {
                try {
                    FiveTuple tmpFiveTuple = new FiveTuple(sourceHost, sourcePort, destinationHost, Packets.TftpPacket.DefaultUdpPortNumber, FiveTuple.TransportProtocol.UDP);
                    assembler = new FileTransfer.FileStreamAssembler(fileStreamAssemblerList, tmpFiveTuple, true, FileTransfer.FileStreamTypes.TFTP, tftpPacket.Filename, "", tftpPacket.OpCode.ToString() + " " + tftpPacket.Mode.ToString() + " " + tftpPacket.Filename, tftpPacket.ParentFrame.FrameNumber, tftpPacket.ParentFrame.Timestamp);
                    fileStreamAssemblerList.Add(assembler);
                }
                catch (Exception e) {
                    //throw new Exception("Error creating assembler for TFTP file transfer", e);
                    //this.parentForm.ShowError("Error creating assembler for TFTP file transfer: "+e.Message);
                    if (assembler != null)
                    {
                        assembler.Clear();
                        assembler = null;
                    }
                    return(false);
                }
                return(true);
            }
            else
            {
                assembler = null;
                return(false);
            }
        }
        internal FileSegmentAssembler(string fileOutputDirectory, NetworkTcpSession networkTcpSession, bool transferIsClientToServer, string filePath, string uniqueFileId, FileTransfer.FileStreamAssemblerList fileStreamAssemblerList, PopularityList <string, PacketParser.FileTransfer.FileSegmentAssembler> parentAssemblerList, FileStreamTypes fileStreamType, string details, string serverHostname)
            : this(fileOutputDirectory, filePath, uniqueFileId, fileStreamAssemblerList, parentAssemblerList, fileStreamType, details, serverHostname)
        {
            //this.fileOutputDirectory = fileOutputDirectory;

            //this.networkTcpSession = networkTcpSession;
            this.fiveTuple = networkTcpSession.Flow.FiveTuple;
            this.transferIsClientToServer = transferIsClientToServer;

            /*
             * if (this.fileTransferIsServerToClient) {
             *  this.sourceHost = networkTcpSession.ServerHost;
             *  this.destinationHost = networkTcpSession.ClientHost;
             *  this.sourcePort = networkTcpSession.ServerTcpPort;
             *  this.destinationPort = networkTcpSession.ClientTcpPort;
             * }
             * else {
             *  this.sourceHost = networkTcpSession.ClientHost;
             *  this.destinationHost = networkTcpSession.ServerHost;
             *  this.sourcePort = networkTcpSession.ClientTcpPort;
             *  this.destinationPort = networkTcpSession.ServerTcpPort;
             * }*/

            /*
             * this.filePath = filePath;
             * this.uniqueFileId = uniqueFileId;
             * this.parentAssemblerList = parentAssemblerList;
             * this.fileStreamAssemblerList = fileStreamAssemblerList;
             * this.fileStreamType = fileStreamType;
             * this.details = details;
             */
        }
        internal FileSegmentAssembler(string fileOutputDirectory, bool transferIsClientToServer, string filePath, string uniqueFileId, FileTransfer.FileStreamAssemblerList fileStreamAssemblerList, PopularityList <string, PacketParser.FileTransfer.FileSegmentAssembler> parentAssemblerList, FileStreamTypes fileStreamType, string details, FiveTuple fiveTuple, string serverHostname)
            : this(fileOutputDirectory, filePath, uniqueFileId, fileStreamAssemblerList, parentAssemblerList, fileStreamType, details, serverHostname)
        {
            this.fiveTuple = fiveTuple;
            this.transferIsClientToServer = transferIsClientToServer;

            /*
             * this.sourceHost = sourceHost;
             * this.destinationHost = destinationHost;
             * this.sourcePort = sourcePort;
             * this.destinationPort = destinationPort;
             */
        }
예제 #7
0
 FileSegmentAssemblerHandler(string fileOutputDirectory, FileStreamAssemblerList fileStreamAssemblerList) {
     this.fileOutputDirectory = fileOutputDirectory;
     this.fileStreamAssemblerList = fileStreamAssemblerList;
     this.assemblerList = new PopularityList<string, FileSegmentAssembler>(100);//100 simultaneous partial downloads allowed
 }
        internal FileSegmentAssembler(string fileOutputDirectory, NetworkTcpSession networkTcpSession, bool transferIsClientToServer, string filePath, string uniqueFileId, FileTransfer.FileStreamAssemblerList fileStreamAssemblerList, PopularityList <string, PacketParser.FileTransfer.FileSegmentAssembler> parentAssemblerList, FileStreamTypes fileStreamType, string details, string serverHostname)
            : this(fileOutputDirectory, filePath, uniqueFileId, fileStreamAssemblerList, parentAssemblerList, fileStreamType, details, serverHostname)
        {
            //this.fileOutputDirectory = fileOutputDirectory;

            //this.networkTcpSession = networkTcpSession;
            this.fiveTuple = networkTcpSession.Flow.FiveTuple;
            this.transferIsClientToServer = transferIsClientToServer;
        }
예제 #9
0
 private bool TryGetFileStreamAssembler(out FileTransfer.FileStreamAssembler assembler, FileTransfer.FileStreamAssemblerList fileStreamAssemblerList, NetworkHost sourceHost, ushort sourcePort, NetworkHost destinationHost, ushort destinationPort)
 {
     if (fileStreamAssemblerList.ContainsAssembler(sourceHost, sourcePort, destinationHost, destinationPort, false))
     {
         //already activated read or write request data
         assembler = fileStreamAssemblerList.GetAssembler(sourceHost, sourcePort, destinationHost, destinationPort, false);
         return(true);
     }
     else if (fileStreamAssemblerList.ContainsAssembler(sourceHost, Packets.TftpPacket.DefaultUdpPortNumber, destinationHost, destinationPort, false))
     {
         //first read request data
         assembler = fileStreamAssemblerList.GetAssembler(sourceHost, Packets.TftpPacket.DefaultUdpPortNumber, destinationHost, destinationPort, false);
         return(true);
     }
     else if (fileStreamAssemblerList.ContainsAssembler(sourceHost, sourcePort, destinationHost, Packets.TftpPacket.DefaultUdpPortNumber, false))
     {
         //check for write request data
         assembler = fileStreamAssemblerList.GetAssembler(sourceHost, sourcePort, destinationHost, Packets.TftpPacket.DefaultUdpPortNumber, false);
         return(true);
     }
     else
     {
         assembler = null;
         return(false);//no assembler found...
     }
 }