コード例 #1
0
        public Task <ITunnel> CreateTunnelAsync(TunnelDestination tunnelEndpoint)
        {
            using (TraceSources.IapDesktop.TraceMethod().WithParameters(tunnelEndpoint))
            {
                var iapEndpoint = new IapTunnelingEndpoint(
                    this.authorizationService.Authorization.Credential,
                    tunnelEndpoint.Instance,
                    tunnelEndpoint.RemotePort,
                    IapTunnelingEndpoint.DefaultNetworkInterface,
                    Globals.UserAgent);


                // Start listener to enable clients to connect. Do not await
                // the listener as we want to continue listeining in the
                // background.
                var listener = SshRelayListener.CreateLocalListener(iapEndpoint);
                var cts      = new CancellationTokenSource();

                _ = listener.ListenAsync(cts.Token);

                // Return the tunnel which allows the listener to be stopped
                // via the CancellationTokenSource.
                return(Task.FromResult <ITunnel>(new Tunnel(iapEndpoint, listener, cts)));
            }
        }
コード例 #2
0
 public Tunnel(
     IapTunnelingEndpoint endpoint,
     SshRelayListener listener,
     CancellationTokenSource cancellationTokenSource)
 {
     this.Endpoint = endpoint;
     this.listener = listener;
     this.cancellationTokenSource = cancellationTokenSource;
 }
コード例 #3
0
        public static RdpTunnel Create(VmInstanceReference vmRef)
        {
            var listener = SshRelayListener.CreateLocalListener(
                new IapTunnelingEndpoint(
                    Defaults.GetCredential(),
                    vmRef,
                    3389,
                    IapTunnelingEndpoint.DefaultNetworkInterface));

            var tokenSource = new CancellationTokenSource();

            listener.ListenAsync(tokenSource.Token);

            return(new RdpTunnel(listener, tokenSource));
        }
コード例 #4
0
ファイル: RdpTunnel.cs プロジェクト: bejhokawok/iap-desktop
        public static RdpTunnel Create(InstanceLocator vmRef, ICredential credential)
        {
            var listener = SshRelayListener.CreateLocalListener(
                new IapTunnelingEndpoint(
                    credential,
                    vmRef,
                    3389,
                    IapTunnelingEndpoint.DefaultNetworkInterface,
                    TestProject.UserAgent));

            var tokenSource = new CancellationTokenSource();

            listener.ListenAsync(tokenSource.Token);

            return(new RdpTunnel(listener, tokenSource));
        }
コード例 #5
0
        protected override INetworkStream ConnectToEchoServer(VmInstanceReference vmRef)
        {
            var listener = SshRelayListener.CreateLocalListener(
                new IapTunnelingEndpoint(
                    Defaults.GetCredential(),
                    vmRef,
                    7,
                    IapTunnelingEndpoint.DefaultNetworkInterface));

            listener.ClientAcceptLimit = 1; // Terminate after first connection.
            listener.ListenAsync(CancellationToken.None);

            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.Connect(new IPEndPoint(IPAddress.Loopback, listener.LocalPort));

            return(new SocketStream(socket));
        }
コード例 #6
0
        public Task <ITunnel> CreateTunnelAsync(
            TunnelDestination tunnelEndpoint,
            ISshRelayPolicy relayPolicy)
        {
            using (ApplicationTraceSources.Default.TraceMethod().WithParameters(tunnelEndpoint))
            {
                var clientCertificate =
                    (this.authorizationService.DeviceEnrollment != null &&
                     this.authorizationService.DeviceEnrollment.State == DeviceEnrollmentState.Enrolled)
                    ? this.authorizationService.DeviceEnrollment.Certificate
                    : null;

                if (clientCertificate != null)
                {
                    ApplicationTraceSources.Default.TraceInformation(
                        "Using client certificate (valid till {0})", clientCertificate.NotAfter);
                }

                var iapEndpoint = new IapTunnelingEndpoint(
                    this.authorizationService.Authorization.Credential,
                    tunnelEndpoint.Instance,
                    tunnelEndpoint.RemotePort,
                    IapTunnelingEndpoint.DefaultNetworkInterface,
                    Globals.UserAgent,
                    clientCertificate);

                // Start listener to enable clients to connect. Do not await
                // the listener as we want to continue listeining in the
                // background.
                var listener = SshRelayListener.CreateLocalListener(
                    iapEndpoint,
                    relayPolicy);
                var cts = new CancellationTokenSource();

                _ = listener.ListenAsync(cts.Token);

                // Return the tunnel which allows the listener to be stopped
                // via the CancellationTokenSource.
                return(Task.FromResult <ITunnel>(new Tunnel(iapEndpoint, listener, cts)));
            }
        }
