public async Task WhenCredentialsInvalid_ThenErrorIsShownAndWindowIsClosed(
            [WindowsInstance] InstanceRequest testInstance)
        {
            await testInstance.AwaitReady();

            using (var tunnel = RdpTunnel.Create(testInstance.InstanceReference))
            {
                var rdpService = new RemoteDesktopService(this.serviceProvider);
                var session    = rdpService.Connect(
                    testInstance.InstanceReference,
                    "localhost",
                    (ushort)tunnel.LocalPort,
                    new VmInstanceSettings()
                {
                    Username                   = "******",
                    Password                   = SecureStringExtensions.FromClearText("wrong"),
                    AuthenticationLevel        = RdpAuthenticationLevel.NoServerAuthentication,
                    UserAuthenticationBehavior = RdpUserAuthenticationBehavior.AbortOnFailure
                });

                AwaitEvent <RemoteDesktopConnectionFailedEvent>();
                Assert.IsNotNull(this.ExceptionShown);
                Assert.IsInstanceOf(typeof(RdpDisconnectedException), this.ExceptionShown);
                Assert.AreEqual(2055, ((RdpDisconnectedException)this.ExceptionShown).DisconnectReason);
            }
        }
        public async Task WhenCredentialsInvalid_ThenErrorIsShownAndWindowIsClosed(
            [WindowsInstance] ResourceTask <InstanceLocator> testInstance,
            [Credential(Role = PredefinedRole.IapTunnelUser)] ResourceTask <ICredential> credential)
        {
            var locator = await testInstance;

            using (var tunnel = RdpTunnel.Create(
                       locator,
                       await credential))
            {
                var settings = VmInstanceConnectionSettings.CreateNew(
                    locator.ProjectId,
                    locator.Name);
                settings.Username.StringValue                 = "wrong";
                settings.Password.Value                       = SecureStringExtensions.FromClearText("wrong");
                settings.AuthenticationLevel.EnumValue        = RdpAuthenticationLevel.NoServerAuthentication;
                settings.UserAuthenticationBehavior.EnumValue = RdpUserAuthenticationBehavior.AbortOnFailure;
                settings.DesktopSize.EnumValue                = RdpDesktopSize.ClientSize;

                var rdpService = new RemoteDesktopConnectionBroker(this.serviceProvider);
                var session    = rdpService.Connect(
                    locator,
                    "localhost",
                    (ushort)tunnel.LocalPort,
                    settings);

                AwaitEvent <ConnectionFailedEvent>();
                Assert.IsNotNull(this.ExceptionShown);
                Assert.IsInstanceOf(typeof(RdpDisconnectedException), this.ExceptionShown);
                Assert.AreEqual(2055, ((RdpDisconnectedException)this.ExceptionShown).DisconnectReason);
            }
        }
        public void WhenSettingIsNull_ThenSaveResetsRegistry()
        {
            using (var key = this.hkcu.CreateSubKey(TestKeyPath))
            {
                var setting = RegistrySecureStringSetting.FromKey(
                    "test",
                    "title",
                    "description",
                    "category",
                    key,
                    DataProtectionScope.CurrentUser);

                setting.Value = SecureStringExtensions.FromClearText("red");
                setting.Save(key);

                Assert.IsNotNull(key.GetValue("test"));

                // Now write again.

                setting = RegistrySecureStringSetting.FromKey(
                    "test",
                    "title",
                    "description",
                    "category",
                    key,
                    DataProtectionScope.CurrentUser);

                setting.Value = null;
                setting.Save(key);

                Assert.IsNull(key.GetValue("test"));
            }
        }
        public async Task WhenConnectingByUrlWithUsernameAndCredentialsExist_ThenConnectionIsMadeWithUsernameFromUrl()
        {
            var settings = new VmInstanceConnectionSettings()
            {
                Username = "******",
                Password = SecureStringExtensions.FromClearText("password")
            };

            var settingsService = this.serviceRegistry.AddMock <IConnectionSettingsService>();

            settingsService.Setup(s => s.GetConnectionSettingsEditor(
                                      It.IsAny <IProjectExplorerNode>()))
            .Returns(new ConnectionSettingsEditor(
                         settings,
                         _ => { },
                         null));

            var vmNode = new Mock <IProjectExplorerVmInstanceNode>();

            vmNode.SetupGet(n => n.Reference)
            .Returns(new InstanceLocator("project-1", "zone-1", "instance-1"));

            this.serviceRegistry.AddMock <ICredentialPrompt>()
            .Setup(p => p.ShowCredentialsPromptAsync(
                       It.IsAny <IWin32Window>(),
                       It.IsAny <InstanceLocator>(),
                       It.IsAny <ConnectionSettingsEditor>(),
                       It.IsAny <bool>()));
            this.serviceRegistry.AddMock <IProjectExplorer>()
            .Setup(p => p.TryFindNode(
                       It.IsAny <InstanceLocator>()))
            .Returns(vmNode.Object);

            var remoteDesktopService = new Mock <IRemoteDesktopConnectionBroker>();

            remoteDesktopService.Setup(s => s.Connect(
                                           It.IsAny <InstanceLocator>(),
                                           "localhost",
                                           It.IsAny <ushort>(),
                                           It.IsAny <VmInstanceConnectionSettings>())).Returns <IRemoteDesktopSession>(null);

            this.serviceRegistry.AddSingleton <IRemoteDesktopConnectionBroker>(remoteDesktopService.Object);

            var service = new IapRdpConnectionService(this.serviceRegistry);
            await service.ActivateOrConnectInstanceAsync(
                IapRdpUrl.FromString("iap-rdp:///project/us-central-1/instance-1?username=john%20doe"));

            remoteDesktopService.Verify(s => s.Connect(
                                            It.IsAny <InstanceLocator>(),
                                            "localhost",
                                            It.IsAny <ushort>(),
                                            It.Is <VmInstanceConnectionSettings>(i => i.Username == "john doe")), Times.Once);
            settingsService.Verify(s => s.GetConnectionSettingsEditor(
                                       It.IsAny <IProjectExplorerNode>()), Times.Once);
        }
