public void WhenBehaviorSetToForceAndPermissionsNotGranted_ThenJumpToSettingsOptionIsShown() { var taskDialog = new Mock <ITaskDialog>(); taskDialog.Setup(t => t.ShowOptionsTaskDialog( It.IsAny <IWin32Window>(), It.IsAny <IntPtr>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <IList <string> >(), It.IsAny <string>(), out It.Ref <bool> .IsAny)).Returns(0); var credentialPrompt = CreateCredentialsPrompt(false, false, taskDialog); var window = this.serviceRegistry.AddMock <IConnectionSettingsWindow>(); var settings = new ConnectionSettingsEditor( new VmInstanceConnectionSettings(), _ => { }, null); settings.CredentialGenerationBehavior = RdpCredentialGenerationBehavior.Force; AssertEx.ThrowsAggregateException <TaskCanceledException>( () => credentialPrompt.ShowCredentialsPromptAsync( null, SampleInstance, settings, true).Wait()); window.Verify(w => w.ShowWindow(), Times.Once); taskDialog.Verify(t => t.ShowOptionsTaskDialog( It.IsAny <IWin32Window>(), It.IsAny <IntPtr>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.Is <IList <string> >(options => options.Count == 2), It.IsAny <string>(), out It.Ref <bool> .IsAny), Times.Once); }
public async Task GenerateCredentialsAsync( IWin32Window owner, InstanceLocator instanceLocator, ConnectionSettingsEditor settings) { // Prompt for username to use. var username = this.serviceProvider .GetService <IGenerateCredentialsDialog>() .PromptForUsername( owner, settings.Username ?? this.serviceProvider .GetService <IAuthorizationAdapter>() .Authorization .SuggestWindowsUsername()); if (username == null) { // Aborted. throw new OperationCanceledException(); } var credentials = await this.serviceProvider.GetService <IJobService>().RunInBackground( new JobDescription("Generating Windows logon credentials..."), token => this.serviceProvider .GetService <IComputeEngineAdapter>() .ResetWindowsUserAsync( instanceLocator, username, token)) .ConfigureAwait(true); this.serviceProvider.GetService <IShowCredentialsDialog>().ShowDialog( owner, credentials.UserName, credentials.Password); // Save credentials. settings.Username = credentials.UserName; settings.CleartextPassword = credentials.Password; settings.Domain = null; settings.SaveChanges(); }
public async Task WhenSuggestedUserNameProvidedAndSilentIsTrue_ThenSuggestionIsUsedWithoutPrompting() { var serviceRegistry = new ServiceRegistry(); var auth = new Mock <IAuthorization>(); auth.SetupGet(a => a.Email).Returns("*****@*****.**"); serviceRegistry.AddMock <IAuthorizationAdapter>() .SetupGet(a => a.Authorization).Returns(auth.Object); serviceRegistry.AddSingleton <IJobService, SynchronousJobService>(); serviceRegistry.AddMock <IComputeEngineAdapter>() .Setup(a => a.ResetWindowsUserAsync( It.IsAny <InstanceLocator>(), It.Is <string>(user => user == "alice"), It.IsAny <CancellationToken>())) .ReturnsAsync(new NetworkCredential("alice", "password")); var credDialog = serviceRegistry.AddMock <IGenerateCredentialsDialog>(); var settings = new ConnectionSettingsEditor( new VmInstanceConnectionSettings(), _ => { }, null); settings.Username = "******"; var credentialsService = new CredentialsService(serviceRegistry); await credentialsService.GenerateCredentialsAsync( null, SampleInstance, settings, true); Assert.AreEqual("alice", settings.Username); Assert.AreEqual("password", settings.Password.AsClearText()); credDialog.Verify(d => d.PromptForUsername( It.IsAny <IWin32Window>(), It.IsAny <string>()), Times.Never); }
public void WhenSuggestedUserNameIsEmpty_ThenSuggestionIsDerivedFromSigninName() { var serviceRegistry = new ServiceRegistry(); var auth = new Mock <IAuthorization>(); auth.SetupGet(a => a.Email).Returns("*****@*****.**"); serviceRegistry.AddMock <IAuthorizationAdapter>() .SetupGet(a => a.Authorization).Returns(auth.Object); var credDialog = serviceRegistry.AddMock <IGenerateCredentialsDialog>(); credDialog .Setup(d => d.PromptForUsername( It.IsAny <IWin32Window>(), It.IsAny <string>())) .Returns <string>(null); // Cancel dialog var settings = new ConnectionSettingsEditor( new VmInstanceConnectionSettings(), _ => { }, null); settings.Username = ""; var credentialsService = new CredentialsService(serviceRegistry); AssertEx.ThrowsAggregateException <TaskCanceledException>( () => credentialsService.GenerateCredentialsAsync( null, SampleInstance, settings, false).Wait()); credDialog.Verify(d => d.PromptForUsername( It.IsAny <IWin32Window>(), It.Is <string>(u => u == "bobsemail")), Times.Once); }
public async Task ShowCredentialsPromptAsync( IWin32Window owner, InstanceLocator instanceLocator, ConnectionSettingsEditor settings, bool allowJumpToSettings) { var credentialsService = this.serviceProvider.GetService <ICredentialsService>(); // // Determine which options to show in prompt. // var credentialsExist = !string.IsNullOrEmpty(settings.Username) && settings.Password != null && settings.Password.Length != 0; var options = new List <CredentialOption>(); if ((!credentialsExist && settings.CredentialGenerationBehavior == RdpCredentialGenerationBehavior.Prompt && await credentialsService .IsGrantedPermissionToGenerateCredentials(instanceLocator) .ConfigureAwait(true)) || settings.CredentialGenerationBehavior == RdpCredentialGenerationBehavior.Always) { // TODO: check for permission options.Add( new CredentialOption() { Title = "Generate new credentials", Apply = () => credentialsService .GenerateCredentialsAsync( owner, instanceLocator, settings) }); } if (!credentialsExist && allowJumpToSettings) { options.Add( new CredentialOption() { Title = "Configure credentials", Apply = () => { // Configure credentials -> jump to settings. this.serviceProvider .GetService <IConnectionSettingsWindow>() .ShowWindow(); return(Task.FromException(new OperationCanceledException())); } }); } options.Add( new CredentialOption() { Title = "Connect without configuring credentials", Apply = () => Task.CompletedTask }); // // Prompt. // CredentialOption selectedOption; if (options.Count > 1) { var optionIndex = this.serviceProvider.GetService <ITaskDialog>().ShowOptionsTaskDialog( owner, TaskDialogIcons.TD_INFORMATION_ICON, "Credentials", $"You do not have any saved credentials for {instanceLocator.Name}", "How do you want to proceed?", null, options.Select(o => o.Title).ToList(), null, //"Do not show this prompt again", out bool donotAskAgain); selectedOption = options[optionIndex]; } else { // Do not prompt if there is only one option. selectedOption = options[0]; } // // Apply. // await selectedOption .Apply() .ConfigureAwait(true); }