From 88999263a728d0dfcfc96461af9337e5d9f991cb Mon Sep 17 00:00:00 2001 From: xRushG <145561288+xRushG@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:07:33 +0200 Subject: [PATCH] Finalize Update Options Page This commit finalizes the Update Options Page with the following changes: - Removed unnecessary methods due to new features of the registry handler class. - Updated and added comments to improve code readability and understanding. - Implemented UI optimizations such as disabling the frequency control and showing "Never" in the combobox. - Enabled the password storing ability, making it functional but not yet usable. - Applied some code optimizations for improved efficiency. --- .../UI/Forms/OptionsPages/OptionsPage.cs | 23 +- .../OptionsPages/UpdatesPage.Designer.cs | 31 +- .../UI/Forms/OptionsPages/UpdatesPage.cs | 333 ++++++++++++------ .../UI/Forms/OptionsPages/UpdatesPage.resx | 3 - mRemoteNG/UI/Forms/frmMain.cs | 1 + 5 files changed, 252 insertions(+), 139 deletions(-) diff --git a/mRemoteNG/UI/Forms/OptionsPages/OptionsPage.cs b/mRemoteNG/UI/Forms/OptionsPages/OptionsPage.cs index b5e03a5e..408b440f 100644 --- a/mRemoteNG/UI/Forms/OptionsPages/OptionsPage.cs +++ b/mRemoteNG/UI/Forms/OptionsPages/OptionsPage.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System; +using System.ComponentModel; using System.Drawing; using System.Runtime.Versioning; using System.Windows.Forms; @@ -42,13 +43,27 @@ namespace mRemoteNG.UI.Forms.OptionsPages public virtual void RevertSettings() { } + + /// + /// Loads registry settings related to update options and proxy configurations. + /// This method retrieves values from the registry and initializes the corresponding controls + /// on the page with these values. It also updates internal flags and properties accordingly. + /// public virtual void LoadRegistrySettings() { } - public virtual bool ShowAdministratorInfo() + + /// + /// Determines if any registry settings are being used. + /// + /// + /// A boolean value indicating whether registry settings are used, as determined by the configuration on the options page. + /// + public virtual bool ShowRegistrySettingsUsedInfo() { return false; } + public virtual void DisablePage() { } @@ -94,10 +109,8 @@ namespace mRemoteNG.UI.Forms.OptionsPages ((TextBox)control).ReadOnly = control.Enabled; } } - - } - internal class DropdownList + internal class DropdownList { public int Index { get; set; } public string DisplayString { get; set; } diff --git a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.Designer.cs b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.Designer.cs index 9aa1020d..5db9e0a5 100644 --- a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.Designer.cs +++ b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.Designer.cs @@ -56,7 +56,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages btnTestProxy = new MrngButton(); groupBoxReleaseChannel = new MrngGroupBox(); pnlDefaultUpdate = new System.Windows.Forms.Panel(); - lblUpdateAdminInfo = new System.Windows.Forms.Label(); + lblRegistrySettingsUsedInfo = new System.Windows.Forms.Label(); pnlUpdateCheck.SuspendLayout(); pnlProxy.SuspendLayout(); tblProxyBasic.SuspendLayout(); @@ -97,6 +97,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages cboUpdateCheckFrequency.Name = "cboUpdateCheckFrequency"; cboUpdateCheckFrequency.Size = new System.Drawing.Size(120, 21); cboUpdateCheckFrequency.TabIndex = 1; + cboUpdateCheckFrequency.Enabled = false; // // btnUpdateCheckNow // @@ -137,7 +138,6 @@ namespace mRemoteNG.UI.Forms.OptionsPages // // cboReleaseChannel // - cboReleaseChannel._mice = MrngComboBox.MouseState.HOVER; cboReleaseChannel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; cboReleaseChannel.FormattingEnabled = true; cboReleaseChannel.Location = new System.Drawing.Point(7, 21); @@ -273,6 +273,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages txtProxyPassword.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); txtProxyPassword.Location = new System.Drawing.Point(163, 29); txtProxyPassword.Name = "txtProxyPassword"; + txtProxyPassword.PasswordChar = '*'; txtProxyPassword.Size = new System.Drawing.Size(184, 22); txtProxyPassword.TabIndex = 3; txtProxyPassword.UseSystemPasswordChar = true; @@ -332,25 +333,25 @@ namespace mRemoteNG.UI.Forms.OptionsPages pnlDefaultUpdate.Controls.Add(pnlProxy); pnlDefaultUpdate.Controls.Add(groupBoxReleaseChannel); pnlDefaultUpdate.Controls.Add(pnlUpdateCheck); - pnlDefaultUpdate.Controls.Add(lblUpdateAdminInfo); + pnlDefaultUpdate.Controls.Add(lblRegistrySettingsUsedInfo); pnlDefaultUpdate.Dock = System.Windows.Forms.DockStyle.Top; pnlDefaultUpdate.Location = new System.Drawing.Point(0, 0); pnlDefaultUpdate.Name = "pnlDefaultUpdate"; pnlDefaultUpdate.Size = new System.Drawing.Size(610, 483); pnlDefaultUpdate.TabIndex = 4; // - // lblUpdateAdminInfo + // lblRegistrySettingsUsedInfo // - lblUpdateAdminInfo.BackColor = System.Drawing.SystemColors.ControlLight; - lblUpdateAdminInfo.Dock = System.Windows.Forms.DockStyle.Top; - lblUpdateAdminInfo.ForeColor = System.Drawing.SystemColors.ControlText; - lblUpdateAdminInfo.Location = new System.Drawing.Point(0, 0); - lblUpdateAdminInfo.Name = "lblUpdateAdminInfo"; - lblUpdateAdminInfo.Padding = new System.Windows.Forms.Padding(0, 2, 0, 0); - lblUpdateAdminInfo.Size = new System.Drawing.Size(610, 30); - lblUpdateAdminInfo.TabIndex = 0; - lblUpdateAdminInfo.Text = "Some settings are configured by your Administrator. Please contact your administrator for more information."; - lblUpdateAdminInfo.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; // // UpdatesPage // @@ -397,7 +398,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages private System.Windows.Forms.TableLayoutPanel tblProxyBasic; private System.Windows.Forms.TableLayoutPanel tblProxyAuthentication; private System.Windows.Forms.Panel pnlDefaultUpdate; - internal System.Windows.Forms.Label lblUpdateAdminInfo; + internal System.Windows.Forms.Label lblRegistrySettingsUsedInfo; internal MrngComboBox cboUpdateCheckFrequency; } } \ No newline at end of file diff --git a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.cs b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.cs index 9f1951c8..d4c8966d 100644 --- a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.cs +++ b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.cs @@ -21,7 +21,6 @@ namespace mRemoteNG.UI.Forms.OptionsPages private AppUpdater _appUpdate; private readonly OptRegistryUpdatesPage _RegistrySettings = new(); - private bool _pageEnabled = true; #endregion @@ -62,69 +61,22 @@ namespace mRemoteNG.UI.Forms.OptionsPages btnTestProxy.Text = Language.TestProxy; - lblUpdateAdminInfo.Text = Language.OptionsAdminInfo; + lblRegistrySettingsUsedInfo.Text = Language.OptionsCompanyPolicyMessage; } public override void LoadSettings() { + // Checks the combination of the following registry settings: + // 1. AllowCheckForUpdates is false. + // 2. AllowCheckForUpdatesAutomatical and AllowCheckForUpdatesManual are false. + // 3. Disable page and stop processing at this point. if (UpdatesForbidden()) return; chkCheckForUpdatesOnStartup.Checked = Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup; - if (!_RegistrySettings.CheckForUpdatesFrequencyDays.IsKeyPresent) - cboUpdateCheckFrequency.Enabled = chkCheckForUpdatesOnStartup.Checked; - if (CommonRegistrySettings.AllowCheckForUpdatesAutomatical) - { - cboUpdateCheckFrequency.Items.Clear(); - int nDaily = cboUpdateCheckFrequency.Items.Add(Language.Daily); - int nWeekly = cboUpdateCheckFrequency.Items.Add(Language.Weekly); - int nMonthly = cboUpdateCheckFrequency.Items.Add(Language.Monthly); - if (Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays < 1) - { - chkCheckForUpdatesOnStartup.Checked = false; - cboUpdateCheckFrequency.SelectedIndex = nDaily; - } // Daily - else - { - switch (Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays) - { - case 1: - cboUpdateCheckFrequency.SelectedIndex = nDaily; - break; - case 7: - cboUpdateCheckFrequency.SelectedIndex = nWeekly; - break; - case 31: - cboUpdateCheckFrequency.SelectedIndex = nMonthly; - break; - default: - int nCustom = - cboUpdateCheckFrequency.Items.Add(string.Format(Language.UpdateFrequencyCustom, Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays)); - cboUpdateCheckFrequency.SelectedIndex = nCustom; - break; - } - } - } - - int stable = cboReleaseChannel.Items.Add(UpdateChannelInfo.STABLE); - int beta = cboReleaseChannel.Items.Add(UpdateChannelInfo.PREVIEW); - int dev = cboReleaseChannel.Items.Add(UpdateChannelInfo.NIGHTLY); - switch (Properties.OptionsUpdatesPage.Default.UpdateChannel) - { - case UpdateChannelInfo.STABLE: - cboReleaseChannel.SelectedIndex = stable; - break; - case UpdateChannelInfo.PREVIEW: - cboReleaseChannel.SelectedIndex = beta; - break; - case UpdateChannelInfo.NIGHTLY: - cboReleaseChannel.SelectedIndex = dev; - break; - default: - cboReleaseChannel.SelectedIndex = stable; - break; - } + InitialiseCheckForUpdatesOnStartupComboBox(); + InitialiseReleaseChannelComboBox(); chkUseProxyForAutomaticUpdates.Checked = Properties.OptionsUpdatesPage.Default.UpdateUseProxy; tblProxyBasic.Enabled = Properties.OptionsUpdatesPage.Default.UpdateUseProxy; @@ -145,19 +97,29 @@ namespace mRemoteNG.UI.Forms.OptionsPages { base.SaveSettings(); + // Checks the combination of the following registry settings: + // 1. AllowCheckForUpdates is false. + // 2. AllowCheckForUpdatesAutomatical and AllowCheckForUpdatesManual are false. + // 3. Disable page and stop processing at this point. if (UpdatesForbidden()) return; Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup = chkCheckForUpdatesOnStartup.Checked; - if (cboUpdateCheckFrequency.SelectedItem.ToString() == Language.Daily) + + string UpdateCheckFrequency = cboUpdateCheckFrequency.SelectedItem?.ToString(); + if (UpdateCheckFrequency == Language.Never) + { + Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup = false; + } + if (UpdateCheckFrequency == Language.Daily) { Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays = 1; } - else if (cboUpdateCheckFrequency.SelectedItem.ToString() == Language.Weekly) + else if (UpdateCheckFrequency == Language.Weekly) { Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays = 7; } - else if (cboUpdateCheckFrequency.SelectedItem.ToString() == Language.Monthly) + else if (UpdateCheckFrequency == Language.Monthly) { Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays = 31; } @@ -176,9 +138,16 @@ namespace mRemoteNG.UI.Forms.OptionsPages public override void LoadRegistrySettings() { + // Checks the combination of the following registry settings: + // 1. AllowCheckForUpdates is false. + // 2. AllowCheckForUpdatesAutomatical and AllowCheckForUpdatesManual are false. + // 3. Disable page and stop processing at this point. if (UpdatesForbidden()) return; + // AllowCheckForUpdatesAutomatical reg setting: + // 1. Allowed/default: true; Disabled: false. + // 2. Disable the option "check for updates on startup". if (!CommonRegistrySettings.AllowCheckForUpdatesAutomatical) { Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup = false; @@ -186,87 +155,134 @@ namespace mRemoteNG.UI.Forms.OptionsPages DisableControl(cboUpdateCheckFrequency); } - if (_RegistrySettings.CheckForUpdatesFrequencyDays.IsKeyPresent && _RegistrySettings.CheckForUpdatesFrequencyDays.Value >= 1) + // CheckForUpdatesFrequencyDays reg setting: + // 1. Is 0 or less, than CheckForUpdatesOnStartup will be disabled. + // 2. Is Valid than set CheckForUpdatesFrequencyDays option based on value. + if (CommonRegistrySettings.AllowCheckForUpdatesAutomatical && _RegistrySettings.CheckForUpdatesFrequencyDays.IsSet) { - Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays = _RegistrySettings.CheckForUpdatesFrequencyDays.Value; - DisableControl(cboUpdateCheckFrequency); + if (_RegistrySettings.CheckForUpdatesFrequencyDays.Value < 0) + { + Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup = false; + DisableControl(chkCheckForUpdatesOnStartup); + } + else if (_RegistrySettings.CheckForUpdatesFrequencyDays.IsValid) + { + Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup = true; + DisableControl(chkCheckForUpdatesOnStartup); + + Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays = _RegistrySettings.CheckForUpdatesFrequencyDays.Value; + DisableControl(cboUpdateCheckFrequency); + } } + // Enable or disable the "Update Check" button if allowed or not. btnUpdateCheckNow.Enabled = CommonRegistrySettings.AllowCheckForUpdatesManual; - if (_RegistrySettings.UpdateChannel.IsKeyPresent) + // UpdateChannel reg setting: set UpdateChannel option based on value + if (_RegistrySettings.UpdateChannel.IsValid) { Properties.OptionsUpdatesPage.Default.UpdateChannel = _RegistrySettings.UpdateChannel.Value; DisableControl(cboReleaseChannel); } - if (_RegistrySettings.UseProxyForUpdates.IsKeyPresent) + // UseProxyForUpdates reg setting: set UseProxyForUpdates option based on value + // 1. Continues with the options checks for "ProxyAddress" and "ProxyPort" + // 2. Moved on to the "UseProxyAuthentication" options if true + if (_RegistrySettings.UseProxyForUpdates.IsSet) { - Properties.OptionsUpdatesPage.Default.UpdateUseProxy = _RegistrySettings.UseProxyForUpdates.Value; + bool UseProxy = _RegistrySettings.UseProxyForUpdates.Value; + Properties.OptionsUpdatesPage.Default.UpdateUseProxy = UseProxy; DisableControl(chkUseProxyForAutomaticUpdates); - if (_RegistrySettings.UseProxyForUpdates.Value == false) + // If the proxy is not used, reset the proxy address, port, and authentication settings to defaults. + if (!UseProxy) { Properties.OptionsUpdatesPage.Default.UpdateProxyAddress = ""; Properties.OptionsUpdatesPage.Default.UpdateProxyPort = 80; + Properties.OptionsUpdatesPage.Default.UpdateProxyUseAuthentication = false; } - if (_RegistrySettings.ProxyAddress.IsKeyPresent && _RegistrySettings.UseProxyForUpdates.Value == true) + // ProxyAddress reg setting: set ProxyAddress option based on value + if (_RegistrySettings.ProxyAddress.IsSet && UseProxy) { Properties.OptionsUpdatesPage.Default.UpdateProxyAddress = _RegistrySettings.ProxyAddress.Value; DisableControl(txtProxyAddress); } - if (_RegistrySettings.ProxyPort.IsKeyPresent && _RegistrySettings.UseProxyForUpdates.Value == true) + // ProxyPort reg setting: set ProxyPort option based on value + if (_RegistrySettings.ProxyPort.IsSet && UseProxy) { - // only set value if not is 0 to prevent errors.. - if (_RegistrySettings.ProxyPort.Value >= 1) + _RegistrySettings.ProxyPort.SetValidation((int)numProxyPort.Minimum, (int)numProxyPort.Maximum); + if (_RegistrySettings.ProxyPort.IsValid) + { Properties.OptionsUpdatesPage.Default.UpdateProxyPort = _RegistrySettings.ProxyPort.Value; - - DisableControl(numProxyPort); + DisableControl(numProxyPort); + } } } - if (_RegistrySettings.UseProxyAuthentication.IsKeyPresent) + // UseProxyAuthentication reg setting: set UseProxyAuthentication option based on value + // 1. Only applied when UpdateUseProxy is true + // 2. Continues with the options checks for "ProxyAuthUser" and "ProxyAuthPass" + if (Properties.OptionsUpdatesPage.Default.UpdateUseProxy && _RegistrySettings.UseProxyAuthentication.IsSet) { - Properties.OptionsUpdatesPage.Default.UpdateProxyUseAuthentication = _RegistrySettings.UseProxyAuthentication.Value; + bool UseProxyAuth = _RegistrySettings.UseProxyAuthentication.Value; + Properties.OptionsUpdatesPage.Default.UpdateProxyUseAuthentication = UseProxyAuth; DisableControl(chkUseProxyAuthentication); - if (_RegistrySettings.UseProxyAuthentication.Value == false) + // If proxy authentication is not used, reset the proxy authentication username and password to defaults. + if (!UseProxyAuth) { Properties.OptionsUpdatesPage.Default.UpdateProxyAuthUser = ""; - //Properties.OptionsUpdatesPage.Default.UpdateProxyAuthPass = ""; + Properties.OptionsUpdatesPage.Default.UpdateProxyAuthPass = ""; } - if (_RegistrySettings.ProxyAuthUser.IsKeyPresent && _RegistrySettings.UseProxyAuthentication.Value == true) + // ProxyAuthUser reg setting: set ProxyAuthUser option based on value + if (_RegistrySettings.ProxyAuthUser.IsSet && UseProxyAuth) { Properties.OptionsUpdatesPage.Default.UpdateProxyAuthUser = _RegistrySettings.ProxyAuthUser.Value; DisableControl(txtProxyUsername); } - /*if (_RegistrySettings.ProxyAuthPass.IsProvided && _RegistrySettings.UseProxyAuthentication.Value == true) + // ProxyAuthPass reg setting: + // 1. Test decription works to prevents potential issues + // 2. Set ProxyAuthPass option based on value + if (_RegistrySettings.ProxyAuthPass.IsSet && UseProxyAuth) { - Properties.OptionsUpdatesPage.Default.UpdateProxyAuthPass = _RegistrySettings.ProxyAuthPass; - DisableControl(txtProxyPassword); - }*/ + // Prevents potential issues when using UpdateProxyAuthPass later. + try + { + LegacyRijndaelCryptographyProvider cryptographyProvider = new(); + string decryptedPassword; + string ProxyAuthPass = _RegistrySettings.ProxyAuthPass.Value; + decryptedPassword = cryptographyProvider.Decrypt(ProxyAuthPass, Runtime.EncryptionKey); + + Properties.OptionsUpdatesPage.Default.UpdateProxyAuthPass = ProxyAuthPass; + DisableControl(txtProxyPassword); + } + catch + { + // Fire-and-forget: The password in the registry is not encrypted. + } + } } - - - lblUpdateAdminInfo.Visible = ShowAdministratorInfo(); + // Updates the visibility of the information label indicating whether registry settings are used. + lblRegistrySettingsUsedInfo.Visible = ShowRegistrySettingsUsedInfo(); } - public override bool ShowAdministratorInfo() + public override bool ShowRegistrySettingsUsedInfo() { return !CommonRegistrySettings.AllowCheckForUpdatesAutomatical || !CommonRegistrySettings.AllowCheckForUpdatesManual - || _RegistrySettings.CheckForUpdatesFrequencyDays.IsKeyPresent - || _RegistrySettings.UpdateChannel.IsKeyPresent - || _RegistrySettings.UseProxyForUpdates.IsKeyPresent - || _RegistrySettings.ProxyAddress.IsKeyPresent - || _RegistrySettings.ProxyPort.IsKeyPresent - || _RegistrySettings.UseProxyAuthentication.IsKeyPresent - || _RegistrySettings.ProxyAuthUser.IsKeyPresent; + || _RegistrySettings.CheckForUpdatesFrequencyDays.IsSet + || _RegistrySettings.UpdateChannel.IsValid + || _RegistrySettings.UseProxyForUpdates.IsSet + || _RegistrySettings.ProxyAddress.IsSet + || _RegistrySettings.ProxyPort.IsValid + || _RegistrySettings.UseProxyAuthentication.IsSet + || _RegistrySettings.ProxyAuthUser.IsSet + || _RegistrySettings.ProxyAuthPass.IsSet; } #endregion @@ -275,8 +291,10 @@ namespace mRemoteNG.UI.Forms.OptionsPages private void chkCheckForUpdatesOnStartup_CheckedChanged(object sender, EventArgs e) { - if (!_RegistrySettings.CheckForUpdatesFrequencyDays.IsKeyPresent) + if (!_RegistrySettings.CheckForUpdatesFrequencyDays.IsValid) cboUpdateCheckFrequency.Enabled = chkCheckForUpdatesOnStartup.Checked; + + InitialiseCheckForUpdatesOnStartupComboBox(); } private void btnUpdateCheckNow_Click(object sender, EventArgs e) @@ -286,24 +304,16 @@ namespace mRemoteNG.UI.Forms.OptionsPages private void chkUseProxyForAutomaticUpdates_CheckedChanged(object sender, EventArgs e) { - tblProxyBasic.Enabled = chkUseProxyForAutomaticUpdates.Checked; - btnTestProxy.Enabled = chkUseProxyForAutomaticUpdates.Checked; + // Enables/disables proxy settings controls + bool useProxy = chkUseProxyForAutomaticUpdates.Checked; + tblProxyBasic.Enabled = useProxy; + btnTestProxy.Enabled = useProxy; - if (chkUseProxyForAutomaticUpdates.Checked) - { - if (!_RegistrySettings.UseProxyForUpdates.IsKeyPresent) - chkUseProxyAuthentication.Enabled = true; - - if (chkUseProxyAuthentication.Checked && !_RegistrySettings.UseProxyAuthentication.IsKeyPresent) - { - tblProxyAuthentication.Enabled = true; - } - } - else - { - chkUseProxyAuthentication.Enabled = false; - tblProxyAuthentication.Enabled = false; - } + // Enables/disables proxy authentication controls + bool useProxyAuth = chkUseProxyAuthentication.Checked; + bool useProxyAuthRegIsSet = _RegistrySettings.UseProxyAuthentication.IsSet; + chkUseProxyAuthentication.Enabled = useProxy && !useProxyAuthRegIsSet; + tblProxyAuthentication.Enabled = useProxy && useProxyAuth && !useProxyAuthRegIsSet; } private async void btnTestProxy_Click(object sender, EventArgs e) @@ -348,23 +358,116 @@ namespace mRemoteNG.UI.Forms.OptionsPages private void chkUseProxyAuthentication_CheckedChanged(object sender, EventArgs e) { if (chkUseProxyForAutomaticUpdates.Checked) - { tblProxyAuthentication.Enabled = chkUseProxyAuthentication.Checked; + } + + #endregion + + #region Private Methods + + /// + /// Initializes the update check frequency ComboBox. + /// + /// + /// Clears existing items, adds default options (Daily, Weekly, Monthly), and sets the selected option + /// based on the saved frequency. If the saved frequency is less than 1, adds and selects "Never". + /// + private void InitialiseCheckForUpdatesOnStartupComboBox() + { + cboUpdateCheckFrequency.Items.Clear(); + int nDaily = cboUpdateCheckFrequency.Items.Add(Language.Daily); + int nWeekly = cboUpdateCheckFrequency.Items.Add(Language.Weekly); + int nMonthly = cboUpdateCheckFrequency.Items.Add(Language.Monthly); + if (Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays < 1) + { + chkCheckForUpdatesOnStartup.Checked = false; + Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup = false; + + int nNever = cboUpdateCheckFrequency.Items.Add(Language.Never); + cboUpdateCheckFrequency.SelectedIndex = nNever; + } + else if (!chkCheckForUpdatesOnStartup.Checked) + { + int nNever = cboUpdateCheckFrequency.Items.Add(Language.Never); + cboUpdateCheckFrequency.SelectedIndex = nNever; + } + else + { + switch (Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays) + { + case 1: + cboUpdateCheckFrequency.SelectedIndex = nDaily; + break; + case 7: + cboUpdateCheckFrequency.SelectedIndex = nWeekly; + break; + case 31: + cboUpdateCheckFrequency.SelectedIndex = nMonthly; + break; + default: + int nCustom = + cboUpdateCheckFrequency.Items.Add(string.Format(Language.UpdateFrequencyCustom, Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays)); + cboUpdateCheckFrequency.SelectedIndex = nCustom; + break; + } } } + + /// + /// Initializes the release channel ComboBox + /// + /// + /// Set available options (STABLE, PREVIEW, NIGHTLY) and selects the appropriate channel based on saved settings + /// + private void InitialiseReleaseChannelComboBox() + { + cboReleaseChannel.Items.Clear(); + int stable = cboReleaseChannel.Items.Add(UpdateChannelInfo.STABLE); + int beta = cboReleaseChannel.Items.Add(UpdateChannelInfo.PREVIEW); + int dev = cboReleaseChannel.Items.Add(UpdateChannelInfo.NIGHTLY); + cboReleaseChannel.SelectedIndex = Properties.OptionsUpdatesPage.Default.UpdateChannel switch + { + UpdateChannelInfo.STABLE => stable, + UpdateChannelInfo.PREVIEW => beta, + UpdateChannelInfo.NIGHTLY => dev, + _ => stable, + }; + } + + /// + /// Determines if updates are forbidden based on registry settings. + /// + /// + /// True if updates are forbidden; otherwise, false. + /// private bool UpdatesForbidden() { - bool forbidden = !CommonRegistrySettings.AllowCheckForUpdates + bool disablePage = !CommonRegistrySettings.AllowCheckForUpdates || (!CommonRegistrySettings.AllowCheckForUpdatesAutomatical && !CommonRegistrySettings.AllowCheckForUpdatesManual); - if (forbidden && _pageEnabled) + if (disablePage) + { DisablePage(); - return forbidden; + // Ensure the UI (CheckFrequency ComboBox) appears correct when disabled + cboUpdateCheckFrequency.Items.Clear(); + int nNever = cboUpdateCheckFrequency.Items.Add(Language.Never); + cboUpdateCheckFrequency.SelectedIndex = nNever; + + // Ensure the UI (ReleaseChannel ComboBox) appears correct when disabled + cboReleaseChannel.Items.Clear(); + int stable = cboReleaseChannel.Items.Add(UpdateChannelInfo.STABLE); + cboReleaseChannel.SelectedIndex = stable; + } + + return disablePage; } + /// + /// Disables all controls on the page related to update settings and proxy configurations. + /// public override void DisablePage() { chkCheckForUpdatesOnStartup.Checked = false; @@ -391,9 +494,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages txtProxyPassword.ReadOnly = true; btnTestProxy.Enabled = false; - lblUpdateAdminInfo.Visible = true; - - _pageEnabled = false; + lblRegistrySettingsUsedInfo.Visible = true; } #endregion diff --git a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.resx b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.resx index 5b46216f..af32865e 100644 --- a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.resx +++ b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.resx @@ -117,7 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - \ No newline at end of file diff --git a/mRemoteNG/UI/Forms/frmMain.cs b/mRemoteNG/UI/Forms/frmMain.cs index 9a58d803..84b4c54e 100644 --- a/mRemoteNG/UI/Forms/frmMain.cs +++ b/mRemoteNG/UI/Forms/frmMain.cs @@ -377,6 +377,7 @@ namespace mRemoteNG.UI.Forms if (!CommonRegistrySettings.AllowCheckForUpdatesAutomatical) return; if (!Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup) return; + if (Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays == 0) return; DateTime nextUpdateCheck = Convert.ToDateTime(Properties.OptionsUpdatesPage.Default.CheckForUpdatesLastCheck.Add(TimeSpan.FromDays(Convert.ToDouble(Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays))));