Exemple #5
0
        public async Task WhenConnectingByUrlWithUsernameAndCredentialsExist_ThenConnectionIsMadeWithUsernameFromUrl()
        {
            var settings = InstanceConnectionSettings.CreateNew("project", "instance-1");

            settings.RdpUsername.Value = "existinguser";
            settings.RdpPassword.Value = SecureStringExtensions.FromClearText("password");

            var settingsService = this.serviceRegistry.AddMock <IConnectionSettingsService>();

            settingsService.Setup(s => s.GetConnectionSettings(
                                      It.IsAny <IProjectModelNode>()))
            .Returns(
                settings.ToPersistentSettingsCollection(s => Assert.Fail("should not be called")));

            var vmNode = new Mock <IProjectModelInstanceNode>();

            vmNode.SetupGet(n => n.Instance)
            .Returns(new InstanceLocator("project-1", "zone-1", "instance-1"));

            this.serviceRegistry.AddMock <ICredentialPrompt>()
            .Setup(p => p.ShowCredentialsPromptAsync(
                       It.IsAny <IWin32Window>(),
                       It.IsAny <InstanceLocator>(),
                       It.IsAny <ConnectionSettingsBase>(),
                       It.IsAny <bool>()));
            this.serviceRegistry.AddMock <IProjectModelService>()
            .Setup(p => p.GetNodeAsync(
                       It.IsAny <ResourceLocator>(),
                       It.IsAny <CancellationToken>()))
            .ReturnsAsync(vmNode.Object);

            var remoteDesktopService = new Mock <IRemoteDesktopSessionBroker>();

            remoteDesktopService.Setup(s => s.Connect(
                                           It.IsAny <InstanceLocator>(),
                                           "localhost",
                                           It.IsAny <ushort>(),
                                           It.IsAny <InstanceConnectionSettings>())).Returns <IRemoteDesktopSession>(null);

            this.serviceRegistry.AddSingleton <IRemoteDesktopSessionBroker>(remoteDesktopService.Object);

            var service = new RdpConnectionService(this.serviceRegistry);
            await service.ActivateOrConnectInstanceAsync(
                IapRdpUrl.FromString("iap-rdp:///project/us-central-1/instance-1?username=john%20doe"));

            remoteDesktopService.Verify(s => s.Connect(
                                            It.IsAny <InstanceLocator>(),
                                            "localhost",
                                            It.IsAny <ushort>(),
                                            It.Is <InstanceConnectionSettings>(i => i.RdpUsername.StringValue == "john doe")), Times.Once);
            settingsService.Verify(s => s.GetConnectionSettings(
                                       It.IsAny <IProjectModelNode>()), Times.Once);
        }
