diff --git a/mRemoteNG/Language/Language.Designer.cs b/mRemoteNG/Language/Language.Designer.cs
index 799476154..e3dcbc1d9 100644
--- a/mRemoteNG/Language/Language.Designer.cs
+++ b/mRemoteNG/Language/Language.Designer.cs
@@ -3399,9 +3399,9 @@ namespace mRemoteNG.Resources.Language {
///
/// Looks up a localized string similar to *Some settings are determined by your company. For further information, please contact your administrator.
///
- internal static string OptionsAdminInfo {
+ internal static string OptionsCompanyPolicyMessage {
get {
- return ResourceManager.GetString("OptionsAdminInfo", resourceCulture);
+ return ResourceManager.GetString("OptionsCompanyPolicyMessage", resourceCulture);
}
}
diff --git a/mRemoteNG/Language/Language.de.resx b/mRemoteNG/Language/Language.de.resx
index db19159e4..5893c0fc9 100644
--- a/mRemoteNG/Language/Language.de.resx
+++ b/mRemoteNG/Language/Language.de.resx
@@ -2047,7 +2047,7 @@ Nightly umfasst Alphas, Betas und Release Candidates.
Maximale Anmeldeversuche erreicht. Verbindung erneut initiieren.
C# to Powershell transfer issue with encoding possible
-
+
*Einige Einstellungen werden von Ihrem Unternehmen festgelegt. Für weitere Informationen wenden Sie sich an Ihren Systemadministrator.
\ No newline at end of file
diff --git a/mRemoteNG/Language/Language.resx b/mRemoteNG/Language/Language.resx
index 5420b8641..dbaa0e573 100644
--- a/mRemoteNG/Language/Language.resx
+++ b/mRemoteNG/Language/Language.resx
@@ -2292,7 +2292,7 @@ Nightly Channel includes Alphas, Betas & Release Candidates.
Clickstudios Passwordstate
-
+
None
@@ -2365,7 +2365,7 @@ Nightly Channel includes Alphas, Betas & Release Candidates.
SecureCRT (*.xml)
-
+
*Some settings are determined by your company. For further information, please contact your administrator
\ No newline at end of file
diff --git a/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.Designer.cs b/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.Designer.cs
index f88641c73..f3873d7ff 100644
--- a/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.Designer.cs
+++ b/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.Designer.cs
@@ -43,7 +43,7 @@
lblCredentialsDomain = new Controls.MrngLabel();
radCredentialsNoInfo = new Controls.MrngRadioButton();
radCredentialsCustom = new Controls.MrngRadioButton();
- lblCredentialsAdminInfo = new System.Windows.Forms.Label();
+ lblRegistrySettingsUsedInfo = new System.Windows.Forms.Label();
lblCredentialsGeneratorHelp = new Controls.MrngLabel();
btnCredentialsGenerator = new System.Windows.Forms.Button();
lblCredentialsGenerator = new Controls.MrngLabel();
@@ -56,7 +56,7 @@
// pnlDefaultCredentials
//
pnlDefaultCredentials.Controls.Add(pnlCredentialsSettingsPanel);
- pnlDefaultCredentials.Controls.Add(lblCredentialsAdminInfo);
+ pnlDefaultCredentials.Controls.Add(lblRegistrySettingsUsedInfo);
pnlDefaultCredentials.Dock = System.Windows.Forms.DockStyle.Top;
pnlDefaultCredentials.Location = new System.Drawing.Point(0, 0);
pnlDefaultCredentials.Name = "pnlDefaultCredentials";
@@ -149,6 +149,7 @@
txtCredentialsPassword.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
txtCredentialsPassword.Location = new System.Drawing.Point(163, 55);
txtCredentialsPassword.Name = "txtCredentialsPassword";
+ txtCredentialsPassword.PasswordChar = '*';
txtCredentialsPassword.Size = new System.Drawing.Size(166, 22);
txtCredentialsPassword.TabIndex = 7;
//
@@ -232,18 +233,18 @@
radCredentialsCustom.UseVisualStyleBackColor = false;
radCredentialsCustom.CheckedChanged += radCredentialsCustom_CheckedChanged;
//
- // lblCredentialsAdminInfo
+ // lblRegistrySettingsUsedInfo
//
- lblCredentialsAdminInfo.BackColor = System.Drawing.SystemColors.ControlLight;
- lblCredentialsAdminInfo.Dock = System.Windows.Forms.DockStyle.Top;
- lblCredentialsAdminInfo.ForeColor = System.Drawing.SystemColors.ControlText;
- lblCredentialsAdminInfo.Location = new System.Drawing.Point(0, 0);
- lblCredentialsAdminInfo.Name = "lblCredentialsAdminInfo";
- lblCredentialsAdminInfo.Padding = new System.Windows.Forms.Padding(0, 2, 0, 0);
- lblCredentialsAdminInfo.Size = new System.Drawing.Size(610, 30);
- lblCredentialsAdminInfo.TabIndex = 0;
- lblCredentialsAdminInfo.Text = "Some settings are configured by your Administrator. Please contact your administrator for more information.";
- lblCredentialsAdminInfo.Visible = false;
+ lblRegistrySettingsUsedInfo.BackColor = System.Drawing.SystemColors.ControlLight;
+ lblRegistrySettingsUsedInfo.Dock = System.Windows.Forms.DockStyle.Top;
+ lblRegistrySettingsUsedInfo.ForeColor = System.Drawing.SystemColors.ControlText;
+ lblRegistrySettingsUsedInfo.Location = new System.Drawing.Point(0, 0);
+ lblRegistrySettingsUsedInfo.Name = "lblRegistrySettingsUsedInfo";
+ lblRegistrySettingsUsedInfo.Padding = new System.Windows.Forms.Padding(0, 2, 0, 0);
+ lblRegistrySettingsUsedInfo.Size = new System.Drawing.Size(610, 30);
+ lblRegistrySettingsUsedInfo.TabIndex = 0;
+ lblRegistrySettingsUsedInfo.Text = "Some settings are configured by your Administrator. Please contact your administrator for more information.";
+ lblRegistrySettingsUsedInfo.Visible = false;
//
// lblCredentialsGeneratorHelp
//
@@ -304,7 +305,7 @@
internal Controls.MrngTextBox txtCredentialsUsername;
internal Controls.MrngLabel lblCredentialsDomain;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
- internal System.Windows.Forms.Label lblCredentialsAdminInfo;
+ internal System.Windows.Forms.Label lblRegistrySettingsUsedInfo;
internal System.Windows.Forms.Panel pnlCredentialsSettingsPanel;
internal Controls.MrngLabel lblCredentialsGenerator;
internal System.Windows.Forms.TextBox txtCredentialsGeneratorPsswd;
diff --git a/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.cs b/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.cs
index 4f8485214..2cadfb12f 100644
--- a/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.cs
+++ b/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.cs
@@ -5,6 +5,7 @@ using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Resources.Language;
using System.Runtime.Versioning;
using mRemoteNG.Config.Settings.Registry;
+using System.DirectoryServices;
namespace mRemoteNG.UI.Forms.OptionsPages
{
@@ -13,8 +14,6 @@ namespace mRemoteNG.UI.Forms.OptionsPages
{
#region Private Fields
private readonly OptRegistryCredentialsPage _RegistrySettings = new();
- private bool _pageEnabled = true;
-
#endregion
public CredentialsPage()
@@ -40,27 +39,28 @@ namespace mRemoteNG.UI.Forms.OptionsPages
lblCredentialsUsername.Text = Language.Username;
lblCredentialsPassword.Text = Language.Password;
lblCredentialsDomain.Text = Language.Domain;
- lblCredentialsAdminInfo.Text = Language.OptionsAdminInfo;
+ lblRegistrySettingsUsedInfo.Text = Language.OptionsCompanyPolicyMessage;
}
public override void LoadSettings()
{
- if (!_pageEnabled) { return; }
+ if (!_RegistrySettings.CredentialPageEnabled)
+ return;
// ReSharper disable once SwitchStatementMissingSomeCases
switch (Properties.OptionsCredentialsPage.Default.EmptyCredentials)
{
- case "noinfo":
- radCredentialsNoInfo.Checked = true;
- break;
- case "windows":
- radCredentialsWindows.Checked = true;
- break;
- case "custom":
- radCredentialsCustom.Checked = true;
- break;
- }
-
+ case "noinfo":
+ radCredentialsNoInfo.Checked = true;
+ break;
+ case "windows":
+ radCredentialsWindows.Checked = true;
+ break;
+ case "custom":
+ radCredentialsCustom.Checked = true;
+ break;
+ }
+
txtCredentialsUsername.Text = Properties.OptionsCredentialsPage.Default.DefaultUsername;
LegacyRijndaelCryptographyProvider cryptographyProvider = new();
txtCredentialsPassword.Text = cryptographyProvider.Decrypt(Properties.OptionsCredentialsPage.Default.DefaultPassword, Runtime.EncryptionKey);
@@ -92,13 +92,19 @@ namespace mRemoteNG.UI.Forms.OptionsPages
public override void LoadRegistrySettings()
{
- if (!CommonRegistrySettings.AllowModifyCredentialSettings)
+ // CredentialPageEnabled reg setting: enabled/default: true; Disabled: false.
+ if (!_RegistrySettings.CredentialPageEnabled)
{
DisablePage();
return;
}
- if (_RegistrySettings.UseCredentials.IsKeyPresent)
+ // UseCredentials reg setting with validation:
+ // 1. Is not set or valid, stop processing.
+ // 2. Set the 'EmptyCredentials' option based on value
+ // 3. Only proceed when "custom"
+ if (!_RegistrySettings.UseCredentials.IsValid) { return; }
+ else if (_RegistrySettings.UseCredentials.IsValid)
{
Properties.OptionsCredentialsPage.Default.EmptyCredentials = _RegistrySettings.UseCredentials.Value;
@@ -107,11 +113,13 @@ namespace mRemoteNG.UI.Forms.OptionsPages
case "noinfo":
DisableControl(radCredentialsWindows);
DisableControl(radCredentialsCustom);
- break;
+ SetVisibilitySettingsUsedInfo();
+ return;
case "windows":
DisableControl(radCredentialsNoInfo);
DisableControl(radCredentialsCustom);
- break;
+ SetVisibilitySettingsUsedInfo();
+ return;
case "custom":
DisableControl(radCredentialsNoInfo);
DisableControl(radCredentialsWindows);
@@ -119,95 +127,87 @@ namespace mRemoteNG.UI.Forms.OptionsPages
}
}
- if (_RegistrySettings.UseCredentials.Value != "custom") { return; }
+ // ***
+ // The following is only used when set to custom!
-
- if (!CommonRegistrySettings.AllowSaveUsernames)
- {
- Properties.OptionsCredentialsPage.Default.DefaultUsername = "";
- DisableControl(txtCredentialsUsername);
- }
- else if (_RegistrySettings.DefaultUsername.IsKeyPresent)
+ // DefaultUsername reg setting: set DefaultUsername option based on value
+ if (_RegistrySettings.DefaultUsername.IsSet)
{
Properties.OptionsCredentialsPage.Default.DefaultUsername = _RegistrySettings.DefaultUsername.Value;
DisableControl(txtCredentialsUsername);
}
- if (!CommonRegistrySettings.AllowSavePasswords)
+ // DefaultPassword reg setting:
+ // 1. Test decription works to prevents potential issues
+ // 2. Set DefaultPassword option based on value
+ // 3. Clears reg setting if fails
+ if (_RegistrySettings.DefaultPassword.IsSet)
{
- Properties.OptionsCredentialsPage.Default.DefaultPassword = "";
- DisableControl(txtCredentialsPassword);
- }
- //else if (_RegistrySettings.DefaultPassword.IsKeyPresent)
- //{
- // Properties.OptionsCredentialsPage.Default.DefaultPassword = _RegistrySettings.DefaultPassword.Value;
- // DisableControl(txtCredentialsPassword);
- //}
+ try
+ {
+ LegacyRijndaelCryptographyProvider cryptographyProvider = new();
+ string decryptedPassword;
+ string defaultPassword = _RegistrySettings.DefaultPassword.Value;
- if (_RegistrySettings.DefaultDomain.IsKeyPresent)
+ decryptedPassword = cryptographyProvider.Decrypt(defaultPassword, Runtime.EncryptionKey);
+ Properties.OptionsCredentialsPage.Default.DefaultPassword = defaultPassword;
+ DisableControl(txtCredentialsPassword);
+ }
+ catch
+ {
+ // Fire-and-forget: The DefaultPassword in the registry is not encrypted.
+ _RegistrySettings.DefaultPassword.Clear();
+ }
+ }
+
+ // DefaultDomain reg setting: set DefaultDomain option based on value
+ if (_RegistrySettings.DefaultDomain.IsSet)
{
Properties.OptionsCredentialsPage.Default.DefaultDomain = _RegistrySettings.DefaultDomain.Value;
DisableControl(txtCredentialsDomain);
}
- if (!CommonRegistrySettings.AllowSaveUsernames)
- {
- Properties.OptionsCredentialsPage.Default.UserViaAPIDefault = "";
- DisableControl(txtCredentialsUserViaAPI);
- }
- else if (_RegistrySettings.UserViaAPIDefault.IsKeyPresent)
+ // UserViaAPIDefault reg setting: set UserViaAPIDefault option based on value
+ if (_RegistrySettings.UserViaAPIDefault.IsSet)
{
Properties.OptionsCredentialsPage.Default.UserViaAPIDefault = _RegistrySettings.UserViaAPIDefault.Value;
DisableControl(txtCredentialsUserViaAPI);
}
- lblCredentialsAdminInfo.Visible = ShowAdministratorInfo();
+ SetVisibilitySettingsUsedInfo();
}
- public override bool ShowAdministratorInfo()
+ ///
+ /// Checks if any credantil registry settings are being used.
+ ///
+ ///
+ /// True if any relevant registry settings are used; otherwise, false.
+ ///
+ public override bool ShowRegistrySettingsUsedInfo()
{
- return !CommonRegistrySettings.AllowModifyCredentialSettings
- || !CommonRegistrySettings.AllowExportPasswords
+ return !CommonRegistrySettings.AllowExportPasswords
|| !CommonRegistrySettings.AllowExportUsernames
|| !CommonRegistrySettings.AllowSavePasswords
|| !CommonRegistrySettings.AllowSaveUsernames
- || _RegistrySettings.DefaultUsername.IsKeyPresent
- //|| _RegistrySettings.DefaultPassword.IsKeyPresent
- || _RegistrySettings.DefaultDomain.IsKeyPresent
- || _RegistrySettings.UserViaAPIDefault.IsKeyPresent;
- }
-
- private void radCredentialsCustom_CheckedChanged(object sender, EventArgs e)
- {
- if (!_RegistrySettings.DefaultUsername.IsKeyPresent && CommonRegistrySettings.AllowSaveUsernames)
- {
- lblCredentialsUsername.Enabled = radCredentialsCustom.Checked;
- txtCredentialsUsername.Enabled = radCredentialsCustom.Checked;
- }
-
- if (/*!_RegistrySettings.DefaultPassword.IsKeyPresent &&*/ CommonRegistrySettings.AllowSavePasswords)
- {
- lblCredentialsPassword.Enabled = radCredentialsCustom.Checked;
- txtCredentialsPassword.Enabled = radCredentialsCustom.Checked;
- }
-
- if (!_RegistrySettings.DefaultDomain.IsKeyPresent)
- {
- lblCredentialsDomain.Enabled = radCredentialsCustom.Checked;
- txtCredentialsDomain.Enabled = radCredentialsCustom.Checked;
- }
-
- if (!_RegistrySettings.UserViaAPIDefault.IsKeyPresent)
- {
- lblCredentialsUserViaAPI.Enabled = radCredentialsCustom.Checked;
- txtCredentialsUserViaAPI.Enabled = radCredentialsCustom.Checked;
- }
+ || !_RegistrySettings.CredentialPageEnabled
+ || _RegistrySettings.UseCredentials.IsValid;
+
+ /*
+ * Checking these values is unnecessary because UseCredentials must be valid and set to Custom.
+ *
+ ||_RegistrySettings.DefaultUsername.IsSet
+ || _RegistrySettings.DefaultPassword.IsSet
+ || _RegistrySettings.DefaultDomain.IsSet
+ || _RegistrySettings.UserViaAPIDefault.IsSet;
+ */
}
+ ///
+ /// Disables the page by setting default values and disabling controls.
+ ///
public override void DisablePage()
{
Properties.OptionsCredentialsPage.Default.EmptyCredentials = "noinfo";
- //radCredentialsNoInfo.Enabled = false;
radCredentialsWindows.Enabled = false;
radCredentialsCustom.Enabled = false;
@@ -216,8 +216,50 @@ namespace mRemoteNG.UI.Forms.OptionsPages
txtCredentialsDomain.Enabled = false;
txtCredentialsUserViaAPI.Enabled = false;
- lblCredentialsAdminInfo.Visible = true;
- _pageEnabled = false;
+ SetVisibilitySettingsUsedInfo();
}
+
+ #region Event Handlers
+
+ private void radCredentialsCustom_CheckedChanged(object sender, EventArgs e)
+ {
+ if (!_RegistrySettings.DefaultUsername.IsSet && CommonRegistrySettings.AllowSaveUsernames)
+ {
+ lblCredentialsUsername.Enabled = radCredentialsCustom.Checked;
+ txtCredentialsUsername.Enabled = radCredentialsCustom.Checked;
+ }
+
+ if (!_RegistrySettings.DefaultPassword.IsSet && CommonRegistrySettings.AllowSavePasswords)
+ {
+ lblCredentialsPassword.Enabled = radCredentialsCustom.Checked;
+ txtCredentialsPassword.Enabled = radCredentialsCustom.Checked;
+ }
+
+ if (!_RegistrySettings.DefaultDomain.IsSet)
+ {
+ lblCredentialsDomain.Enabled = radCredentialsCustom.Checked;
+ txtCredentialsDomain.Enabled = radCredentialsCustom.Checked;
+ }
+
+ if (!_RegistrySettings.UserViaAPIDefault.IsSet && CommonRegistrySettings.AllowSaveUsernames)
+ {
+ lblCredentialsUserViaAPI.Enabled = radCredentialsCustom.Checked;
+ txtCredentialsUserViaAPI.Enabled = radCredentialsCustom.Checked;
+ }
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ ///
+ /// Updates the visibility of the information label indicating whether registry settings are used.
+ ///
+ private void SetVisibilitySettingsUsedInfo()
+ {
+ lblRegistrySettingsUsedInfo.Visible = ShowRegistrySettingsUsedInfo();
+ }
+
+ #endregion
}
}
\ No newline at end of file
diff --git a/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.resx b/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.resx
index f298a7be8..af32865ec 100644
--- a/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.resx
+++ b/mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.resx
@@ -1,4 +1,64 @@
-
+
+
+