using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Configuration; using System.Configuration.Provider; using System.IO; using System.Linq; using System.Text.RegularExpressions; namespace ScreenConnect; public class ApplicationSettingsProvider : SettingsProviderEx { public override void Initialize(string? name, NameValueCollection config) { ((ProviderBase)this).Initialize(name ?? ((object)this).GetType().Name, config); } public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection collection) { TryClickOnceUpgradeIfNeeded(); return SettingsProviderEx.GetPropertyValues(collection, SettingsProviderEx.GetPrioritizedConfigurationSectionInfos(context, GetPrioritizedConfigurationFileInfos())); } public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection) { SettingsProviderEx.WriteApplicablePropertyValuesToConfiguration(((IEnumerable?)collection).OfType(), SettingsProviderEx.GetPrioritizedConfigurationSectionInfos(context, GetPrioritizedConfigurationFileInfos())); } private static bool IsClickOnceDirectory(DirectoryInfo directoryInfo) { return Regex.IsMatch(directoryInfo.Name, "^.+_[0-9a-f]{16}_[0-9a-f]{4}\\.[0-9a-f]{4}_[0-9a-f]{16}$"); } private static void TryClickOnceUpgradeIfNeeded() { try { DirectoryInfo baseDirectory = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); if (File.Exists("user.config") || !IsClickOnceDirectory(baseDirectory)) { return; } foreach (DirectoryInfo item in from it in baseDirectory.Parent.SafePipe((DirectoryInfo it) => it.GetDirectories()).SafeEnumerate() where it.FullName != baseDirectory.FullName select it) { if (IsClickOnceDirectory(item)) { string text = Path.Combine(item.FullName, "user.config"); if (File.Exists(text)) { File.Copy(text, "user.config"); break; } } } } catch { } } private static IEnumerable GetPrioritizedConfigurationFileInfos() { DirectoryInfo baseDirectory = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); bool isClickOnce = IsClickOnceDirectory(baseDirectory); yield return new ConfigurationFileInfo(isClickOnce ? Path.Combine(baseDirectory.FullName, "user.config") : Extensions.CombinePaths(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), baseDirectory.Name, "user.config"), IsWriteable: true, IsTrustworthy: true); if (!isClickOnce) { yield return new ConfigurationFileInfo(Extensions.CombinePaths(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), baseDirectory.Name, "user.config"), IsWriteable: false, IsTrustworthy: false); } yield return new ConfigurationFileInfo(Path.Combine(baseDirectory.FullName, "app.config"), IsWriteable: false, IsTrustworthy: true); yield return new ConfigurationFileInfo(Path.Combine(baseDirectory.FullName, "system.config"), IsWriteable: false, IsTrustworthy: true); } }