Exemple #6
0
        public async Task WhenConnectingByNodeAndPersistentCredentialsAllowed_ThenCredentialsAreUsed()
        {
            var settings = InstanceConnectionSettings.CreateNew("project", "instance-1");

            settings.RdpUsername.Value = "existinguser";
            settings.RdpPassword.Value = SecureStringExtensions.FromClearText("password");

            bool settingsSaved = false;

            var settingsService = this.serviceRegistry.AddMock <IConnectionSettingsService>();

            settingsService.Setup(s => s.GetConnectionSettings(
                                      It.IsAny <IProjectExplorerNode>()))
            .Returns(
                settings.ToPersistentSettingsCollection(s => settingsSaved = true));

            var vmNode = new Mock <IProjectExplorerInstanceNode>();

            vmNode.SetupGet(n => n.Instance)
            .Returns(new InstanceLocator("project-1", "zone-1", "instance-1"));

            this.serviceRegistry.AddMock <IProjectExplorer>()
            .Setup(p => p.TryFindNode(
                       It.IsAny <InstanceLocator>()))
            .Returns(vmNode.Object);

            var remoteDesktopService = new Mock <IRemoteDesktopSessionBroker>();

            remoteDesktopService.Setup(s => s.Connect(
                                           It.IsAny <InstanceLocator>(),
                                           "localhost",
                                           It.IsAny <ushort>(),
                                           It.IsAny <InstanceConnectionSettings>())).Returns <IRemoteDesktopSession>(null);

            this.serviceRegistry.AddSingleton <IRemoteDesktopSessionBroker>(remoteDesktopService.Object);

            var service = new RdpConnectionService(this.serviceRegistry);
            await service.ActivateOrConnectInstanceAsync(vmNode.Object, true);

            remoteDesktopService.Verify(s => s.Connect(
                                            It.IsAny <InstanceLocator>(),
                                            "localhost",
                                            It.IsAny <ushort>(),
                                            It.Is <InstanceConnectionSettings>(i =>
                                                                               i.RdpUsername.StringValue == "existinguser" &&
                                                                               i.RdpPassword.ClearTextValue == "password")), Times.Once);

            Assert.IsTrue(settingsSaved);
        }
Exemple #7
0
            public override void SetValue(object component, object value)
            {
                //
                // NB. Avoid converting null to a SecureString as this results
                // in an empty string - which would then be treated as non-default.
                //

                if (value == null)
                {
                    ResetValue(component);
                }
                else
                {
                    this.setting.Value = SecureStringExtensions.FromClearText((string)value);
                }
            }
