|
|
@@ -0,0 +1,236 @@
|
|
|
+using System;
|
|
|
+using System.Net;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
|
+using Renci.SshNet.Common;
|
|
|
+using Renci.SshNet.Tests.Common;
|
|
|
+
|
|
|
+namespace Renci.SshNet.Tests.Classes
|
|
|
+{
|
|
|
+ public partial class SessionTest
|
|
|
+ {
|
|
|
+ [TestMethod]
|
|
|
+ public void ConnectShouldThrowProxyExceptionWhenHttpProxyReturnsHttpStatusOtherThan200()
|
|
|
+ {
|
|
|
+ var proxyEndPoint = new IPEndPoint(IPAddress.Loopback, 8123);
|
|
|
+ var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
|
|
|
+
|
|
|
+ using (var proxyStub = new HttpProxyStub(proxyEndPoint, "A"))
|
|
|
+ {
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("HTTP/1.0 501 Custom\r\n"));
|
|
|
+ proxyStub.Start();
|
|
|
+
|
|
|
+ using (var session = new Session(CreateConnectionInfoWithProxy(proxyEndPoint, serverEndPoint, "anon")))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ session.Connect();
|
|
|
+ Assert.Fail();
|
|
|
+ }
|
|
|
+ catch (ProxyException ex)
|
|
|
+ {
|
|
|
+ Assert.IsNull(ex.InnerException);
|
|
|
+ Assert.AreEqual("HTTP: Status code 501, \"Custom\"", ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void ConnectShouldSkipHeadersWhenHttpProxyReturnsHttpStatus200()
|
|
|
+ {
|
|
|
+ var proxyEndPoint = new IPEndPoint(IPAddress.Loopback, 8123);
|
|
|
+ var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
|
|
|
+
|
|
|
+ using (var proxyStub = new HttpProxyStub(proxyEndPoint, "B"))
|
|
|
+ {
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("HTTP/1.0 200 OK\r\n"));
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("Content-Type: application/octet-stream\r\n"));
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("\r\n"));
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("SSH-666-SshStub"));
|
|
|
+ proxyStub.Start();
|
|
|
+
|
|
|
+ using (var session = new Session(CreateConnectionInfoWithProxy(proxyEndPoint, serverEndPoint, "anon")))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ session.Connect();
|
|
|
+ Assert.Fail();
|
|
|
+ }
|
|
|
+ catch (SshConnectionException ex)
|
|
|
+ {
|
|
|
+ Assert.IsNull(ex.InnerException);
|
|
|
+ Assert.AreEqual("Server version '666' is not supported.", ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void ConnectShouldSkipContentWhenHttpProxyReturnsHttpStatus200()
|
|
|
+ {
|
|
|
+ var proxyEndPoint = new IPEndPoint(IPAddress.Loopback, 8123);
|
|
|
+ var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
|
|
|
+
|
|
|
+ using (var proxyStub = new HttpProxyStub(proxyEndPoint, "B"))
|
|
|
+ {
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("HTTP/1.0 200 OK\r\n"));
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("Content-Length: 13\r\n"));
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("Content-Type: application/octet-stream\r\n"));
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("\r\n"));
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("DUMMY_CONTENT"));
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("SSH-666-SshStub"));
|
|
|
+ proxyStub.Start();
|
|
|
+
|
|
|
+ using (var session = new Session(CreateConnectionInfoWithProxy(proxyEndPoint, serverEndPoint, "anon")))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ session.Connect();
|
|
|
+ Assert.Fail();
|
|
|
+ }
|
|
|
+ catch (SshConnectionException ex)
|
|
|
+ {
|
|
|
+ Assert.IsNull(ex.InnerException);
|
|
|
+ Assert.AreEqual("Server version '666' is not supported.", ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void ConnectShouldWriteConnectMethodToHttpProxy()
|
|
|
+ {
|
|
|
+ var proxyEndPoint = new IPEndPoint(IPAddress.Loopback, 8123);
|
|
|
+ var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
|
|
|
+
|
|
|
+ using (var proxyStub = new HttpProxyStub(proxyEndPoint, "A"))
|
|
|
+ {
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("HTTP/1.0 501 Custom\r\n"));
|
|
|
+ proxyStub.Start();
|
|
|
+
|
|
|
+ using (var session = new Session(CreateConnectionInfoWithProxy(proxyEndPoint, serverEndPoint, "anon")))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ session.Connect();
|
|
|
+ Assert.Fail();
|
|
|
+ }
|
|
|
+ catch (ProxyException)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Assert.AreEqual(string.Format("CONNECT {0} HTTP/1.0", serverEndPoint), proxyStub.HttpRequest.RequestLine);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void ConnectShouldWriteProxyAuthorizationToHttpProxyWhenProxyUserNameIsNotNullAndNotEmpty()
|
|
|
+ {
|
|
|
+ var proxyEndPoint = new IPEndPoint(IPAddress.Loopback, 8123);
|
|
|
+ var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
|
|
|
+
|
|
|
+ using (var proxyStub = new HttpProxyStub(proxyEndPoint, "A"))
|
|
|
+ {
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("HTTP/1.0 501 Custom\r\n"));
|
|
|
+ proxyStub.Start();
|
|
|
+
|
|
|
+ var connectionInfo = CreateConnectionInfoWithProxy(proxyEndPoint, serverEndPoint, "anon");
|
|
|
+ using (var session = new Session(connectionInfo))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ session.Connect();
|
|
|
+ Assert.Fail();
|
|
|
+ }
|
|
|
+ catch (ProxyException)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var expectedProxyAuthorizationHeader = CreateProxyAuthorizationHeader(connectionInfo);
|
|
|
+ Assert.IsNotNull(proxyStub.HttpRequest.Headers.SingleOrDefault(p => p == expectedProxyAuthorizationHeader));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void ConnectShouldNotWriteProxyAuthorizationToHttpProxyWhenProxyUserNameIsEmpty()
|
|
|
+ {
|
|
|
+ var proxyEndPoint = new IPEndPoint(IPAddress.Loopback, 8123);
|
|
|
+ var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
|
|
|
+
|
|
|
+ using (var proxyStub = new HttpProxyStub(proxyEndPoint, "A"))
|
|
|
+ {
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("HTTP/1.0 501 Custom\r\n"));
|
|
|
+ proxyStub.Start();
|
|
|
+
|
|
|
+ var connectionInfo = CreateConnectionInfoWithProxy(proxyEndPoint, serverEndPoint, string.Empty);
|
|
|
+ using (var session = new Session(connectionInfo))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ session.Connect();
|
|
|
+ Assert.Fail();
|
|
|
+ }
|
|
|
+ catch (ProxyException)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Assert.IsFalse(proxyStub.HttpRequest.Headers.Any(p => p.StartsWith("Proxy-Authorization:")));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void ConnectShouldNotWriteProxyAuthorizationToHttpProxyWhenProxyUserNameIsNull()
|
|
|
+ {
|
|
|
+ var proxyEndPoint = new IPEndPoint(IPAddress.Loopback, 8123);
|
|
|
+ var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
|
|
|
+
|
|
|
+ using (var proxyStub = new HttpProxyStub(proxyEndPoint, "A"))
|
|
|
+ {
|
|
|
+ proxyStub.Responses.Add(Encoding.ASCII.GetBytes("HTTP/1.0 501 Custom\r\n"));
|
|
|
+ proxyStub.Start();
|
|
|
+
|
|
|
+ var connectionInfo = CreateConnectionInfoWithProxy(proxyEndPoint, serverEndPoint, null);
|
|
|
+ using (var session = new Session(connectionInfo))
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ session.Connect();
|
|
|
+ Assert.Fail();
|
|
|
+ }
|
|
|
+ catch (ProxyException)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Assert.IsFalse(proxyStub.HttpRequest.Headers.Any(p => p.StartsWith("Proxy-Authorization:")));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static ConnectionInfo CreateConnectionInfoWithProxy(IPEndPoint proxyEndPoint, IPEndPoint serverEndPoint, string proxyUserName)
|
|
|
+ {
|
|
|
+ return new ConnectionInfo(
|
|
|
+ serverEndPoint.Address.ToString(),
|
|
|
+ serverEndPoint.Port,
|
|
|
+ "eric",
|
|
|
+ ProxyTypes.Http,
|
|
|
+ proxyEndPoint.Address.ToString(),
|
|
|
+ proxyEndPoint.Port,
|
|
|
+ proxyUserName,
|
|
|
+ "proxypwd",
|
|
|
+ new NoneAuthenticationMethod("eric"));
|
|
|
+ }
|
|
|
+
|
|
|
+ private static string CreateProxyAuthorizationHeader(ConnectionInfo connectionInfo)
|
|
|
+ {
|
|
|
+ return string.Format("Proxy-Authorization: Basic {0}",
|
|
|
+ Convert.ToBase64String(
|
|
|
+ Encoding.ASCII.GetBytes(string.Format("{0}:{1}", connectionInfo.ProxyUsername,
|
|
|
+ connectionInfo.ProxyPassword))));
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|