private async Task <IFtpResponse> HandleUserAsync(string argument, CancellationToken cancellationToken) { var results = new List <Tuple <IFtpResponse, IAuthorizationMechanism> >(); foreach (var authorizationMechanism in SelectedHost.AuthorizationMechanisms) { var response = await authorizationMechanism.HandleUserAsync(argument, cancellationToken) .ConfigureAwait(false); if (response.Code >= 200 && response.Code < 300) { _filteredAuthorizationMechanism = authorizationMechanism; return(response); } results.Add(Tuple.Create(response, authorizationMechanism)); } var mechanismNeedingPassword = results.FirstOrDefault(x => x.Item1.Code >= 300 && x.Item1.Code < 400); if (mechanismNeedingPassword != null) { _filteredAuthorizationMechanism = mechanismNeedingPassword.Item2; return(mechanismNeedingPassword.Item1); } return(results.First().Item1); }
/// <inheritdoc /> protected override void OnStatusChanged(SecurityStatus from, SecurityStatus to) { if (to == SecurityStatus.Unauthenticated) { _filteredAuthenticationMechanism = null; _selectedAuthenticationMechanism = null; foreach (var authenticationMechanism in SelectedHost.AuthenticationMechanisms) { authenticationMechanism.Reset(); } } else if (to == SecurityStatus.Authenticated) { _selectedAuthorizationMechanism = null; _filteredAuthorizationMechanism = null; foreach (var authorizationMechanism in SelectedHost.AuthorizationMechanisms) { authorizationMechanism.Reset(SelectedAuthenticationMechanism); } if (from == SecurityStatus.Unauthenticated || from == SecurityStatus.NeedSecurityData) { // Successfull AUTH or ADAT _selectedAuthenticationMechanism = _filteredAuthenticationMechanism; } } else if (to == SecurityStatus.Authorized) { _selectedAuthorizationMechanism = _filteredAuthorizationMechanism; } }