Exemple #8
0
        public void WhenSettingsSaved_GetSettingsReturnsData()
        {
            var baseKey    = hkcu.CreateSubKey(TestKeyPath);
            var repository = new AuthSettingsRepository(baseKey);

            var originalSettings = repository.GetSettings();

            originalSettings.Credentials.Value = SecureStringExtensions.FromClearText("secure");
            repository.SetSettings(originalSettings);

            var settings = repository.GetSettings();

            Assert.AreEqual(
                "secure",
                settings.Credentials.ClearTextValue);
        }
        public async Task WhenConnectingByNodeAndPersistentCredentialsDisallowed_ThenPasswordIsClear()
        {
            var settings = VmInstanceConnectionSettings.CreateNew("project", "instance-1");

            settings.Username.Value = "existinguser";
            settings.Password.Value = SecureStringExtensions.FromClearText("password");

            var settingsService = this.serviceRegistry.AddMock <IConnectionSettingsService>();

            settingsService.Setup(s => s.GetConnectionSettings(
                                      It.IsAny <IProjectExplorerNode>()))
            .Returns(settings);

            var vmNode = new Mock <IProjectExplorerVmInstanceNode>();

            vmNode.SetupGet(n => n.Reference)
            .Returns(new InstanceLocator("project-1", "zone-1", "instance-1"));

            this.serviceRegistry.AddMock <IProjectExplorer>()
            .Setup(p => p.TryFindNode(
                       It.IsAny <InstanceLocator>()))
            .Returns(vmNode.Object);

            var remoteDesktopService = new Mock <IRemoteDesktopSessionBroker>();

            remoteDesktopService.Setup(s => s.Connect(
                                           It.IsAny <InstanceLocator>(),
                                           "localhost",
                                           It.IsAny <ushort>(),
                                           It.IsAny <VmInstanceConnectionSettings>())).Returns <IRemoteDesktopSession>(null);

            this.serviceRegistry.AddSingleton <IRemoteDesktopSessionBroker>(remoteDesktopService.Object);

            var service = new IapRdpConnectionService(this.serviceRegistry);
            await service.ActivateOrConnectInstanceAsync(vmNode.Object, false);

            remoteDesktopService.Verify(s => s.Connect(
                                            It.IsAny <InstanceLocator>(),
                                            "localhost",
                                            It.IsAny <ushort>(),
                                            It.Is <VmInstanceConnectionSettings>(i =>
                                                                                 i.Username.StringValue == "existinguser" &&
                                                                                 i.Password.ClearTextValue == "")), Times.Once);

            settingsService.Verify(s => s.SaveConnectionSettings(
                                       It.IsAny <ConnectionSettingsBase>()), Times.Never);
        }
Exemple #10
0
        public void WhenSecureStringStored_StringCanBeDecrypted()
        {
            this.hkcu.DeleteSubKeyTree(TestKeyPath, false);
            var registryKey = hkcu.CreateSubKey(TestKeyPath);

            var original = new KeyWithSecureString()
            {
                Secure = SecureStringExtensions.FromClearText("secure!!!")
            };

            new RegistryBinder <KeyWithSecureString>().Store(original, registryKey);

            var copy = new RegistryBinder <KeyWithSecureString>().Load(registryKey);

            Assert.AreEqual(
                "secure!!!",
                copy.Secure.AsClearText());
        }
        public Task StoreAsync <T>(string key, T value)
        {
            Utilities.ThrowIfNullOrEmpty(key, nameof(key));

            if (key == CredentialStoreKey)
            {
                var settings = GetSettings();
                settings.Credentials.Value = SecureStringExtensions.FromClearText(
                    NewtonsoftJsonSerializer.Instance.Serialize(value));
                SetSettings(settings);

                return(Task.CompletedTask);
            }
            else
            {
                throw new KeyNotFoundException(key);
            }
        }
        public void WhenValueDiffersFromDefault_ThenSetValueSucceedsAndSettingIsDirty()
        {
            using (var key = this.hkcu.CreateSubKey(TestKeyPath))
            {
                var setting = RegistrySecureStringSetting.FromKey(
                    "test",
                    "title",
                    "description",
                    "category",
                    key,
                    DataProtectionScope.CurrentUser);

                setting.Value = SecureStringExtensions.FromClearText("yellow");

                Assert.IsFalse(setting.IsDefault);
                Assert.IsTrue(setting.IsDirty);
            }
        }
        public void WhenValueIsNull_ThenSetValueResetsToDefault()
        {
            using (var key = this.hkcu.CreateSubKey(TestKeyPath))
            {
                var setting = RegistrySecureStringSetting.FromKey(
                    "test",
                    "title",
                    "description",
                    "category",
                    key,
                    DataProtectionScope.CurrentUser);

                setting.Value = SecureStringExtensions.FromClearText("blue");
                setting.Value = null;

                Assert.IsNull(setting.Value);
                Assert.IsTrue(setting.IsDefault);
            }
        }
