diff --git a/src/Renci.SshNet/Messages/Authentication/BannerMessage.cs b/src/Renci.SshNet/Messages/Authentication/BannerMessage.cs index 90652a34f..15f46386b 100644 --- a/src/Renci.SshNet/Messages/Authentication/BannerMessage.cs +++ b/src/Renci.SshNet/Messages/Authentication/BannerMessage.cs @@ -3,12 +3,29 @@ /// /// Represents SSH_MSG_USERAUTH_BANNER message. /// - [Message("SSH_MSG_USERAUTH_BANNER", 53)] public class BannerMessage : Message { private byte[] _message; private byte[] _language; + /// + public override string MessageName + { + get + { + return "SSH_MSG_USERAUTH_BANNER"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 53; + } + } + /// /// Gets banner message. /// diff --git a/src/Renci.SshNet/Messages/Authentication/FailureMessage.cs b/src/Renci.SshNet/Messages/Authentication/FailureMessage.cs index f02705ecb..1904fa1de 100644 --- a/src/Renci.SshNet/Messages/Authentication/FailureMessage.cs +++ b/src/Renci.SshNet/Messages/Authentication/FailureMessage.cs @@ -5,9 +5,26 @@ namespace Renci.SshNet.Messages.Authentication /// /// Represents SSH_MSG_USERAUTH_FAILURE message. /// - [Message("SSH_MSG_USERAUTH_FAILURE", 51)] public class FailureMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_USERAUTH_FAILURE"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 51; + } + } + /// /// Gets or sets the allowed authentications if available. /// diff --git a/src/Renci.SshNet/Messages/Authentication/InformationRequestMessage.cs b/src/Renci.SshNet/Messages/Authentication/InformationRequestMessage.cs index 7110222ac..9a45bcf2b 100644 --- a/src/Renci.SshNet/Messages/Authentication/InformationRequestMessage.cs +++ b/src/Renci.SshNet/Messages/Authentication/InformationRequestMessage.cs @@ -8,9 +8,26 @@ namespace Renci.SshNet.Messages.Authentication /// /// Represents SSH_MSG_USERAUTH_INFO_REQUEST message. /// - [Message("SSH_MSG_USERAUTH_INFO_REQUEST", 60)] internal sealed class InformationRequestMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_USERAUTH_INFO_REQUEST"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 60; + } + } + /// /// Gets information request name. /// diff --git a/src/Renci.SshNet/Messages/Authentication/InformationResponseMessage.cs b/src/Renci.SshNet/Messages/Authentication/InformationResponseMessage.cs index 9e3227342..27e4fe65b 100644 --- a/src/Renci.SshNet/Messages/Authentication/InformationResponseMessage.cs +++ b/src/Renci.SshNet/Messages/Authentication/InformationResponseMessage.cs @@ -6,9 +6,26 @@ namespace Renci.SshNet.Messages.Authentication /// /// Represents SSH_MSG_USERAUTH_INFO_RESPONSE message. /// - [Message("SSH_MSG_USERAUTH_INFO_RESPONSE", 61)] internal sealed class InformationResponseMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_USERAUTH_INFO_RESPONSE"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 61; + } + } + /// /// Gets authentication responses. /// diff --git a/src/Renci.SshNet/Messages/Authentication/PasswordChangeRequiredMessage.cs b/src/Renci.SshNet/Messages/Authentication/PasswordChangeRequiredMessage.cs index a87b53dfb..8cff4d1d7 100644 --- a/src/Renci.SshNet/Messages/Authentication/PasswordChangeRequiredMessage.cs +++ b/src/Renci.SshNet/Messages/Authentication/PasswordChangeRequiredMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_USERAUTH_PASSWD_CHANGEREQ message. /// - [Message("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ", 60)] internal sealed class PasswordChangeRequiredMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_USERAUTH_PASSWD_CHANGEREQ"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 60; + } + } + /// /// Gets password change request message as UTF-8 encoded byte array. /// diff --git a/src/Renci.SshNet/Messages/Authentication/PublicKeyMessage.cs b/src/Renci.SshNet/Messages/Authentication/PublicKeyMessage.cs index b917ab99a..491d1262c 100644 --- a/src/Renci.SshNet/Messages/Authentication/PublicKeyMessage.cs +++ b/src/Renci.SshNet/Messages/Authentication/PublicKeyMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_USERAUTH_PK_OK message. /// - [Message("SSH_MSG_USERAUTH_PK_OK", 60)] internal sealed class PublicKeyMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_USERAUTH_PK_OK"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 60; + } + } + /// /// Gets the name of the public key algorithm as ASCII encoded byte array. /// diff --git a/src/Renci.SshNet/Messages/Authentication/RequestMessage.cs b/src/Renci.SshNet/Messages/Authentication/RequestMessage.cs index 57f60849f..58daa10fc 100644 --- a/src/Renci.SshNet/Messages/Authentication/RequestMessage.cs +++ b/src/Renci.SshNet/Messages/Authentication/RequestMessage.cs @@ -6,9 +6,26 @@ namespace Renci.SshNet.Messages.Authentication /// /// Represents SSH_MSG_USERAUTH_REQUEST message. Server as a base message for other user authentication requests. /// - [Message("SSH_MSG_USERAUTH_REQUEST", AuthenticationMessageCode)] public abstract class RequestMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_USERAUTH_REQUEST"; + } + } + + /// + public override byte MessageNumber + { + get + { + return AuthenticationMessageCode; + } + } + /// /// Returns the authentication message code for SSH_MSG_USERAUTH_REQUEST. /// diff --git a/src/Renci.SshNet/Messages/Authentication/SuccessMessage.cs b/src/Renci.SshNet/Messages/Authentication/SuccessMessage.cs index e21544211..03ed4a9a0 100644 --- a/src/Renci.SshNet/Messages/Authentication/SuccessMessage.cs +++ b/src/Renci.SshNet/Messages/Authentication/SuccessMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_USERAUTH_SUCCESS message. /// - [Message("SSH_MSG_USERAUTH_SUCCESS", 52)] public class SuccessMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_USERAUTH_SUCCESS"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 52; + } + } + /// /// Called when type specific data need to be loaded. /// diff --git a/src/Renci.SshNet/Messages/Connection/ChannelCloseMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelCloseMessage.cs index dfb430134..c66294a79 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelCloseMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelCloseMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_CHANNEL_CLOSE message. /// - [Message("SSH_MSG_CHANNEL_CLOSE", 97)] public class ChannelCloseMessage : ChannelMessage { + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_CLOSE"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 97; + } + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Renci.SshNet/Messages/Connection/ChannelDataMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelDataMessage.cs index 8a764d798..f387a7c36 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelDataMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelDataMessage.cs @@ -5,10 +5,25 @@ namespace Renci.SshNet.Messages.Connection /// /// Represents SSH_MSG_CHANNEL_DATA message. /// - [Message("SSH_MSG_CHANNEL_DATA", MessageNumber)] public class ChannelDataMessage : ChannelMessage { - internal const byte MessageNumber = 94; + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_DATA"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 94; + } + } /// /// Gets the message data. diff --git a/src/Renci.SshNet/Messages/Connection/ChannelEofMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelEofMessage.cs index 0ad028242..1a7ca9bce 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelEofMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelEofMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_CHANNEL_EOF message. /// - [Message("SSH_MSG_CHANNEL_EOF", 96)] public class ChannelEofMessage : ChannelMessage { + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_EOF"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 96; + } + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Renci.SshNet/Messages/Connection/ChannelExtendedDataMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelExtendedDataMessage.cs index 4546a7343..c3788ff3a 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelExtendedDataMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelExtendedDataMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_CHANNEL_EXTENDED_DATA message. /// - [Message("SSH_MSG_CHANNEL_EXTENDED_DATA", 95)] public class ChannelExtendedDataMessage : ChannelMessage { + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_EXTENDED_DATA"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 95; + } + } + /// /// Gets message data type code. /// diff --git a/src/Renci.SshNet/Messages/Connection/ChannelFailureMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelFailureMessage.cs index 5987534ca..a6b24d2da 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelFailureMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelFailureMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_CHANNEL_FAILURE message. /// - [Message("SSH_MSG_CHANNEL_FAILURE", 100)] public class ChannelFailureMessage : ChannelMessage { + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_FAILURE"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 100; + } + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Renci.SshNet/Messages/Connection/ChannelOpen/ChannelOpenMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelOpen/ChannelOpenMessage.cs index 3a18bb22f..a45eda441 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelOpen/ChannelOpenMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelOpen/ChannelOpenMessage.cs @@ -6,13 +6,28 @@ namespace Renci.SshNet.Messages.Connection /// /// Represents SSH_MSG_CHANNEL_OPEN message. /// - [Message("SSH_MSG_CHANNEL_OPEN", MessageNumber)] public class ChannelOpenMessage : Message { - internal const byte MessageNumber = 90; - private byte[] _infoBytes; + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_OPEN"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 90; + } + } + /// /// Gets the type of the channel as ASCII encoded byte array. /// diff --git a/src/Renci.SshNet/Messages/Connection/ChannelOpenConfirmationMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelOpenConfirmationMessage.cs index 0213136df..ae6db2bf9 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelOpenConfirmationMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelOpenConfirmationMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_CHANNEL_OPEN_CONFIRMATION message. /// - [Message("SSH_MSG_CHANNEL_OPEN_CONFIRMATION", 91)] public class ChannelOpenConfirmationMessage : ChannelMessage { + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_OPEN_CONFIRMATION"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 91; + } + } + /// /// Gets the remote channel number. /// diff --git a/src/Renci.SshNet/Messages/Connection/ChannelOpenFailureMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelOpenFailureMessage.cs index 4488f9f5f..e68ab0358 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelOpenFailureMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelOpenFailureMessage.cs @@ -3,7 +3,6 @@ /// /// Represents SSH_MSG_CHANNEL_OPEN_FAILURE message. /// - [Message("SSH_MSG_CHANNEL_OPEN_FAILURE", 92)] public class ChannelOpenFailureMessage : ChannelMessage { internal const uint AdministrativelyProhibited = 1; @@ -14,6 +13,24 @@ public class ChannelOpenFailureMessage : ChannelMessage private byte[] _description; private byte[] _language; + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_OPEN_FAILURE"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 92; + } + } + /// /// Gets failure reason code. /// diff --git a/src/Renci.SshNet/Messages/Connection/ChannelRequest/ChannelRequestMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelRequest/ChannelRequestMessage.cs index fd9ad03b6..695c35b29 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelRequest/ChannelRequestMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelRequest/ChannelRequestMessage.cs @@ -3,12 +3,29 @@ /// /// Represents SSH_MSG_CHANNEL_REQUEST message. /// - [Message("SSH_MSG_CHANNEL_REQUEST", 98)] public class ChannelRequestMessage : ChannelMessage { private string _requestName; private byte[] _requestNameBytes; + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_REQUEST"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 98; + } + } + /// /// Gets the name of the request. /// diff --git a/src/Renci.SshNet/Messages/Connection/ChannelSuccessMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelSuccessMessage.cs index 50d302f21..c554f32e9 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelSuccessMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelSuccessMessage.cs @@ -3,7 +3,6 @@ /// /// Represents SSH_MSG_CHANNEL_SUCCESS message. /// - [Message("SSH_MSG_CHANNEL_SUCCESS", 99)] public class ChannelSuccessMessage : ChannelMessage { /// @@ -22,6 +21,24 @@ public ChannelSuccessMessage(uint localChannelNumber) { } + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_SUCCESS"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 99; + } + } + internal override void Process(Session session) { session.OnChannelSuccessReceived(this); diff --git a/src/Renci.SshNet/Messages/Connection/ChannelWindowAdjustMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelWindowAdjustMessage.cs index 315c98c8a..3e6ad90d1 100644 --- a/src/Renci.SshNet/Messages/Connection/ChannelWindowAdjustMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/ChannelWindowAdjustMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_CHANNEL_SUCCESS message. /// - [Message("SSH_MSG_CHANNEL_WINDOW_ADJUST", 93)] public class ChannelWindowAdjustMessage : ChannelMessage { + /// + public override string MessageName + { + get + { + return "SSH_MSG_CHANNEL_WINDOW_ADJUST"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 93; + } + } + /// /// Gets number of bytes to add to the window. /// diff --git a/src/Renci.SshNet/Messages/Connection/GlobalRequestMessage.cs b/src/Renci.SshNet/Messages/Connection/GlobalRequestMessage.cs index 6e0ca3a21..d34778e54 100644 --- a/src/Renci.SshNet/Messages/Connection/GlobalRequestMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/GlobalRequestMessage.cs @@ -3,11 +3,28 @@ /// /// Represents SSH_MSG_GLOBAL_REQUEST message. /// - [Message("SSH_MSG_GLOBAL_REQUEST", 80)] public class GlobalRequestMessage : Message { private byte[] _requestName; + /// + public override string MessageName + { + get + { + return "SSH_MSG_GLOBAL_REQUEST"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 80; + } + } + /// /// Gets the name of the request. /// diff --git a/src/Renci.SshNet/Messages/Connection/RequestFailureMessage.cs b/src/Renci.SshNet/Messages/Connection/RequestFailureMessage.cs index 553f95473..8602f5089 100644 --- a/src/Renci.SshNet/Messages/Connection/RequestFailureMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/RequestFailureMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_REQUEST_FAILURE message. /// - [Message("SSH_MSG_REQUEST_FAILURE", 82)] public class RequestFailureMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_REQUEST_FAILURE"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 82; + } + } + /// /// Called when type specific data need to be loaded. /// diff --git a/src/Renci.SshNet/Messages/Connection/RequestSuccessMessage.cs b/src/Renci.SshNet/Messages/Connection/RequestSuccessMessage.cs index 00ad1059d..68f5a2f84 100644 --- a/src/Renci.SshNet/Messages/Connection/RequestSuccessMessage.cs +++ b/src/Renci.SshNet/Messages/Connection/RequestSuccessMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_REQUEST_SUCCESS message. /// - [Message("SSH_MSG_REQUEST_SUCCESS", 81)] public class RequestSuccessMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_REQUEST_SUCCESS"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 81; + } + } + /// /// Gets the bound port. /// diff --git a/src/Renci.SshNet/Messages/Message.cs b/src/Renci.SshNet/Messages/Message.cs index ebe3a2e71..eab59815d 100644 --- a/src/Renci.SshNet/Messages/Message.cs +++ b/src/Renci.SshNet/Messages/Message.cs @@ -1,5 +1,4 @@ -using System.Globalization; -using System.IO; +using System.IO; using Renci.SshNet.Abstractions; using Renci.SshNet.Common; @@ -13,11 +12,16 @@ namespace Renci.SshNet.Messages public abstract class Message : SshData { /// - /// Gets the size of the message in bytes. + /// Gets the message name as defined in RFC 4250. /// - /// - /// The size of the messages in bytes. - /// + public abstract string MessageName { get; } + + /// + /// Gets the message number as defined in RFC 4250. + /// + public abstract byte MessageNumber { get; } + + /// protected override int BufferCapacity { get @@ -26,28 +30,11 @@ protected override int BufferCapacity } } - /// - /// Writes the message to the specified . - /// - /// The to write the message to. + /// protected override void WriteBytes(SshDataStream stream) { - var enumerator = GetType().GetCustomAttributes(inherit: true).GetEnumerator(); - try - { - if (!enumerator.MoveNext()) - { - throw new SshException(string.Format(CultureInfo.CurrentCulture, "Type '{0}' is not a valid message type.", GetType().AssemblyQualifiedName)); - } - - var messageAttribute = enumerator.Current; - stream.WriteByte(messageAttribute.Number); - base.WriteBytes(stream); - } - finally - { - enumerator.Dispose(); - } + stream.WriteByte(MessageNumber); + base.WriteBytes(stream); } internal byte[] GetPacket(byte paddingMultiplier, Compressor compressor) @@ -163,23 +150,10 @@ private static byte GetPaddingLength(byte paddingMultiplier, long packetLength) return paddingLength; } - /// - /// Returns a that represents this instance. - /// - /// - /// A that represents this instance. - /// + /// public override string ToString() { - using (var enumerator = GetType().GetCustomAttributes(inherit: true).GetEnumerator()) - { - if (!enumerator.MoveNext()) - { - return string.Format(CultureInfo.CurrentCulture, "'{0}' without Message attribute.", GetType().FullName); - } - - return enumerator.Current.Name; - } + return MessageName; } /// diff --git a/src/Renci.SshNet/Messages/MessageAttribute.cs b/src/Renci.SshNet/Messages/MessageAttribute.cs deleted file mode 100644 index f94d13c32..000000000 --- a/src/Renci.SshNet/Messages/MessageAttribute.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; - -namespace Renci.SshNet.Messages -{ - /// - /// Indicates that a class represents SSH message. This class cannot be inherited. - /// - [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)] - public sealed class MessageAttribute : Attribute - { - /// - /// Gets the message name as defined in RFC 4250. - /// - /// - /// The name. - /// - public string Name { get; } - - /// - /// Gets the message number as defined in RFC 4250. - /// - /// - /// The number. - /// - public byte Number { get; } - - /// - /// Initializes a new instance of the class. - /// - /// The name. - /// The number. - public MessageAttribute(string name, byte number) - { - Name = name; - Number = number; - } - } -} diff --git a/src/Renci.SshNet/Messages/Transport/DebugMessage.cs b/src/Renci.SshNet/Messages/Transport/DebugMessage.cs index f550d95fe..0331107d9 100644 --- a/src/Renci.SshNet/Messages/Transport/DebugMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/DebugMessage.cs @@ -3,12 +3,29 @@ /// /// Represents SSH_MSG_DEBUG message. /// - [Message("SSH_MSG_DEBUG", 4)] public class DebugMessage : Message { private byte[] _message; private byte[] _language; + /// + public override string MessageName + { + get + { + return "SSH_MSG_DEBUG"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 4; + } + } + /// /// Gets a value indicating whether the message to be always displayed. /// diff --git a/src/Renci.SshNet/Messages/Transport/DisconnectMessage.cs b/src/Renci.SshNet/Messages/Transport/DisconnectMessage.cs index b5f43adfc..88ad5a01a 100644 --- a/src/Renci.SshNet/Messages/Transport/DisconnectMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/DisconnectMessage.cs @@ -3,12 +3,29 @@ /// /// Represents SSH_MSG_DISCONNECT message. /// - [Message("SSH_MSG_DISCONNECT", 1)] public class DisconnectMessage : Message, IKeyExchangedAllowed { private byte[] _description; private byte[] _language; + /// + public override string MessageName + { + get + { + return "SSH_MSG_DISCONNECT"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 1; + } + } + /// /// Gets disconnect reason code. /// diff --git a/src/Renci.SshNet/Messages/Transport/IgnoreMessage.cs b/src/Renci.SshNet/Messages/Transport/IgnoreMessage.cs index d657d2d46..b71b28788 100644 --- a/src/Renci.SshNet/Messages/Transport/IgnoreMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/IgnoreMessage.cs @@ -5,10 +5,25 @@ namespace Renci.SshNet.Messages.Transport /// /// Represents SSH_MSG_IGNORE message. /// - [Message("SSH_MSG_IGNORE", MessageNumber)] public class IgnoreMessage : Message { - internal const byte MessageNumber = 2; + /// + public override string MessageName + { + get + { + return "SSH_MSG_IGNORE"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 2; + } + } /// /// Gets ignore message data if this message has been initialised diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeGroup.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeGroup.cs index f1010a19d..a17c23e33 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeGroup.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeGroup.cs @@ -5,14 +5,29 @@ namespace Renci.SshNet.Messages.Transport /// /// Represents SSH_MSG_KEX_DH_GEX_GROUP message. /// - [Message("SSH_MSG_KEX_DH_GEX_GROUP", MessageNumber)] public class KeyExchangeDhGroupExchangeGroup : Message { - internal const byte MessageNumber = 31; - private byte[] _safePrime; private byte[] _subGroup; + /// + public override string MessageName + { + get + { + return "SSH_MSG_KEX_DH_GEX_GROUP"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 31; + } + } + /// /// Gets the safe prime. /// diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs index 381c534b9..c63484739 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_KEX_DH_GEX_INIT message. /// - [Message("SSH_MSG_KEX_DH_GEX_INIT", 32)] internal sealed class KeyExchangeDhGroupExchangeInit : Message, IKeyExchangedAllowed { + /// + public override string MessageName + { + get + { + return "SSH_MSG_KEX_DH_GEX_INIT"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 32; + } + } + /// /// Gets the E value. /// diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs index 7b446d962..090dd71ab 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs @@ -3,10 +3,25 @@ /// /// Represents SSH_MSG_KEX_DH_GEX_REPLY message. /// - [Message("SSH_MSG_KEX_DH_GEX_REPLY", MessageNumber)] internal sealed class KeyExchangeDhGroupExchangeReply : Message { - internal const byte MessageNumber = 33; + /// + public override string MessageName + { + get + { + return "SSH_MSG_KEX_DH_GEX_REPLY"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 33; + } + } /// /// Gets server public host key and certificates. diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeRequest.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeRequest.cs index 9bb6c6bc8..1ad967c8e 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeRequest.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeRequest.cs @@ -3,10 +3,25 @@ /// /// Represents SSH_MSG_KEX_DH_GEX_REQUEST message. /// - [Message("SSH_MSG_KEX_DH_GEX_REQUEST", MessageNumber)] internal sealed class KeyExchangeDhGroupExchangeRequest : Message, IKeyExchangedAllowed { - internal const byte MessageNumber = 34; + /// + public override string MessageName + { + get + { + return "SSH_MSG_KEX_DH_GEX_REQUEST"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 34; + } + } /// /// Gets the minimum size, in bits, of an acceptable group. diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs index 5b681d1b4..3ce030c8d 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_KEXDH_INIT message. /// - [Message("SSH_MSG_KEXDH_INIT", 30)] internal sealed class KeyExchangeDhInitMessage : Message, IKeyExchangedAllowed { + /// + public override string MessageName + { + get + { + return "SSH_MSG_KEXDH_INIT"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 30; + } + } + /// /// Gets the E value. /// diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs index 8f0a1489f..efc280183 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_KEXDH_REPLY message. /// - [Message("SSH_MSG_KEXDH_REPLY", 31)] public class KeyExchangeDhReplyMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_KEXDH_REPLY"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 31; + } + } + /// /// Gets server public host key and certificates. /// diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs index 2d02d1480..ab5bc1c85 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs @@ -6,9 +6,26 @@ namespace Renci.SshNet.Messages.Transport /// /// Represents SSH_MSG_KEXECDH_INIT message. /// - [Message("SSH_MSG_KEX_ECDH_INIT", 30)] internal sealed class KeyExchangeEcdhInitMessage : Message, IKeyExchangedAllowed { + /// + public override string MessageName + { + get + { + return "SSH_MSG_KEX_ECDH_INIT"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 30; + } + } + /// /// Gets the client's ephemeral contribution to the ECDH exchange, encoded as an octet string. /// diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs index a5626aece..70ed96c00 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_KEXECDH_REPLY message. /// - [Message("SSH_MSG_KEX_ECDH_REPLY", 31)] public class KeyExchangeEcdhReplyMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_KEX_ECDH_REPLY"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 31; + } + } + /// /// Gets a string encoding an X.509v3 certificate containing the server's ECDSA public host key. /// diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeInitMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeInitMessage.cs index 43bcd72bf..7bfce46dc 100644 --- a/src/Renci.SshNet/Messages/Transport/KeyExchangeInitMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeInitMessage.cs @@ -5,7 +5,6 @@ namespace Renci.SshNet.Messages.Transport /// /// Represents SSH_MSG_KEXINIT message. /// - [Message("SSH_MSG_KEXINIT", 20)] public class KeyExchangeInitMessage : Message, IKeyExchangedAllowed { /// @@ -20,6 +19,24 @@ public KeyExchangeInitMessage() #region Message Properties + /// + public override string MessageName + { + get + { + return "SSH_MSG_KEXINIT"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 20; + } + } + /// /// Gets session cookie. /// diff --git a/src/Renci.SshNet/Messages/Transport/NewKeysMessage.cs b/src/Renci.SshNet/Messages/Transport/NewKeysMessage.cs index 838d4373b..ea0f6b754 100644 --- a/src/Renci.SshNet/Messages/Transport/NewKeysMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/NewKeysMessage.cs @@ -3,9 +3,26 @@ /// /// Represents SSH_MSG_NEWKEYS message. /// - [Message("SSH_MSG_NEWKEYS", 21)] public class NewKeysMessage : Message, IKeyExchangedAllowed { + /// + public override string MessageName + { + get + { + return "SSH_MSG_NEWKEYS"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 21; + } + } + /// /// Called when type specific data need to be loaded. /// diff --git a/src/Renci.SshNet/Messages/Transport/ServiceAcceptMessage.cs b/src/Renci.SshNet/Messages/Transport/ServiceAcceptMessage.cs index a7c2a8c6f..ce16d9fd4 100644 --- a/src/Renci.SshNet/Messages/Transport/ServiceAcceptMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/ServiceAcceptMessage.cs @@ -6,10 +6,25 @@ namespace Renci.SshNet.Messages.Transport /// /// Represents SSH_MSG_SERVICE_ACCEPT message. /// - [Message("SSH_MSG_SERVICE_ACCEPT", MessageNumber)] public class ServiceAcceptMessage : Message { - internal const byte MessageNumber = 6; + /// + public override string MessageName + { + get + { + return "SSH_MSG_SERVICE_ACCEPT"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 6; + } + } /// /// Gets the name of the service. diff --git a/src/Renci.SshNet/Messages/Transport/ServiceRequestMessage.cs b/src/Renci.SshNet/Messages/Transport/ServiceRequestMessage.cs index c41a4f904..c7b6a6cbf 100644 --- a/src/Renci.SshNet/Messages/Transport/ServiceRequestMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/ServiceRequestMessage.cs @@ -6,11 +6,28 @@ namespace Renci.SshNet.Messages.Transport /// /// Represents SSH_MSG_SERVICE_REQUEST message. /// - [Message("SSH_MSG_SERVICE_REQUEST", 5)] public class ServiceRequestMessage : Message { private readonly byte[] _serviceName; + /// + public override string MessageName + { + get + { + return "SSH_MSG_SERVICE_REQUEST"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 5; + } + } + /// /// Gets the name of the service. /// diff --git a/src/Renci.SshNet/Messages/Transport/UnimplementedMessage.cs b/src/Renci.SshNet/Messages/Transport/UnimplementedMessage.cs index 323a01439..761156408 100644 --- a/src/Renci.SshNet/Messages/Transport/UnimplementedMessage.cs +++ b/src/Renci.SshNet/Messages/Transport/UnimplementedMessage.cs @@ -5,9 +5,26 @@ namespace Renci.SshNet.Messages.Transport /// /// Represents SSH_MSG_UNIMPLEMENTED message. /// - [Message("SSH_MSG_UNIMPLEMENTED", 3)] public class UnimplementedMessage : Message { + /// + public override string MessageName + { + get + { + return "SSH_MSG_UNIMPLEMENTED"; + } + } + + /// + public override byte MessageNumber + { + get + { + return 3; + } + } + /// /// Called when type specific data need to be loaded. /// diff --git a/test/Renci.SshNet.Benchmarks/Messages/MessageBenchmarks.cs b/test/Renci.SshNet.Benchmarks/Messages/MessageBenchmarks.cs new file mode 100644 index 000000000..5a15773e4 --- /dev/null +++ b/test/Renci.SshNet.Benchmarks/Messages/MessageBenchmarks.cs @@ -0,0 +1,35 @@ +using BenchmarkDotNet.Attributes; + +using Renci.SshNet.Common; +using Renci.SshNet.Messages; +using Renci.SshNet.Messages.Transport; + +namespace Renci.SshNet.Benchmarks.Messages +{ + [MemoryDiagnoser] + public class MessageBenchmarks + { + [Benchmark] + public Message WriteBytes() + { + using var sshDataStream = new SshDataStream(SshData.DefaultCapacity); + var bannerMessage = new WritableDisconnectMessage(DisconnectReason.ServiceNotAvailable, "Goodbye"); + bannerMessage.WritePrivateBytes(sshDataStream); + + return bannerMessage; // Avoid JIT elimination + } + + private sealed class WritableDisconnectMessage : DisconnectMessage + { + public WritableDisconnectMessage(DisconnectReason reasonCode, string message) + : base(reasonCode, message) + { + } + + public void WritePrivateBytes(SshDataStream sshDataStream) + { + WriteBytes(sshDataStream); + } + } + } +} diff --git a/test/Renci.SshNet.Benchmarks/Renci.SshNet.Benchmarks.csproj b/test/Renci.SshNet.Benchmarks/Renci.SshNet.Benchmarks.csproj index eee47fcf7..e9e964377 100644 --- a/test/Renci.SshNet.Benchmarks/Renci.SshNet.Benchmarks.csproj +++ b/test/Renci.SshNet.Benchmarks/Renci.SshNet.Benchmarks.csproj @@ -1,4 +1,4 @@ - + Exe net8.0 @@ -7,7 +7,7 @@ - + diff --git a/test/Renci.SshNet.IntegrationTests/Properties/AssemblyInfo.cs b/test/Renci.SshNet.IntegrationTests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..a3ec2d895 --- /dev/null +++ b/test/Renci.SshNet.IntegrationTests/Properties/AssemblyInfo.cs @@ -0,0 +1,5 @@ +#if NET6_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; + +[assembly: ExcludeFromCodeCoverage] +#endif // NET6_0_OR_GREATER diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelDataMessageTest.cs b/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelDataMessageTest.cs index fbc5e1b46..31002433b 100644 --- a/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelDataMessageTest.cs +++ b/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelDataMessageTest.cs @@ -116,7 +116,7 @@ public void GetBytes() var sshDataStream = new SshDataStream(bytes); - Assert.AreEqual(ChannelDataMessage.MessageNumber, sshDataStream.ReadByte()); + Assert.AreEqual(target.MessageNumber, sshDataStream.ReadByte()); Assert.AreEqual(localChannelNumber, sshDataStream.ReadUInt32()); Assert.AreEqual((uint) size, sshDataStream.ReadUInt32()); diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelOpen/ChannelOpenMessageTest.cs b/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelOpen/ChannelOpenMessageTest.cs index 1a40d8609..d53568a83 100644 --- a/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelOpen/ChannelOpenMessageTest.cs +++ b/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelOpen/ChannelOpenMessageTest.cs @@ -94,7 +94,7 @@ public void GetBytes() var sshDataStream = new SshDataStream(bytes); - Assert.AreEqual(ChannelOpenMessage.MessageNumber, sshDataStream.ReadByte()); + Assert.AreEqual(target.MessageNumber, sshDataStream.ReadByte()); var actualChannelTypeLength = sshDataStream.ReadUInt32(); Assert.AreEqual((uint) target.ChannelType.Length, actualChannelTypeLength); @@ -225,16 +225,16 @@ public void Load_ShouldThrowNotSupportedExceptionWhenChannelTypeIsNotSupported() var maximumPacketSize = (uint)_random.Next(0, int.MaxValue); var channelName = "dunno_" + _random.Next().ToString(CultureInfo.InvariantCulture); var channelType = _ascii.GetBytes(channelName); + var target = new ChannelOpenMessage(); var sshDataStream = new SshDataStream(1 + 4 + channelType.Length + 4 + 4 + 4); - sshDataStream.WriteByte(ChannelOpenMessage.MessageNumber); + sshDataStream.WriteByte(target.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 { diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Transport/IgnoreMessageTest.cs b/test/Renci.SshNet.Tests/Classes/Messages/Transport/IgnoreMessageTest.cs index ecdbf3310..ff8fd86dc 100644 --- a/test/Renci.SshNet.Tests/Classes/Messages/Transport/IgnoreMessageTest.cs +++ b/test/Renci.SshNet.Tests/Classes/Messages/Transport/IgnoreMessageTest.cs @@ -68,7 +68,7 @@ public void GetBytes() var sshDataStream = new SshDataStream(bytes); - Assert.AreEqual(IgnoreMessage.MessageNumber, sshDataStream.ReadByte()); + Assert.AreEqual(request.MessageNumber, sshDataStream.ReadByte()); Assert.AreEqual((uint) _data.Length, sshDataStream.ReadUInt32()); var actualData = new byte[_data.Length]; diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeGroupBuilder.cs b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeGroupBuilder.cs index 4e71bbec4..c2dfe026b 100644 --- a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeGroupBuilder.cs +++ b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeGroupBuilder.cs @@ -23,7 +23,8 @@ public KeyExchangeDhGroupExchangeGroupBuilder WithSubGroup(BigInteger subGroup) public byte[] Build() { var sshDataStream = new SshDataStream(0); - sshDataStream.WriteByte(KeyExchangeDhGroupExchangeGroup.MessageNumber); + var target = new KeyExchangeDhGroupExchangeGroup(); + sshDataStream.WriteByte(target.MessageNumber); sshDataStream.Write(_safePrime); sshDataStream.Write(_subGroup); return sshDataStream.ToArray(); diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyBuilder.cs b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyBuilder.cs index 81714f368..f257e6de3 100644 --- a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyBuilder.cs +++ b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyBuilder.cs @@ -41,7 +41,8 @@ public KeyExchangeDhGroupExchangeReplyBuilder WithSignature(byte[] signature) public byte[] Build() { var sshDataStream = new SshDataStream(0); - sshDataStream.WriteByte(KeyExchangeDhGroupExchangeReply.MessageNumber); + var target = new KeyExchangeDhGroupExchangeReply(); + sshDataStream.WriteByte(target.MessageNumber); sshDataStream.Write((uint)(4 + _hostKeyAlgorithm.Length + _hostKeys.Length)); sshDataStream.Write((uint) _hostKeyAlgorithm.Length); sshDataStream.Write(_hostKeyAlgorithm, 0, _hostKeyAlgorithm.Length); diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeRequestTest.cs b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeRequestTest.cs index 0120c5550..da1d04976 100644 --- a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeRequestTest.cs +++ b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeRequestTest.cs @@ -46,7 +46,7 @@ public void Test_KeyExchangeDhGroupExchangeRequest_GetBytes() var sshDataStream = new SshDataStream(bytes); - Assert.AreEqual(KeyExchangeDhGroupExchangeRequest.MessageNumber, sshDataStream.ReadByte()); + Assert.AreEqual(request.MessageNumber, sshDataStream.ReadByte()); Assert.AreEqual(_minimum, sshDataStream.ReadUInt32()); Assert.AreEqual(_preferred, sshDataStream.ReadUInt32()); Assert.AreEqual(_maximum, sshDataStream.ReadUInt32()); diff --git a/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs b/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs index 3c1c2fdcf..7fa1ac24e 100644 --- a/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs +++ b/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs @@ -244,11 +244,12 @@ public static ServiceAcceptMessageBuilder Create(ServiceName serviceName) public byte[] Build() { var serviceName = _serviceName.ToArray(); + var target = new ServiceAcceptMessage(); 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.WriteByte(target.MessageNumber); sshDataStream.WriteBinary(serviceName); return sshDataStream.ToArray(); } diff --git a/test/Renci.SshNet.Tests/Classes/SessionTest_Connected_ServerAndClientDisconnectRace.cs b/test/Renci.SshNet.Tests/Classes/SessionTest_Connected_ServerAndClientDisconnectRace.cs index b565fe1fb..96797d727 100644 --- a/test/Renci.SshNet.Tests/Classes/SessionTest_Connected_ServerAndClientDisconnectRace.cs +++ b/test/Renci.SshNet.Tests/Classes/SessionTest_Connected_ServerAndClientDisconnectRace.cs @@ -222,11 +222,12 @@ public static ServiceAcceptMessageBuilder Create(ServiceName serviceName) public byte[] Build() { var serviceName = _serviceName.ToArray(); + var target = new ServiceAcceptMessage(); 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.WriteByte(target.MessageNumber); sshDataStream.WriteBinary(serviceName); return sshDataStream.ToArray(); } diff --git a/test/Renci.SshNet.Tests/Properties/AssemblyInfo.cs b/test/Renci.SshNet.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..a3ec2d895 --- /dev/null +++ b/test/Renci.SshNet.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,5 @@ +#if NET6_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; + +[assembly: ExcludeFromCodeCoverage] +#endif // NET6_0_OR_GREATER