From 093370081e2bfa85b5e6d29aea7c8d8a7bbc3cb1 Mon Sep 17 00:00:00 2001 From: Schmitti91 Date: Tue, 23 Jan 2024 16:14:36 +0100 Subject: [PATCH] Add capability to set Update Settings via Registry This commit enhances the functionality of the WindowsRegistryAdvanced class to provide the capability to set up Update Settings through the Windows Registry. The changes include the addition of methods or modifications that allow users to configure update-related settings using the Registry. --- mRemoteNG/App/Info/WindowsRegistryInfo.cs | 21 ++ .../Registry/CommonRegistrySettings.cs | 62 +++++ .../Registry/OptRegistryUpdatesPage.cs | 86 +++++++ mRemoteNG/Language/Language.Designer.cs | 9 + mRemoteNG/Language/Language.de.resx | 3 + mRemoteNG/Language/Language.resx | 3 + .../UI/Forms/OptionsPages/OptionsPage.cs | 31 +++ .../OptionsPages/UpdatesPage.Designer.cs | 92 +++++--- .../UI/Forms/OptionsPages/UpdatesPage.cs | 214 +++++++++++++++--- .../UI/Forms/OptionsPages/UpdatesPage.resx | 65 +++++- mRemoteNG/UI/Forms/frmMain.cs | 8 + mRemoteNG/UI/Forms/frmOptions.cs | 1 + mRemoteNG/UI/Menu/msMain/HelpMenu.cs | 3 + 13 files changed, 540 insertions(+), 58 deletions(-) create mode 100644 mRemoteNG/App/Info/WindowsRegistryInfo.cs create mode 100644 mRemoteNG/Config/Settings/Registry/CommonRegistrySettings.cs create mode 100644 mRemoteNG/Config/Settings/Registry/OptRegistryUpdatesPage.cs diff --git a/mRemoteNG/App/Info/WindowsRegistryInfo.cs b/mRemoteNG/App/Info/WindowsRegistryInfo.cs new file mode 100644 index 000000000..0ecd22a14 --- /dev/null +++ b/mRemoteNG/App/Info/WindowsRegistryInfo.cs @@ -0,0 +1,21 @@ +using Microsoft.Win32; +using System.Runtime.Versioning; + +namespace mRemoteNG.App.Info +{ + [SupportedOSPlatform("windows")] + public static class WindowsRegistryInfo + { + #region general parameters + public const RegistryHive Hive = RegistryHive.LocalMachine; + public const string RootKey = "SOFTWARE\\mRemoteNG"; + #endregion + + #region subkey location parameters + + // Updates + public const string UpdateSubkey = RootKey + "\\Updates"; // Registry subkey for general update settings + public const string UpdateOptionsSubkey = RootKey + "\\Updates\\Options"; // Registry subkey for update options within the update settings + #endregion + } +} \ No newline at end of file diff --git a/mRemoteNG/Config/Settings/Registry/CommonRegistrySettings.cs b/mRemoteNG/Config/Settings/Registry/CommonRegistrySettings.cs new file mode 100644 index 000000000..21d980fc4 --- /dev/null +++ b/mRemoteNG/Config/Settings/Registry/CommonRegistrySettings.cs @@ -0,0 +1,62 @@ +using Microsoft.Win32; +using System.Runtime.Versioning; +using mRemoteNG.App.Info; +using mRemoteNG.Tools.WindowsRegistry; + +namespace mRemoteNG.Config.Settings.Registry +{ + [SupportedOSPlatform("windows")] + /// Static utility class that provides access to and management of registry settings on the local machine. + /// It abstracts complex registry operations and centralizes the handling of various registry keys. + /// Benefits: Simplified code, enhances maintainability, and ensures consistency. #ReadOnly + public static class CommonRegistrySettings + { + private static readonly IRegistryAdvancedRead _WindowsRegistry = new WindowsRegistryAdvanced(); + private static readonly RegistryHive _Hive = WindowsRegistryInfo.Hive; + + private const string __Update = WindowsRegistryInfo.UpdateSubkey; + private const string __Credential = WindowsRegistryInfo.CredentialSubkey; + + #region general update registry settings + /// + /// Indicates whether searching for updates is allowed. If false, there is no way to update directly from mRemoteNG. + /// + /// + /// Default value is true, which allows check for updates. + /// If the registry key is set to true, no action will be taken because the key is not needed. + /// + public static bool AllowCheckForUpdates { get; } = _WindowsRegistry.GetBoolValue(_Hive, __Update, nameof(AllowCheckForUpdates), true); + + /// + /// Indicates whether automatic search for updates is allowed. + /// + /// + /// Default value is true, which allows check for updates automaticaly. + /// If the registry key is set to true, no action will be taken because the key is not needed. + /// Important: If AllowCheckForUpdates is false, the default for this value (AllowCheckForUpdatesAutomatical) is also false, manual update checks are disabled. + /// + public static bool AllowCheckForUpdatesAutomatical { get; } = _WindowsRegistry.GetBoolValue(_Hive, __Update, nameof(AllowCheckForUpdatesAutomatical), AllowCheckForUpdates); + + /// + /// Indicates whether a manual search for updates is allowed. + /// + /// + /// The default value is true, enabling the manual check for updates. + /// If the registry key is set to true, no action will be taken because the key is not needed. + /// Important: If AllowCheckForUpdates is false, the default for this value (AllowCheckForUpdatesManual) is also false, manual update checks are disabled. + /// + public static bool AllowCheckForUpdatesManual { get; } = _WindowsRegistry.GetBoolValue(_Hive, __Update, nameof(AllowCheckForUpdatesManual), AllowCheckForUpdates); + + /// + /// Specifies whether a question about checking for updates is displayed at startup. + /// + /// + /// Important: If the registry entry is set to true, a popup will appear every time you start + /// + public static bool CheckForUpdatesAsked { get; } = _WindowsRegistry.GetBoolValue(_Hive, __Update, nameof(CheckForUpdatesAsked)); + #endregion + + + + } +} \ No newline at end of file diff --git a/mRemoteNG/Config/Settings/Registry/OptRegistryUpdatesPage.cs b/mRemoteNG/Config/Settings/Registry/OptRegistryUpdatesPage.cs new file mode 100644 index 000000000..18a623c26 --- /dev/null +++ b/mRemoteNG/Config/Settings/Registry/OptRegistryUpdatesPage.cs @@ -0,0 +1,86 @@ +using System.Runtime.Versioning; +using Microsoft.Win32; +using mRemoteNG.App.Info; +using mRemoteNG.Tools.WindowsRegistry; + +namespace mRemoteNG.Config.Settings.Registry +{ + [SupportedOSPlatform("windows")] + /// Static utility class that provides access to and management of registry settings on the local machine. + /// It abstracts complex registry operations and centralizes the handling of various registry keys. + /// Benefits: Simplified code, enhances maintainability, and ensures consistency. #ReadOnly + public sealed partial class OptRegistryUpdatesPage : WindowsRegistryAdvanced + { + /// + /// Specifies the number of days between update checks. + /// + public WindowsRegistryKeyInteger CheckForUpdatesFrequencyDays { get; } + + /// + /// Specifies the update channel for updates. + /// + /// + /// The update channel should be one of the predefined values: Stable, Preview, Nightly. + /// + public WindowsRegistryKeyString UpdateChannel { get; } + + /// + /// Indicates whether proxy usage for updates is enabled. + /// + public WindowsRegistryKeyBoolean UseProxyForUpdates { get; } + + /// + /// Specifies the proxy address for updates. + /// + public WindowsRegistryKeyString ProxyAddress { get; } + + /// + /// Specifies the proxy port for updates. + /// + public WindowsRegistryKeyInteger ProxyPort { get; } + + /// + /// Indicates whether proxy authentication is enabled. + /// + public WindowsRegistryKeyBoolean UseProxyAuthentication { get; } + + /// + /// Specifies the authentication username for the proxy. + /// + public WindowsRegistryKeyString ProxyAuthUser { get; } + + /// + /// Specifies the authentication password for the proxy. + /// + /// + /// Please only store encrypted passwords in the registry by using the password generator on the 'Credentials' options page. + /// + public string ProxyAuthPass { get; } + + public OptRegistryUpdatesPage() + { + RegistryHive hive = WindowsRegistryInfo.Hive; + string subKey = WindowsRegistryInfo.UpdateOptionsSubkey; + + CheckForUpdatesFrequencyDays = GetInteger(hive, subKey, nameof(CheckForUpdatesFrequencyDays)); + + UpdateChannel = GetStringValidated(hive, subKey, nameof(UpdateChannel), + new string[] { + UpdateChannelInfo.STABLE, + UpdateChannelInfo.PREVIEW, + UpdateChannelInfo.NIGHTLY + } + ,true + ); + + UseProxyForUpdates = GetBoolean(hive, subKey, nameof(UseProxyForUpdates)); + ProxyAddress = GetString(hive, subKey, nameof(ProxyAddress), null); + ProxyPort = GetInteger(hive, subKey, nameof(ProxyPort)); + + UseProxyAuthentication = GetBoolean(hive, subKey, nameof(UseProxyAuthentication)); + ProxyAuthUser = GetString(hive, subKey, nameof(ProxyAuthUser), null); + //Currently not supported: + //ProxyAuthPass = GetPassword(Hive, _SubKey, nameof(ProxyAuthPass)); + } + } +} \ No newline at end of file diff --git a/mRemoteNG/Language/Language.Designer.cs b/mRemoteNG/Language/Language.Designer.cs index 02c057514..cedf95c73 100644 --- a/mRemoteNG/Language/Language.Designer.cs +++ b/mRemoteNG/Language/Language.Designer.cs @@ -3387,6 +3387,15 @@ 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 { + get { + return ResourceManager.GetString("OptionsAdminInfo", resourceCulture); + } + } + /// /// Looks up a localized string similar to mRemoteNG Options. /// diff --git a/mRemoteNG/Language/Language.de.resx b/mRemoteNG/Language/Language.de.resx index 0a6f70594..db19159e4 100644 --- a/mRemoteNG/Language/Language.de.resx +++ b/mRemoteNG/Language/Language.de.resx @@ -2047,4 +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 5b7aa5945..eba84d393 100644 --- a/mRemoteNG/Language/Language.resx +++ b/mRemoteNG/Language/Language.resx @@ -2362,4 +2362,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/OptionsPage.cs b/mRemoteNG/UI/Forms/OptionsPages/OptionsPage.cs index 80ec17810..b5e03a5e6 100644 --- a/mRemoteNG/UI/Forms/OptionsPages/OptionsPage.cs +++ b/mRemoteNG/UI/Forms/OptionsPages/OptionsPage.cs @@ -42,6 +42,16 @@ namespace mRemoteNG.UI.Forms.OptionsPages public virtual void RevertSettings() { } + public virtual void LoadRegistrySettings() + { + } + public virtual bool ShowAdministratorInfo() + { + return false; + } + public virtual void DisablePage() + { + } #endregion @@ -65,6 +75,27 @@ namespace mRemoteNG.UI.Forms.OptionsPages Name = "OptionsPage"; ResumeLayout(false); } + + /// + /// Disables the specified control by setting its Enabled property to false. + /// For TextBox controls, additionally sets the ReadOnly property based on the Enabled state. + /// Does nothing if the control is null. + /// + /// The control to be disabled. + protected static void DisableControl(Control control) + { + if (control == null) return; + + control.Enabled = false; + + if (control is TextBox) + { + // If it's a TextBox, set the ReadOnly property + ((TextBox)control).ReadOnly = control.Enabled; + } + } + + } internal class DropdownList { diff --git a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.Designer.cs b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.Designer.cs index 34859d8c2..9aa1020d4 100644 --- a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.Designer.cs +++ b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.Designer.cs @@ -35,9 +35,9 @@ namespace mRemoteNG.UI.Forms.OptionsPages { lblUpdatesExplanation = new MrngLabel(); pnlUpdateCheck = new System.Windows.Forms.Panel(); + cboUpdateCheckFrequency = new MrngComboBox(); btnUpdateCheckNow = new MrngButton(); chkCheckForUpdatesOnStartup = new MrngCheckBox(); - cboUpdateCheckFrequency = new MrngComboBox(); lblReleaseChannelExplanation = new MrngTextBox(); cboReleaseChannel = new MrngComboBox(); pnlProxy = new System.Windows.Forms.Panel(); @@ -55,36 +55,53 @@ namespace mRemoteNG.UI.Forms.OptionsPages chkUseProxyAuthentication = new MrngCheckBox(); btnTestProxy = new MrngButton(); groupBoxReleaseChannel = new MrngGroupBox(); + pnlDefaultUpdate = new System.Windows.Forms.Panel(); + lblUpdateAdminInfo = new System.Windows.Forms.Label(); pnlUpdateCheck.SuspendLayout(); pnlProxy.SuspendLayout(); tblProxyBasic.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)numProxyPort).BeginInit(); tblProxyAuthentication.SuspendLayout(); groupBoxReleaseChannel.SuspendLayout(); + pnlDefaultUpdate.SuspendLayout(); SuspendLayout(); // // lblUpdatesExplanation // - lblUpdatesExplanation.Location = new System.Drawing.Point(3, 3); + lblUpdatesExplanation.Dock = System.Windows.Forms.DockStyle.Top; + lblUpdatesExplanation.Location = new System.Drawing.Point(0, 0); lblUpdatesExplanation.Name = "lblUpdatesExplanation"; - lblUpdatesExplanation.Size = new System.Drawing.Size(595, 32); + lblUpdatesExplanation.Padding = new System.Windows.Forms.Padding(3, 0, 0, 0); + lblUpdatesExplanation.Size = new System.Drawing.Size(610, 38); lblUpdatesExplanation.TabIndex = 0; lblUpdatesExplanation.Text = "mRemoteNG can periodically connect to the mRemoteNG website to check for updates."; // // pnlUpdateCheck // + pnlUpdateCheck.Controls.Add(cboUpdateCheckFrequency); pnlUpdateCheck.Controls.Add(btnUpdateCheckNow); pnlUpdateCheck.Controls.Add(chkCheckForUpdatesOnStartup); - pnlUpdateCheck.Controls.Add(cboUpdateCheckFrequency); - pnlUpdateCheck.Location = new System.Drawing.Point(3, 25); + pnlUpdateCheck.Controls.Add(lblUpdatesExplanation); + pnlUpdateCheck.Dock = System.Windows.Forms.DockStyle.Top; + pnlUpdateCheck.Location = new System.Drawing.Point(0, 30); pnlUpdateCheck.Name = "pnlUpdateCheck"; - pnlUpdateCheck.Size = new System.Drawing.Size(604, 99); - pnlUpdateCheck.TabIndex = 1; + pnlUpdateCheck.Size = new System.Drawing.Size(610, 114); + pnlUpdateCheck.TabIndex = 0; + // + // cboUpdateCheckFrequency + // + cboUpdateCheckFrequency._mice = MrngComboBox.MouseState.HOVER; + cboUpdateCheckFrequency.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + cboUpdateCheckFrequency.FormattingEnabled = true; + cboUpdateCheckFrequency.Location = new System.Drawing.Point(27, 44); + cboUpdateCheckFrequency.Name = "cboUpdateCheckFrequency"; + cboUpdateCheckFrequency.Size = new System.Drawing.Size(120, 21); + cboUpdateCheckFrequency.TabIndex = 1; // // btnUpdateCheckNow // btnUpdateCheckNow._mice = MrngButton.MouseState.OUT; - btnUpdateCheckNow.Location = new System.Drawing.Point(5, 63); + btnUpdateCheckNow.Location = new System.Drawing.Point(5, 79); btnUpdateCheckNow.Name = "btnUpdateCheckNow"; btnUpdateCheckNow.Size = new System.Drawing.Size(122, 25); btnUpdateCheckNow.TabIndex = 2; @@ -97,7 +114,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages chkCheckForUpdatesOnStartup._mice = MrngCheckBox.MouseState.OUT; chkCheckForUpdatesOnStartup.AutoSize = true; chkCheckForUpdatesOnStartup.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - chkCheckForUpdatesOnStartup.Location = new System.Drawing.Point(6, 11); + chkCheckForUpdatesOnStartup.Location = new System.Drawing.Point(9, 21); chkCheckForUpdatesOnStartup.Name = "chkCheckForUpdatesOnStartup"; chkCheckForUpdatesOnStartup.Size = new System.Drawing.Size(120, 17); chkCheckForUpdatesOnStartup.TabIndex = 0; @@ -105,16 +122,6 @@ namespace mRemoteNG.UI.Forms.OptionsPages chkCheckForUpdatesOnStartup.UseVisualStyleBackColor = true; chkCheckForUpdatesOnStartup.CheckedChanged += chkCheckForUpdatesOnStartup_CheckedChanged; // - // cboUpdateCheckFrequency - // - cboUpdateCheckFrequency._mice = MrngComboBox.MouseState.HOVER; - cboUpdateCheckFrequency.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - cboUpdateCheckFrequency.FormattingEnabled = true; - cboUpdateCheckFrequency.Location = new System.Drawing.Point(6, 34); - cboUpdateCheckFrequency.Name = "cboUpdateCheckFrequency"; - cboUpdateCheckFrequency.Size = new System.Drawing.Size(120, 21); - cboUpdateCheckFrequency.TabIndex = 1; - // // lblReleaseChannelExplanation // lblReleaseChannelExplanation.BackColor = System.Drawing.SystemColors.Control; @@ -145,9 +152,10 @@ namespace mRemoteNG.UI.Forms.OptionsPages pnlProxy.Controls.Add(chkUseProxyForAutomaticUpdates); pnlProxy.Controls.Add(chkUseProxyAuthentication); pnlProxy.Controls.Add(btnTestProxy); - pnlProxy.Location = new System.Drawing.Point(3, 240); + pnlProxy.Dock = System.Windows.Forms.DockStyle.Top; + pnlProxy.Location = new System.Drawing.Point(0, 248); pnlProxy.Name = "pnlProxy"; - pnlProxy.Size = new System.Drawing.Size(604, 223); + pnlProxy.Size = new System.Drawing.Size(610, 232); pnlProxy.TabIndex = 3; // // tblProxyBasic @@ -311,24 +319,47 @@ namespace mRemoteNG.UI.Forms.OptionsPages // groupBoxReleaseChannel.Controls.Add(lblReleaseChannelExplanation); groupBoxReleaseChannel.Controls.Add(cboReleaseChannel); - groupBoxReleaseChannel.Location = new System.Drawing.Point(3, 130); + groupBoxReleaseChannel.Dock = System.Windows.Forms.DockStyle.Top; + groupBoxReleaseChannel.Location = new System.Drawing.Point(0, 144); groupBoxReleaseChannel.Name = "groupBoxReleaseChannel"; - groupBoxReleaseChannel.Size = new System.Drawing.Size(604, 104); + groupBoxReleaseChannel.Size = new System.Drawing.Size(610, 104); groupBoxReleaseChannel.TabIndex = 3; groupBoxReleaseChannel.TabStop = false; groupBoxReleaseChannel.Text = "Release Channel"; // + // pnlDefaultUpdate + // + pnlDefaultUpdate.Controls.Add(pnlProxy); + pnlDefaultUpdate.Controls.Add(groupBoxReleaseChannel); + pnlDefaultUpdate.Controls.Add(pnlUpdateCheck); + pnlDefaultUpdate.Controls.Add(lblUpdateAdminInfo); + 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 + // + 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; + // // UpdatesPage // AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - Controls.Add(groupBoxReleaseChannel); - Controls.Add(lblUpdatesExplanation); - Controls.Add(pnlUpdateCheck); - Controls.Add(pnlProxy); + Controls.Add(pnlDefaultUpdate); Margin = new System.Windows.Forms.Padding(4); Name = "UpdatesPage"; - Size = new System.Drawing.Size(610, 490); + Size = new System.Drawing.Size(610, 496); pnlUpdateCheck.ResumeLayout(false); pnlUpdateCheck.PerformLayout(); pnlProxy.ResumeLayout(false); @@ -340,6 +371,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages tblProxyAuthentication.PerformLayout(); groupBoxReleaseChannel.ResumeLayout(false); groupBoxReleaseChannel.PerformLayout(); + pnlDefaultUpdate.ResumeLayout(false); ResumeLayout(false); } @@ -347,7 +379,6 @@ namespace mRemoteNG.UI.Forms.OptionsPages internal System.Windows.Forms.Panel pnlUpdateCheck; internal MrngButton btnUpdateCheckNow; internal MrngCheckBox chkCheckForUpdatesOnStartup; - internal MrngComboBox cboUpdateCheckFrequency; internal System.Windows.Forms.Panel pnlProxy; internal Controls.MrngLabel lblProxyAddress; internal Controls.MrngTextBox txtProxyAddress; @@ -365,5 +396,8 @@ namespace mRemoteNG.UI.Forms.OptionsPages private MrngGroupBox groupBoxReleaseChannel; 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 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 93c87d2a4..5cd9a0d43 100644 --- a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.cs +++ b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.cs @@ -10,6 +10,7 @@ using mRemoteNG.Tools; using mRemoteNG.UI.TaskDialog; using mRemoteNG.Resources.Language; using System.Runtime.Versioning; +using mRemoteNG.Config.Settings.Registry; namespace mRemoteNG.UI.Forms.OptionsPages { @@ -19,6 +20,8 @@ namespace mRemoteNG.UI.Forms.OptionsPages #region Private Fields private AppUpdater _appUpdate; + private readonly OptRegistryUpdatesPage _RegistrySettings = new(); + private bool _pageEnabled = true; #endregion @@ -58,39 +61,51 @@ namespace mRemoteNG.UI.Forms.OptionsPages lblProxyPassword.Text = Language.Password; btnTestProxy.Text = Language.TestProxy; + + lblUpdateAdminInfo.Text = Language.OptionsAdminInfo; } public override void LoadSettings() { + if (UpdatesForbidden()) + return; + chkCheckForUpdatesOnStartup.Checked = Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup; - cboUpdateCheckFrequency.Enabled = chkCheckForUpdatesOnStartup.Checked; - cboUpdateCheckFrequency.Items.Clear(); - var nDaily = cboUpdateCheckFrequency.Items.Add(Language.Daily); - var nWeekly = cboUpdateCheckFrequency.Items.Add(Language.Weekly); - var nMonthly = cboUpdateCheckFrequency.Items.Add(Language.Monthly); - if (Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays < 1) + if (!_RegistrySettings.CheckForUpdatesFrequencyDays.IsKeyPresent) + cboUpdateCheckFrequency.Enabled = chkCheckForUpdatesOnStartup.Checked; + + if (CommonRegistrySettings.AllowCheckForUpdatesAutomatical) { - chkCheckForUpdatesOnStartup.Checked = false; - cboUpdateCheckFrequency.SelectedIndex = nDaily; - } // Daily - else - switch (Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays) + cboUpdateCheckFrequency.Items.Clear(); + var nDaily = cboUpdateCheckFrequency.Items.Add(Language.Daily); + var nWeekly = cboUpdateCheckFrequency.Items.Add(Language.Weekly); + var nMonthly = cboUpdateCheckFrequency.Items.Add(Language.Monthly); + if (Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays < 1) { - case 1: - cboUpdateCheckFrequency.SelectedIndex = nDaily; - break; - case 7: - cboUpdateCheckFrequency.SelectedIndex = nWeekly; - break; - case 31: - cboUpdateCheckFrequency.SelectedIndex = nMonthly; - break; - default: - var nCustom = - cboUpdateCheckFrequency.Items.Add(string.Format(Language.UpdateFrequencyCustom, Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays)); - cboUpdateCheckFrequency.SelectedIndex = nCustom; - break; + 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: + var nCustom = + cboUpdateCheckFrequency.Items.Add(string.Format(Language.UpdateFrequencyCustom, Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays)); + cboUpdateCheckFrequency.SelectedIndex = nCustom; + break; + } } + } var stable = cboReleaseChannel.Items.Add(UpdateChannelInfo.STABLE); var beta = cboReleaseChannel.Items.Add(UpdateChannelInfo.PREVIEW); @@ -130,6 +145,9 @@ namespace mRemoteNG.UI.Forms.OptionsPages { base.SaveSettings(); + if (UpdatesForbidden()) + return; + Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup = chkCheckForUpdatesOnStartup.Checked; if (cboUpdateCheckFrequency.SelectedItem.ToString() == Language.Daily) { @@ -156,13 +174,109 @@ namespace mRemoteNG.UI.Forms.OptionsPages Properties.OptionsUpdatesPage.Default.UpdateProxyAuthPass = cryptographyProvider.Encrypt(txtProxyPassword.Text, Runtime.EncryptionKey); } + public override void LoadRegistrySettings() + { + if (UpdatesForbidden()) + return; + + if (!CommonRegistrySettings.AllowCheckForUpdatesAutomatical) + { + Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup = false; + DisableControl(chkCheckForUpdatesOnStartup); + DisableControl(cboUpdateCheckFrequency); + } + + if (_RegistrySettings.CheckForUpdatesFrequencyDays.IsKeyPresent && _RegistrySettings.CheckForUpdatesFrequencyDays.Value >= 1) + { + Properties.OptionsUpdatesPage.Default.CheckForUpdatesFrequencyDays = _RegistrySettings.CheckForUpdatesFrequencyDays.Value; + DisableControl(cboUpdateCheckFrequency); + } + + btnUpdateCheckNow.Enabled = CommonRegistrySettings.AllowCheckForUpdatesManual; + + if (_RegistrySettings.UpdateChannel.IsKeyPresent) + { + Properties.OptionsUpdatesPage.Default.UpdateChannel = _RegistrySettings.UpdateChannel.Value; + DisableControl(cboReleaseChannel); + } + + if (_RegistrySettings.UseProxyForUpdates.IsKeyPresent) + { + Properties.OptionsUpdatesPage.Default.UpdateUseProxy = _RegistrySettings.UseProxyForUpdates.Value; + DisableControl(chkUseProxyForAutomaticUpdates); + + if (_RegistrySettings.UseProxyForUpdates.Value == false) + { + Properties.OptionsUpdatesPage.Default.UpdateProxyAddress = ""; + Properties.OptionsUpdatesPage.Default.UpdateProxyPort = 80; + } + + if (_RegistrySettings.ProxyAddress.IsKeyPresent && _RegistrySettings.UseProxyForUpdates.Value == true) + { + Properties.OptionsUpdatesPage.Default.UpdateProxyAddress = _RegistrySettings.ProxyAddress.Value; + DisableControl(txtProxyAddress); + } + + if (_RegistrySettings.ProxyPort.IsKeyPresent && _RegistrySettings.UseProxyForUpdates.Value == true) + { + // only set value if not is 0 to prevent errors.. + if (_RegistrySettings.ProxyPort.Value >= 1) + Properties.OptionsUpdatesPage.Default.UpdateProxyPort = _RegistrySettings.ProxyPort.Value; + + DisableControl(numProxyPort); + } + } + + if (_RegistrySettings.UseProxyAuthentication.IsKeyPresent) + { + Properties.OptionsUpdatesPage.Default.UpdateProxyUseAuthentication = _RegistrySettings.UseProxyAuthentication.Value; + DisableControl(chkUseProxyAuthentication); + + if (_RegistrySettings.UseProxyAuthentication.Value == false) + { + Properties.OptionsUpdatesPage.Default.UpdateProxyAuthUser = ""; + //Properties.OptionsUpdatesPage.Default.UpdateProxyAuthPass = ""; + } + + if (_RegistrySettings.ProxyAuthUser.IsKeyPresent && _RegistrySettings.UseProxyAuthentication.Value == true) + { + Properties.OptionsUpdatesPage.Default.UpdateProxyAuthUser = _RegistrySettings.ProxyAuthUser.Value; + DisableControl(txtProxyUsername); + } + + /*if (_RegistrySettings.ProxyAuthPass.IsProvided && _RegistrySettings.UseProxyAuthentication.Value == true) + { + Properties.OptionsUpdatesPage.Default.UpdateProxyAuthPass = _RegistrySettings.ProxyAuthPass; + DisableControl(txtProxyPassword); + }*/ + } + + + + lblUpdateAdminInfo.Visible = ShowAdministratorInfo(); + } + + public override bool ShowAdministratorInfo() + { + 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; + } + #endregion #region Event Handlers private void chkCheckForUpdatesOnStartup_CheckedChanged(object sender, EventArgs e) { - cboUpdateCheckFrequency.Enabled = chkCheckForUpdatesOnStartup.Checked; + if (!_RegistrySettings.CheckForUpdatesFrequencyDays.IsKeyPresent) + cboUpdateCheckFrequency.Enabled = chkCheckForUpdatesOnStartup.Checked; } private void btnUpdateCheckNow_Click(object sender, EventArgs e) @@ -177,9 +291,10 @@ namespace mRemoteNG.UI.Forms.OptionsPages if (chkUseProxyForAutomaticUpdates.Checked) { - chkUseProxyAuthentication.Enabled = true; + if (!_RegistrySettings.UseProxyForUpdates.IsKeyPresent) + chkUseProxyAuthentication.Enabled = true; - if (chkUseProxyAuthentication.Checked) + if (chkUseProxyAuthentication.Checked && !_RegistrySettings.UseProxyAuthentication.IsKeyPresent) { tblProxyAuthentication.Enabled = true; } @@ -238,6 +353,49 @@ namespace mRemoteNG.UI.Forms.OptionsPages } } + private bool UpdatesForbidden() + { + bool forbidden = !CommonRegistrySettings.AllowCheckForUpdates + || (!CommonRegistrySettings.AllowCheckForUpdatesAutomatical + && !CommonRegistrySettings.AllowCheckForUpdatesManual); + + if (forbidden && _pageEnabled) + DisablePage(); + + return forbidden; + } + + public override void DisablePage() + { + chkCheckForUpdatesOnStartup.Checked = false; + chkCheckForUpdatesOnStartup.Enabled = false; + cboUpdateCheckFrequency.Enabled = false; + btnUpdateCheckNow.Enabled = false; + cboReleaseChannel.Enabled = false; + + chkUseProxyForAutomaticUpdates.Checked = false; + chkUseProxyForAutomaticUpdates.Enabled = false; + + tblProxyBasic.Enabled = false; + txtProxyAddress.Enabled = false; + txtProxyAddress.ReadOnly = true; + numProxyPort.Enabled = false; + + chkUseProxyAuthentication.Checked = false; + chkUseProxyAuthentication.Enabled = false; + + tblProxyAuthentication.Enabled = false; + txtProxyUsername.Enabled = false; + txtProxyUsername.ReadOnly = true; + txtProxyPassword.Enabled = false; + txtProxyPassword.ReadOnly = true; + btnTestProxy.Enabled = false; + + lblUpdateAdminInfo.Visible = true; + + _pageEnabled = false; + } + #endregion } } \ No newline at end of file diff --git a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.resx b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.resx index f298a7be8..5b46216f2 100644 --- a/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.resx +++ b/mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.resx @@ -1,4 +1,64 @@ - + + + @@ -57,4 +117,7 @@ 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 244bfcc5f..eee7f9f7a 100644 --- a/mRemoteNG/UI/Forms/frmMain.cs +++ b/mRemoteNG/UI/Forms/frmMain.cs @@ -33,6 +33,7 @@ using WeifenLuo.WinFormsUI.Docking; using mRemoteNG.UI.Controls; using mRemoteNG.Resources.Language; using System.Runtime.Versioning; +using mRemoteNG.Config.Settings.Registry; #endregion // ReSharper disable MemberCanBePrivate.Global @@ -345,6 +346,10 @@ namespace mRemoteNG.UI.Forms private void PromptForUpdatesPreference() { + if (!CommonRegistrySettings.AllowCheckForUpdates) return; + if (!CommonRegistrySettings.AllowCheckForUpdatesAutomatical) return; + if (CommonRegistrySettings.CheckForUpdatesAsked) return; + if (Properties.OptionsUpdatesPage.Default.CheckForUpdatesAsked) return; string[] commandButtons = { @@ -368,6 +373,9 @@ namespace mRemoteNG.UI.Forms private async Task CheckForUpdates() { + if (!CommonRegistrySettings.AllowCheckForUpdates) return; + if (!CommonRegistrySettings.AllowCheckForUpdatesAutomatical) return; + if (!Properties.OptionsUpdatesPage.Default.CheckForUpdatesOnStartup) return; var nextUpdateCheck = diff --git a/mRemoteNG/UI/Forms/frmOptions.cs b/mRemoteNG/UI/Forms/frmOptions.cs index 09257643a..fc4e97897 100644 --- a/mRemoteNG/UI/Forms/frmOptions.cs +++ b/mRemoteNG/UI/Forms/frmOptions.cs @@ -206,6 +206,7 @@ namespace mRemoteNG.UI.Forms if (page == null) return; page.ApplyLanguage(); + page.LoadRegistrySettings(); page.LoadSettings(); _optionPages.Add(page); lstOptionPages.AddObject(page); diff --git a/mRemoteNG/UI/Menu/msMain/HelpMenu.cs b/mRemoteNG/UI/Menu/msMain/HelpMenu.cs index c4675bd1a..5bb3bd830 100644 --- a/mRemoteNG/UI/Menu/msMain/HelpMenu.cs +++ b/mRemoteNG/UI/Menu/msMain/HelpMenu.cs @@ -6,6 +6,7 @@ using mRemoteNG.App.Info; using mRemoteNG.UI.Forms; using mRemoteNG.Resources.Language; using System.Runtime.Versioning; +using mRemoteNG.Config.Settings.Registry; namespace mRemoteNG.UI.Menu { @@ -78,6 +79,8 @@ namespace mRemoteNG.UI.Menu _mMenToolsUpdate.Size = new System.Drawing.Size(190, 22); _mMenToolsUpdate.Text = Language.CheckForUpdates; _mMenToolsUpdate.Click += mMenToolsUpdate_Click; + _mMenToolsUpdate.Enabled = CommonRegistrySettings.AllowCheckForUpdates + && CommonRegistrySettings.AllowCheckForUpdatesManual; // // mMenInfoSep1 //