From 113f967006e07968f9759f34c5c30f9b2bcbfdea Mon Sep 17 00:00:00 2001 From: vkamn Date: Thu, 28 May 2026 15:14:04 +0800 Subject: [PATCH] fix: various fixes (#2664) * fix: fixed nextAvailableServerName * fix: fixed password request for ssh key --- .../selfhosted/importController.cpp | 6 +- .../selfhosted/installController.cpp | 16 +++-- .../selfhosted/installController.h | 3 +- .../core/controllers/settingsController.cpp | 2 +- client/core/controllers/updateController.cpp | 17 ++--- .../secureAppSettingsRepository.cpp | 20 ------ .../secureAppSettingsRepository.h | 2 - .../repositories/secureServersRepository.cpp | 62 +++++++++++++++++++ .../repositories/secureServersRepository.h | 2 + 9 files changed, 81 insertions(+), 49 deletions(-) diff --git a/client/core/controllers/selfhosted/importController.cpp b/client/core/controllers/selfhosted/importController.cpp index bf31e1312..d2e34e0b2 100644 --- a/client/core/controllers/selfhosted/importController.cpp +++ b/client/core/controllers/selfhosted/importController.cpp @@ -486,7 +486,7 @@ QJsonObject ImportController::extractOpenVpnConfig(const QString &data) const QJsonObject config; config[configKey::containers] = arr; config[configKey::defaultContainer] = configKey::amneziaOpenvpn; - config[configKey::description] = m_appSettingsRepository->nextAvailableServerName(); + config[configKey::description] = m_serversRepository->nextAvailableServerName(); const static QRegularExpression dnsRegExp("dhcp-option DNS (\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b)"); QRegularExpressionMatchIterator dnsMatch = dnsRegExp.globalMatch(data); @@ -645,7 +645,7 @@ QJsonObject ImportController::extractWireGuardConfig(const QString &data, Config QJsonObject config; config[configKey::containers] = arr; config[configKey::defaultContainer] = containerName; - config[configKey::description] = m_appSettingsRepository->nextAvailableServerName(); + config[configKey::description] = m_serversRepository->nextAvailableServerName(); const static QRegularExpression dnsRegExp( "DNS = " @@ -699,7 +699,7 @@ QJsonObject ImportController::extractXrayConfig(const QString &data, ConfigTypes ? configKey::amneziaSsxray : configKey::amneziaXray; if (description.isEmpty()) { - config[configKey::description] = m_appSettingsRepository->nextAvailableServerName(); + config[configKey::description] = m_serversRepository->nextAvailableServerName(); } else { config[configKey::description] = description; } diff --git a/client/core/controllers/selfhosted/installController.cpp b/client/core/controllers/selfhosted/installController.cpp index 55a8993b5..abf317441 100644 --- a/client/core/controllers/selfhosted/installController.cpp +++ b/client/core/controllers/selfhosted/installController.cpp @@ -358,7 +358,7 @@ void InstallController::addEmptyServer(const ServerCredentials &credentials) serverConfig.userName = credentials.userName; serverConfig.password = credentials.secretData; serverConfig.port = credentials.port; - serverConfig.description = m_appSettingsRepository->nextAvailableServerName(); + serverConfig.description = m_serversRepository->nextAvailableServerName(); serverConfig.displayName = serverConfig.description.isEmpty() ? serverConfig.hostName : serverConfig.description; serverConfig.defaultContainer = DockerContainer::None; @@ -1170,7 +1170,7 @@ ErrorCode InstallController::installServer(const ServerCredentials &credentials, serverConfig.userName = credentials.userName; serverConfig.password = credentials.secretData; serverConfig.port = credentials.port; - serverConfig.description = m_appSettingsRepository->nextAvailableServerName(); + serverConfig.description = m_serversRepository->nextAvailableServerName(); for (auto iterator = preparedContainers.begin(); iterator != preparedContainers.end(); iterator++) { serverConfig.containers.insert(iterator.key(), iterator.value()); @@ -1240,28 +1240,26 @@ ErrorCode InstallController::installContainer(const QString &serverId, DockerCon return ErrorCode::NoError; } -ErrorCode InstallController::checkSshConnection(const ServerCredentials &credentials, QString &output, +ErrorCode InstallController::checkSshConnection(ServerCredentials &credentials, QString &output, std::function passphraseCallback) { SshSession sshSession(this); ErrorCode errorCode = ErrorCode::NoError; - ServerCredentials processedCredentials = credentials; - - if (processedCredentials.secretData.contains("BEGIN") && processedCredentials.secretData.contains("PRIVATE KEY")) { + if (credentials.secretData.contains("BEGIN") && credentials.secretData.contains("PRIVATE KEY")) { if (!passphraseCallback) { return ErrorCode::SshPrivateKeyError; } QString decryptedPrivateKey; - errorCode = sshSession.getDecryptedPrivateKey(processedCredentials, decryptedPrivateKey, passphraseCallback); + errorCode = sshSession.getDecryptedPrivateKey(credentials, decryptedPrivateKey, passphraseCallback); if (errorCode != ErrorCode::NoError) { return errorCode; } - processedCredentials.secretData = decryptedPrivateKey; + credentials.secretData = decryptedPrivateKey; } - output = sshSession.checkSshConnection(processedCredentials, errorCode); + output = sshSession.checkSshConnection(credentials, errorCode); return errorCode; } diff --git a/client/core/controllers/selfhosted/installController.h b/client/core/controllers/selfhosted/installController.h index 25c041273..6aec8ce86 100644 --- a/client/core/controllers/selfhosted/installController.h +++ b/client/core/controllers/selfhosted/installController.h @@ -64,7 +64,8 @@ public: bool isUpdateDockerContainerRequired(DockerContainer container, const ContainerConfig &oldConfig, const ContainerConfig &newConfig); - ErrorCode checkSshConnection(const ServerCredentials &credentials, QString &output, std::function passphraseCallback = nullptr); + ErrorCode checkSshConnection(ServerCredentials &credentials, QString &output, + std::function passphraseCallback = nullptr); bool isServerAlreadyExists(const ServerCredentials &credentials, int &existingServerIndex); diff --git a/client/core/controllers/settingsController.cpp b/client/core/controllers/settingsController.cpp index e7d950e96..aa79f0fc3 100644 --- a/client/core/controllers/settingsController.cpp +++ b/client/core/controllers/settingsController.cpp @@ -363,6 +363,6 @@ void SettingsController::disablePremV1MigrationReminder() QString SettingsController::nextAvailableServerName() const { - return m_appSettingsRepository->nextAvailableServerName(); + return m_serversRepository->nextAvailableServerName(); } diff --git a/client/core/controllers/updateController.cpp b/client/core/controllers/updateController.cpp index 371c3ab3c..0654ca59c 100644 --- a/client/core/controllers/updateController.cpp +++ b/client/core/controllers/updateController.cpp @@ -13,7 +13,6 @@ #include "version.h" #include "core/controllers/gatewayController.h" #include "core/utils/constants/apiKeys.h" -#include "core/utils/errorStrings.h" #include "core/utils/selfhosted/scriptsRegistry.h" namespace @@ -109,7 +108,7 @@ void UpdateController::fetchGatewayUrl() .then(this, [this, gatewayController](QPair result) { auto [err, gatewayResponse] = result; if (err != ErrorCode::NoError) { - logger.error() << errorString(err); + logger.error() << "Gateway request failed, error code:" << static_cast(err); finishUpdateCheck(); return; } @@ -250,17 +249,9 @@ void UpdateController::runInstaller() runLinuxInstaller(kInstallerLocalPath); #endif } else { - if (reply->error() == QNetworkReply::NetworkError::OperationCanceledError - || reply->error() == QNetworkReply::NetworkError::TimeoutError) { - logger.error() << errorString(ErrorCode::ApiConfigTimeoutError); - } else { - QString err = reply->errorString(); - logger.error() << QString::fromUtf8(reply->readAll()); - logger.error() << "Network error code:" << QString::number(static_cast(reply->error())); - logger.error() << "Error message:" << err; - logger.error() << "HTTP status:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - logger.error() << errorString(ErrorCode::ApiConfigDownloadError); - } + logger.error() << "Installer download failed, network error:" << static_cast(reply->error()) + << reply->errorString(); + logger.error() << "HTTP status:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); } reply->deleteLater(); }); diff --git a/client/core/repositories/secureAppSettingsRepository.cpp b/client/core/repositories/secureAppSettingsRepository.cpp index 441e53bbc..f8662fc3d 100644 --- a/client/core/repositories/secureAppSettingsRepository.cpp +++ b/client/core/repositories/secureAppSettingsRepository.cpp @@ -426,26 +426,6 @@ void SecureAppSettingsRepository::clearSettings() emit settingsCleared(); } -QString SecureAppSettingsRepository::nextAvailableServerName() const -{ - int i = 0; - bool nameExist = false; - - do { - i++; - nameExist = false; - QJsonArray servers = QJsonDocument::fromJson(value("Servers/serversList").toByteArray()).array(); - for (const QJsonValue &server : servers) { - if (server.toObject().value(configKey::description).toString() == QString("Server") + " " + QString::number(i)) { - nameExist = true; - break; - } - } - } while (nameExist); - - return QString("Server") + " " + QString::number(i); -} - void SecureAppSettingsRepository::setInstallationUuid(const QString &uuid) { m_settings->setValue("Conf/installationUuid", uuid); diff --git a/client/core/repositories/secureAppSettingsRepository.h b/client/core/repositories/secureAppSettingsRepository.h index f95174dd4..a105688fa 100644 --- a/client/core/repositories/secureAppSettingsRepository.h +++ b/client/core/repositories/secureAppSettingsRepository.h @@ -90,8 +90,6 @@ public: bool restoreAppConfig(const QByteArray &cfg); void clearSettings(); - QString nextAvailableServerName() const; - QByteArray xraySavedConfigs() const; void setXraySavedConfigs(const QByteArray &data); diff --git a/client/core/repositories/secureServersRepository.cpp b/client/core/repositories/secureServersRepository.cpp index d59dfc7b7..5521743da 100644 --- a/client/core/repositories/secureServersRepository.cpp +++ b/client/core/repositories/secureServersRepository.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "core/utils/serverConfigUtils.h" @@ -32,6 +33,45 @@ QJsonObject embedStorageServerId(const QString &serverId, const QJsonObject &pay return o; } +QString storedServerDisplayName(const SecureServersRepository *repository, const QString &serverId) +{ + using Kind = serverConfigUtils::ConfigType; + switch (repository->serverKind(serverId)) { + case Kind::SelfHostedAdmin: + if (const auto cfg = repository->selfHostedAdminConfig(serverId)) { + return cfg->displayName; + } + break; + case Kind::SelfHostedUser: + if (const auto cfg = repository->selfHostedUserConfig(serverId)) { + return cfg->displayName; + } + break; + case Kind::Native: + if (const auto cfg = repository->nativeConfig(serverId)) { + return cfg->displayName; + } + break; + case Kind::AmneziaPremiumV2: + case Kind::AmneziaFreeV3: + case Kind::ExternalPremium: + if (const auto cfg = repository->apiV2Config(serverId)) { + return cfg->displayName; + } + break; + case Kind::AmneziaPremiumV1: + case Kind::AmneziaFreeV2: + if (const auto cfg = repository->legacyApiConfig(serverId)) { + return cfg->displayName; + } + break; + case Kind::Invalid: + default: + break; + } + return {}; +} + } // namespace SecureServersRepository::SecureServersRepository(SecureQSettings *settings, QObject *parent) @@ -153,6 +193,28 @@ void SecureServersRepository::clearServers() syncToStorage(); } +QString SecureServersRepository::nextAvailableServerName() const +{ + QSet usedNames; + usedNames.reserve(m_orderedServerIds.size()); + + for (const QString &serverId : m_orderedServerIds) { + const QString displayName = storedServerDisplayName(this, serverId); + if (!displayName.isEmpty()) { + usedNames.insert(displayName); + } + } + + int i = 0; + QString candidate; + do { + i++; + candidate = QStringLiteral("Server %1").arg(i); + } while (usedNames.contains(candidate)); + + return candidate; +} + QString SecureServersRepository::addServer(const QString &serverId, const QJsonObject &serverJson, serverConfigUtils::ConfigType kind) { const QString id = normalizedOrGeneratedServerId(serverId); diff --git a/client/core/repositories/secureServersRepository.h b/client/core/repositories/secureServersRepository.h index a0542a62f..3efc63e3b 100644 --- a/client/core/repositories/secureServersRepository.h +++ b/client/core/repositories/secureServersRepository.h @@ -48,6 +48,8 @@ public: void clearServers(); + QString nextAvailableServerName() const; + void invalidateCache(); signals: