|
|
|
|
using System;
|
|
|
|
|
using System.Net.Sockets;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using Renci.SshNet.Channels;
|
|
|
|
|
using Renci.SshNet.Common;
|
|
|
|
|
using Renci.SshNet.Messages;
|
|
|
|
|
using Renci.SshNet.Messages.Authentication;
|
|
|
|
|
using Renci.SshNet.Messages.Connection;
|
|
|
|
|
|
|
|
|
|
namespace Renci.SshNet
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Provides functionality to connect and interact with SSH server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
internal interface ISession : IDisposable
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets or sets the connection info.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value>The connection info.</value>
|
|
|
|
|
IConnectionInfo ConnectionInfo { get; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a value indicating whether the session is connected.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value>
|
|
|
|
|
/// <c>true</c> if the session is connected; otherwise, <c>false</c>.
|
|
|
|
|
/// </value>
|
|
|
|
|
bool IsConnected { get; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the session semaphore that controls session channels.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value>
|
|
|
|
|
/// The session semaphore.
|
|
|
|
|
/// </value>
|
|
|
|
|
SemaphoreLight SessionSemaphore { get; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="WaitHandle"/> that can be used to wait for the message listener loop to complete.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value>
|
|
|
|
|
/// A <see cref="WaitHandle"/> that can be used to wait for the message listener loop to complete, or
|
|
|
|
|
/// <c>null</c> when the session has not been connected.
|
|
|
|
|
/// </value>
|
|
|
|
|
WaitHandle MessageListenerCompleted { get; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Connects to the server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <exception cref="SocketException">Socket connection to the SSH server or proxy server could not be established, or an error occurred while resolving the hostname.</exception>
|
|
|
|
|
/// <exception cref="SshConnectionException">SSH session could not be established.</exception>
|
|
|
|
|
/// <exception cref="SshAuthenticationException">Authentication of SSH session failed.</exception>
|
|
|
|
|
/// <exception cref="ProxyException">Failed to establish proxy connection.</exception>
|
|
|
|
|
void Connect();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Create a new SSH session channel.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>
|
|
|
|
|
/// A new SSH session channel.
|
|
|
|
|
/// </returns>
|
|
|
|
|
IChannelSession CreateChannelSession();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Create a new channel for a locally forwarded TCP/IP port.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>
|
|
|
|
|
/// A new channel for a locally forwarded TCP/IP port.
|
|
|
|
|
/// </returns>
|
|
|
|
|
IChannelDirectTcpip CreateChannelDirectTcpip();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Creates a "forwarded-tcpip" SSH channel.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>
|
|
|
|
|
/// A new "forwarded-tcpip" SSH channel.
|
|
|
|
|
/// </returns>
|
|
|
|
|
IChannelForwardedTcpip CreateChannelForwardedTcpip(uint remoteChannelNumber, uint remoteWindowSize, uint remoteChannelDataPacketSize);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Disconnects from the server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// This sends a <b>SSH_MSG_DISCONNECT</b> message to the server, waits for the
|
|
|
|
|
/// server to close the socket on its end and subsequently closes the client socket.
|
|
|
|
|
/// </remarks>
|
|
|
|
|
void Disconnect();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Called when client is disconnecting from the server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
void OnDisconnecting();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Registers SSH message with the session.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="messageName">The name of the message to register with the session.</param>
|
|
|
|
|
void RegisterMessage(string messageName);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Sends a message to the server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="message">The message to send.</param>
|
|
|
|
|
/// <exception cref="SshConnectionException">The client is not connected.</exception>
|
|
|
|
|
/// <exception cref="SshOperationTimeoutException">The operation timed out.</exception>
|
|
|
|
|
/// <exception cref="InvalidOperationException">The size of the packet exceeds the maximum size defined by the protocol.</exception>
|
|
|
|
|
void SendMessage(Message message);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Sends a message to the server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="message">The message to send.</param>
|
|
|
|
|
/// <returns>
|
|
|
|
|
/// <c>true</c> if the message was sent to the server; otherwise, <c>false</c>.
|
|
|
|
|
/// </returns>
|
|
|
|
|
/// <exception cref="InvalidOperationException">The size of the packet exceeds the maximum size defined by the protocol.</exception>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// This methods returns <c>false</c> when the attempt to send the message results in a
|
|
|
|
|
/// <see cref="SocketException"/> or a <see cref="SshException"/>.
|
|
|
|
|
/// </remarks>
|
|
|
|
|
bool TrySendMessage(Message message);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Unregister SSH message from the session.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="messageName">The name of the message to unregister with the session.</param>
|
|
|
|
|
void UnRegisterMessage(string messageName);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Waits for the specified handle or the exception handle for the receive thread
|
|
|
|
|
/// to signal within the connection timeout.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="waitHandle">The wait handle.</param>
|
|
|
|
|
/// <exception cref="SshConnectionException">A received package was invalid or failed the message integrity check.</exception>
|
|
|
|
|
/// <exception cref="SshOperationTimeoutException">None of the handles are signaled in time and the session is not disconnecting.</exception>
|
|
|
|
|
/// <exception cref="SocketException">A socket error was signaled while receiving messages from the server.</exception>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// When neither handles are signaled in time and the session is not closing, then the
|
|
|
|
|
/// session is disconnected.
|
|
|
|
|
/// </remarks>
|
|
|
|
|
void WaitOnHandle(WaitHandle waitHandle);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Waits for the specified handle or the exception handle for the receive thread
|
|
|
|
|
/// to signal within the specified timeout.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="waitHandle">The wait handle.</param>
|
|
|
|
|
/// <param name="timeout">The time to wait for any of the handles to become signaled.</param>
|
|
|
|
|
/// <exception cref="SshConnectionException">A received package was invalid or failed the message integrity check.</exception>
|
|
|
|
|
/// <exception cref="SshOperationTimeoutException">None of the handles are signaled in time and the session is not disconnecting.</exception>
|
|
|
|
|
/// <exception cref="SocketException">A socket error was signaled while receiving messages from the server.</exception>
|
|
|
|
|
/// <remarks>
|
|
|
|
|
/// When neither handles are signaled in time and the session is not closing, then the
|
|
|
|
|
/// session is disconnected.
|
|
|
|
|
/// </remarks>
|
|
|
|
|
void WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout);
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelCloseMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelCloseMessage>> ChannelCloseReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelDataMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelDataMessage>> ChannelDataReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelEofMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelEofMessage>> ChannelEofReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelExtendedDataMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelExtendedDataMessage>> ChannelExtendedDataReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelFailureMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelFailureMessage>> ChannelFailureReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelOpenConfirmationMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelOpenConfirmationMessage>> ChannelOpenConfirmationReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelOpenFailureMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelOpenFailureMessage>> ChannelOpenFailureReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelOpenMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelOpenMessage>> ChannelOpenReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelRequestMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelRequestMessage>> ChannelRequestReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelSuccessMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelSuccessMessage>> ChannelSuccessReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="ChannelWindowAdjustMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<ChannelWindowAdjustMessage>> ChannelWindowAdjustReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when session has been disconnected from the server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<EventArgs> Disconnected;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when an error occurred.
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<ExceptionEventArgs> ErrorOccured;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when host key received.
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<HostKeyEventArgs> HostKeyReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="RequestSuccessMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<RequestSuccessMessage>> RequestSuccessReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="RequestFailureMessage"/> message received
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<RequestFailureMessage>> RequestFailureReceived;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs when <see cref="BannerMessage"/> message is received from the server.
|
|
|
|
|
/// </summary>
|
|
|
|
|
event EventHandler<MessageEventArgs<BannerMessage>> UserAuthenticationBannerReceived;
|
|
|
|
|
}
|
|
|
|
|
}
|