Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }