You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
10 KiB
C#

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;
}
}