Exemple #14
0
        public async Task WhenConnectingByNodeAndPersistentCredentialsDisallowed_ThenPasswordIsClear()
        {
            var settings = InstanceConnectionSettings.CreateNew("project", "instance-1");

            settings.RdpUsername.Value = "existinguser";
            settings.RdpPassword.Value = SecureStringExtensions.FromClearText("password");

            var settingsService = this.serviceRegistry.AddMock <IConnectionSettingsService>();

            settingsService.Setup(s => s.GetConnectionSettings(
                                      It.IsAny <IProjectModelNode>()))
            .Returns(
                settings.ToPersistentSettingsCollection(s => Assert.Fail("should not be called")));

            var vmNode = CreateInstanceNodeMock();

            this.serviceRegistry.AddMock <IProjectModelService>()
            .Setup(p => p.GetNodeAsync(
                       It.IsAny <ResourceLocator>(),
                       It.IsAny <CancellationToken>()))
            .ReturnsAsync(vmNode.Object);

            var remoteDesktopService = new Mock <IRemoteDesktopSessionBroker>();

            remoteDesktopService.Setup(s => s.Connect(
                                           It.IsAny <InstanceLocator>(),
                                           "localhost",
                                           It.IsAny <ushort>(),
                                           It.IsAny <InstanceConnectionSettings>())).Returns <IRemoteDesktopSession>(null);

            this.serviceRegistry.AddSingleton <IRemoteDesktopSessionBroker>(remoteDesktopService.Object);

            var service = new RdpConnectionService(this.serviceRegistry);
            await service.ActivateOrConnectInstanceAsync(vmNode.Object, false);

            remoteDesktopService.Verify(s => s.Connect(
                                            It.IsAny <InstanceLocator>(),
                                            "localhost",
                                            It.IsAny <ushort>(),
                                            It.Is <InstanceConnectionSettings>(i =>
                                                                               i.RdpUsername.StringValue == "existinguser" &&
                                                                               i.RdpPassword.ClearTextValue == "")), Times.Once);
        }
Exemple #15
0
        public void WhenSecureStringIsDeleted_RemainsNull()
        {
            this.hkcu.DeleteSubKeyTree(TestKeyPath, false);
            var registryKey = hkcu.CreateSubKey(TestKeyPath);

            new RegistryBinder <KeyWithSecureString>().Store(
                new KeyWithSecureString()
            {
                Secure = SecureStringExtensions.FromClearText("secure!!!")
            },
                registryKey);
            new RegistryBinder <KeyWithSecureString>().Store(
                new KeyWithSecureString()
            {
                Secure = null
            },
                registryKey);

            var copy = new RegistryBinder <KeyWithSecureString>().Load(registryKey);

            Assert.IsNull(copy.Secure);
        }
        public void WhenRegistryValueExists_ThenFromKeyUsesValue()
        {
            using (var key = this.hkcu.CreateSubKey(TestKeyPath))
            {
                var setting = RegistrySecureStringSetting.FromKey(
                    "test",
                    "title",
                    "description",
                    "category",
                    key,
                    DataProtectionScope.CurrentUser);

                setting.Value = SecureStringExtensions.FromClearText("red");
                setting.Save(key);

                Assert.IsNotNull(key.GetValue("test"));

                // Now read again.

                setting = RegistrySecureStringSetting.FromKey(
                    "test",
                    "title",
                    "description",
                    "category",
                    key,
                    DataProtectionScope.CurrentUser);

                Assert.AreEqual("test", setting.Key);
                Assert.AreEqual("title", setting.Title);
                Assert.AreEqual("description", setting.Description);
                Assert.AreEqual("category", setting.Category);
                Assert.AreEqual("red", setting.ClearTextValue);
                Assert.IsFalse(setting.IsDefault);
                Assert.IsFalse(setting.IsDirty);
            }
        }