added local port field to v2ray settings page

- some code style refactoring
This commit is contained in:
vladimir.kuznetsov 2023-02-14 08:35:03 +03:00
parent 2b0ba2aff9
commit 36fae9152f
10 changed files with 88 additions and 65 deletions

View file

@ -52,26 +52,25 @@ ErrorCode OpenVpnOverCloakProtocol::start()
args << "-u"; args << "-u";
} }
qDebug().noquote() << "OpenVpnOverCloakProtocol::start()" qDebug().noquote() << "OpenVpnOverCloakProtocol::start()" << cloakExecPath() << args.join(" ");
<< cloakExecPath() << args.join(" ");
m_ckProcess.setProcessChannelMode(QProcess::MergedChannels); m_ckProcess.setProcessChannelMode(QProcess::MergedChannels);
m_ckProcess.setProgram(cloakExecPath()); m_ckProcess.setProgram(cloakExecPath());
m_ckProcess.setArguments(args); m_ckProcess.setArguments(args);
connect(&m_ckProcess, &QProcess::readyReadStandardOutput, this, [this](){ connect(&m_ckProcess, &QProcess::readyReadStandardOutput, this, [this]() {
qDebug().noquote() << "ck-client:" << m_ckProcess.readAllStandardOutput(); qDebug().noquote() << "ck-client:" << m_ckProcess.readAllStandardOutput();
}); });
m_errorHandlerConnection = connect(&m_ckProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus){ m_errorHandlerConnection = connect(&m_ckProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) {
qDebug().noquote() << "OpenVpnOverCloakProtocol finished, exitCode, exiStatus" << exitCode << exitStatus; qDebug().noquote() << "OpenVpnOverCloakProtocol finished, exitCode, exiStatus" << exitCode << exitStatus;
setConnectionState(VpnProtocol::Disconnected); setConnectionState(VpnProtocol::Disconnected);
if (exitStatus != QProcess::NormalExit){ if (exitStatus != QProcess::NormalExit) {
emit protocolError(amnezia::ErrorCode::CloakExecutableCrashed); emit protocolError(amnezia::ErrorCode::CloakExecutableCrashed);
stop(); stop();
} }
if (exitCode !=0 ){ if (exitCode !=0 ) {
emit protocolError(amnezia::ErrorCode::InternalError); emit protocolError(amnezia::ErrorCode::InternalError);
stop(); stop();
} }
@ -84,8 +83,9 @@ ErrorCode OpenVpnOverCloakProtocol::start()
setConnectionState(VpnConnectionState::Connecting); setConnectionState(VpnConnectionState::Connecting);
return OpenVpnProtocol::start(); return OpenVpnProtocol::start();
} else {
return ErrorCode::CloakExecutableMissing;
} }
else return ErrorCode::CloakExecutableMissing;
#endif #endif
} }

View file

