From 19fcddfdaf141129f812133c98432b09ae178eaa Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 23 Feb 2025 14:26:04 +0700 Subject: [PATCH] chore: added 404 handling for revoke configs - added revoke before remove api server for premium v2 --- client/core/api/apiUtils.cpp | 3 +++ client/core/defs.h | 1 + client/core/errorstrings.cpp | 1 + .../ui/controllers/api/apiConfigsController.cpp | 15 ++++++++++++--- .../ui/qml/Pages2/PageSettingsApiServerInfo.qml | 9 ++++++--- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/client/core/api/apiUtils.cpp b/client/core/api/apiUtils.cpp index 6166c512..9f518b52 100644 --- a/client/core/api/apiUtils.cpp +++ b/client/core/api/apiUtils.cpp @@ -57,6 +57,7 @@ apiDefs::ConfigSource apiUtils::getConfigSource(const QJsonObject &serverConfigO amnezia::ErrorCode apiUtils::checkNetworkReplyErrors(const QList &sslErrors, QNetworkReply *reply) { const int httpStatusCodeConflict = 409; + const int httpStatusCodeNotFound = 404; if (!sslErrors.empty()) { qDebug().noquote() << sslErrors; @@ -75,6 +76,8 @@ amnezia::ErrorCode apiUtils::checkNetworkReplyErrors(const QList &ssl qDebug() << httpStatusCode; if (httpStatusCode == httpStatusCodeConflict) { return amnezia::ErrorCode::ApiConfigLimitError; + } else if (httpStatusCode == httpStatusCodeNotFound) { + return amnezia::ErrorCode::ApiNotFoundError; } return amnezia::ErrorCode::ApiConfigDownloadError; } diff --git a/client/core/defs.h b/client/core/defs.h index 330ebc48..6c85c65d 100644 --- a/client/core/defs.h +++ b/client/core/defs.h @@ -110,6 +110,7 @@ namespace amnezia ApiConfigDecryptionError = 1106, ApiServicesMissingError = 1107, ApiConfigLimitError = 1108, + ApiNotFoundError = 1109, // QFile errors OpenError = 1200, diff --git a/client/core/errorstrings.cpp b/client/core/errorstrings.cpp index c45b1eaf..2b9182cf 100644 --- a/client/core/errorstrings.cpp +++ b/client/core/errorstrings.cpp @@ -67,6 +67,7 @@ QString errorString(ErrorCode code) { case (ErrorCode::ApiConfigDecryptionError): errorMessage = QObject::tr("Failed to decrypt response payload"); break; case (ErrorCode::ApiServicesMissingError): errorMessage = QObject::tr("Missing list of available services"); break; case (ErrorCode::ApiConfigLimitError): errorMessage = QObject::tr("The limit of allowed configurations per subscription has been exceeded"); break; + case (ErrorCode::ApiNotFoundError): errorMessage = QObject::tr("Error when retrieving configuration from API"); break; // QFile errors case(ErrorCode::OpenError): errorMessage = QObject::tr("QFile error: The file could not be opened"); break; diff --git a/client/ui/controllers/api/apiConfigsController.cpp b/client/ui/controllers/api/apiConfigsController.cpp index 0fe304c2..27813f9c 100644 --- a/client/ui/controllers/api/apiConfigsController.cpp +++ b/client/ui/controllers/api/apiConfigsController.cpp @@ -110,7 +110,7 @@ bool ApiConfigsController::revokeNativeConfig(const QString &serverCountryCode) QByteArray responseBody; ErrorCode errorCode = gatewayController.post(QString("%1v1/revoke_native_config"), apiPayload, responseBody); - if (errorCode != ErrorCode::NoError) { + if (errorCode != ErrorCode::NoError && errorCode != ErrorCode::ApiNotFoundError) { emit errorOccurred(errorCode); return false; } @@ -323,9 +323,14 @@ bool ApiConfigsController::deactivateDevice() { GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs); - auto serverConfigObject = m_serversModel->getServerConfig(m_serversModel->getProcessedServerIndex()); + auto serverIndex = m_serversModel->getProcessedServerIndex(); + auto serverConfigObject = m_serversModel->getServerConfig(serverIndex); auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject(); + if (apiUtils::getConfigType(serverConfigObject) != apiDefs::ConfigType::AmneziaPremiumV2) { + return true; + } + QString protocol = apiConfigObject.value(configKey::serviceProtocol).toString(); ApiPayloadData apiPayloadData = generateApiPayloadData(protocol); @@ -338,10 +343,14 @@ bool ApiConfigsController::deactivateDevice() QByteArray responseBody; ErrorCode errorCode = gatewayController.post(QString("%1v1/revoke_config"), apiPayload, responseBody); - if (errorCode != ErrorCode::NoError) { + if (errorCode != ErrorCode::NoError && errorCode != ErrorCode::ApiNotFoundError) { emit errorOccurred(errorCode); return false; } + + serverConfigObject.remove(config_key::containers); + m_serversModel->editServer(serverConfigObject, serverIndex); + return true; } diff --git a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml index 7080ad26..44ed6f4b 100644 --- a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml @@ -164,7 +164,7 @@ PageType { Layout.fillWidth: true Layout.topMargin: 32 - visible: footer.isVisibleForAmneziaFree + visible: false //footer.isVisibleForAmneziaFree text: qsTr("Subscription key") rightImageSource: "qrc:/images/controls/chevron-right.svg" @@ -187,11 +187,12 @@ PageType { } DividerType { - visible: footer.isVisibleForAmneziaFree + visible: false //footer.isVisibleForAmneziaFree } LabelWithButtonType { Layout.fillWidth: true + Layout.topMargin: 32 visible: footer.isVisibleForAmneziaFree @@ -336,7 +337,9 @@ PageType { PageController.showNotificationMessage(qsTr("Cannot remove server during active connection")) } else { PageController.showBusyIndicator(true) - InstallController.removeProcessedServer() + if (ApiConfigsController.deactivateDevice()) { + InstallController.removeProcessedServer() + } PageController.showBusyIndicator(false) } }