/*
* Copyright (c) 2026 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.Reflection;
using ProtonVPN.Common.Core.Helpers;
using ProtonVPN.Configurations.Contracts.Entities;
namespace ProtonVPN.Configurations.Defaults;
public static class DefaultConfiguration
{
// Constants
private const string LOGS_FOLDER_NAME = "Logs";
private const string IPV6_FOLDER_NAME = "IPv6";
// Auxiliary fields
/// C:\Program Files\Proton\VPN\v4.0.0
private static readonly Lazy _baseVersionDirectory = new(() =>
{
string? location = Assembly.GetEntryAssembly()?.Location;
return (location is null ? null : new FileInfo(location).DirectoryName) ?? AppDomain.CurrentDomain.BaseDirectory;
});
/// C:\Program Files\Proton\VPN
private static readonly Lazy _baseDirectory = new(() => Path.GetDirectoryName(_baseVersionDirectory.Value) ?? string.Empty);
/// C:\Program Files\Proton\VPN\v4.0.0\Resources
private static readonly Lazy _resourcesFolderPath = new(() => Path.Combine(_baseVersionDirectory.Value, "Resources"));
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData
private static readonly Lazy _serviceDataPath = new(() => Path.Combine(_baseVersionDirectory.Value, "ServiceData"));
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData\Logs
private static readonly Lazy _serviceLogsFolder = new(() => Path.Combine(_serviceDataPath.Value, LOGS_FOLDER_NAME));
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData\IPv6
private static readonly Lazy _ipv6DataFolder = new(() => Path.Combine(_serviceDataPath.Value, IPV6_FOLDER_NAME));
/// C:\Users\{user}\AppData\Local
private static readonly Lazy _localAppDataPath = new(() => Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN
private static readonly Lazy _localAppDataProtonVpnPath = new(() => Path.Combine(_localAppDataPath.Value, "Proton", "Proton VPN"));
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\Storage
private static readonly Lazy _storageFolder = new(() => Path.Combine(_localAppDataProtonVpnPath.Value, "Storage"));
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\Logs
private static readonly Lazy _clientLogsFolder = new(() => Path.Combine(_localAppDataProtonVpnPath.Value, LOGS_FOLDER_NAME));
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\DiagnosticLogs
private static readonly Lazy _diagnosticLogsFolder = new(() => Path.Combine(_localAppDataProtonVpnPath.Value, "DiagnosticLogs"));
// Properties
public static string ClientVersion => AssemblyVersion.Get();
public static string ApiClientId => "windows-vpn";
public static string UserAgent => "ProtonVPN";
public static string ApiVersion => "3";
public static string ClientName => "ProtonVPN.Client";
public static string ServiceName => "ProtonVPN Service";
public static string CalloutServiceName => "ProtonVPNCallout";
public static string BaseFilteringEngineServiceName => "BFE";
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN
public static string LocalAppDataProtonVpnPath => _localAppDataProtonVpnPath.Value;
/// C:\Program Files\Proton\VPN\ProtonVPN.Launcher.exe
public static string ClientLauncherExePath => Path.Combine(_baseDirectory.Value, "ProtonVPN.Launcher.exe");
/// C:\Program Files\Proton\VPN\v4.0.0\Resources\ProtonVPN.InstallActions.dll
public static string InstallActionsPath => Path.Combine(_baseVersionDirectory.Value, "ProtonVPN.InstallActions.dll");
/// C:\Program Files\Proton\VPN\v4.0.0\ProtonVPN.Client.exe
public static string ClientExePath => Path.Combine(_baseVersionDirectory.Value, "ProtonVPN.Client.exe");
/// C:\Program Files\Proton\VPN\v4.0.0\ProtonVPNService.exe
public static string ServiceExePath => Path.Combine(_baseVersionDirectory.Value, "ProtonVPNService.exe");
/// C:\Program Files\Proton\VPN\v4.0.0\ProtonVPN.NrptWatchdog.exe
public static string NrptWatchdogExePath => Path.Combine(_baseVersionDirectory.Value, "ProtonVPN.NrptWatchdog.exe");
public static string ProtocolActivationScheme = "proton-vpn";
public static string LegacyProtocolActivationScheme = "protonvpn";
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\Storage
public static string StorageFolder => _storageFolder.Value;
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\Logs
public static string ClientLogsFolder => _clientLogsFolder.Value;
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData\Logs
public static string ServiceLogsFolder => _serviceLogsFolder.Value;
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\DiagnosticLogs
public static string DiagnosticLogsFolder => _diagnosticLogsFolder.Value;
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\Images
public static string ImageCacheFolder => Path.Combine(_localAppDataProtonVpnPath.Value, "Images");
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData\Updates
public static string UpdatesFolder => Path.Combine(_serviceDataPath.Value, "Updates");
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\WebView2
public static string WebViewFolder => Path.Combine(_localAppDataProtonVpnPath.Value, "WebView2");
/// C:\Program Files\Proton\VPN\v4.0.0\ProtonVPN.Client.Common.UI\Assets
public static string AssetsFolder => Path.Combine(_baseVersionDirectory.Value, "ProtonVPN.Client.Common.UI", "Assets");
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\Logs\client-logs.txt
public static string ClientLogsFilePath => Path.Combine(ClientLogsFolder, "client-logs.txt");
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData\Logs\service-logs.txt
public static string ServiceLogsFilePath => Path.Combine(ServiceLogsFolder, "service-logs.txt");
/// C:\Program Files\Proton\VPN\Install.log.txt
public static string InstallLogsFilePath => Path.Combine(_baseDirectory.Value, "Install.log.txt");
/// C:\Users\{user}\AppData\Local\Proton\Proton VPN\DiagnosticLogs\diagnostic_logs.zip
public static string DiagnosticLogsZipFilePath => Path.Combine(DiagnosticLogsFolder, "diagnostic_logs.zip");
/// C:\Program Files\Proton\VPN\v4.0.0\Resources\GuestHoleServers.json
public static string GuestHoleServersJsonFilePath => Path.Combine(_resourcesFolderPath.Value, "GuestHoleServers.json");
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData\ServiceSettings.json
public static string ServiceSettingsFilePath => Path.Combine(_serviceDataPath.Value, "ServiceSettings.json");
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData\WireGuardServerRoutes.json
public static string WireGuardServerRoutesFilePath => Path.Combine(_serviceDataPath.Value, "WireGuardServerRoutes.json");
/// C:\Users\{user}\AppData\Local\ProtonVPN
public static string LegacyAppLocalData => Path.Combine(_localAppDataPath.Value, "ProtonVPN");
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData\IPv6\PrefixTree.bin
public static string IPv6PrefixTreeFilePath => Path.Combine(_ipv6DataFolder.Value, "PrefixTree.bin");
/// C:\Program Files\Proton\VPN\v4.0.0\ServiceData\IPv6\PrefixTree.bin
public static string IPv6PersistedDataFilePath => Path.Combine(_ipv6DataFolder.Value, "PersistedData.csv");
// C:\Program Files\Proton\VPN\v4.0.0\wintun.dll
public static string WintunDriverPath => Path.Combine(_baseVersionDirectory.Value, "wintun.dll");
public static string WintunAdapterName => "ProtonVPN TUN";
public static string ServerValidationPublicKey => "MCowBQYDK2VwAyEANpYpt/FlSRwEuGLMoNAGOjy1BTyEJPJvKe00oln7LZk=";
public static string VpnUsernameSuffix => "+pw"; // p - proton, w - windows
public static string GuestHoleVpnUsername => "guest";
public static string GuestHoleVpnPassword => "guest";
public static string DoHVerifyApiHost => "verify-api.protonvpn.com";
public static string NtpServerUrl => "time.windows.com";
public static int MaximumProfileNameLength => 25;
public static long BugReportingMaxFileSize => 488 * 1024;
public static int MaxClientLogsAttached => 3;
public static int MaxServiceLogsAttached => 3;
public static int MaxDiagnosticLogsAttached => 4;
public static int ApiRetries => 2;
public static int MaxGuestHoleRetries => 5;
public static decimal? DeviceRolloutProportion => null;
public static bool IsCertificateValidationEnabled => true;
public static TimeSpan ServiceCheckInterval => TimeSpan.FromSeconds(10);
public static TimeSpan ClientConfigUpdateInterval => TimeSpan.FromHours(12);
public static TimeSpan FeatureFlagsUpdateInterval => TimeSpan.FromHours(2);
public static TimeSpan ConnectionCertificateUpdateInterval => TimeSpan.FromMinutes(5);
public static TimeSpan ServerUpdateInterval => TimeSpan.FromHours(12);
public static TimeSpan ServerLoadUpdateInterval => TimeSpan.FromMinutes(15);
public static TimeSpan MinimumServerLoadUpdateInterval => TimeSpan.FromMinutes(15);
public static TimeSpan AnnouncementsUpdateInterval => TimeSpan.FromMinutes(150);
public static TimeSpan AlternativeRoutingCheckInterval => TimeSpan.FromMinutes(30);
public static TimeSpan UpdateCheckInterval => TimeSpan.FromHours(3);
public static TimeSpan ApiUploadTimeout => TimeSpan.FromSeconds(30);
public static TimeSpan ApiTimeout => TimeSpan.FromSeconds(10);
public static TimeSpan FailedDnsRequestTimeout => TimeSpan.FromSeconds(5);
public static TimeSpan NewCacheTimeToLiveOnResolveError => TimeSpan.FromMinutes(10);
public static TimeSpan DnsResolveTimeout => TimeSpan.FromSeconds(30);
public static TimeSpan DefaultDnsTimeToLive => TimeSpan.FromMinutes(20);
public static TimeSpan DnsOverHttpsPerProviderTimeout => TimeSpan.FromSeconds(20);
public static TimeSpan DohClientTimeout => TimeSpan.FromSeconds(10);
public static TimeSpan VpnStatePollingInterval => TimeSpan.FromSeconds(3);
public static TimeSpan VpnPlanRequestInterval => TimeSpan.FromHours(12);
public static TimeSpan VpnPlanMinimumRequestInterval => TimeSpan.FromMinutes(5);
public static TimeSpan NetShieldStatisticRequestInterval => TimeSpan.FromSeconds(60);
public static TimeSpan P2PTrafficDetectionInterval => TimeSpan.FromSeconds(60);
public static TimeSpan StatisticalEventSendTriggerInterval => TimeSpan.FromMinutes(15);
public static TimeSpan StatisticalEventMinimumWaitInterval => TimeSpan.FromMinutes(10);
public static TimeSpan ServerSearchDelay => TimeSpan.FromSeconds(2.5);
public static TimeSpan ConflictingAdapterCheckerDelay => TimeSpan.FromSeconds(5);
public static IProTunConfigurations ProTun => DefaultProTunConfigurationsFactory.Create();
public static IWireGuardConfigurations WireGuard => DefaultWireGuardConfigurationsFactory.Create(
baseDirectory: _baseVersionDirectory.Value,
commonAppDataProtonVpnPath: _serviceDataPath.Value);
public static IOpenVpnConfigurations OpenVpn => DefaultOpenVpnConfigurationsFactory.Create(
baseFolder: _baseVersionDirectory.Value,
resourcesFolderPath: _resourcesFolderPath.Value,
commonAppDataProtonVpnPath: _serviceDataPath.Value);
public static IList DohProviders => DefaultDohProvidersFactory.Create();
public static IUrlsConfiguration Urls => DefaultUrlsConfigurationFactory.Create();
public static ITlsPinningConfiguration TlsPinning => DefaultTlsPinningConfigurationFactory.Create();
}