@ -9,7 +9,7 @@
#include <QJsonObject> #include <QJsonObject>
ShadowSocksVpnProtocol::ShadowSocksVpnProtocol(const QJsonObject &configuration, QObject *parent): ShadowSocksVpnProtocol::ShadowSocksVpnProtocol(const QJsonObject &configuration, QObject *parent):
OpenVpnProtocol(configuration, parent) OpenVpnProtocol(configuration, parent)
{ {
readShadowSocksConfiguration(configuration); readShadowSocksConfiguration(configuration);
} }
@ -32,7 +32,6 @@ ErrorCode ShadowSocksVpnProtocol::start()
return lastError(); return lastError();
} }
#ifndef Q_OS_IOS #ifndef Q_OS_IOS
if (Utils::processIsRunning(Utils::executable("ss-local", false))) { if (Utils::processIsRunning(Utils::executable("ss-local", false))) {
Utils::killProcessByName(Utils::executable("ss-local", false)); Utils::killProcessByName(Utils::executable("ss-local", false));
@ -48,30 +47,28 @@ ErrorCode ShadowSocksVpnProtocol::start()
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
QStringList args = QStringList() << "-c" << m_shadowSocksCfgFile.fileName(); QStringList args = QStringList() << "-c" << m_shadowSocksCfgFile.fileName();
#else #else
QStringList args = QStringList() << "-c" << m_shadowSocksCfgFile.fileName() QStringList args = QStringList() << "-c" << m_shadowSocksCfgFile.fileName() << "--no-delay";
<< "--no-delay";
#endif #endif
qDebug().noquote() << "ShadowSocksVpnProtocol::start()" qDebug().noquote() << "ShadowSocksVpnProtocol::start()" << shadowSocksExecPath() << args.join(" ");
<< shadowSocksExecPath() << args.join(" ");
m_ssProcess.setProcessChannelMode(QProcess::MergedChannels); m_ssProcess.setProcessChannelMode(QProcess::MergedChannels);
m_ssProcess.setProgram(shadowSocksExecPath()); m_ssProcess.setProgram(shadowSocksExecPath());
m_ssProcess.setArguments(args); m_ssProcess.setArguments(args);
connect(&m_ssProcess, &QProcess::readyReadStandardOutput, this, [this](){ connect(&m_ssProcess, &QProcess::readyReadStandardOutput, this, [this]() {
qDebug().noquote() << "ss-local:" << m_ssProcess.readAllStandardOutput(); qDebug().noquote() << "ss-local:" << m_ssProcess.readAllStandardOutput();
}); });
connect(&m_ssProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus){ connect(&m_ssProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) {
qDebug().noquote() << "ShadowSocksVpnProtocol finished, exitCode, exiStatus" << exitCode << exitStatus; qDebug().noquote() << "ShadowSocksVpnProtocol finished, exitCode, exiStatus" << exitCode << exitStatus;
setConnectionState(VpnProtocol::Disconnected); setConnectionState(VpnProtocol::Disconnected);
if (exitStatus != QProcess::NormalExit){ if (exitStatus != QProcess::NormalExit) {
emit protocolError(amnezia::ErrorCode::ShadowSocksExecutableCrashed); emit protocolError(amnezia::ErrorCode::ShadowSocksExecutableCrashed);
stop(); stop();
} }
if (exitCode !=0 ){ if (exitCode !=0 ) {
emit protocolError(amnezia::ErrorCode::InternalError); emit protocolError(amnezia::ErrorCode::InternalError);
stop(); stop();
} }
@ -84,8 +81,9 @@ ErrorCode ShadowSocksVpnProtocol::start()
setConnectionState(VpnConnectionState::Connecting); setConnectionState(VpnConnectionState::Connecting);
return OpenVpnProtocol::start(); return OpenVpnProtocol::start();
} else {
return ErrorCode::ShadowSocksExecutableMissing;
} }
else return ErrorCode::ShadowSocksExecutableMissing;
#else #else
return ErrorCode::NotImplementedError; return ErrorCode::NotImplementedError;
#endif #endif

View file

@ -1,9 +1,9 @@
#ifndef SHADOWSOCKSVPNPROTOCOL_H #ifndef SHADOWSOCKSVPNPROTOCOL_H
#define SHADOWSOCKSVPNPROTOCOL_H #define SHADOWSOCKSVPNPROTOCOL_H
#include "openvpnprotocol.h"
#include "QProcess" #include "QProcess"
#include "containers/containers_defs.h"
#include "openvpnprotocol.h"
class ShadowSocksVpnProtocol : public OpenVpnProtocol class ShadowSocksVpnProtocol : public OpenVpnProtocol
{ {
@ -14,20 +14,18 @@ public:
ErrorCode start() override; ErrorCode start() override;
void stop() override; void stop() override;
protected:
void readShadowSocksConfiguration(const QJsonObject &configuration);
protected: protected:
QJsonObject m_shadowSocksConfig; QJsonObject m_shadowSocksConfig;
private: void readShadowSocksConfiguration(const QJsonObject &configuration);
static QString shadowSocksExecPath();
private: private:
#ifndef Q_OS_IOS #ifndef Q_OS_IOS
QProcess m_ssProcess; QProcess m_ssProcess;
#endif #endif
QTemporaryFile m_shadowSocksCfgFile; QTemporaryFile m_shadowSocksCfgFile;
static QString shadowSocksExecPath();
}; };
#endif // SHADOWSOCKSVPNPROTOCOL_H #endif // SHADOWSOCKSVPNPROTOCOL_H

View file

@ -32,22 +32,21 @@ ErrorCode V2RayProtocol::start()
QStringList args = QStringList() << "-c" << m_v2RayConfigFile.fileName(); QStringList args = QStringList() << "-c" << m_v2RayConfigFile.fileName();
qDebug().noquote() << "V2RayProtocol::start()" qDebug().noquote() << "V2RayProtocol::start()" << v2RayExecPath() << args.join(" ");
<< v2RayExecPath() << args.join(" ");
m_v2RayProcess.setProcessChannelMode(QProcess::MergedChannels); m_v2RayProcess.setProcessChannelMode(QProcess::MergedChannels);
m_v2RayProcess.setProgram(v2RayExecPath()); m_v2RayProcess.setProgram(v2RayExecPath());
m_v2RayProcess.setArguments(args); m_v2RayProcess.setArguments(args);
connect(&m_v2RayProcess, &QProcess::readyReadStandardOutput, this, [this](){ connect(&m_v2RayProcess, &QProcess::readyReadStandardOutput, this, [this]() {
qDebug().noquote() << "V2Ray:" << m_v2RayProcess.readAllStandardOutput(); qDebug().noquote() << "V2Ray:" << m_v2RayProcess.readAllStandardOutput();
}); });
connect(&m_v2RayProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) { connect(&m_v2RayProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) {
qDebug().noquote() << "V2RayProtocol finished, exitCode, exiStatus" << exitCode << exitStatus; qDebug().noquote() << "V2RayProtocol finished, exitCode, exiStatus" << exitCode << exitStatus;
setConnectionState(VpnProtocol::Disconnected); setConnectionState(VpnProtocol::Disconnected);
if (exitStatus != QProcess::NormalExit){ if (exitStatus != QProcess::NormalExit) {
emit protocolError(amnezia::ErrorCode::V2RayExecutableCrashed); emit protocolError(amnezia::ErrorCode::V2RayExecutableCrashed);
stop(); stop();
} }
@ -64,7 +63,9 @@ ErrorCode V2RayProtocol::start()
setConnectionState(VpnConnectionState::Connecting); setConnectionState(VpnConnectionState::Connecting);
return OpenVpnProtocol::start(); return OpenVpnProtocol::start();
} else return ErrorCode::V2RayExecutableMissing; } else {
return ErrorCode::V2RayExecutableMissing;
}
#else #else
return ErrorCode::NotImplementedError; return ErrorCode::NotImplementedError;
#endif #endif

View file

@ -112,15 +112,15 @@ void CloakLogic::onPushButtonSaveClicked()
progressBarFunc.setTextVisibleFunc(true); progressBarFunc.setTextVisibleFunc(true);
progressBarFunc.setTextFunc(QString("Configuring...")); progressBarFunc.setTextFunc(QString("Configuring..."));
ErrorCode e = uiLogic()->pageLogic<ServerConfiguringProgressLogic>()->doInstallAction([this, containerConfig, &newContainerConfig](){
auto installAction = [this, containerConfig, &newContainerConfig]() {
return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex),
uiLogic()->selectedDockerContainer, uiLogic()->selectedDockerContainer, containerConfig, newContainerConfig);
containerConfig, };
newContainerConfig);
}, ErrorCode e = uiLogic()->pageLogic<ServerConfiguringProgressLogic>()->doInstallAction(installAction, pageFunc, progressBarFunc,
pageFunc, progressBarFunc, saveButtonFunc, waitInfoFunc,
saveButtonFunc, waitInfoFunc, busyInfoFuncy, cancelButtonFunc);
busyInfoFuncy, cancelButtonFunc);
if (!e) { if (!e) {
m_settings->setContainerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, newContainerConfig); m_settings->setContainerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, newContainerConfig);

