Exemplo n.º 1
0
        public void GetBytes()
        {
            var request = new SftpRemoveRequest(_protocolVersion, _requestId, _filename, _encoding, null);

            var bytes = request.GetBytes();

            var expectedBytesLength = 0;

            expectedBytesLength += 4;                     // Length
            expectedBytesLength += 1;                     // Type
            expectedBytesLength += 4;                     // RequestId
            expectedBytesLength += 4;                     // Filename length
            expectedBytesLength += _filenameBytes.Length; // Filename

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

            Assert.AreEqual((uint)bytes.Length - 4, sshDataStream.ReadUInt32());
            Assert.AreEqual((byte)SftpMessageTypes.Remove, sshDataStream.ReadByte());
            Assert.AreEqual(_requestId, sshDataStream.ReadUInt32());

            Assert.AreEqual((uint)_filenameBytes.Length, sshDataStream.ReadUInt32());
            var actualFilename = new byte[_filenameBytes.Length];

            sshDataStream.Read(actualFilename, 0, actualFilename.Length);
            Assert.IsTrue(_filenameBytes.SequenceEqual(actualFilename));

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
        public void GetBytes()
        {
            var random = new Random();

            var localChannelNumber = (uint)random.Next(0, int.MaxValue);
            var data   = CryptoAbstraction.GenerateRandom(random.Next(10, 20));
            var offset = random.Next(0, data.Length - 1);
            var size   = random.Next(0, data.Length - offset);

            var target = new ChannelDataMessage(localChannelNumber, data, offset, size);

            var bytes = target.GetBytes();

            var expectedBytesLength = 1; // Type

            expectedBytesLength += 4;    // LocalChannelNumber
            expectedBytesLength += 4;    // Data length
            expectedBytesLength += size; // Data

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

            Assert.AreEqual(ChannelDataMessage.MessageNumber, sshDataStream.ReadByte());
            Assert.AreEqual(localChannelNumber, sshDataStream.ReadUInt32());
            Assert.AreEqual((uint)size, sshDataStream.ReadUInt32());

            var actualData = new byte[size];

            sshDataStream.Read(actualData, 0, size);
            Assert.IsTrue(actualData.SequenceEqual(data.Take(offset, size)));

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
        private static byte[] CreateSftpNameResponse(uint responseId, Encoding encoding, params string[] names)
        {
            var namesAndAttributes = new List <byte>();

            foreach (var name in names)
            {
                var nameBytes       = encoding.GetBytes(name);
                var attributesBytes = SftpFileAttributes.Empty.GetBytes();

                namesAndAttributes.AddRange((((uint)nameBytes.Length).GetBytes())); // filename length
                namesAndAttributes.AddRange(nameBytes);                             // filename
                namesAndAttributes.AddRange(((uint)0).GetBytes());                  // longname length
                namesAndAttributes.AddRange(attributesBytes);                       // attributes
            }

            var namesAndAttributesBytes = namesAndAttributes.ToArray();

            var sshDataStream = new SshDataStream(4 + 1 + 4 + 4 + namesAndAttributesBytes.Length);

            sshDataStream.Write((uint)sshDataStream.Capacity - 4);
            sshDataStream.WriteByte((byte)SftpMessageTypes.Name);
            sshDataStream.Write(responseId);
            sshDataStream.Write((uint)names.Length);
            sshDataStream.Write(namesAndAttributesBytes, 0, namesAndAttributesBytes.Length);
            return(sshDataStream.ToArray());
        }
Exemplo n.º 4
0
        /// <summary>
        /// Writes the current message to the specified <see cref="SshDataStream"/>.
        /// </summary>
        /// <param name="stream">The <see cref="SshDataStream"/> to write the message to.</param>
        protected override void WriteBytes(SshDataStream stream)
        {
            const int sizeOfDataLengthBytes = 4;

            var startPosition = stream.Position;

            // skip 4 bytes for the length of the SFTP message data
            stream.Seek(sizeOfDataLengthBytes, SeekOrigin.Current);

            // write the SFTP message data to the stream
            base.WriteBytes(stream);

            // save where we were positioned when we finished writing the SSH message data
            var endPosition = stream.Position;

            // determine the length of the SSH message data
            var dataLength = endPosition - startPosition - sizeOfDataLengthBytes;

            // write the length of the SFTP message where we were positioned before we started
            // writing the SFTP message data
            stream.Position = startPosition;
            stream.Write((uint)dataLength);

            // move back to we were positioned when we finished writing the SFTP message data
            stream.Position = endPosition;
        }
Exemplo n.º 5
0
        public void GetBytes()
        {
            var statusActionInvocations = new List <SftpStatusResponse>();
            var nameActionInvocations   = new List <SftpNameResponse>();
            Action <SftpStatusResponse> statusAction = statusActionInvocations.Add;
            var request = new SftpRmDirRequest(_protocolVersion, _requestId, _path, _encoding, null);

            var bytes = request.GetBytes();

            var expectedBytesLength = 0;

            expectedBytesLength += 4;                 // Length
            expectedBytesLength += 1;                 // Type
            expectedBytesLength += 4;                 // RequestId
            expectedBytesLength += 4;                 // Path length
            expectedBytesLength += _pathBytes.Length; // Path

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

            Assert.AreEqual((uint)bytes.Length - 4, sshDataStream.ReadUInt32());
            Assert.AreEqual((byte)SftpMessageTypes.RmDir, sshDataStream.ReadByte());
            Assert.AreEqual(_requestId, sshDataStream.ReadUInt32());

            Assert.AreEqual((uint)_pathBytes.Length, sshDataStream.ReadUInt32());
            var actualPath = new byte[_pathBytes.Length];

            sshDataStream.Read(actualPath, 0, actualPath.Length);
            Assert.IsTrue(_pathBytes.SequenceEqual(actualPath));

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
        public void Load_ShouldThrowNotSupportedExceptionWhenChannelTypeIsNotSupported()
        {
            var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
            var initialWindowSize  = (uint)_random.Next(0, int.MaxValue);
            var maximumPacketSize  = (uint)_random.Next(0, int.MaxValue);
            var channelName        = "dunno_" + _random.Next().ToString(CultureInfo.InvariantCulture);
            var channelType        = _ascii.GetBytes(channelName);

            var sshDataStream = new SshDataStream(1 + 4 + channelType.Length + 4 + 4 + 4);

            sshDataStream.WriteByte(ChannelOpenMessage.MessageNumber);
            sshDataStream.Write((uint)channelType.Length);
            sshDataStream.Write(channelType, 0, channelType.Length);
            sshDataStream.Write(localChannelNumber);
            sshDataStream.Write(initialWindowSize);
            sshDataStream.Write(maximumPacketSize);
            var bytes  = sshDataStream.ToArray();
            var target = new ChannelOpenMessage();

            try
            {
                target.Load(bytes);
                Assert.Fail();
            }
            catch (NotSupportedException ex)
            {
                Assert.IsNull(ex.InnerException);
                Assert.AreEqual(string.Format("Channel type '{0}' is not supported.", channelName), ex.Message);
            }
        }
Exemplo n.º 7
0
 internal static SftpFileAttributes FromBytes(byte[] buffer)
 {
     using (var stream = new SshDataStream(buffer))
     {
         return(FromBytes(stream));
     }
 }
Exemplo n.º 8
0
        public void GetBytes_TerminalModeValues_Null()
        {
            var target = new PseudoTerminalRequestInfo(_environmentVariable, _columns, _rows, _width, _height, null);

            var bytes = target.GetBytes();

            var expectedBytesLength = 1;                             // WantReply

            expectedBytesLength += 4;                                // EnvironmentVariable length
            expectedBytesLength += _environmentVariableBytes.Length; // EnvironmentVariable
            expectedBytesLength += 4;                                // Columns
            expectedBytesLength += 4;                                // Rows
            expectedBytesLength += 4;                                // PixelWidth
            expectedBytesLength += 4;                                // PixelHeight
            expectedBytesLength += 4;                                // Length of "encoded terminal modes"

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

            Assert.AreEqual(1, sshDataStream.ReadByte()); // WantReply
            Assert.AreEqual(_environmentVariable, sshDataStream.ReadString(Encoding.UTF8));
            Assert.AreEqual(_columns, sshDataStream.ReadUInt32());
            Assert.AreEqual(_rows, sshDataStream.ReadUInt32());
            Assert.AreEqual(_width, sshDataStream.ReadUInt32());
            Assert.AreEqual(_height, sshDataStream.ReadUInt32());
            Assert.AreEqual((uint)0, sshDataStream.ReadUInt32());

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
Exemplo n.º 9
0
        public void Load()
        {
            var target          = new SftpAttrsResponse(_protocolVersion);
            var attributes      = CreateSftpFileAttributes();
            var attributesBytes = attributes.GetBytes();

            var sshDataStream = new SshDataStream(4 + 1 + 4 + attributesBytes.Length);

            sshDataStream.Position = 4; // skip 4 bytes for SSH packet length
            sshDataStream.WriteByte((byte)SftpMessageTypes.Attrs);
            sshDataStream.Write(_responseId);
            sshDataStream.Write(attributesBytes, 0, attributesBytes.Length);

            target.Load(sshDataStream.ToArray());

            Assert.IsNotNull(target.Attributes);
            Assert.AreEqual(_protocolVersion, target.ProtocolVersion);
            Assert.AreEqual(_responseId, target.ResponseId);
            Assert.AreEqual(SftpMessageTypes.Attrs, target.SftpMessageType);

            // check attributes in detail
            Assert.AreEqual(attributes.GroupId, target.Attributes.GroupId);
            Assert.AreEqual(attributes.LastWriteTime, target.Attributes.LastWriteTime);
            Assert.AreEqual(attributes.LastWriteTime, target.Attributes.LastWriteTime);
            Assert.AreEqual(attributes.UserId, target.Attributes.UserId);
        }
Exemplo n.º 10
0
        public void GetBytes()
        {
            var request = new IgnoreMessage(_data);

            var bytes = request.GetBytes();

            var expectedBytesLength = 0;

            expectedBytesLength += 1;            // Type
            expectedBytesLength += 4;            // Data length
            expectedBytesLength += _data.Length; // Data

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

            Assert.AreEqual(IgnoreMessage.MessageNumber, sshDataStream.ReadByte());
            Assert.AreEqual((uint)_data.Length, sshDataStream.ReadUInt32());

            var actualData = new byte[_data.Length];

            sshDataStream.Read(actualData, 0, actualData.Length);
            Assert.IsTrue(_data.SequenceEqual(actualData));

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
Exemplo n.º 11
0
        public void GetBytes()
        {
            var request = new SftpCloseRequest(_protocolVersion, _requestId, _handle, null);

            var bytes = request.GetBytes();

            var expectedBytesLength = 0;

#if TUNING
            expectedBytesLength += 4;              // Length
#endif
            expectedBytesLength += 1;              // Type
            expectedBytesLength += 4;              // RequestId
            expectedBytesLength += 4;              // Handle length
            expectedBytesLength += _handle.Length; // Handle

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

#if TUNING
            Assert.AreEqual((uint)bytes.Length - 4, sshDataStream.ReadUInt32());
#endif
            Assert.AreEqual((byte)SftpMessageTypes.Close, sshDataStream.ReadByte());
            Assert.AreEqual(_requestId, sshDataStream.ReadUInt32());

            Assert.AreEqual((uint)_handle.Length, sshDataStream.ReadUInt32());
            var actualHandle = new byte[_handle.Length];
            sshDataStream.Read(actualHandle, 0, actualHandle.Length);
            Assert.IsTrue(_handle.SequenceEqual(actualHandle));

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
Exemplo n.º 12
0
        public void GetBytes()
        {
            var request = new SftpReadLinkRequest(_protocolVersion, _requestId, _path, _encoding, null, null);

            var bytes = request.GetBytes();

            var expectedBytesLength = 0;

            expectedBytesLength += 4;                 // Length
            expectedBytesLength += 1;                 // Type
            expectedBytesLength += 4;                 // RequestId
            expectedBytesLength += 4;                 // Path length
            expectedBytesLength += _pathBytes.Length; // Path

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

            Assert.AreEqual((uint)bytes.Length - 4, sshDataStream.ReadUInt32());
            Assert.AreEqual((byte)SftpMessageTypes.ReadLink, sshDataStream.ReadByte());
            Assert.AreEqual(_requestId, sshDataStream.ReadUInt32());

            Assert.AreEqual((uint)_pathBytes.Length, sshDataStream.ReadUInt32());
            var actualPath = new byte[_pathBytes.Length];

            sshDataStream.Read(actualPath, 0, actualPath.Length);
            Assert.IsTrue(_pathBytes.SequenceEqual(actualPath));

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
Exemplo n.º 13
0
        public void GetBytes()
        {
            var request = new SftpReadRequest(_protocolVersion, _requestId, _handle, _offset, _length, null, null);

            var bytes = request.GetBytes();

            var expectedBytesLength = 0;

            expectedBytesLength += 4;              // Length
            expectedBytesLength += 1;              // Type
            expectedBytesLength += 4;              // RequestId
            expectedBytesLength += 4;              // Handle length
            expectedBytesLength += _handle.Length; // Handle
            expectedBytesLength += 8;              // Offset
            expectedBytesLength += 4;              // Length

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

            Assert.AreEqual((uint)bytes.Length - 4, sshDataStream.ReadUInt32());
            Assert.AreEqual((byte)SftpMessageTypes.Read, sshDataStream.ReadByte());
            Assert.AreEqual(_requestId, sshDataStream.ReadUInt32());

            Assert.AreEqual((uint)_handle.Length, sshDataStream.ReadUInt32());
            var actualHandle = new byte[_handle.Length];

            sshDataStream.Read(actualHandle, 0, actualHandle.Length);
            Assert.IsTrue(_handle.SequenceEqual(actualHandle));

            Assert.AreEqual(_offset, sshDataStream.ReadUInt64());
            Assert.AreEqual(_length, sshDataStream.ReadUInt32());

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
Exemplo n.º 14
0
        internal static SftpFileAttributes FromBytes(SshDataStream stream)
        {
            var flag = stream.ReadUInt32();

            long     size        = -1;
            var      userId      = -1;
            var      groupId     = -1;
            uint     permissions = 0;
            DateTime accessTime;
            DateTime modifyTime;
            IDictionary <string, string> extensions = null;

            if ((flag & 0x00000001) == 0x00000001)   //  SSH_FILEXFER_ATTR_SIZE
            {
                size = (long)stream.ReadUInt64();
            }

            if ((flag & 0x00000002) == 0x00000002)   //  SSH_FILEXFER_ATTR_UIDGID
            {
                userId = (int)stream.ReadUInt32();

                groupId = (int)stream.ReadUInt32();
            }

            if ((flag & 0x00000004) == 0x00000004)   //  SSH_FILEXFER_ATTR_PERMISSIONS
            {
                permissions = stream.ReadUInt32();
            }

            if ((flag & 0x00000008) == 0x00000008)   //  SSH_FILEXFER_ATTR_ACMODTIME
            {
                // The incoming times are "Unix times", so they're already in UTC.  We need to preserve that
                // to avoid losing information in a local time conversion during the "fall back" hour in DST.
                var time = stream.ReadUInt32();
                accessTime = DateTime.FromFileTimeUtc((time + 11644473600) * 10000000);
                time       = stream.ReadUInt32();
                modifyTime = DateTime.FromFileTimeUtc((time + 11644473600) * 10000000);
            }
            else
            {
                accessTime = DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
                modifyTime = DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
            }

            if ((flag & 0x80000000) == 0x80000000)   //  SSH_FILEXFER_ATTR_EXTENDED
            {
                var extendedCount = (int)stream.ReadUInt32();
                extensions = new Dictionary <string, string>(extendedCount);
                for (var i = 0; i < extendedCount; i++)
                {
                    var extensionName = stream.ReadString(SshData.Utf8);
                    var extensionData = stream.ReadString(SshData.Utf8);
                    extensions.Add(extensionName, extensionData);
                }
            }

            return(new SftpFileAttributes(accessTime, modifyTime, size, userId, groupId, permissions, extensions));
        }
Exemplo n.º 15
0
        public byte[] Build()
        {
            var sshDataStream = new SshDataStream(0);

            sshDataStream.WriteByte(KeyExchangeDhGroupExchangeGroup.MessageNumber);
            sshDataStream.Write(_safePrime);
            sshDataStream.Write(_subGroup);
            return(sshDataStream.ToArray());
        }
Exemplo n.º 16
0
        public void GetReply_StatVfsReplyInfo()
        {
            var bsize   = (ulong)_random.Next(0, int.MaxValue);
            var frsize  = (ulong)_random.Next(0, int.MaxValue);
            var blocks  = (ulong)_random.Next(0, int.MaxValue);
            var bfree   = (ulong)_random.Next(0, int.MaxValue);
            var bavail  = (ulong)_random.Next(0, int.MaxValue);
            var files   = (ulong)_random.Next(0, int.MaxValue);
            var ffree   = (ulong)_random.Next(0, int.MaxValue);
            var favail  = (ulong)_random.Next(0, int.MaxValue);
            var sid     = (ulong)_random.Next(0, int.MaxValue);
            var namemax = (ulong)_random.Next(0, int.MaxValue);

            var sshDataStream = new SshDataStream(4 + 1 + 4 + 88);

            sshDataStream.Position = 4; // skip 4 bytes for SSH packet length
            sshDataStream.WriteByte((byte)SftpMessageTypes.Attrs);
            sshDataStream.Write(_responseId);
            sshDataStream.Write(bsize);
            sshDataStream.Write(frsize);
            sshDataStream.Write(blocks);
            sshDataStream.Write(bfree);
            sshDataStream.Write(bavail);
            sshDataStream.Write(files);
            sshDataStream.Write(ffree);
            sshDataStream.Write(favail);
            sshDataStream.Write(sid);
            sshDataStream.Write((ulong)0x2);
            sshDataStream.Write(namemax);

            var sshData = sshDataStream.ToArray();

            var target = new SftpExtendedReplyResponse(_protocolVersion);

            target.Load(sshData, 5, sshData.Length - 5);

            var reply = target.GetReply <StatVfsReplyInfo>();

            Assert.IsNotNull(reply);

            var information = reply.Information;

            Assert.IsNotNull(information);
            Assert.AreEqual(bavail, information.AvailableBlocks);
            Assert.AreEqual(favail, information.AvailableNodes);
            Assert.AreEqual(frsize, information.BlockSize);
            Assert.AreEqual(bsize, information.FileSystemBlockSize);
            Assert.AreEqual(bfree, information.FreeBlocks);
            Assert.AreEqual(ffree, information.FreeNodes);
            Assert.IsFalse(information.IsReadOnly);
            Assert.AreEqual(namemax, information.MaxNameLenght);
            Assert.AreEqual(sid, information.Sid);
            Assert.IsFalse(information.SupportsSetUid);
            Assert.AreEqual(blocks, information.TotalBlocks);
            Assert.AreEqual(files, information.TotalNodes);
        }
Exemplo n.º 17
0
        private byte[] BuildExtensions()
        {
            var sshDataStream = new SshDataStream(0);

            foreach (var extensionPair in _extensions)
            {
                sshDataStream.Write(extensionPair.Key, Encoding.ASCII);
                sshDataStream.Write(extensionPair.Value, Encoding.ASCII);
            }
            return(sshDataStream.ToArray());
        }
        private static byte[] CreateSftpDataResponse(uint responseId, byte[] data)
        {
            var sshDataStream = new SshDataStream(4 + 1 + 4 + 4 + data.Length + 1);

            sshDataStream.Write((uint)sshDataStream.Capacity - 4);
            sshDataStream.WriteByte((byte)SftpMessageTypes.Data);
            sshDataStream.Write(responseId);
            sshDataStream.Write((uint)data.Length);
            sshDataStream.Write(data, 0, data.Length);
            sshDataStream.WriteByte(1); // EOF
            return(sshDataStream.ToArray());
        }
Exemplo n.º 19
0
        public byte[] Build()
        {
            var extensions = BuildExtensions();

            var sshDataStream = new SshDataStream(4 + 1 + 4 + extensions.Length);

            sshDataStream.Write((uint)sshDataStream.Capacity - 4);
            sshDataStream.WriteByte((byte)SftpMessageTypes.Version);
            sshDataStream.Write(_version);
            sshDataStream.Write(extensions, 0, extensions.Length);
            return(sshDataStream.ToArray());
        }
            public byte[] Build()
            {
                var serviceName = _serviceName.ToArray();

                var sshDataStream = new SshDataStream(4 + 1 + 1 + 4 + serviceName.Length);

                sshDataStream.Write((uint)(sshDataStream.Capacity - 4)); // packet length
                sshDataStream.WriteByte(0);                              // padding length
                sshDataStream.WriteByte(ServiceAcceptMessage.MessageNumber);
                sshDataStream.WriteBinary(serviceName);
                return(sshDataStream.ToArray());
            }
Exemplo n.º 21
0
        /// <summary>
        /// Writes the message to the specified <see cref="SshDataStream"/>.
        /// </summary>
        protected override void WriteBytes(SshDataStream stream)
        {
            var messageAttribute = GetType().GetCustomAttributes <MessageAttribute>(true).FirstOrDefault();

            if (messageAttribute == null)
            {
                throw new SshException(string.Format(CultureInfo.CurrentCulture, "Type '{0}' is not a valid message type.", GetType().AssemblyQualifiedName));
            }

            stream.WriteByte(messageAttribute.Number);
            base.WriteBytes(stream);
        }
        public byte[] Build()
        {
            var sshDataStream = new SshDataStream(0);

            sshDataStream.WriteByte(KeyExchangeDhGroupExchangeReply.MessageNumber);
            sshDataStream.Write((uint)(4 + _hostKeyAlgorithm.Length + _hostKeys.Length));
            sshDataStream.Write((uint)_hostKeyAlgorithm.Length);
            sshDataStream.Write(_hostKeyAlgorithm, 0, _hostKeyAlgorithm.Length);
            sshDataStream.Write(_hostKeys, 0, _hostKeys.Length);
            sshDataStream.Write(_f);
            sshDataStream.WriteBinary(_signature);
            return(sshDataStream.ToArray());
        }
Exemplo n.º 23
0
        internal static SftpFileAttributes FromBytes(SshDataStream stream)
        {
            var flag = stream.ReadUInt32();

            long size        = -1;
            var  userId      = -1;
            var  groupId     = -1;
            uint permissions = 0;
            var  accessTime  = DateTime.MinValue;
            var  modifyTime  = DateTime.MinValue;
            IDictionary <string, string> extensions = null;

            if ((flag & 0x00000001) == 0x00000001)   //  SSH_FILEXFER_ATTR_SIZE
            {
                size = (long)stream.ReadUInt64();
            }

            if ((flag & 0x00000002) == 0x00000002)   //  SSH_FILEXFER_ATTR_UIDGID
            {
                userId = (int)stream.ReadUInt32();

                groupId = (int)stream.ReadUInt32();
            }

            if ((flag & 0x00000004) == 0x00000004)   //  SSH_FILEXFER_ATTR_PERMISSIONS
            {
                permissions = stream.ReadUInt32();
            }

            if ((flag & 0x00000008) == 0x00000008)   //  SSH_FILEXFER_ATTR_ACMODTIME
            {
                var time = stream.ReadUInt32();
                accessTime = DateTime.FromFileTime((time + 11644473600) * 10000000);
                time       = stream.ReadUInt32();
                modifyTime = DateTime.FromFileTime((time + 11644473600) * 10000000);
            }

            if ((flag & 0x80000000) == 0x80000000)   //  SSH_FILEXFER_ATTR_EXTENDED
            {
                var extendedCount = (int)stream.ReadUInt32();
                extensions = new Dictionary <string, string>(extendedCount);
                for (var i = 0; i < extendedCount; i++)
                {
                    var extensionName = stream.ReadString(SshData.Utf8);
                    var extensionData = stream.ReadString(SshData.Utf8);
                    extensions.Add(extensionName, extensionData);
                }
            }

            return(new SftpFileAttributes(accessTime, modifyTime, size, userId, groupId, permissions, extensions));
        }
 internal void SaveData(SshDataStream stream)
 {
     stream.Write(FileSystemBlockSize);
     stream.Write(BlockSize);
     stream.Write(TotalBlocks);
     stream.Write(FreeBlocks);
     stream.Write(AvailableBlocks);
     stream.Write(TotalNodes);
     stream.Write(FreeNodes);
     stream.Write(AvailableNodes);
     stream.Write(Sid);
     stream.Write(_flag);
     stream.Write(MaxNameLenght);
 }
        public KeyExchangeDhGroupExchangeReplyBuilder WithHostKey(string hostKeyAlgorithm, params BigInteger[] hostKeys)
        {
            _hostKeyAlgorithm = Encoding.UTF8.GetBytes(hostKeyAlgorithm);

            var sshDataStream = new SshDataStream(0);

            foreach (var hostKey in hostKeys)
            {
                sshDataStream.Write(hostKey);
            }
            _hostKeys = sshDataStream.ToArray();

            return(this);
        }
Exemplo n.º 26
0
        public void GetBytes()
        {
            var localChannelNumber = (uint)_random.Next(0, int.MaxValue);
            var initialWindowSize  = (uint)_random.Next(0, int.MaxValue);
            var maximumPacketSize  = (uint)_random.Next(0, int.MaxValue);
            var info      = new DirectTcpipChannelInfo("host", 22, "originator", 25);
            var infoBytes = info.GetBytes();
            var target    = new ChannelOpenMessage(localChannelNumber, initialWindowSize, maximumPacketSize, info);

            var bytes = target.GetBytes();

            var expectedBytesLength = 1;                      // Type

            expectedBytesLength += 4;                         // ChannelType length
            expectedBytesLength += target.ChannelType.Length; // ChannelType
            expectedBytesLength += 4;                         // LocalChannelNumber
            expectedBytesLength += 4;                         // InitialWindowSize
            expectedBytesLength += 4;                         // MaximumPacketSize
            expectedBytesLength += infoBytes.Length;          // Info

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

            Assert.AreEqual(ChannelOpenMessage.MessageNumber, sshDataStream.ReadByte());

            var actualChannelTypeLength = sshDataStream.ReadUInt32();

            Assert.AreEqual((uint)target.ChannelType.Length, actualChannelTypeLength);

#if TUNING
            var actualChannelType = new byte[actualChannelTypeLength];
            sshDataStream.Read(actualChannelType, 0, (int)actualChannelTypeLength);
            Assert.IsTrue(target.ChannelType.SequenceEqual(actualChannelType));
#else
            var actualChannelType = new byte[actualChannelTypeLength];
            sshDataStream.Read(actualChannelType, 0, (int)actualChannelTypeLength);
            Assert.AreEqual(target.ChannelType, SshData.Ascii.GetString(actualChannelType));
#endif

            Assert.AreEqual(localChannelNumber, sshDataStream.ReadUInt32());
            Assert.AreEqual(initialWindowSize, sshDataStream.ReadUInt32());
            Assert.AreEqual(maximumPacketSize, sshDataStream.ReadUInt32());

            var actualInfo = new byte[infoBytes.Length];
            sshDataStream.Read(actualInfo, 0, actualInfo.Length);
            Assert.IsTrue(infoBytes.SequenceEqual(actualInfo));

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
Exemplo n.º 27
0
        public void Load()
        {
            var target = new SftpExtendedReplyResponse(_protocolVersion);

            var sshDataStream = new SshDataStream(4);

            sshDataStream.Write(_responseId);

            target.Load(sshDataStream.ToArray());

            Assert.AreEqual(_protocolVersion, target.ProtocolVersion);
            Assert.AreEqual(_responseId, target.ResponseId);
            Assert.AreEqual(SftpMessageTypes.ExtendedReply, target.SftpMessageType);
        }
Exemplo n.º 28
0
        public void GetBytes()
        {
            var request = new HardLinkRequest(_protocolVersion, _requestId, _oldPath, _newPath, null);

            var bytes = request.GetBytes();

            var expectedBytesLength = 0;

#if TUNING
            expectedBytesLength += 4;                    // Length
#endif
            expectedBytesLength += 1;                    // Type
            expectedBytesLength += 4;                    // RequestId
            expectedBytesLength += 4;                    // Name length
            expectedBytesLength += _nameBytes.Length;    // Name
            expectedBytesLength += 4;                    // OldPath length
            expectedBytesLength += _oldPathBytes.Length; // OldPath
            expectedBytesLength += 4;                    // NewPath length
            expectedBytesLength += _newPathBytes.Length; // NewPath

            Assert.AreEqual(expectedBytesLength, bytes.Length);

            var sshDataStream = new SshDataStream(bytes);

#if TUNING
            Assert.AreEqual((uint)bytes.Length - 4, sshDataStream.ReadUInt32());
#endif
            Assert.AreEqual((byte)SftpMessageTypes.Extended, sshDataStream.ReadByte());
            Assert.AreEqual(_requestId, sshDataStream.ReadUInt32());
            Assert.AreEqual((uint)_nameBytes.Length, sshDataStream.ReadUInt32());

            var actualNameBytes = new byte[_nameBytes.Length];
            sshDataStream.Read(actualNameBytes, 0, actualNameBytes.Length);
            Assert.IsTrue(_nameBytes.SequenceEqual(actualNameBytes));

            Assert.AreEqual((uint)_oldPathBytes.Length, sshDataStream.ReadUInt32());

            var actualOldPath = new byte[_oldPathBytes.Length];
            sshDataStream.Read(actualOldPath, 0, actualOldPath.Length);
            Assert.IsTrue(_oldPathBytes.SequenceEqual(actualOldPath));

            Assert.AreEqual((uint)_newPathBytes.Length, sshDataStream.ReadUInt32());

            var actualNewPath = new byte[_newPathBytes.Length];
            sshDataStream.Read(actualNewPath, 0, actualNewPath.Length);
            Assert.IsTrue(_newPathBytes.SequenceEqual(actualNewPath));

            Assert.IsTrue(sshDataStream.IsEndOfData);
        }
Exemplo n.º 29
0
 public override void LoadData(SshDataStream stream)
 {
     Information = new SftpFileSytemInformation(stream.ReadUInt64(), // FileSystemBlockSize
                                                stream.ReadUInt64(), // BlockSize
                                                stream.ReadUInt64(), // TotalBlocks
                                                stream.ReadUInt64(), // FreeBlocks
                                                stream.ReadUInt64(), // AvailableBlocks
                                                stream.ReadUInt64(), // TotalNodes
                                                stream.ReadUInt64(), // FreeNodes
                                                stream.ReadUInt64(), // AvailableNodes
                                                stream.ReadUInt64(), // Sid
                                                stream.ReadUInt64(), // Flags
                                                stream.ReadUInt64()  // MaxNameLenght
                                                );
 }
Exemplo n.º 30
0
        public void Load()
        {
            var target = new SftpExtendedReplyResponse(_protocolVersion);

            var sshDataStream = new SshDataStream(4 + 1 + 4);

            sshDataStream.Position = 4; // skip 4 bytes for SSH packet length
            sshDataStream.WriteByte((byte)SftpMessageTypes.ExtendedReply);
            sshDataStream.Write(_responseId);

            target.Load(sshDataStream.ToArray());

            Assert.AreEqual(_protocolVersion, target.ProtocolVersion);
            Assert.AreEqual(_responseId, target.ResponseId);
            Assert.AreEqual(SftpMessageTypes.ExtendedReply, target.SftpMessageType);
        }