diff --git a/client/core/controllers/coreController.cpp b/client/core/controllers/coreController.cpp index 8f0fee0a5..1c6993630 100644 --- a/client/core/controllers/coreController.cpp +++ b/client/core/controllers/coreController.cpp @@ -56,11 +56,15 @@ void CoreController::initLocalProxy() if (port < 1024) { qWarning() << "Local proxy: invalid HTTP API port" << port << ", stopping server"; m_proxyServer->stop(); + m_settings->setLocalProxyHttpEnabled(false); + emit m_settings->localProxyStartFailed(tr("Local proxy disabled: invalid HTTP API port.")); return; } if (!m_proxyServer->start(port)) { qWarning() << "Local proxy: failed to start on port" << port; + m_settings->setLocalProxyHttpEnabled(false); + emit m_settings->localProxyStartFailed(tr("Local proxy failed to start. Check if the port is available.")); return; } diff --git a/client/core/local-proxy/proxyservice.cpp b/client/core/local-proxy/proxyservice.cpp index 745916f76..6286ee089 100644 --- a/client/core/local-proxy/proxyservice.cpp +++ b/client/core/local-proxy/proxyservice.cpp @@ -44,24 +44,14 @@ bool ProxyService::startXray() QString error; const auto configData = m_configManager->buildConfig(error); - qDebug() << "configData:" << configData.value().serializedConfig; - qDebug() << "configData:" << configData.value().parsedConfig; if (!configData) { logConfigError(error); return false; } - QString configPath; - if (!m_configManager->writeTempConfig(configData->serializedConfig, configPath, error)) { - qDebug() << "configPath:" << configPath; - logConfigError(error); - return false; - } - qDebug() << "configPath:" << configPath; - m_cachedConfig = configData->parsedConfig; - const bool success = m_xrayController->start(configPath); + const bool success = m_xrayController->start(configData->serializedConfig); if (success) { ProxyLogger::getInstance().info("Xray started successfully"); emit xrayStatusChanged(true); @@ -78,7 +68,6 @@ bool ProxyService::stopXray() const bool stopped = m_xrayController->stop(); if (stopped) { ProxyLogger::getInstance().info("Xray stopped"); - m_configManager->removeTempConfig(); emit xrayStatusChanged(false); return true; } diff --git a/client/core/local-proxy/xraycontroller.cpp b/client/core/local-proxy/xraycontroller.cpp index 02081df47..d96b44e0a 100644 --- a/client/core/local-proxy/xraycontroller.cpp +++ b/client/core/local-proxy/xraycontroller.cpp @@ -3,8 +3,6 @@ #include "proxylogger.h" #include "core/ipcclient.h" -#include - namespace { const QString kIpcUnavailableError = QStringLiteral("Failed to communicate with IPC service"); } @@ -20,25 +18,25 @@ XrayController::~XrayController() stop(); } -bool XrayController::start(const QString &configPath) +bool XrayController::start(const QString &configJson) { - if (m_isRunning) { ProxyLogger::getInstance().info("Xray is already running"); return true; } - + ProxyLogger::getInstance().info("Request to start Xray via IPC"); m_lastError.clear(); - QString configContent; - if (!loadConfigFile(configPath, configContent)) { + if (configJson.trimmed().isEmpty()) { + m_lastError = QStringLiteral("Config content is empty"); + ProxyLogger::getInstance().error(m_lastError); return false; } const bool ipcResult = IpcClient::withInterface([&](QSharedPointer iface) { - iface->xrayStart(configContent); + iface->xrayStart(configJson); return true; }, []() { return false; @@ -89,39 +87,4 @@ qint64 XrayController::getProcessId() const QString XrayController::getError() const { return m_lastError; -} - -bool XrayController::loadConfigFile(const QString &configPath, QString &configContent) -{ - if (configPath.isEmpty()) { - m_lastError = "Config path is empty"; - ProxyLogger::getInstance().error(m_lastError); - return false; - } - - QFile configFile(configPath); - if (!configFile.exists()) { - m_lastError = QString("Config file not found at: %1").arg(configPath); - ProxyLogger::getInstance().error(m_lastError); - return false; - } - - if (!configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { - m_lastError = QString("Failed to open config file: %1").arg(configFile.errorString()); - ProxyLogger::getInstance().error(m_lastError); - return false; - } - - QByteArray data = configFile.readAll(); - configFile.close(); - - if (data.isEmpty()) { - m_lastError = QString("Config file is empty: %1").arg(configPath); - ProxyLogger::getInstance().error(m_lastError); - return false; - } - - configContent = QString::fromUtf8(data); - ProxyLogger::getInstance().debug(QString("Loaded Xray config from %1").arg(configPath)); - return true; } \ No newline at end of file diff --git a/client/core/local-proxy/xraycontroller.h b/client/core/local-proxy/xraycontroller.h index 6cbf9284d..f45dbaf7e 100644 --- a/client/core/local-proxy/xraycontroller.h +++ b/client/core/local-proxy/xraycontroller.h @@ -10,15 +10,13 @@ public: explicit XrayController(QObject* parent = nullptr); ~XrayController(); - bool start(const QString& configPath); + bool start(const QString& configJson); bool stop(); bool isXrayRunning() const; qint64 getProcessId() const; QString getError() const; private: - bool loadConfigFile(const QString& configPath, QString& configContent); - bool m_isRunning {false}; QString m_lastError; }; \ No newline at end of file diff --git a/client/settings.h b/client/settings.h index 63da0dad0..e300f7f6d 100644 --- a/client/settings.h +++ b/client/settings.h @@ -253,6 +253,7 @@ signals: void serverRemoved(int serverIndex); void settingsCleared(); void localProxySettingsChanged(); + void localProxyStartFailed(const QString &message); private: QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const; diff --git a/client/ui/controllers/settingsController.cpp b/client/ui/controllers/settingsController.cpp index 227d15bfa..1ee14d0a9 100644 --- a/client/ui/controllers/settingsController.cpp +++ b/client/ui/controllers/settingsController.cpp @@ -56,6 +56,7 @@ SettingsController::SettingsController(const QSharedPointer &serve toggleDevGatewayEnv(m_isDevModeEnabled); connect(m_settings.get(), &Settings::localProxySettingsChanged, this, &SettingsController::localProxySettingsUpdated); + connect(m_settings.get(), &Settings::localProxyStartFailed, this, &SettingsController::localProxyStartFailed); } QString getPlatformName() diff --git a/client/ui/controllers/settingsController.h b/client/ui/controllers/settingsController.h index b54851e58..79d8c6c29 100644 --- a/client/ui/controllers/settingsController.h +++ b/client/ui/controllers/settingsController.h @@ -153,6 +153,7 @@ signals: void isHomeAdLabelVisibleChanged(bool visible); void startMinimizedChanged(); void localProxySettingsUpdated(); + void localProxyStartFailed(const QString &message); private: QSharedPointer m_serversModel;