View file

@ -162,15 +162,15 @@ void OpenVpnLogic::onPushButtonSaveClicked()
progressBarFunc.setTextVisibleFunc(true); progressBarFunc.setTextVisibleFunc(true);
progressBarFunc.setTextFunc(QString("Configuring...")); progressBarFunc.setTextFunc(QString("Configuring..."));
ErrorCode e = uiLogic()->pageLogic<ServerConfiguringProgressLogic>()->doInstallAction([this, containerConfig, &newContainerConfig](){
auto installAction = [this, containerConfig, &newContainerConfig]() {
return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex),
uiLogic()->selectedDockerContainer, uiLogic()->selectedDockerContainer, containerConfig, newContainerConfig);
containerConfig, };
newContainerConfig);
}, ErrorCode e = uiLogic()->pageLogic<ServerConfiguringProgressLogic>()->doInstallAction(installAction, pageFunc, progressBarFunc,
pageFunc, progressBarFunc, saveButtonFunc, waitInfoFunc,
saveButtonFunc, waitInfoFunc, busyInfoFuncy, cancelButtonFunc);
busyInfoFuncy, cancelButtonFunc);
if (!e) { if (!e) {
m_settings->setContainerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, newContainerConfig); m_settings->setContainerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, newContainerConfig);

View file

