/*
* Copyright (c) 2023 Proton AG
*
* This file is part of ProtonVPN.
*
* ProtonVPN is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ProtonVPN is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ProtonVPN. If not, see .
*/
using System.Collections;
using System.Text;
using Newtonsoft.Json;
using ProtonVPN.Client.Logic.Auth.Contracts;
using ProtonVPN.Client.Logic.Auth.Contracts.Models;
using ProtonVPN.Client.Logic.Users.Contracts.Messages;
using ProtonVPN.Client.Settings.Contracts;
using ProtonVPN.Client.Settings.Contracts.Models;
using ProtonVPN.Common.Core.Geographical;
using ProtonVPN.Configurations.Contracts;
namespace ProtonVPN.Client.Logic.Feedback.Diagnostics.Logs;
public class UserSettingsLog : LogBase
{
private readonly ISettings _settings;
private readonly IUserAuthenticator _userAuthenticator;
public UserSettingsLog(IStaticConfiguration config, ISettings settings, IUserAuthenticator userAuthenticator)
: base(config.DiagnosticLogsFolder, "Settings.txt")
{
_settings = settings;
_userAuthenticator = userAuthenticator;
}
public override void Write()
{
File.WriteAllText(Path, GenerateContent());
}
private string GenerateContent()
{
StringBuilder stringBuilder = new();
stringBuilder
.AppendLine("Global Settings")
.AppendLine();
foreach (KeyValuePair property in GetGlobalSettings())
{
stringBuilder.AppendLine($"{property.Key}: {Serialize(property.Value)}");
}
stringBuilder
.AppendLine()
.AppendLine("User Settings")
.AppendLine();
if (_userAuthenticator.IsLoggedIn)
{
foreach (KeyValuePair property in GetUserSettings())
{
stringBuilder.AppendLine($"{property.Key}: {Serialize(property.Value)}");
}
}
else
{
stringBuilder.AppendLine("The user is not logged in.");
}
return stringBuilder.ToString();
}
private IEnumerable> GetGlobalSettings()
{
yield return new(nameof(IGlobalSettings.Language), _settings.Language);
yield return new($"{nameof(IGlobalSettings.DeviceLocation)}.{nameof(DeviceLocation.CountryCode)}", _settings.DeviceLocation?.CountryCode);
yield return new(nameof(IGlobalSettings.IsAlternativeRoutingEnabled), _settings.IsAlternativeRoutingEnabled);
yield return new(nameof(IGlobalSettings.IsGlobalSettingsMigrationDone), _settings.IsGlobalSettingsMigrationDone);
yield return new(nameof(IGlobalSettings.AreAutomaticUpdatesEnabled), _settings.AreAutomaticUpdatesEnabled);
yield return new(nameof(IGlobalSettings.IsBetaAccessEnabled), _settings.IsBetaAccessEnabled);
yield return new(nameof(IGlobalSettings.IsShareCrashReportsEnabled), _settings.IsShareCrashReportsEnabled);
yield return new(nameof(IGlobalSettings.IsAutoLaunchEnabled), _settings.IsAutoLaunchEnabled);
yield return new(nameof(IGlobalSettings.AutoLaunchMode), _settings.AutoLaunchMode);
yield return new(nameof(IGlobalSettings.IsKillSwitchEnabled), _settings.IsKillSwitchEnabled);
yield return new(nameof(IGlobalSettings.KillSwitchMode), _settings.KillSwitchMode);
yield return new(nameof(IGlobalSettings.WireGuardConnectionTimeout), _settings.WireGuardConnectionTimeout);
}
private IEnumerable> GetUserSettings()
{
yield return new(nameof(IUserSettings.Theme), _settings.Theme);
yield return new(nameof(IUserSettings.VpnProtocol), _settings.VpnProtocol);
yield return new(nameof(IUserSettings.Username), _settings.Username);
yield return new($"{nameof(IUserSettings.VpnPlan)}.{nameof(VpnPlan.IsPaid)}", _settings.VpnPlan.IsPaid);
yield return new($"{nameof(IUserSettings.VpnPlan)}.{nameof(VpnPlan.Title)}", _settings.VpnPlan.Title);
yield return new($"{nameof(IUserSettings.ConnectionCertificate)}.{nameof(ConnectionCertificate.RequestUtcDate)}", _settings.ConnectionCertificate?.RequestUtcDate);
yield return new($"{nameof(IUserSettings.ConnectionCertificate)}.{nameof(ConnectionCertificate.RefreshUtcDate)}", _settings.ConnectionCertificate?.RefreshUtcDate);
yield return new($"{nameof(IUserSettings.ConnectionCertificate)}.{nameof(ConnectionCertificate.ExpirationUtcDate)}", _settings.ConnectionCertificate?.ExpirationUtcDate);
yield return new($"{nameof(IUserSettings.ChangeServerAttempts)}.{nameof(ChangeServerAttempts.AttemptsCount)}", _settings.ChangeServerAttempts.AttemptsCount);
yield return new($"{nameof(IUserSettings.ChangeServerAttempts)}.{nameof(ChangeServerAttempts.LastAttemptUtcDate)}", _settings.ChangeServerAttempts.LastAttemptUtcDate);
yield return new(nameof(IUserSettings.IsNotificationEnabled), _settings.IsNotificationEnabled);
yield return new(nameof(IUserSettings.OpenVpnAdapter), _settings.OpenVpnAdapter);
yield return new(nameof(IUserSettings.IsIpv6Enabled), _settings.IsIpv6Enabled);
yield return new(nameof(IUserSettings.IsIpv6LeakProtectionEnabled), _settings.IsIpv6LeakProtectionEnabled);
yield return new(nameof(IUserSettings.IsSmartReconnectEnabled), _settings.IsSmartReconnectEnabled);
yield return new(nameof(IUserSettings.NatType), _settings.NatType);
yield return new(nameof(IUserSettings.IsVpnAcceleratorEnabled), _settings.IsVpnAcceleratorEnabled);
yield return new(nameof(IUserSettings.LogicalsLastModifiedDate), _settings.LogicalsLastModifiedDate);
yield return new(nameof(IUserSettings.IsUserSettingsMigrationDone), _settings.IsUserSettingsMigrationDone);
yield return new(nameof(IUserSettings.IsShareStatisticsEnabled), _settings.IsShareStatisticsEnabled);
yield return new(nameof(IUserSettings.IsLocalAreaNetworkAccessEnabled), _settings.IsLocalAreaNetworkAccessEnabled);
yield return new(nameof(IUserSettings.IsLocalDnsEnabled), _settings.IsLocalDnsEnabled);
yield return new(nameof(IUserSettings.IsCustomDnsServersEnabled), _settings.IsCustomDnsServersEnabled);
yield return new(nameof(IUserSettings.CustomDnsServersList), _settings.CustomDnsServersList);
yield return new(nameof(IUserSettings.IsAutoConnectEnabled), _settings.IsAutoConnectEnabled);
yield return new(nameof(IUserSettings.IsNetShieldEnabled), _settings.IsNetShieldEnabled);
yield return new(nameof(IUserSettings.NetShieldMode), _settings.NetShieldMode);
yield return new(nameof(IUserSettings.IsPortForwardingEnabled), _settings.IsPortForwardingEnabled);
yield return new(nameof(IUserSettings.IsPortForwardingNotificationEnabled), _settings.IsPortForwardingNotificationEnabled);
yield return new(nameof(IUserSettings.IsSplitTunnelingEnabled), _settings.IsSplitTunnelingEnabled);
yield return new(nameof(IUserSettings.SplitTunnelingMode), _settings.SplitTunnelingMode);
yield return new(nameof(IUserSettings.SplitTunnelingStandardAppsList), _settings.SplitTunnelingStandardAppsList);
yield return new(nameof(IUserSettings.SplitTunnelingStandardIpAddressesList), _settings.SplitTunnelingStandardIpAddressesList);
yield return new(nameof(IUserSettings.SplitTunnelingInverseAppsList), _settings.SplitTunnelingInverseAppsList);
yield return new(nameof(IUserSettings.SplitTunnelingInverseIpAddressesList), _settings.SplitTunnelingInverseIpAddressesList);
yield return new(nameof(IUserSettings.DefaultConnection), _settings.DefaultConnection);
yield return new(nameof(IUserSettings.ExcludedLocationsList), _settings.ExcludedLocationsList);
yield return new(nameof(IUserSettings.SidebarWidth), _settings.SidebarWidth);
yield return new(nameof(IUserSettings.IsRecentsPaneOpened), _settings.IsRecentsPaneOpened);
yield return new(nameof(IUserSettings.IsNavigationPaneOpened), _settings.IsNavigationPaneOpened);
yield return new(nameof(IUserSettings.IsConnectionDetailsPaneOpened), _settings.IsConnectionDetailsPaneOpened);
yield return new(nameof(IUserSettings.WindowWidth), _settings.WindowWidth);
yield return new(nameof(IUserSettings.WindowHeight), _settings.WindowHeight);
yield return new(nameof(IUserSettings.WindowXPosition), _settings.WindowXPosition);
yield return new(nameof(IUserSettings.WindowYPosition), _settings.WindowYPosition);
yield return new(nameof(IUserSettings.IsWindowMaximized), _settings.IsWindowMaximized);
yield return new(nameof(IUserSettings.WasWelcomeOverlayDisplayed), _settings.WasWelcomeOverlayDisplayed);
yield return new(nameof(IUserSettings.WasWelcomePlusOverlayDisplayed), _settings.WasWelcomePlusOverlayDisplayed);
yield return new(nameof(IUserSettings.WasWelcomeUnlimitedOverlayDisplayed), _settings.WasWelcomeUnlimitedOverlayDisplayed);
yield return new(nameof(IUserSettings.WasWelcomeB2BOverlayDisplayed), _settings.WasWelcomeB2BOverlayDisplayed);
yield return new(nameof(IUserSettings.WasExcludedLocationsSmartDiscoveryPromptDisplayed), _settings.WasExcludedLocationsSmartDiscoveryPromptDisplayed);
yield return new(nameof(IUserSettings.WasExcludedLocationsTeachingTipDisplayed), _settings.WasExcludedLocationsTeachingTipDisplayed);
yield return new(nameof(IUserSettings.IsP2PInfoBannerDismissed), _settings.IsP2PInfoBannerDismissed);
yield return new(nameof(IUserSettings.IsSecureCoreInfoBannerDismissed), _settings.IsSecureCoreInfoBannerDismissed);
yield return new(nameof(IUserSettings.IsTorInfoBannerDismissed), _settings.IsTorInfoBannerDismissed);
yield return new(nameof(IUserSettings.IsGatewayInfoBannerDismissed), _settings.IsGatewayInfoBannerDismissed);
yield return new(nameof(IUserSettings.LastSeenWhatsNewOverlayVersion), _settings.LastSeenWhatsNewOverlayVersion);
}
private string Serialize(dynamic? value)
{
if (value == null ||
(value is string stringValue && string.IsNullOrEmpty(stringValue)))
{
value = "Not set";
}
if (value is ICollection)
{
value = JsonConvert.SerializeObject(value);
}
return value is string result
? result
: value?.ToString() ?? string.Empty;
}
}