diff --git a/client/core/api/apiDefs.h b/client/core/api/apiDefs.h index 03b678053..be3cc8f34 100644 --- a/client/core/api/apiDefs.h +++ b/client/core/api/apiDefs.h @@ -56,6 +56,8 @@ namespace apiDefs constexpr QLatin1String activeDeviceCount("active_device_count"); constexpr QLatin1String maxDeviceCount("max_device_count"); constexpr QLatin1String subscriptionEndDate("subscription_end_date"); + constexpr QLatin1String subscription("subscription"); + constexpr QLatin1String endDate("end_date"); constexpr QLatin1String issuedConfigs("issued_configs"); constexpr QLatin1String subscriptionDescription("subscription_description"); diff --git a/client/core/api/apiUtils.cpp b/client/core/api/apiUtils.cpp index 67deab6b8..42ad3794f 100644 --- a/client/core/api/apiUtils.cpp +++ b/client/core/api/apiUtils.cpp @@ -24,9 +24,30 @@ namespace bool apiUtils::isSubscriptionExpired(const QString &subscriptionEndDate) { - QDateTime now = QDateTime::currentDateTimeUtc(); - QDateTime endDate = QDateTime::fromString(subscriptionEndDate, Qt::ISODateWithMs); - return endDate < now; + if (subscriptionEndDate.isEmpty()) { + return false; + } + const QDateTime endDate = QDateTime::fromString(subscriptionEndDate, Qt::ISODate).toUTC(); + if (!endDate.isValid()) { + return false; + } + return endDate < QDateTime::currentDateTimeUtc(); +} + +bool apiUtils::isSubscriptionExpiringSoon(const QString &subscriptionEndDate, int withinDays) +{ + if (subscriptionEndDate.isEmpty()) { + return false; + } + const QDateTime endDate = QDateTime::fromString(subscriptionEndDate, Qt::ISODate).toUTC(); + if (!endDate.isValid()) { + return false; + } + const QDateTime nowUtc = QDateTime::currentDateTimeUtc(); + if (endDate < nowUtc) { + return false; + } + return endDate <= nowUtc.addDays(withinDays); } bool apiUtils::isServerFromApi(const QJsonObject &serverConfigObject) diff --git a/client/core/api/apiUtils.h b/client/core/api/apiUtils.h index d4e1d9cef..819242a5f 100644 --- a/client/core/api/apiUtils.h +++ b/client/core/api/apiUtils.h @@ -13,6 +13,8 @@ namespace apiUtils bool isSubscriptionExpired(const QString &subscriptionEndDate); + bool isSubscriptionExpiringSoon(const QString &subscriptionEndDate, int withinDays = 10); + bool isPremiumServer(const QJsonObject &serverConfigObject); apiDefs::ConfigType getConfigType(const QJsonObject &serverConfigObject); diff --git a/client/ui/controllers/api/apiConfigsController.cpp b/client/ui/controllers/api/apiConfigsController.cpp index 8607d7a4e..ea381b072 100644 --- a/client/ui/controllers/api/apiConfigsController.cpp +++ b/client/ui/controllers/api/apiConfigsController.cpp @@ -47,9 +47,6 @@ namespace constexpr char config[] = "config"; - constexpr char subscription[] = "subscription"; - constexpr char endDate[] = "end_date"; - constexpr char isConnectEvent[] = "is_connect_event"; } diff --git a/client/ui/controllers/api/apiSettingsController.cpp b/client/ui/controllers/api/apiSettingsController.cpp index 78ac5c240..d96437666 100644 --- a/client/ui/controllers/api/apiSettingsController.cpp +++ b/client/ui/controllers/api/apiSettingsController.cpp @@ -78,13 +78,6 @@ bool ApiSettingsController::getAccountInfo(bool reload) QJsonObject accountInfo = QJsonDocument::fromJson(responseBody).object(); m_apiAccountInfoModel->updateModel(accountInfo, serverConfig); - QString subscriptionEndDate = accountInfo.value(apiDefs::key::subscriptionEndDate).toString(); - if (!subscriptionEndDate.isEmpty()) { - apiConfig.insert(apiDefs::key::subscriptionEndDate, subscriptionEndDate); - serverConfig.insert(configKey::apiConfig, apiConfig); - m_serversModel->editServer(serverConfig, processedIndex); - } - if (reload) { updateApiCountryModel(); updateApiDevicesModel(); diff --git a/client/ui/models/api/apiAccountInfoModel.cpp b/client/ui/models/api/apiAccountInfoModel.cpp index b5fd6f556..459e4271f 100644 --- a/client/ui/models/api/apiAccountInfoModel.cpp +++ b/client/ui/models/api/apiAccountInfoModel.cpp @@ -77,16 +77,22 @@ QVariant ApiAccountInfoModel::data(const QModelIndex &index, int role) const return false; } case IsSubscriptionExpiredRole: { - if (m_accountInfoData.configType == apiDefs::ConfigType::AmneziaFreeV3) return false; - if (m_accountInfoData.subscriptionEndDate.isEmpty()) return false; + if (m_accountInfoData.configType == apiDefs::ConfigType::AmneziaFreeV3) { + return false; + } + if (m_accountInfoData.subscriptionEndDate.isEmpty()) { + return false; + } return apiUtils::isSubscriptionExpired(m_accountInfoData.subscriptionEndDate); } case IsSubscriptionExpiringSoonRole: { - if (m_accountInfoData.configType == apiDefs::ConfigType::AmneziaFreeV3) return false; - if (m_accountInfoData.subscriptionEndDate.isEmpty()) return false; - if (apiUtils::isSubscriptionExpired(m_accountInfoData.subscriptionEndDate)) return false; - QDateTime endDate = QDateTime::fromString(m_accountInfoData.subscriptionEndDate, Qt::ISODateWithMs); - return endDate <= QDateTime::currentDateTimeUtc().addDays(10); + if (m_accountInfoData.configType == apiDefs::ConfigType::AmneziaFreeV3) { + return false; + } + if (m_accountInfoData.subscriptionEndDate.isEmpty()) { + return false; + } + return apiUtils::isSubscriptionExpiringSoon(m_accountInfoData.subscriptionEndDate); } } diff --git a/client/ui/models/api/apiServicesModel.cpp b/client/ui/models/api/apiServicesModel.cpp index 7d831f48c..02b09dabf 100644 --- a/client/ui/models/api/apiServicesModel.cpp +++ b/client/ui/models/api/apiServicesModel.cpp @@ -1,7 +1,9 @@ #include "apiServicesModel.h" +#include #include +#include "core/api/apiDefs.h" #include "logger.h" namespace @@ -32,9 +34,6 @@ namespace constexpr char storeEndpoint[] = "store_endpoint"; constexpr char isAvailable[] = "is_available"; - - constexpr char subscription[] = "subscription"; - constexpr char endDate[] = "end_date"; } namespace serviceType @@ -243,7 +242,7 @@ ApiServicesModel::ApiServicesData ApiServicesModel::getApiServicesData(const QJs auto availableCountries = data.value(configKey::availableCountries).toArray(); auto serviceDescription = data.value(configKey::serviceDescription).toObject(); - auto subscriptionObject = data.value(configKey::subscription).toObject(); + auto subscriptionObject = data.value(apiDefs::key::subscription).toObject(); ApiServicesData serviceData; serviceData.serviceInfo.name = serviceInfo.value(configKey::name).toString(); @@ -270,7 +269,7 @@ ApiServicesModel::ApiServicesData ApiServicesModel::getApiServicesData(const QJs serviceData.serviceInfo.object = serviceInfo; serviceData.availableCountries = availableCountries; - serviceData.subscription.endDate = subscriptionObject.value(configKey::endDate).toString(); + serviceData.subscription.endDate = subscriptionObject.value(apiDefs::key::endDate).toString(); return serviceData; } diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index e85fc269b..de5c7c45b 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -180,18 +180,26 @@ QVariant ServersModel::data(const QModelIndex &index, int role) const return apiConfig.value(apiDefs::key::serviceInfo).toObject().value(apiDefs::key::adEndpoint).toString(); } case IsSubscriptionExpiredRole: { - if (configVersion != apiDefs::ConfigSource::AmneziaGateway) return false; - QString endDate = apiConfig.value(apiDefs::key::subscriptionEndDate).toString(); - if (endDate.isEmpty()) return false; + if (configVersion != apiDefs::ConfigSource::AmneziaGateway) { + return false; + } + const QString endDate = + apiConfig.value(apiDefs::key::subscription).toObject().value(apiDefs::key::endDate).toString(); + if (endDate.isEmpty()) { + return false; + } return apiUtils::isSubscriptionExpired(endDate); } case IsSubscriptionExpiringSoonRole: { - if (configVersion != apiDefs::ConfigSource::AmneziaGateway) return false; - QString endDate = apiConfig.value(apiDefs::key::subscriptionEndDate).toString(); - if (endDate.isEmpty()) return false; - if (apiUtils::isSubscriptionExpired(endDate)) return false; - QDateTime endDateTime = QDateTime::fromString(endDate, Qt::ISODateWithMs); - return endDateTime <= QDateTime::currentDateTimeUtc().addDays(10); + if (configVersion != apiDefs::ConfigSource::AmneziaGateway) { + return false; + } + const QString endDate = + apiConfig.value(apiDefs::key::subscription).toObject().value(apiDefs::key::endDate).toString(); + if (endDate.isEmpty()) { + return false; + } + return apiUtils::isSubscriptionExpiringSoon(endDate); } }