@ -50,6 +50,7 @@ QJsonObject ShadowSocksLogic::getProtocolConfigFromPage(QJsonObject oldConfig)
void ShadowSocksLogic::onPushButtonSaveClicked() void ShadowSocksLogic::onPushButtonSaveClicked()
{ {
QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Proto::ShadowSocks); QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Proto::ShadowSocks);
protocolConfig = getProtocolConfigFromPage(protocolConfig);
QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer);
QJsonObject newContainerConfig = containerConfig; QJsonObject newContainerConfig = containerConfig;
@ -105,11 +106,9 @@ void ShadowSocksLogic::onPushButtonSaveClicked()
progressBarFunc.setTextVisibleFunc(true); progressBarFunc.setTextVisibleFunc(true);
progressBarFunc.setTextFunc(QString("Configuring...")); progressBarFunc.setTextFunc(QString("Configuring..."));
auto installAction = [this, containerConfig, &newContainerConfig](){ auto installAction = [this, containerConfig, &newContainerConfig]() {
return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex),
uiLogic()->selectedDockerContainer, uiLogic()->selectedDockerContainer, containerConfig, newContainerConfig);
containerConfig,
newContainerConfig);
}; };
ErrorCode e = uiLogic()->pageLogic<ServerConfiguringProgressLogic>()->doInstallAction(installAction, pageFunc, progressBarFunc, ErrorCode e = uiLogic()->pageLogic<ServerConfiguringProgressLogic>()->doInstallAction(installAction, pageFunc, progressBarFunc,
saveButtonFunc, waitInfoFunc, saveButtonFunc, waitInfoFunc,

View file

@ -11,14 +11,16 @@ using namespace PageEnumNS;
V2RayLogic::V2RayLogic(UiLogic *logic, QObject *parent): V2RayLogic::V2RayLogic(UiLogic *logic, QObject *parent):
PageProtocolLogicBase(logic, parent), PageProtocolLogicBase(logic, parent),
m_lineEditPortText{}, m_lineEditServerPortText{},
m_pushButtonSaveVisible{false}, m_pushButtonSaveVisible{false},
m_progressBarResetVisible{false}, m_progressBarResetVisible{false},
m_lineEditPortEnabled{false}, m_lineEditServerPortEnabled{false},
m_labelInfoVisible{true}, m_labelInfoVisible{true},
m_labelInfoText{}, m_labelInfoText{},
m_progressBarResetValue{0}, m_progressBarResetValue{0},
m_progressBarResetMaximium{100} m_progressBarResetMaximium{100},
m_lineEditLocalPortEnabled{false},
m_lineEditLocalPortText{}
{ {
} }
@ -29,21 +31,25 @@ void V2RayLogic::updateProtocolPage(const QJsonObject &v2RayConfig, DockerContai
set_pushButtonSaveVisible(haveAuthData); set_pushButtonSaveVisible(haveAuthData);
set_progressBarResetVisible(haveAuthData); set_progressBarResetVisible(haveAuthData);
set_lineEditPortText(v2RayConfig.value(config_key::port). set_lineEditServerPortText(v2RayConfig.value(config_key::port).toString(protocols::v2ray::defaultServerPort));
toString(protocols::v2ray::defaultServerPort)); set_lineEditServerPortEnabled(container == DockerContainer::V2Ray);
set_lineEditLocalPortText(v2RayConfig.value(config_key::local_port).toString(protocols::v2ray::defaultLocalPort));
set_lineEditLocalPortEnabled(container == DockerContainer::V2Ray);
set_lineEditPortEnabled(container == DockerContainer::V2Ray);
} }
QJsonObject V2RayLogic::getProtocolConfigFromPage(QJsonObject oldConfig) QJsonObject V2RayLogic::getProtocolConfigFromPage(QJsonObject oldConfig)
{ {
oldConfig.insert(config_key::port, lineEditPortText()); oldConfig.insert(config_key::port, lineEditServerPortText());
oldConfig.insert(config_key::local_port, lineEditLocalPortText());
return oldConfig; return oldConfig;
} }
void V2RayLogic::onPushButtonSaveClicked() void V2RayLogic::onPushButtonSaveClicked()
{ {
QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Proto::V2Ray); QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, Proto::V2Ray);
protocolConfig = getProtocolConfigFromPage(protocolConfig);
QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer);
QJsonObject newContainerConfig = containerConfig; QJsonObject newContainerConfig = containerConfig;
@ -101,9 +107,7 @@ void V2RayLogic::onPushButtonSaveClicked()
auto installAction = [this, containerConfig, &newContainerConfig]() { auto installAction = [this, containerConfig, &newContainerConfig]() {
return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex),
uiLogic()->selectedDockerContainer, uiLogic()->selectedDockerContainer, containerConfig, newContainerConfig);
containerConfig,
newContainerConfig);
}; };
ErrorCode e = uiLogic()->pageLogic<ServerConfiguringProgressLogic>()->doInstallAction(installAction, pageFunc, progressBarFunc, ErrorCode e = uiLogic()->pageLogic<ServerConfiguringProgressLogic>()->doInstallAction(installAction, pageFunc, progressBarFunc,

View file

@ -9,8 +9,11 @@ class V2RayLogic : public PageProtocolLogicBase
{ {
Q_OBJECT Q_OBJECT
AUTO_PROPERTY(bool, lineEditPortEnabled) AUTO_PROPERTY(bool, lineEditServerPortEnabled)
AUTO_PROPERTY(QString, lineEditPortText) AUTO_PROPERTY(QString, lineEditServerPortText)
AUTO_PROPERTY(bool, lineEditLocalPortEnabled)
AUTO_PROPERTY(QString, lineEditLocalPortText)
AUTO_PROPERTY(bool, labelInfoVisible) AUTO_PROPERTY(bool, labelInfoVisible)
AUTO_PROPERTY(QString, labelInfoText) AUTO_PROPERTY(QString, labelInfoText)

View file

@ -43,11 +43,31 @@ PageProtocolBase {
TextFieldType { TextFieldType {
Layout.fillWidth: true Layout.fillWidth: true
height: 31 height: 31
text: logic.lineEditPortText text: logic.lineEditServerPortText
onEditingFinished: { onEditingFinished: {
logic.lineEditPortText = text logic.lineEditServerPortText = text
} }
enabled: logic.lineEditPortEnabled enabled: logic.lineEditServerPortEnabled
}
}
RowLayout {
Layout.fillWidth: true
LabelType {
Layout.preferredWidth: 0.3 * root.width - 10
height: 31
text: qsTr("Local port")
}
TextFieldType {
Layout.fillWidth: true
height: 31
text: logic.lineEditLocalPortText
onEditingFinished: {
logic.lineEditLocalPortText = text
}
enabled: logic.lineEditLocalPortEnabled
} }
} }