using System; using System.Threading; using Renci.SshNet.Messages; using Renci.SshNet.Messages.Authentication; namespace Renci.SshNet { /// /// Provides functionality for "none" authentication method. /// public class NoneAuthenticationMethod : AuthenticationMethod, IDisposable { private AuthenticationResult _authenticationResult = AuthenticationResult.Failure; private EventWaitHandle _authenticationCompleted = new AutoResetEvent(initialState: false); private bool _isDisposed; /// /// Gets the name of the authentication method. /// public override string Name { get { return "none"; } } /// /// Initializes a new instance of the class. /// /// The username. /// is whitespace or null. public NoneAuthenticationMethod(string username) : base(username) { } /// /// Authenticates the specified session. /// /// The session. /// /// Result of authentication process. /// /// is null. public override AuthenticationResult Authenticate(Session session) { if (session is null) { throw new ArgumentNullException(nameof(session)); } session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived += Session_UserAuthenticationFailureReceived; try { session.SendMessage(new RequestMessageNone(ServiceName.Connection, Username)); session.WaitOnHandle(_authenticationCompleted); } finally { session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived; session.UserAuthenticationFailureReceived -= Session_UserAuthenticationFailureReceived; } return _authenticationResult; } private void Session_UserAuthenticationSuccessReceived(object sender, MessageEventArgs e) { _authenticationResult = AuthenticationResult.Success; _ = _authenticationCompleted.Set(); } private void Session_UserAuthenticationFailureReceived(object sender, MessageEventArgs e) { if (e.Message.PartialSuccess) { _authenticationResult = AuthenticationResult.PartialSuccess; } else { _authenticationResult = AuthenticationResult.Failure; } // Copy allowed authentication methods AllowedAuthentications = e.Message.AllowedAuthentications; _ = _authenticationCompleted.Set(); } /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// public void Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } /// /// Releases unmanaged and - optionally - managed resources. /// /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected virtual void Dispose(bool disposing) { if (_isDisposed) { return; } if (disposing) { var authenticationCompleted = _authenticationCompleted; if (authenticationCompleted != null) { authenticationCompleted.Dispose(); _authenticationCompleted = null; } _isDisposed = true; } } /// /// Finalizes an instance of the class. /// ~NoneAuthenticationMethod() { Dispose(disposing: false); } } }