コード例 #7
0
        protected override INetworkStream ConnectToWebServer(
            InstanceLocator vmRef,
            ICredential credential)
        {
            var listener = SshRelayListener.CreateLocalListener(
                new IapTunnelingEndpoint(
                    credential,
                    vmRef,
                    80,
                    IapTunnelingEndpoint.DefaultNetworkInterface,
                    TestProject.UserAgent));

            listener.ClientAcceptLimit = 1; // Terminate after first connection.
            listener.ListenAsync(CancellationToken.None);

            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.Connect(new IPEndPoint(IPAddress.Loopback, listener.LocalPort));

            return(new SocketStream(socket));
        }
コード例 #8
0
        public async Task WhenSendingMessagesToEchoServer_ThenStatisticsAreUpdated(
            [LinuxInstance(InitializeScript = InitializeScripts.InstallEchoServer)] ResourceTask <InstanceLocator> vm,
            [Credential(Role = PredefinedRole.IapTunnelUser)] ResourceTask <ICredential> credential,
            [Values(
                 1,
                 (int)DataMessage.MaxDataLength,
                 (int)DataMessage.MaxDataLength * 2)] int length)
        {
            var message = new byte[length];

            FillArray(message);

            var locator = await vm;

            var listener = SshRelayListener.CreateLocalListener(
                new IapTunnelingEndpoint(
                    await credential,
                    await vm,
                    7,
                    IapTunnelingEndpoint.DefaultNetworkInterface,
                    TestProject.UserAgent),
                new AllowAllRelayPolicy());

            listener.ClientAcceptLimit = 1; // Terminate after first connection.
            listener.ListenAsync(CancellationToken.None).ContinueWith(_ => { });

            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.Connect(new IPEndPoint(IPAddress.Loopback, listener.LocalPort));

            var clientStreamStats = new ConnectionStatistics();
            var clientStream      = new SocketStream(socket, clientStreamStats);

            using (var tokenSource = new CancellationTokenSource())
            {
                // Write full payload.
                await clientStream.WriteAsync(message, 0, message.Length, tokenSource.Token);

                Assert.AreEqual(length, clientStreamStats.BytesTransmitted);

                // Read entire response.
                var response       = new byte[length];
                int totalBytesRead = 0;
                while (true)
                {
                    var bytesRead = await clientStream.ReadAsync(
                        response,
                        totalBytesRead,
                        response.Length - totalBytesRead,
                        tokenSource.Token);

                    totalBytesRead += bytesRead;

                    if (bytesRead == 0 || totalBytesRead >= length)
                    {
                        break;
                    }
                }

                await clientStream.CloseAsync(tokenSource.Token);

                await Task.Delay(50);

                Assert.AreEqual(length, totalBytesRead, "bytes read");
                Assert.AreEqual(length, clientStreamStats.BytesReceived, "client received");
                Assert.AreEqual(length, listener.Statistics.BytesReceived, "server received");
                Assert.AreEqual(length, listener.Statistics.BytesTransmitted, "server sent");
            }
        }
コード例 #9
0
 private IapTunnel(SshRelayListener listener, CancellationTokenSource tokenSource)
 {
     this.listener    = listener;
     this.tokenSource = tokenSource;
 }