Remove MessageTypes enum and reorganize message to use class attributes to allow handling of messages with the same code number and more easliy to intorduce new messages in the future

This commit is contained in:
olegkap_cp
2010-12-25 05:57:34 +00:00
parent 792fcbf70a
commit 7297259e21
100 changed files with 237 additions and 554 deletions
@@ -135,9 +135,9 @@ namespace Renci.SshClient
{
this.Session = session;
this.Session.RegisterMessageType<FailureMessage>(MessageTypes.UserAuthenticationFailure);
this.Session.RegisterMessageType<SuccessMessage>(MessageTypes.UserAuthenticationSuccess);
this.Session.RegisterMessageType<BannerMessage>(MessageTypes.UserAuthenticationBanner);
this.Session.RegisterMessage<FailureMessage>();
this.Session.RegisterMessage<SuccessMessage>();
this.Session.RegisterMessage<BannerMessage>();
this.Session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived;
this.Session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessMessageReceived;
@@ -151,9 +151,9 @@ namespace Renci.SshClient
this.Session.UserAuthenticationBannerReceived -= Session_UserAuthenticationBannerMessageReceived;
this.Session.MessageReceived -= Session_MessageReceived;
this.Session.UnRegisterMessageType(MessageTypes.UserAuthenticationFailure);
this.Session.UnRegisterMessageType(MessageTypes.UserAuthenticationSuccess);
this.Session.UnRegisterMessageType(MessageTypes.UserAuthenticationBanner);
this.Session.UnRegisterMessage<FailureMessage>();
this.Session.UnRegisterMessage<SuccessMessage>();
this.Session.UnRegisterMessage<BannerMessage>();
return this.IsAuthenticated;
}
@@ -20,9 +20,9 @@ namespace Renci.SshClient
if (this.IsStarted)
return;
this.Session.RegisterMessageType<RequestFailureMessage>(Messages.MessageTypes.RequestFailure);
this.Session.RegisterMessageType<RequestSuccessMessage>(Messages.MessageTypes.RequestSuccess);
this.Session.RegisterMessageType<ChannelOpenMessage>(Messages.MessageTypes.ChannelOpen);
this.Session.RegisterMessage<RequestFailureMessage>();
this.Session.RegisterMessage<RequestSuccessMessage>();
this.Session.RegisterMessage<ChannelOpenMessage>();
this.Session.RequestSuccessReceived += Session_RequestSuccess;
this.Session.RequestFailureReceived += Session_RequestFailure;
@@ -39,13 +39,13 @@ namespace Renci.SshClient
protected override void OnAuthenticate()
{
this.Session.RegisterMessageType<InformationRequestMessage>(MessageTypes.UserAuthenticationInformationRequest);
this.Session.RegisterMessage<InformationRequestMessage>();
this.Session.SendMessage(new RequestMessageKeyboardInteractive(ServiceNames.Connection, this.Username));
this.WaitHandle(this._authenticationCompleted);
this.Session.UnRegisterMessageType(MessageTypes.UserAuthenticationInformationRequest);
this.Session.UnRegisterMessage<InformationRequestMessage>();
if (this._exception != null)
{
@@ -2,13 +2,9 @@
namespace Renci.SshClient.Messages.Authentication
{
[Message("SSH_MSG_USERAUTH_BANNER", 53)]
public class BannerMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.UserAuthenticationBanner; }
}
public string Message { get; private set; }
public string Language { get; private set; }
@@ -3,13 +3,9 @@ using System.Collections.Generic;
namespace Renci.SshClient.Messages.Authentication
{
[Message("SSH_MSG_USERAUTH_FAILURE", 51)]
public class FailureMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.UserAuthenticationFailure; }
}
public IEnumerable<string> AllowedAuthentications { get; set; }
public string Message { get; private set; }
@@ -5,13 +5,9 @@ using Renci.SshClient.Common;
namespace Renci.SshClient.Messages.Authentication
{
[Message("SSH_MSG_USERAUTH_INFO_REQUEST", 60)]
internal class InformationRequestMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.UserAuthenticationInformationRequest; }
}
public string Name { get; private set; }
public string Instruction { get; private set; }
@@ -3,13 +3,9 @@ using System.Collections.Generic;
namespace Renci.SshClient.Messages.Authentication
{
[Message("SSH_MSG_USERAUTH_INFO_RESPONSE", 61)]
internal class InformationResponseMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.UserAuthenticationInformationResponse; }
}
public IList<string> Responses { get; private set; }
public InformationResponseMessage()
@@ -1,13 +1,9 @@
namespace Renci.SshClient.Messages.Authentication
{
[Message("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ", 60)]
internal class PasswordChangeRequiredMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.UserAuthenticationPasswordChangeRequired; }
}
public string Message { get; private set; }
public string Language { get; private set; }
@@ -3,13 +3,9 @@ using System.Collections.Generic;
namespace Renci.SshClient.Messages.Authentication
{
[Message("SSH_MSG_USERAUTH_PK_OK", 60)]
internal class PublicKeyMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.UserAuthenticationPublicKey; }
}
public string PublicKeyAlgorithmName { get; private set; }
public IEnumerable<byte> PublicKeyData { get; private set; }
@@ -3,13 +3,9 @@ using System.Text;
namespace Renci.SshClient.Messages.Authentication
{
[Message("SSH_MSG_USERAUTH_REQUEST", 50)]
public class RequestMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.UserAuthenticationRequest; }
}
public string Username { get; private set; }
public ServiceNames ServiceName { get; private set; }
@@ -2,7 +2,7 @@
namespace Renci.SshClient.Messages.Authentication
{
internal class RequestMessagePublicKey : RequestMessage
public class RequestMessagePublicKey : RequestMessage
{
public override string MethodName
{
@@ -1,13 +1,9 @@
namespace Renci.SshClient.Messages.Authentication
{
[Message("SSH_MSG_USERAUTH_SUCCESS", 52)]
public class SuccessMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.UserAuthenticationSuccess; }
}
protected override void LoadData()
{
}
@@ -1,12 +1,8 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_CLOSE", 97)]
public class ChannelCloseMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelClose; }
}
public ChannelCloseMessage()
{
@@ -1,12 +1,8 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_DATA", 94)]
public class ChannelDataMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelData; }
}
public string Data { get; protected set; }
public ChannelDataMessage()
@@ -1,12 +1,8 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_EOF", 96)]
public class ChannelEofMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelEof; }
}
public ChannelEofMessage()
{
@@ -1,13 +1,8 @@
namespace Renci.SshClient.Messages.Connection
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_EXTENDED_DATA", 95)]
public class ChannelExtendedDataMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelExtendedData; }
}
public uint DataTypeCode { get; private set; }
public string Data { get; private set; }
@@ -1,12 +1,8 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_FAILURE", 100)]
public class ChannelFailureMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelFailure; }
}
public ChannelFailureMessage()
{
@@ -17,7 +17,7 @@ namespace Renci.SshClient.Messages.Connection
public override string ToString()
{
return string.Format("{0} : #{1}", this.MessageType, this.LocalChannelNumber);
return string.Format("{0} : #{1}", base.ToString(), this.LocalChannelNumber);
}
}
}
@@ -2,13 +2,9 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_OPEN", 90)]
public class ChannelOpenMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelOpen; }
}
public string ChannelType
{
get
@@ -1,12 +1,8 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_OPEN_CONFIRMATION", 91)]
public class ChannelOpenConfirmationMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelOpenConfirmation; }
}
public uint RemoteChannelNumber { get; private set; }
public uint InitialWindowSize { get; private set; }
@@ -1,33 +0,0 @@
namespace Renci.SshClient.Messages.Connection
{
internal class ChannelOpenDirectTcpIPMessage : ChannelOpenMessage
{
public string HostToConnect { get; private set; }
public uint PortToConnect { get; private set; }
public string OriginatorIP { get; private set; }
public uint OriginatorPort { get; private set; }
protected override void LoadData()
{
base.LoadData();
this.HostToConnect = this.ReadString();
this.PortToConnect = this.ReadUInt32();
this.OriginatorIP = this.ReadString();
this.OriginatorPort = this.ReadUInt32();
}
protected override void SaveData()
{
base.SaveData();
this.Write(this.HostToConnect);
this.Write(this.PortToConnect);
this.Write(this.OriginatorIP);
this.Write(this.OriginatorPort);
}
}
}
@@ -1,12 +1,8 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_OPEN_FAILURE", 92)]
public class ChannelOpenFailureMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelOpenFailure; }
}
public uint ReasonCode { get; private set; }
public string Description { get; private set; }
@@ -2,13 +2,9 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_REQUEST", 98)]
public class ChannelRequestMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelRequest; }
}
public string RequestName
{
get
@@ -1,12 +1,8 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_SUCCESS", 99)]
public class ChannelSuccessMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelSuccess; }
}
public ChannelSuccessMessage()
{
@@ -1,12 +1,8 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_CHANNEL_WINDOW_ADJUST", 93)]
public class ChannelWindowAdjustMessage : ChannelMessage
{
public override MessageTypes MessageType
{
get { return MessageTypes.ChannelWindowAdjust; }
}
public uint BytesToAdd { get; private set; }
public ChannelWindowAdjustMessage()
@@ -2,6 +2,7 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_GLOBAL_REQUEST", 80)]
public class GlobalRequestMessage : Message
{
public GlobalRequestNames RequestName { get; private set; }
@@ -30,11 +31,6 @@ namespace Renci.SshClient.Messages.Connection
this.PortToBind = portToBind;
}
public override MessageTypes MessageType
{
get { return MessageTypes.GlobalRequest; }
}
protected override void LoadData()
{
var requestName = this.ReadString();
@@ -65,9 +61,6 @@ namespace Renci.SshClient.Messages.Connection
case GlobalRequestNames.CancelTcpIpForward:
this.Write("cancel-tcpip-forward");
break;
case GlobalRequestNames.KeepAlive:
this.Write("keep-alive-message-ignore-me");
break;
default:
break;
}
@@ -81,8 +74,6 @@ namespace Renci.SshClient.Messages.Connection
this.Write(this.AddressToBind);
this.Write(this.PortToBind);
break;
case GlobalRequestNames.KeepAlive:
break;
default:
break;
}
@@ -10,9 +10,5 @@
/// cancel-tcpip-forward
/// </summary>
CancelTcpIpForward,
/// <summary>
/// keep-alive-message-ignore-me
/// </summary>
KeepAlive
}
}
@@ -1,13 +1,9 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_REQUEST_FAILURE", 82)]
public class RequestFailureMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.RequestFailure; }
}
protected override void LoadData()
{
}
@@ -1,15 +1,11 @@
namespace Renci.SshClient.Messages.Connection
{
[Message("SSH_MSG_REQUEST_SUCCESS", 81)]
public class RequestSuccessMessage : Message
{
public uint? BoundPort { get; private set; }
public override MessageTypes MessageType
{
get { return MessageTypes.RequestSuccess; }
}
public RequestSuccessMessage()
{
@@ -6,11 +6,9 @@ namespace Renci.SshClient.Messages
{
public abstract class Message : SshData
{
public abstract MessageTypes MessageType { get; }
internal static T Load<T>(IEnumerable<byte> data) where T : Message, new()
{
var messageType = (MessageTypes)data.FirstOrDefault();
var messageType = data.FirstOrDefault();
T message = new T();
@@ -33,17 +31,26 @@ namespace Renci.SshClient.Messages
public override IEnumerable<byte> GetBytes()
{
var messageAttribute = this.GetType().GetCustomAttributes(typeof(MessageAttribute), true).SingleOrDefault() as MessageAttribute;
if (messageAttribute == null)
throw new SshException(string.Format("Type '{0}' is not a valid message type.", this.GetType().AssemblyQualifiedName));
var data = new List<byte>(base.GetBytes());
data.Insert(0, (byte)this.MessageType);
data.Insert(0, messageAttribute.Number);
return data;
}
public override string ToString()
{
return this.MessageType.ToString();
}
var messageAttribute = this.GetType().GetCustomAttributes(typeof(MessageAttribute), true).SingleOrDefault() as MessageAttribute;
if (messageAttribute == null)
throw new SshException(string.Format("Type '{0}' is not a valid message type.", this.GetType().AssemblyQualifiedName));
return messageAttribute.Name;
}
}
}
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Renci.SshClient.Messages
{
[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public sealed class MessageAttribute : Attribute
{
public string Name { get; set; }
public byte Number { get; set; }
// This is a positional argument
public MessageAttribute(string name, byte number)
{
this.Name = name;
this.Number = number;
}
}
}
@@ -1,161 +0,0 @@
namespace Renci.SshClient.Messages
{
/// <summary>
///
/// </summary>
public enum MessageTypes : byte
{
/// <summary>
/// {35A90EBF-F421-44A3-BE3A-47C72AFE47FE}
/// </summary>
None = 0,
/// <summary>
/// SSH_MSG_DISCONNECT
/// </summary>
Disconnect = 1,
/// <summary>
/// SSH_MSG_IGNORE
/// </summary>
Ignore = 2,
/// <summary>
/// SSH_MSG_UNIMPLEMENTED
/// </summary>
Unimplemented = 3,
/// <summary>
/// SSH_MSG_DEBUG
/// </summary>
Debug = 4,
/// <summary>
/// SSH_MSG_SERVICE_REQUEST
/// </summary>
ServiceRequest = 5,
/// <summary>
/// SSH_MSG_SERVICE_ACCEPT
/// </summary>
ServiceAcceptRequest = 6,
/// <summary>
/// SSH_MSG_KEXINIT
/// </summary>
KeyExchangeInit = 20,
/// <summary>
/// SSH_MSG_NEWKEYS
/// </summary>
NewKeys = 21,
/// <summary>
/// SSH_MSG_KEXDH_INIT
/// </summary>
DiffieHellmanKeyExchangeInit = 30,
/// <summary>
/// SSH_MSG_KEXDH_REPLY
/// </summary>
KeyExchangeDhReply = 31,
/// <summary>
/// SSH_MSG_KEX_DH_GEX_GROUP
/// </summary>
KeyExchangeDhGroupExchangeGroup = 31,
/// <summary>
/// SSH_MSG_KEX_DH_GEX_INIT
/// </summary>
KeyExchangeDhGroupExchangeInit = 32,
/// <summary>
/// SSH_MSG_KEX_DH_GEX_REPLY
/// </summary>
KeyExchangeDhGroupExchangeReply = 33,
/// <summary>
/// SSH_MSG_KEX_DH_GEX_REQUEST
/// </summary>
KeyExchangeDhGroupExchangeRequest = 34,
/// <summary>
/// SSH_MSG_USERAUTH_REQUEST
/// </summary>
UserAuthenticationRequest = 50,
/// <summary>
/// SSH_MSG_USERAUTH_FAILURE
/// </summary>
UserAuthenticationFailure = 51,
/// <summary>
/// SSH_MSG_USERAUTH_SUCCESS
/// </summary>
UserAuthenticationSuccess = 52,
/// <summary>
/// SSH_MSG_USERAUTH_BANNER
/// </summary>
UserAuthenticationBanner = 53,
/// <summary>
/// SSH_MSG_USERAUTH_INFO_REQUEST
/// </summary>
UserAuthenticationInformationRequest = 60,
/// <summary>
/// SSH_MSG_USERAUTH_INFO_RESPONSE
/// </summary>
UserAuthenticationInformationResponse = 61,
/// <summary>
/// SSH_MSG_USERAUTH_PK_OK
/// </summary>
UserAuthenticationPublicKey = 60,
/// <summary>
/// SSH_MSG_USERAUTH_PASSWD_CHANGEREQ
/// </summary>
UserAuthenticationPasswordChangeRequired = 60,
/// <summary>
/// SSH_MSG_GLOBAL_REQUEST
/// </summary>
GlobalRequest = 80,
/// <summary>
/// SSH_MSG_REQUEST_SUCCESS
/// </summary>
RequestSuccess = 81,
/// <summary>
/// SSH_MSG_REQUEST_FAILURE
/// </summary>
RequestFailure = 82,
/// <summary>
/// SSH_MSG_CHANNEL_OPEN
/// </summary>
ChannelOpen = 90,
/// <summary>
/// SSH_MSG_CHANNEL_OPEN_CONFIRMATION
/// </summary>
ChannelOpenConfirmation = 91,
/// <summary>
/// SSH_MSG_CHANNEL_OPEN_FAILURE
/// </summary>
ChannelOpenFailure = 92,
/// <summary>
/// SSH_MSG_CHANNEL_WINDOW_ADJUST
/// </summary>
ChannelWindowAdjust = 93,
/// <summary>
/// SSH_MSG_CHANNEL_DATA
/// </summary>
ChannelData = 94,
/// <summary>
/// SSH_MSG_CHANNEL_EXTENDED_DATA
/// </summary>
ChannelExtendedData = 95,
/// <summary>
/// SSH_MSG_CHANNEL_EOF
/// </summary>
ChannelEof = 96,
/// <summary>
/// SSH_MSG_CHANNEL_CLOSE
/// </summary>
ChannelClose = 97,
/// <summary>
/// SSH_MSG_CHANNEL_REQUEST
/// </summary>
ChannelRequest = 98,
/// <summary>
/// SSH_MSG_CHANNEL_SUCCESS
/// </summary>
ChannelSuccess = 99,
/// <summary>
/// SSH_MSG_CHANNEL_FAILURE
/// </summary>
ChannelFailure = 100,
}
}
@@ -1,6 +1,7 @@
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_DEBUG", 4)]
public class DebugMessage : Message
{
public bool IsAlwaysDisplay { get; private set; }
@@ -9,11 +10,6 @@ namespace Renci.SshClient.Messages.Transport
public string Language { get; private set; }
public override MessageTypes MessageType
{
get { return MessageTypes.Debug; }
}
protected override void LoadData()
{
this.IsAlwaysDisplay = this.ReadBoolean();
@@ -2,13 +2,9 @@
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_DISCONNECT", 1)]
public class DisconnectMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.Disconnect; }
}
public DisconnectReasons ReasonCode { get; private set; }
public string Description { get; private set; }
@@ -1,15 +1,11 @@
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_IGNORE", 2)]
public class IgnoreMessage : Message
{
public string Data { get; private set; }
public override MessageTypes MessageType
{
get { return MessageTypes.Ignore; }
}
public IgnoreMessage()
{
this.Data = string.Empty;
@@ -6,13 +6,9 @@ using System.Numerics;
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_KEX_DH_GEX_GROUP", 31)]
public class KeyExchangeDhGroupExchangeGroup : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.KeyExchangeDhGroupExchangeGroup; }
}
/// <summary>
/// Gets or sets the safe prime.
/// </summary>
@@ -6,13 +6,9 @@ using System.Numerics;
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_KEX_DH_GEX_INIT", 32)]
internal class KeyExchangeDhGroupExchangeInit : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.KeyExchangeDhGroupExchangeInit; }
}
public BigInteger E { get; private set; }
public KeyExchangeDhGroupExchangeInit(BigInteger clientExchangeValue)
@@ -6,13 +6,9 @@ using System.Numerics;
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_KEX_DH_GEX_REPLY", 33)]
internal class KeyExchangeDhGroupExchangeReply : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.KeyExchangeDhGroupExchangeReply; }
}
/// <summary>
/// Gets server public host key and certificates
/// </summary>
@@ -5,13 +5,9 @@ using System.Text;
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_KEX_DH_GEX_REQUEST", 34)]
internal class KeyExchangeDhGroupExchangeRequest : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.KeyExchangeDhGroupExchangeRequest; }
}
/// <summary>
/// Gets or sets the minimal size in bits of an acceptable group.
/// </summary>
@@ -2,18 +2,11 @@
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_KEXDH_INIT", 30)]
internal class KeyExchangeDhInitMessage : Message
{
public BigInteger E { get; private set; }
public override MessageTypes MessageType
{
get
{
return MessageTypes.DiffieHellmanKeyExchangeInit;
}
}
public KeyExchangeDhInitMessage(BigInteger clientExchangeValue)
{
this.E = clientExchangeValue;
@@ -3,6 +3,7 @@ using System.Numerics;
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_KEXDH_REPLY", 31)]
public class KeyExchangeDhReplyMessage : Message
{
/// <summary>
@@ -19,14 +20,6 @@ namespace Renci.SshClient.Messages.Transport
/// <value>The signature.</value>
public string Signature { get; private set; }
public override MessageTypes MessageType
{
get
{
return MessageTypes.KeyExchangeDhReply;
}
}
protected override void LoadData()
{
this.ResetReader();
@@ -4,15 +4,11 @@ using System.Security.Cryptography;
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_KEXINIT", 20)]
public class KeyExchangeInitMessage : Message
{
private static RNGCryptoServiceProvider _randomizer = new System.Security.Cryptography.RNGCryptoServiceProvider();
public override MessageTypes MessageType
{
get { return MessageTypes.KeyExchangeInit; }
}
public KeyExchangeInitMessage()
{
var cookie = new byte[16];
@@ -1,12 +1,8 @@
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_NEWKEYS", 21)]
public class NewKeysMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.NewKeys; }
}
protected override void LoadData()
{
}
@@ -5,13 +5,9 @@ namespace Renci.SshClient.Messages.Transport
/// <summary>
/// SSH_MSG_SERVICE_ACCEPT
/// </summary>
[Message("SSH_MSG_SERVICE_ACCEPT", 6)]
public class ServiceAcceptMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.ServiceAcceptRequest; }
}
public ServiceNames ServiceName { get; private set; }
protected override void LoadData()
@@ -5,13 +5,9 @@ namespace Renci.SshClient.Messages.Transport
/// <summary>
/// Contains SSH_MSG_SERVICE_REQUEST message information
/// </summary>
[Message("SSH_MSG_SERVICE_REQUEST", 5)]
public class ServiceRequestMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.ServiceRequest; }
}
public ServiceNames ServiceName { get; private set; }
public ServiceRequestMessage(ServiceNames serviceName)
@@ -1,13 +1,9 @@
namespace Renci.SshClient.Messages.Transport
{
[Message("SSH_MSG_UNIMPLEMENTED", 3)]
public class UnimplementedMessage : Message
{
public override MessageTypes MessageType
{
get { return MessageTypes.Unimplemented; }
}
protected override void LoadData()
{
}
@@ -42,7 +42,7 @@ namespace Renci.SshClient
protected override void OnAuthenticate()
{
this.Session.RegisterMessageType<PasswordChangeRequiredMessage>(MessageTypes.UserAuthenticationPasswordChangeRequired);
this.Session.RegisterMessage<PasswordChangeRequiredMessage>();
this.SendMessage(new RequestMessagePassword(ServiceNames.Connection, this.Username, this.Password));
@@ -72,7 +72,7 @@ namespace Renci.SshClient
if (e.Message is PasswordChangeRequiredMessage)
{
this.Session.UnRegisterMessageType(MessageTypes.UserAuthenticationPasswordChangeRequired);
this.Session.UnRegisterMessage<PasswordChangeRequiredMessage>();
var eventTask = Task.Factory.StartNew(() =>
{
@@ -43,7 +43,7 @@ namespace Renci.SshClient
if (this.KeyFiles == null)
return;
this.Session.RegisterMessageType<PublicKeyMessage>(MessageTypes.UserAuthenticationPublicKey);
this.Session.RegisterMessage<PublicKeyMessage>();
foreach (var keyFile in this.KeyFiles)
{
@@ -87,7 +87,7 @@ namespace Renci.SshClient
}
}
this.Session.UnRegisterMessageType(MessageTypes.UserAuthenticationPublicKey);
this.Session.UnRegisterMessage<PublicKeyMessage>();
}
protected override void Session_UserAuthenticationSuccessMessageReceived(object sender, MessageEventArgs<SuccessMessage> e)
@@ -135,7 +135,7 @@ namespace Renci.SshClient
protected override void SaveData()
{
this.Write(this._sessionId);
this.Write((byte)this._message.MessageType);
this.Write((byte)50);
this.Write(this._message.Username);
this.Write("ssh-connection");
this.Write("publickey");
@@ -95,7 +95,8 @@
<Compile Include="Messages\Connection\ChannelRequest\WindowChangeRequestInfo.cs" />
<Compile Include="Messages\Connection\ChannelRequest\X11ForwardingRequestInfo.cs" />
<Compile Include="Messages\Connection\ChannelRequest\XonXoffRequestInfo.cs" />
<Compile Include="Messages\Sftp\SftpRequestMessage.cs" />
<Compile Include="Messages\MessageAttribute.cs" />
<Compile Include="Sftp\Messages\SftpRequestMessage.cs" />
<Compile Include="Messages\Transport\KeyExchangeDhGroupExchangeGroup.cs" />
<Compile Include="Messages\Transport\KeyExchangeDhGroupExchangeInit.cs" />
<Compile Include="Messages\Transport\KeyExchangeDhGroupExchangeReply.cs" />
@@ -138,7 +139,6 @@
<Compile Include="ForwardedPort.cs" />
<Compile Include="ForwardedPortLocal.cs" />
<Compile Include="ForwardedPortRemote.cs" />
<Compile Include="Messages\Connection\ChannelOpenDirectTcpIPMessage.cs" />
<Compile Include="Messages\Connection\GlobalRequestNames.cs" />
<Compile Include="Security\Algorithm.cs" />
<Compile Include="Security\Cipher.cs" />
@@ -146,43 +146,43 @@
<Compile Include="Security\CipherTripleDES.cs" />
<Compile Include="Compression\Compressor.cs" />
<Compile Include="Common\DataReceivedEventArgs.cs" />
<Compile Include="Messages\Sftp\AceMasks.cs" />
<Compile Include="Messages\Sftp\Attributes.cs" />
<Compile Include="Messages\Sftp\AttributesMessage.cs" />
<Compile Include="Messages\Sftp\CloseMessage.cs" />
<Compile Include="Messages\Sftp\DataMessage.cs" />
<Compile Include="Messages\Sftp\ExtendedMessage.cs" />
<Compile Include="Messages\Sftp\ExtendedReplyMessage.cs" />
<Compile Include="Messages\Sftp\Flags.cs" />
<Compile Include="Messages\Sftp\FSetStat.cs" />
<Compile Include="Messages\Sftp\FSetStatMessage.cs" />
<Compile Include="Messages\Sftp\FStatMessage.cs" />
<Compile Include="Messages\Sftp\HandleMessage.cs" />
<Compile Include="Messages\Sftp\InitMessage.cs" />
<Compile Include="Messages\Sftp\SymLinkMessage.cs">
<Compile Include="Sftp\Messages\AceMasks.cs" />
<Compile Include="Sftp\Messages\Attributes.cs" />
<Compile Include="Sftp\Messages\AttributesMessage.cs" />
<Compile Include="Sftp\Messages\CloseMessage.cs" />
<Compile Include="Sftp\Messages\DataMessage.cs" />
<Compile Include="Sftp\Messages\ExtendedMessage.cs" />
<Compile Include="Sftp\Messages\ExtendedReplyMessage.cs" />
<Compile Include="Sftp\Messages\Flags.cs" />
<Compile Include="Sftp\Messages\FSetStat.cs" />
<Compile Include="Sftp\Messages\FSetStatMessage.cs" />
<Compile Include="Sftp\Messages\FStatMessage.cs" />
<Compile Include="Sftp\Messages\HandleMessage.cs" />
<Compile Include="Sftp\Messages\InitMessage.cs" />
<Compile Include="Sftp\Messages\SymLinkMessage.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Messages\Sftp\LStatMessage.cs" />
<Compile Include="Messages\Sftp\MkDirMessage.cs" />
<Compile Include="Messages\Sftp\NameMessage.cs" />
<Compile Include="Messages\Sftp\OpenDirMessage.cs" />
<Compile Include="Messages\Sftp\OpenMessage.cs" />
<Compile Include="Messages\Sftp\ReadDirMessage.cs" />
<Compile Include="Messages\Sftp\ReadLinkMessage.cs" />
<Compile Include="Messages\Sftp\ReadMessage.cs" />
<Compile Include="Messages\Sftp\RealPathMessage.cs" />
<Compile Include="Messages\Sftp\RemoveMessage.cs" />
<Compile Include="Messages\Sftp\RenameMessage.cs" />
<Compile Include="Messages\Sftp\RmDirMessage.cs" />
<Compile Include="Messages\Sftp\SetStatMessage.cs" />
<Compile Include="Messages\Sftp\SftpDataMessage.cs" />
<Compile Include="Messages\Sftp\SftpMessage.cs" />
<Compile Include="Messages\Sftp\SftpMessageTypes.cs" />
<Compile Include="Messages\Sftp\StatMessage.cs" />
<Compile Include="Messages\Sftp\StatusCodes.cs" />
<Compile Include="Messages\Sftp\StatusMessage.cs" />
<Compile Include="Messages\Sftp\VersionMessage.cs" />
<Compile Include="Messages\Sftp\WriteMessage.cs" />
<Compile Include="Sftp\Messages\LStatMessage.cs" />
<Compile Include="Sftp\Messages\MkDirMessage.cs" />
<Compile Include="Sftp\Messages\NameMessage.cs" />
<Compile Include="Sftp\Messages\OpenDirMessage.cs" />
<Compile Include="Sftp\Messages\OpenMessage.cs" />
<Compile Include="Sftp\Messages\ReadDirMessage.cs" />
<Compile Include="Sftp\Messages\ReadLinkMessage.cs" />
<Compile Include="Sftp\Messages\ReadMessage.cs" />
<Compile Include="Sftp\Messages\RealPathMessage.cs" />
<Compile Include="Sftp\Messages\RemoveMessage.cs" />
<Compile Include="Sftp\Messages\RenameMessage.cs" />
<Compile Include="Sftp\Messages\RmDirMessage.cs" />
<Compile Include="Sftp\Messages\SetStatMessage.cs" />
<Compile Include="Sftp\Messages\SftpDataMessage.cs" />
<Compile Include="Sftp\Messages\SftpMessage.cs" />
<Compile Include="Sftp\Messages\SftpMessageTypes.cs" />
<Compile Include="Sftp\Messages\StatMessage.cs" />
<Compile Include="Sftp\Messages\StatusCodes.cs" />
<Compile Include="Sftp\Messages\StatusMessage.cs" />
<Compile Include="Sftp\Messages\VersionMessage.cs" />
<Compile Include="Sftp\Messages\WriteMessage.cs" />
<Compile Include="Compression\Zlib.cs" />
<Compile Include="Compression\ZlibOpenSsh.cs" />
<Compile Include="Security\CryptoKey.cs" />
@@ -239,9 +239,6 @@
<Compile Include="Messages\Message.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Messages\MessageTypes.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Messages\Transport\NewKeysMessage.cs">
<SubType>Code</SubType>
</Compile>
@@ -268,6 +265,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Documentation\Content\" />
<Folder Include="Messages\Sftp\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
@@ -38,7 +38,7 @@ namespace Renci.SshClient.Security
{
base.Start(session, message);
this.Session.RegisterMessageType<KeyExchangeDhReplyMessage>(MessageTypes.KeyExchangeDhReply);
this.Session.RegisterMessage<KeyExchangeDhReplyMessage>();
this.Session.MessageReceived += Session_MessageReceived;
@@ -68,7 +68,7 @@ namespace Renci.SshClient.Security
if (message != null)
{
// Unregister message once received
this.Session.UnRegisterMessageType(MessageTypes.KeyExchangeDhReply);
this.Session.UnRegisterMessage<KeyExchangeDhReplyMessage>();
this.HandleServerDhReply(message.HostKey, message.F, message.Signature);
}
@@ -38,7 +38,7 @@ namespace Renci.SshClient.Security
{
base.Start(session, message);
this.Session.RegisterMessageType<KeyExchangeDhReplyMessage>(MessageTypes.KeyExchangeDhReply);
this.Session.RegisterMessage<KeyExchangeDhReplyMessage>();
this.Session.MessageReceived += Session_MessageReceived;
@@ -69,7 +69,7 @@ namespace Renci.SshClient.Security
if (message != null)
{
// Unregister message once received
this.Session.UnRegisterMessageType(MessageTypes.KeyExchangeDhReply);
this.Session.UnRegisterMessage<KeyExchangeDhReplyMessage>();
this.HandleServerDhReply(message.HostKey, message.F, message.Signature);
}
@@ -44,8 +44,8 @@ namespace Renci.SshClient.Security
{
base.Start(session, message);
this.Session.RegisterMessageType<KeyExchangeDhGroupExchangeGroup>(MessageTypes.KeyExchangeDhGroupExchangeGroup);
this.Session.RegisterMessageType<KeyExchangeDhGroupExchangeReply>(MessageTypes.KeyExchangeDhGroupExchangeReply);
this.Session.RegisterMessage<KeyExchangeDhGroupExchangeGroup>();
this.Session.RegisterMessage<KeyExchangeDhGroupExchangeReply>();
this.Session.MessageReceived += Session_MessageReceived;
@@ -67,7 +67,7 @@ namespace Renci.SshClient.Security
if (groupMessage != null)
{
// Unregister message once received
this.Session.UnRegisterMessageType(MessageTypes.KeyExchangeDhGroupExchangeGroup);
this.Session.UnRegisterMessage<KeyExchangeDhGroupExchangeGroup>();
// 2. Receive SSH_MSG_KEX_DH_GEX_GROUP
this._prime = groupMessage.SafePrime;
@@ -84,7 +84,7 @@ namespace Renci.SshClient.Security
if (replyMessage != null)
{
// Unregister message once received
this.Session.UnRegisterMessageType(MessageTypes.KeyExchangeDhGroupExchangeReply);
this.Session.UnRegisterMessage<KeyExchangeDhGroupExchangeReply>();
this.HandleServerDhReply(replyMessage.HostKey, replyMessage.F, replyMessage.Signature);
}
@@ -22,8 +22,8 @@ namespace Renci.SshClient.Security
{
base.Start(session, message);
this.Session.RegisterMessageType<KeyExchangeDhGroupExchangeGroup>(MessageTypes.KeyExchangeDhGroupExchangeGroup);
this.Session.RegisterMessageType<KeyExchangeDhGroupExchangeReply>(MessageTypes.KeyExchangeDhGroupExchangeReply);
this.Session.RegisterMessage<KeyExchangeDhGroupExchangeGroup>();
this.Session.RegisterMessage<KeyExchangeDhGroupExchangeReply>();
this.Session.MessageReceived += Session_MessageReceived;
@@ -81,7 +81,7 @@ namespace Renci.SshClient.Security
if (groupMessage != null)
{
// Unregister message once received
this.Session.UnRegisterMessageType(MessageTypes.KeyExchangeDhGroupExchangeGroup);
this.Session.UnRegisterMessage<KeyExchangeDhGroupExchangeGroup>();
// 2. Receive SSH_MSG_KEX_DH_GEX_GROUP
this._prime = groupMessage.SafePrime;
@@ -98,7 +98,7 @@ namespace Renci.SshClient.Security
if (replyMessage != null)
{
// Unregister message once received
this.Session.UnRegisterMessageType(MessageTypes.KeyExchangeDhGroupExchangeReply);
this.Session.UnRegisterMessage<KeyExchangeDhGroupExchangeReply>();
this.HandleServerDhReply(replyMessage.HostKey, replyMessage.F, replyMessage.Signature);
}
+51 -40
View File
@@ -458,13 +458,13 @@ namespace Renci.SshClient
this.Write(Encoding.ASCII.GetBytes(string.Format("{0}\x0D\x0A", this.ClientVersion)));
// Register Transport response messages
this.RegisterMessageType<DisconnectMessage>(MessageTypes.Disconnect);
this.RegisterMessageType<IgnoreMessage>(MessageTypes.Ignore);
this.RegisterMessageType<UnimplementedMessage>(MessageTypes.Unimplemented);
this.RegisterMessageType<DebugMessage>(MessageTypes.Debug);
this.RegisterMessageType<ServiceAcceptMessage>(MessageTypes.ServiceAcceptRequest);
this.RegisterMessageType<KeyExchangeInitMessage>(MessageTypes.KeyExchangeInit);
this.RegisterMessageType<NewKeysMessage>(MessageTypes.NewKeys);
this.RegisterMessage<DisconnectMessage>();
this.RegisterMessage<IgnoreMessage>();
this.RegisterMessage<UnimplementedMessage>();
this.RegisterMessage<DebugMessage>();
this.RegisterMessage<ServiceAcceptMessage>();
this.RegisterMessage<KeyExchangeInitMessage>();
this.RegisterMessage<NewKeysMessage>();
// Start incoming request listener
@@ -973,18 +973,19 @@ namespace Renci.SshClient
this._keyExchangeCompletedWaitHandle.Reset();
// Connection type messages are not allowed during key exchange phase
this.UnRegisterMessageType(MessageTypes.GlobalRequest);
this.UnRegisterMessageType(MessageTypes.RequestSuccess);
this.UnRegisterMessageType(MessageTypes.RequestFailure);
this.UnRegisterMessageType(MessageTypes.ChannelOpenConfirmation);
this.UnRegisterMessageType(MessageTypes.ChannelOpenFailure);
this.UnRegisterMessageType(MessageTypes.ChannelWindowAdjust);
this.UnRegisterMessageType(MessageTypes.ChannelExtendedData);
this.UnRegisterMessageType(MessageTypes.ChannelRequest);
this.UnRegisterMessageType(MessageTypes.ChannelSuccess);
this.UnRegisterMessageType(MessageTypes.ChannelData);
this.UnRegisterMessageType(MessageTypes.ChannelEof);
this.UnRegisterMessageType(MessageTypes.ChannelClose);
this.UnRegisterMessage<GlobalRequestMessage>();
this.UnRegisterMessage<RequestSuccessMessage>();
this.UnRegisterMessage<RequestFailureMessage>();
this.UnRegisterMessage<ChannelOpenConfirmationMessage>();
this.UnRegisterMessage<ChannelOpenFailureMessage>();
this.UnRegisterMessage<ChannelWindowAdjustMessage>();
this.UnRegisterMessage<ChannelExtendedDataMessage>();
this.UnRegisterMessage<ChannelRequestMessage>();
this.UnRegisterMessage<ChannelSuccessMessage>();
this.UnRegisterMessage<ChannelFailureMessage>();
this.UnRegisterMessage<ChannelDataMessage>();
this.UnRegisterMessage<ChannelEofMessage>();
this.UnRegisterMessage<ChannelCloseMessage>();
var keyExchangeAlgorithmName = (from c in this.ConnectionInfo.KeyExchangeAlgorithms.Keys
from s in message.KeyExchangeAlgorithms
@@ -1034,19 +1035,19 @@ namespace Renci.SshClient
this._serverDecompression = this._keyExchange.Decompressor;
// Register Connection messages
this.RegisterMessageType<GlobalRequestMessage>(MessageTypes.GlobalRequest);
this.RegisterMessageType<RequestSuccessMessage>(MessageTypes.RequestSuccess);
this.RegisterMessageType<RequestFailureMessage>(MessageTypes.RequestFailure);
this.RegisterMessageType<ChannelOpenConfirmationMessage>(MessageTypes.ChannelOpenConfirmation);
this.RegisterMessageType<ChannelOpenFailureMessage>(MessageTypes.ChannelOpenFailure);
this.RegisterMessageType<ChannelWindowAdjustMessage>(MessageTypes.ChannelWindowAdjust);
this.RegisterMessageType<ChannelExtendedDataMessage>(MessageTypes.ChannelExtendedData);
this.RegisterMessageType<ChannelRequestMessage>(MessageTypes.ChannelRequest);
this.RegisterMessageType<ChannelSuccessMessage>(MessageTypes.ChannelSuccess);
this.RegisterMessageType<ChannelFailureMessage>(MessageTypes.ChannelFailure);
this.RegisterMessageType<ChannelDataMessage>(MessageTypes.ChannelData);
this.RegisterMessageType<ChannelEofMessage>(MessageTypes.ChannelEof);
this.RegisterMessageType<ChannelCloseMessage>(MessageTypes.ChannelClose);
this.RegisterMessage<GlobalRequestMessage>();
this.RegisterMessage<RequestSuccessMessage>();
this.RegisterMessage<RequestFailureMessage>();
this.RegisterMessage<ChannelOpenConfirmationMessage>();
this.RegisterMessage<ChannelOpenFailureMessage>();
this.RegisterMessage<ChannelWindowAdjustMessage>();
this.RegisterMessage<ChannelExtendedDataMessage>();
this.RegisterMessage<ChannelRequestMessage>();
this.RegisterMessage<ChannelSuccessMessage>();
this.RegisterMessage<ChannelFailureMessage>();
this.RegisterMessage<ChannelDataMessage>();
this.RegisterMessage<ChannelEofMessage>();
this.RegisterMessage<ChannelCloseMessage>();
if (this.NewKeysReceived != null)
{
@@ -1293,7 +1294,7 @@ namespace Renci.SshClient
private delegate T LoadFunc<out T>(IEnumerable<byte> data);
private IDictionary<MessageTypes, LoadFunc<Message>> _registeredMessageTypes = new Dictionary<MessageTypes, LoadFunc<Message>>();
private IDictionary<byte, LoadFunc<Message>> _registeredMessageTypes = new Dictionary<byte, LoadFunc<Message>>();
/// <summary>
/// Registers the message type. This will allow message type to be recognized by and handled by the system.
@@ -1301,27 +1302,37 @@ namespace Renci.SshClient
/// <remarks>Some message types are not allowed during cirtain times or same code can be used for different type of message</remarks>
/// <typeparam name="T"></typeparam>
/// <param name="messageType">Type of the message.</param>
public void RegisterMessageType<T>(MessageTypes messageType) where T : Message, new()
public void RegisterMessage<T>() where T : Message, new()
{
var messageAttribute = typeof(T).GetCustomAttributes(typeof(MessageAttribute), true).SingleOrDefault() as MessageAttribute;
if (messageAttribute == null)
throw new SshException(string.Format("Type '{0}' is not a valid message type.", typeof(T).AssemblyQualifiedName));
lock (this._registeredMessageTypes)
{
if (this._registeredMessageTypes.ContainsKey(messageType))
if (this._registeredMessageTypes.ContainsKey(messageAttribute.Number))
{
this.UnRegisterMessageType(messageType);
this.UnRegisterMessage<T>();
}
this._registeredMessageTypes.Add(messageType, new LoadFunc<Message>(Message.Load<T>));
this._registeredMessageTypes.Add(messageAttribute.Number, new LoadFunc<Message>(Message.Load<T>));
}
}
public void UnRegisterMessageType(MessageTypes messageType)
public void UnRegisterMessage<T>()
{
this._registeredMessageTypes.Remove(messageType);
var messageAttribute = typeof(T).GetCustomAttributes(typeof(MessageAttribute), true).SingleOrDefault() as MessageAttribute;
if (messageAttribute == null)
throw new SshException(string.Format("Type '{0}' is not a valid message type.", typeof(T).AssemblyQualifiedName));
this._registeredMessageTypes.Remove(messageAttribute.Number);
}
public Message LoadMessage(IEnumerable<byte> data)
{
var messageType = (MessageTypes)data.FirstOrDefault();
var messageType = data.FirstOrDefault();
lock (this._registeredMessageTypes)
{
@@ -1,4 +1,4 @@
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{
@@ -1,6 +1,6 @@
using System.IO;
using System.Linq;
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using Renci.SshClient.Common;
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal enum AceMasks
{
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
public class Attributes
{
@@ -1,5 +1,4 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class AttributesMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class CloseMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class DataMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class ExtendedMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class ExtendedReplyMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class FSetStat : SftpRequestMessage
{
@@ -1,4 +1,4 @@
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class FSetStatMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class FStatMessage : SftpRequestMessage
{
@@ -1,4 +1,4 @@
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal enum Flags
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class HandleMessage : SftpRequestMessage
{
@@ -1,4 +1,4 @@
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class InitMessage : SftpMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class LStatMessage : SftpRequestMessage
{
@@ -1,4 +1,4 @@
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class MkDirMessage : SftpRequestMessage
{
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using Renci.SshClient.Sftp;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class NameMessage : SftpRequestMessage
{
@@ -1,6 +1,6 @@

using System.Text;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class OpenDirMessage : SftpRequestMessage
{
@@ -1,6 +1,6 @@
using System;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class OpenMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class ReadDirMessage : SftpRequestMessage
{
@@ -1,6 +1,6 @@

using System.Text;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class ReadLinkMessage : SftpRequestMessage
{
@@ -1,6 +1,6 @@

using System;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class ReadMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class RealPathMessage : SftpRequestMessage
{
@@ -1,6 +1,6 @@

using System.Text;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class RemoveMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class RenameMessage : SftpRequestMessage
{
@@ -1,6 +1,6 @@
using System.Text;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class RmDirMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class SetStatMessage : SftpRequestMessage
{
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using Renci.SshClient.Messages.Connection;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class SftpDataMessage : ChannelDataMessage
{
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using Renci.SshClient.Common;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal abstract class SftpMessage : SshData
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal enum SftpMessageTypes : byte
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal abstract class SftpRequestMessage : SftpMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class StatMessage : SftpRequestMessage
{
@@ -1,5 +1,5 @@

namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal enum StatusCodes : uint
{
@@ -1,4 +1,4 @@
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class StatusMessage : SftpRequestMessage
{
@@ -1,6 +1,6 @@
using System.Text;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class SymLinkMessage : SftpRequestMessage
{
@@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class VersionMessage : SftpMessage
{
@@ -1,6 +1,6 @@
using System;
namespace Renci.SshClient.Messages.Sftp
namespace Renci.SshClient.Sftp.Messages
{
internal class WriteMessage : SftpRequestMessage
{
@@ -1,4 +1,4 @@
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{
@@ -1,4 +1,4 @@
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{
@@ -1,4 +1,4 @@
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Renci.SshClient.Common;
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{
@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{
@@ -5,7 +5,7 @@ using System.Text;
using System.Threading;
using Renci.SshClient.Channels;
using Renci.SshClient.Common;
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{
@@ -1,6 +1,6 @@
using System.IO;
using System.Linq;
using Renci.SshClient.Messages.Sftp;
using Renci.SshClient.Sftp.Messages;
namespace Renci.SshClient.Sftp
{