diff --git a/client/configurators/xray_configurator.cpp b/client/configurators/xray_configurator.cpp index 62f18066..514aa821 100644 --- a/client/configurators/xray_configurator.cpp +++ b/client/configurators/xray_configurator.cpp @@ -4,12 +4,16 @@ #include #include #include -#include +#include "logger.h" #include "containers/containers_defs.h" #include "core/controllers/serverController.h" #include "core/scripts_registry.h" +namespace { +Logger logger("XrayConfigurator"); +} + XrayConfigurator::XrayConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent) : ConfiguratorBase(settings, serverController, parent) { @@ -26,12 +30,14 @@ QString XrayConfigurator::prepareServerConfig(const ServerCredentials &credentia container, credentials, amnezia::protocols::xray::serverConfigPath, errorCode); if (errorCode != ErrorCode::NoError) { + logger.error() << "Failed to get server config file"; return ""; } // Parse current config as JSON QJsonDocument doc = QJsonDocument::fromJson(currentConfig.toUtf8()); if (doc.isNull() || !doc.isObject()) { + logger.error() << "Failed to parse server config JSON"; errorCode = ErrorCode::InternalError; return ""; } @@ -40,24 +46,28 @@ QString XrayConfigurator::prepareServerConfig(const ServerCredentials &credentia // Validate server config structure if (!serverConfig.contains("inbounds")) { + logger.error() << "Server config missing 'inbounds' field"; errorCode = ErrorCode::InternalError; return ""; } QJsonArray inbounds = serverConfig["inbounds"].toArray(); if (inbounds.isEmpty()) { + logger.error() << "Server config has empty 'inbounds' array"; errorCode = ErrorCode::InternalError; return ""; } QJsonObject inbound = inbounds[0].toObject(); if (!inbound.contains("settings")) { + logger.error() << "Inbound missing 'settings' field"; errorCode = ErrorCode::InternalError; return ""; } QJsonObject settings = inbound["settings"].toObject(); if (!settings.contains("clients")) { + logger.error() << "Settings missing 'clients' field"; errorCode = ErrorCode::InternalError; return ""; } @@ -88,6 +98,7 @@ QString XrayConfigurator::prepareServerConfig(const ServerCredentials &credentia libssh::ScpOverwriteMode::ScpOverwriteExisting ); if (errorCode != ErrorCode::NoError) { + logger.error() << "Failed to upload updated config"; return ""; } @@ -99,6 +110,7 @@ QString XrayConfigurator::prepareServerConfig(const ServerCredentials &credentia ); if (errorCode != ErrorCode::NoError) { + logger.error() << "Failed to restart container"; return ""; } @@ -111,6 +123,7 @@ QString XrayConfigurator::createConfig(const ServerCredentials &credentials, Doc // Get client ID from prepareServerConfig QString xrayClientId = prepareServerConfig(credentials, container, containerConfig, errorCode); if (errorCode != ErrorCode::NoError || xrayClientId.isEmpty()) { + logger.error() << "Failed to prepare server config"; errorCode = ErrorCode::InternalError; return ""; } @@ -119,6 +132,7 @@ QString XrayConfigurator::createConfig(const ServerCredentials &credentials, Doc m_serverController->genVarsForScript(credentials, container, containerConfig)); if (config.isEmpty()) { + logger.error() << "Failed to get config template"; errorCode = ErrorCode::InternalError; return ""; } @@ -126,6 +140,7 @@ QString XrayConfigurator::createConfig(const ServerCredentials &credentials, Doc QString xrayPublicKey = m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::PublicKeyPath, errorCode); if (errorCode != ErrorCode::NoError || xrayPublicKey.isEmpty()) { + logger.error() << "Failed to get public key"; errorCode = ErrorCode::InternalError; return ""; } @@ -134,6 +149,7 @@ QString XrayConfigurator::createConfig(const ServerCredentials &credentials, Doc QString xrayShortId = m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::shortidPath, errorCode); if (errorCode != ErrorCode::NoError || xrayShortId.isEmpty()) { + logger.error() << "Failed to get short ID"; errorCode = ErrorCode::InternalError; return ""; } @@ -141,6 +157,10 @@ QString XrayConfigurator::createConfig(const ServerCredentials &credentials, Doc // Validate all required variables are present if (!config.contains("$XRAY_CLIENT_ID") || !config.contains("$XRAY_PUBLIC_KEY") || !config.contains("$XRAY_SHORT_ID")) { + logger.error() << "Config template missing required variables:" + << "XRAY_CLIENT_ID:" << !config.contains("$XRAY_CLIENT_ID") + << "XRAY_PUBLIC_KEY:" << !config.contains("$XRAY_PUBLIC_KEY") + << "XRAY_SHORT_ID:" << !config.contains("$XRAY_SHORT_ID"); errorCode = ErrorCode::InternalError; return ""; } diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 04b4e18c..f07eae71 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -554,8 +554,8 @@ ErrorCode ClientManagementModel::revokeClient(const int row, const DockerContain break; } default: { - logger.warning() << "Unknown container type was received"; - break; + logger.error() << "Internal error: received unexpected container type"; + return ErrorCode::InternalError; } } @@ -597,22 +597,22 @@ ErrorCode ClientManagementModel::revokeClient(const QJsonObject &containerConfig switch(container) { - case DockerContainer::ShadowSocks: - case DockerContainer::Cloak: { - protocol = Proto::OpenVpn; - break; - } - case DockerContainer::OpenVpn: - case DockerContainer::WireGuard: - case DockerContainer::Awg: - case DockerContainer::Xray: { - protocol = ContainerProps::defaultProtocol(container); - break; - } - default: { - logger.warning() << "Unknown container type was received"; - return ErrorCode::NoError; - } + case DockerContainer::ShadowSocks: + case DockerContainer::Cloak: { + protocol = Proto::OpenVpn; + break; + } + case DockerContainer::OpenVpn: + case DockerContainer::WireGuard: + case DockerContainer::Awg: + case DockerContainer::Xray: { + protocol = ContainerProps::defaultProtocol(container); + break; + } + default: { + logger.error() << "Internal error: received unexpected container type"; + return ErrorCode::InternalError; + } } auto protocolConfig = ContainerProps::getProtocolConfigFromContainer(protocol, containerConfig); @@ -686,8 +686,8 @@ ErrorCode ClientManagementModel::revokeClient(const QJsonObject &containerConfig break; } default: - logger.warning() << "Unknown container type was received"; - break; + logger.error() << "Internal error: received unexpected container type"; + return ErrorCode::InternalError; } return errorCode;