/*
* 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 ProtonVPN.Client.Logic.Connection.Contracts.Enums;
namespace ProtonVPN.Client.Logic.Connection.Contracts.Extensions;
public static class VpnErrorExtensions
{
private static readonly List _errorsForUser =
[
VpnError.AllServersExcluded,
VpnError.NoServers,
VpnError.TapAdapterInUseError,
VpnError.TapRequiresUpdateError,
VpnError.TlsCertificateError,
VpnError.RpcServerUnavailable,
VpnError.MissingConnectionCertificate,
VpnError.WireGuardAdapterInUseError,
VpnError.InterfaceHasForwardingEnabled,
];
private static readonly List _sessionLimitErrors =
[
VpnError.SessionLimitReachedBasic,
VpnError.SessionLimitReachedFree,
VpnError.SessionLimitReachedPlus,
VpnError.SessionLimitReachedPro,
VpnError.SessionLimitReachedVisionary,
VpnError.SessionLimitReachedUnknown,
];
private static readonly List _errorsForReconnect =
[
VpnError.TlsError,
VpnError.PingTimeoutError,
VpnError.AdapterTimeoutError,
VpnError.PlanNeedsToBeUpgraded,
VpnError.Unpaid,
VpnError.ServerSessionError,
VpnError.Unknown,
];
private static readonly List _errorsForReconnectWithoutLastServer =
[
VpnError.ServerOffline,
VpnError.ServerRemoved,
VpnError.NoServerValidationPublicKey,
VpnError.SessionBeingInstalled,
VpnError.SystemErrorOnTheServer,
VpnError.ServerUnreachable,
];
private static readonly List _errorsForCertificateUpdate =
[
VpnError.CertificateExpired,
];
private static readonly List _errorsForCertificateDeletion =
[
VpnError.CertificateRevoked,
VpnError.CertCARevokedOrExpired,
VpnError.ClientKeyMismatch,
VpnError.SessionKilledDueToMultipleKeys,
VpnError.ServerSessionDoesNotMatch,
];
private static readonly List _errorsForTwoFactorRequired =
[
VpnError.TwoFactorRequiredReasonUnknown,
VpnError.TwoFactorExpired,
VpnError.TwoFactorNewConnection,
];
public static bool RequiresInformingUser(this VpnError error)
{
return _errorsForUser.Contains(error) || error.IsSessionLimitError();
}
public static bool RequiresReconnect(this VpnError error)
{
return _errorsForReconnect.Contains(error);
}
public static bool RequiresReconnectWithoutLastServer(this VpnError error)
{
return _errorsForReconnectWithoutLastServer.Contains(error);
}
public static bool RequiresCertificateUpdate(this VpnError error)
{
return _errorsForCertificateUpdate.Contains(error);
}
public static bool RequiresCertificateDeletion(this VpnError error)
{
return _errorsForCertificateDeletion.Contains(error);
}
public static bool IsSessionLimitError(this VpnError error)
{
return _sessionLimitErrors.Contains(error);
}
public static bool IsTwoFactorRequiredError(this VpnError error)
{
return _errorsForTwoFactorRequired.Contains(error);
}
public static bool IsBaseFilteringEngineError(this VpnError error)
{
return error is VpnError.BaseFilteringEngineServiceNotRunning;
}
}