From 5a1e469bb9601bf6c6a15c007047e9113caf963c Mon Sep 17 00:00:00 2001 From: drieseng Date: Thu, 3 Nov 2016 20:42:46 +0100 Subject: [PATCH 01/17] No longer throw ObjectDisposedException in Stop() when port is disposed. --- ...rwardedPortDynamicTest_Stop_PortDisposed.cs | 18 +----------------- ...ForwardedPortLocalTest_Stop_PortDisposed.cs | 18 +----------------- ...orwardedPortRemoteTest_Stop_PortDisposed.cs | 18 +----------------- src/Renci.SshNet/ForwardedPort.cs | 2 -- 4 files changed, 3 insertions(+), 53 deletions(-) diff --git a/src/Renci.SshNet.Tests/Classes/ForwardedPortDynamicTest_Stop_PortDisposed.cs b/src/Renci.SshNet.Tests/Classes/ForwardedPortDynamicTest_Stop_PortDisposed.cs index 93e1e4991..f84657b7a 100644 --- a/src/Renci.SshNet.Tests/Classes/ForwardedPortDynamicTest_Stop_PortDisposed.cs +++ b/src/Renci.SshNet.Tests/Classes/ForwardedPortDynamicTest_Stop_PortDisposed.cs @@ -13,7 +13,6 @@ public class ForwardedPortDynamicTest_Stop_PortDisposed private ForwardedPortDynamic _forwardedPort; private IList _closingRegister; private IList _exceptionRegister; - private ObjectDisposedException _actualException; private IPEndPoint _endpoint; [TestInitialize] @@ -47,22 +46,7 @@ protected void Arrange() protected void Act() { - try - { - _forwardedPort.Stop(); - Assert.Fail(); - } - catch (ObjectDisposedException ex) - { - _actualException = ex; - } - } - - [TestMethod] - public void StopShouldThrowObjectDisposedException() - { - Assert.IsNotNull(_actualException); - Assert.AreEqual(_forwardedPort.GetType().FullName, _actualException.ObjectName); + _forwardedPort.Stop(); } [TestMethod] diff --git a/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest_Stop_PortDisposed.cs b/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest_Stop_PortDisposed.cs index 5e11e4e6e..b84a9339c 100644 --- a/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest_Stop_PortDisposed.cs +++ b/src/Renci.SshNet.Tests/Classes/ForwardedPortLocalTest_Stop_PortDisposed.cs @@ -11,7 +11,6 @@ public class ForwardedPortLocalTest_Stop_PortDisposed private ForwardedPortLocal _forwardedPort; private IList _closingRegister; private IList _exceptionRegister; - private ObjectDisposedException _actualException; [TestInitialize] public void Setup() @@ -43,22 +42,7 @@ protected void Arrange() protected void Act() { - try - { - _forwardedPort.Stop(); - Assert.Fail(); - } - catch (ObjectDisposedException ex) - { - _actualException = ex; - } - } - - [TestMethod] - public void StopShouldThrowObjectDisposedException() - { - Assert.IsNotNull(_actualException); - Assert.AreEqual(_forwardedPort.GetType().FullName, _actualException.ObjectName); + _forwardedPort.Stop(); } [TestMethod] diff --git a/src/Renci.SshNet.Tests/Classes/ForwardedPortRemoteTest_Stop_PortDisposed.cs b/src/Renci.SshNet.Tests/Classes/ForwardedPortRemoteTest_Stop_PortDisposed.cs index 033768d0e..5c905c3d7 100644 --- a/src/Renci.SshNet.Tests/Classes/ForwardedPortRemoteTest_Stop_PortDisposed.cs +++ b/src/Renci.SshNet.Tests/Classes/ForwardedPortRemoteTest_Stop_PortDisposed.cs @@ -14,7 +14,6 @@ public class ForwardedPortRemoteTest_Stop_PortDisposed private IPEndPoint _remoteEndpoint; private IList _closingRegister; private IList _exceptionRegister; - private ObjectDisposedException _actualException; [TestInitialize] public void Setup() @@ -49,22 +48,7 @@ protected void Arrange() protected void Act() { - try - { - _forwardedPort.Stop(); - Assert.Fail(); - } - catch (ObjectDisposedException ex) - { - _actualException = ex; - } - } - - [TestMethod] - public void StopShouldThrowObjectDisposedException() - { - Assert.IsNotNull(_actualException); - Assert.AreEqual(_forwardedPort.GetType().FullName, _actualException.ObjectName); + _forwardedPort.Stop(); } [TestMethod] diff --git a/src/Renci.SshNet/ForwardedPort.cs b/src/Renci.SshNet/ForwardedPort.cs index 619e48f3d..d71c0d0a7 100644 --- a/src/Renci.SshNet/ForwardedPort.cs +++ b/src/Renci.SshNet/ForwardedPort.cs @@ -71,8 +71,6 @@ public virtual void Start() /// public virtual void Stop() { - CheckDisposed(); - if (IsStarted) { StopPort(Session.ConnectionInfo.Timeout); From 13fff36135a870aee5b8866d590556784f26a8af Mon Sep 17 00:00:00 2001 From: drieseng Date: Thu, 3 Nov 2016 21:23:43 +0100 Subject: [PATCH 02/17] Added support domain name address type for SOCKS5. Fixes issue #98. --- src/Renci.SshNet/ForwardedPortDynamic.NET.cs | 132 ++++++++++--------- 1 file changed, 72 insertions(+), 60 deletions(-) diff --git a/src/Renci.SshNet/ForwardedPortDynamic.NET.cs b/src/Renci.SshNet/ForwardedPortDynamic.NET.cs index 1fe24040a..c136a18fb 100644 --- a/src/Renci.SshNet/ForwardedPortDynamic.NET.cs +++ b/src/Renci.SshNet/ForwardedPortDynamic.NET.cs @@ -435,106 +435,118 @@ private bool HandleSocks5(Socket socket, IChannelDirectTcpip channel, TimeSpan t return false; } - IPAddress ipAddress; - byte[] addressBuffer; + var host = GetSocks5Host(addressType, socket, timeout); + if (host == null) + { + // SOCKS client closed connection + return false; + } + + var portBuffer = new byte[2]; + if (SocketAbstraction.Read(socket, portBuffer, 0, portBuffer.Length, timeout) == 0) + { + // SOCKS client closed connection + return false; + } + + var port = (uint)(portBuffer[0] * 256 + portBuffer[1]); + + RaiseRequestReceived(host, port); + + channel.Open(host, port, this, socket); + + var socksReply = CreateSocks5Reply(channel.IsOpen); + + SocketAbstraction.Send(socket, socksReply, 0, socksReply.Length); + + return true; + } + + private static string GetSocks5Host(int addressType, Socket socket, TimeSpan timeout) + { switch (addressType) { - case 0x01: + case 0x01: // IPv4 { - addressBuffer = new byte[4]; + var addressBuffer = new byte[4]; if (SocketAbstraction.Read(socket, addressBuffer, 0, 4, timeout) == 0) { // SOCKS client closed connection - return false; + return null; } - ipAddress = new IPAddress(addressBuffer); + var ipv4 = new IPAddress(addressBuffer); + return ipv4.ToString(); } - break; - case 0x03: + case 0x03: // Domain name { var length = SocketAbstraction.ReadByte(socket, timeout); if (length == -1) { // SOCKS client closed connection - return false; + return null; } - addressBuffer = new byte[length]; + var addressBuffer = new byte[length]; if (SocketAbstraction.Read(socket, addressBuffer, 0, addressBuffer.Length, timeout) == 0) { // SOCKS client closed connection - return false; + return null; } - ipAddress = IPAddress.Parse(SshData.Ascii.GetString(addressBuffer, 0, addressBuffer.Length)); - - //var hostName = new Common.ASCIIEncoding().GetString(addressBuffer); - - //ipAddress = Dns.GetHostEntry(hostName).AddressList[0]; + var hostName = SshData.Ascii.GetString(addressBuffer); + return hostName; } - break; - case 0x04: + case 0x04: // IPv6 { - addressBuffer = new byte[16]; + var addressBuffer = new byte[16]; if (SocketAbstraction.Read(socket, addressBuffer, 0, 16, timeout) == 0) { // SOCKS client closed connection - return false; + return null; } - ipAddress = new IPAddress(addressBuffer); + var ipv6 = new IPAddress(addressBuffer); + return ipv6.ToString(); } - break; default: throw new ProxyException(string.Format("SOCKS5: Address type '{0}' is not supported.", addressType)); } + } - var portBuffer = new byte[2]; - if (SocketAbstraction.Read(socket, portBuffer, 0, portBuffer.Length, timeout) == 0) - { - // SOCKS client closed connection - return false; - } - - var port = (uint)(portBuffer[0] * 256 + portBuffer[1]); - var host = ipAddress.ToString(); - - RaiseRequestReceived(host, port); - - channel.Open(host, port, this, socket); - - SocketAbstraction.SendByte(socket, 0x05); - - if (channel.IsOpen) - { - SocketAbstraction.SendByte(socket, 0x00); + private static byte[] CreateSocks5Reply(bool channelOpen) + { + var socksReply = new byte[ + // SOCKS version + 1 + + // Reply field + 1 + + // Reserved; fixed: 0x00 + 1 + + // Address type; fixed: 0x01 + 1 + + // IPv4 server bound address; fixed: {0x00, 0x00, 0x00, 0x00} + 4 + + // server bound port; fixed: {0x00, 0x00} + 2]; + + socksReply[0] = 0x05; + + if (channelOpen) + { + socksReply[1] = 0x00; // succeeded } else { - SocketAbstraction.SendByte(socket, 0x01); + socksReply[1] = 0x01; // general SOCKS server failure } // reserved - SocketAbstraction.SendByte(socket, 0x00); - - if (ipAddress.AddressFamily == AddressFamily.InterNetwork) - { - SocketAbstraction.SendByte(socket, 0x01); - } - else if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6) - { - SocketAbstraction.SendByte(socket, 0x04); - } - else - { - throw new NotSupportedException("Not supported address family."); - } + socksReply[2] = 0x00; - var addressBytes = ipAddress.GetAddressBytes(); - SocketAbstraction.Send(socket, addressBytes, 0, addressBytes.Length); - SocketAbstraction.Send(socket, portBuffer, 0, portBuffer.Length); + // IPv4 address type + socksReply[3] = 0x01; - return true; + return socksReply; } /// From 5f6c3b0bc7a5916d92467931ecacdfc0917f83d7 Mon Sep 17 00:00:00 2001 From: drieseng Date: Thu, 3 Nov 2016 21:30:17 +0100 Subject: [PATCH 03/17] Fix SL build. --- build/sandcastle/new.shfbproj | 71 ++++++++++++++++++++ src/Renci.SshNet/ForwardedPortDynamic.NET.cs | 2 +- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 build/sandcastle/new.shfbproj diff --git a/build/sandcastle/new.shfbproj b/build/sandcastle/new.shfbproj new file mode 100644 index 000000000..4794b9026 --- /dev/null +++ b/build/sandcastle/new.shfbproj @@ -0,0 +1,71 @@ + + + + + Debug + AnyCPU + 2.0 + {6c35cd41-3f6e-47c1-a805-1aab0ac88b36} + 2015.6.5.0 + + Documentation + Documentation + Documentation + + .NET Framework 4.0 + D:\development\SSH.NET\build\target\help\ + Documentation + en-US + 100 + OnlyWarningsAndErrors + Markdown + False + False + False + True + + + + 1.0.0.0 + 2 + False + Standard + Blank + False + Markdown + False + Guid + A Sandcastle Documented Class Library + AboveNamespaces + + + + + + + + + + + + + + + + + + + + + + + + + + + OnBuildSuccess + + \ No newline at end of file diff --git a/src/Renci.SshNet/ForwardedPortDynamic.NET.cs b/src/Renci.SshNet/ForwardedPortDynamic.NET.cs index c136a18fb..45c8c64bb 100644 --- a/src/Renci.SshNet/ForwardedPortDynamic.NET.cs +++ b/src/Renci.SshNet/ForwardedPortDynamic.NET.cs @@ -493,7 +493,7 @@ private static string GetSocks5Host(int addressType, Socket socket, TimeSpan tim return null; } - var hostName = SshData.Ascii.GetString(addressBuffer); + var hostName = SshData.Ascii.GetString(addressBuffer, 0, addressBuffer.Length); return hostName; } case 0x04: // IPv6 From f52d81ad1ed446d9e64d32f227b6bea27e0a472a Mon Sep 17 00:00:00 2001 From: drieseng Date: Mon, 28 Nov 2016 22:08:09 +0100 Subject: [PATCH 04/17] Added more tracing to troubleshoot issue #112. --- src/Renci.SshNet/Session.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Renci.SshNet/Session.cs b/src/Renci.SshNet/Session.cs index d1237b46d..74504d63c 100644 --- a/src/Renci.SshNet/Session.cs +++ b/src/Renci.SshNet/Session.cs @@ -839,8 +839,12 @@ internal void SendMessage(Message message) if (_keyExchangeInProgress && !(message is IKeyExchangedAllowed)) { + DiagnosticAbstraction.Log(string.Format("[{0}] Waiting for KEX to complete to send '{1}': '{2}'.", ToHex(SessionId), message.GetType().Name, message)); + // Wait for key exchange to be completed WaitOnHandle(_keyExchangeCompletedWaitHandle); + + DiagnosticAbstraction.Log(string.Format("[{0}] KEX complete to send '{1}': '{2}'.", ToHex(SessionId), message.GetType().Name, message)); } DiagnosticAbstraction.Log(string.Format("[{0}] SendMessage to server '{1}': '{2}'.", ToHex(SessionId), message.GetType().Name, message)); From a6f0d27fbe3845e6837c64180c55536d1c60abbc Mon Sep 17 00:00:00 2001 From: drieseng Date: Fri, 2 Dec 2016 18:17:18 +0100 Subject: [PATCH 05/17] Removed extra tracing. --- src/Renci.SshNet/Session.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Renci.SshNet/Session.cs b/src/Renci.SshNet/Session.cs index 74504d63c..d1237b46d 100644 --- a/src/Renci.SshNet/Session.cs +++ b/src/Renci.SshNet/Session.cs @@ -839,12 +839,8 @@ internal void SendMessage(Message message) if (_keyExchangeInProgress && !(message is IKeyExchangedAllowed)) { - DiagnosticAbstraction.Log(string.Format("[{0}] Waiting for KEX to complete to send '{1}': '{2}'.", ToHex(SessionId), message.GetType().Name, message)); - // Wait for key exchange to be completed WaitOnHandle(_keyExchangeCompletedWaitHandle); - - DiagnosticAbstraction.Log(string.Format("[{0}] KEX complete to send '{1}': '{2}'.", ToHex(SessionId), message.GetType().Name, message)); } DiagnosticAbstraction.Log(string.Format("[{0}] SendMessage to server '{1}': '{2}'.", ToHex(SessionId), message.GetType().Name, message)); From 18613b2e6ec270fc470bcdde3769e9b39985a356 Mon Sep 17 00:00:00 2001 From: drieseng Date: Fri, 2 Dec 2016 18:18:03 +0100 Subject: [PATCH 06/17] Added timestamp to tracing. --- src/Renci.SshNet/Abstractions/DiagnosticAbstraction.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Renci.SshNet/Abstractions/DiagnosticAbstraction.cs b/src/Renci.SshNet/Abstractions/DiagnosticAbstraction.cs index 6fc1308ee..c79cd0a7a 100644 --- a/src/Renci.SshNet/Abstractions/DiagnosticAbstraction.cs +++ b/src/Renci.SshNet/Abstractions/DiagnosticAbstraction.cs @@ -1,4 +1,5 @@ -using System.Diagnostics; +using System; +using System.Diagnostics; #if FEATURE_DIAGNOSTICS_TRACESOURCE using System.Threading; #endif // FEATURE_DIAGNOSTICS_TRACESOURCE @@ -28,7 +29,7 @@ public static bool IsEnabled(TraceEventType traceEventType) public static void Log(string text) { #if FEATURE_DIAGNOSTICS_TRACESOURCE - Loggging.TraceEvent(TraceEventType.Verbose, Thread.CurrentThread.ManagedThreadId, text); + Loggging.TraceEvent(TraceEventType.Verbose, Thread.CurrentThread.ManagedThreadId, DateTime.Now + ": " + text); #endif // FEATURE_DIAGNOSTICS_TRACESOURCE } } From 8071d000982c3cf7165072903df38ca9115edb4e Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Fri, 9 Dec 2016 17:37:41 +0100 Subject: [PATCH 07/17] Removed obsolete reference to Microsoft.CSharp. --- src/Renci.SshNet.Silverlight/Renci.SshNet.Silverlight.csproj | 3 +-- src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj | 3 +-- src/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj | 1 - src/Renci.SshNet/Renci.SshNet.csproj | 1 - 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Renci.SshNet.Silverlight/Renci.SshNet.Silverlight.csproj b/src/Renci.SshNet.Silverlight/Renci.SshNet.Silverlight.csproj index 4ec535ec9..17a97fb2f 100644 --- a/src/Renci.SshNet.Silverlight/Renci.SshNet.Silverlight.csproj +++ b/src/Renci.SshNet.Silverlight/Renci.SshNet.Silverlight.csproj @@ -55,7 +55,6 @@ ..\Renci.SshNet.snk - ..\..\packages\SshNet.Security.Cryptography.1.2.0\lib\sl4\SshNet.Security.Cryptography.dll @@ -917,7 +916,7 @@ - +