added logic to the connect to vpn button

This commit is contained in:
vladimir.kuznetsov 2023-05-14 21:11:19 +08:00
parent 35d4222c7a
commit 116fa6777b
27 changed files with 293 additions and 125 deletions

View file

@ -66,7 +66,7 @@ ErrorCode OpenVpnOverCloakProtocol::start()
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;
setConnectionState(VpnProtocol::Disconnected);
setConnectionState(Vpn::ConnectionState::Disconnected);
if (exitStatus != QProcess::NormalExit){
emit protocolError(amnezia::ErrorCode::CloakExecutableCrashed);
stop();
@ -81,7 +81,7 @@ ErrorCode OpenVpnOverCloakProtocol::start()
m_ckProcess.waitForStarted();
if (m_ckProcess.state() == QProcess::ProcessState::Running) {
setConnectionState(VpnConnectionState::Connecting);
setConnectionState(Vpn::ConnectionState::Connecting);
return OpenVpnProtocol::start();
}

View file

@ -45,16 +45,16 @@ void OpenVpnProtocol::stop()
// TODO: need refactoring
// sendTermSignal() will even return true while server connected ???
if ((m_connectionState == VpnProtocol::Preparing) ||
(m_connectionState == VpnProtocol::Connecting) ||
(m_connectionState == VpnProtocol::Connected) ||
(m_connectionState == VpnProtocol::Reconnecting)) {
if ((m_connectionState == Vpn::ConnectionState::Preparing) ||
(m_connectionState == Vpn::ConnectionState::Connecting) ||
(m_connectionState == Vpn::ConnectionState::Connected) ||
(m_connectionState == Vpn::ConnectionState::Reconnecting)) {
if (!sendTermSignal()) {
killOpenVpnProcess();
}
m_managementServer.stop();
qApp->processEvents();
setConnectionState(VpnProtocol::Disconnecting);
setConnectionState(Vpn::ConnectionState::Disconnecting);
}
}
@ -175,7 +175,7 @@ ErrorCode OpenVpnProtocol::start()
return lastError();
}
setConnectionState(VpnConnectionState::Connecting);
setConnectionState(Vpn::ConnectionState::Connecting);
m_openVpnProcess = IpcClient::CreatePrivilegedProcess();
@ -208,7 +208,7 @@ ErrorCode OpenVpnProtocol::start()
});
connect(m_openVpnProcess.data(), &PrivilegedProcess::finished, this, [&]() {
setConnectionState(VpnConnectionState::Disconnected);
setConnectionState(Vpn::ConnectionState::Disconnected);
});
m_openVpnProcess->start();
@ -256,14 +256,14 @@ void OpenVpnProtocol::onReadyReadDataFromManagementServer()
if (line.contains("CONNECTED,SUCCESS")) {
sendByteCount();
stopTimeoutTimer();
setConnectionState(VpnProtocol::Connected);
setConnectionState(Vpn::ConnectionState::Connected);
continue;
} else if (line.contains("EXITING,SIGTER")) {
//openVpnStateSigTermHandler();
setConnectionState(VpnProtocol::Disconnecting);
setConnectionState(Vpn::ConnectionState::Disconnecting);
continue;
} else if (line.contains("RECONNECTING")) {
setConnectionState(VpnProtocol::Reconnecting);
setConnectionState(Vpn::ConnectionState::Reconnecting);
continue;
}
}

View file

@ -66,7 +66,7 @@ ErrorCode ShadowSocksVpnProtocol::start()
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;
setConnectionState(VpnProtocol::Disconnected);
setConnectionState(Vpn::ConnectionState::Disconnected);
if (exitStatus != QProcess::NormalExit){
emit protocolError(amnezia::ErrorCode::ShadowSocksExecutableCrashed);
stop();
@ -81,7 +81,7 @@ ErrorCode ShadowSocksVpnProtocol::start()
m_ssProcess.waitForStarted();
if (m_ssProcess.state() == QProcess::ProcessState::Running) {
setConnectionState(VpnConnectionState::Connecting);
setConnectionState(Vpn::ConnectionState::Connecting);
return OpenVpnProtocol::start();
}

View file

@ -18,7 +18,7 @@
VpnProtocol::VpnProtocol(const QJsonObject &configuration, QObject* parent)
: QObject(parent),
m_connectionState(VpnConnectionState::Unknown),
m_connectionState(Vpn::ConnectionState::Unknown),
m_rawConfig(configuration),
m_timeoutTimer(new QTimer(this)),
m_receivedBytes(0),
@ -32,7 +32,7 @@ void VpnProtocol::setLastError(ErrorCode lastError)
{
m_lastError = lastError;
if (lastError){
setConnectionState(VpnConnectionState::Error);
setConnectionState(Vpn::ConnectionState::Error);
}
qCritical().noquote() << "VpnProtocol error, code" << m_lastError << errorString(m_lastError);
}
@ -60,7 +60,7 @@ void VpnProtocol::stopTimeoutTimer()
m_timeoutTimer->stop();
}
VpnProtocol::VpnConnectionState VpnProtocol::connectionState() const
Vpn::ConnectionState VpnProtocol::connectionState() const
{
return m_connectionState;
}
@ -76,19 +76,19 @@ void VpnProtocol::setBytesChanged(quint64 receivedBytes, quint64 sentBytes)
m_sentBytes = sentBytes;
}
void VpnProtocol::setConnectionState(VpnProtocol::VpnConnectionState state)
void VpnProtocol::setConnectionState(Vpn::ConnectionState state)
{
qDebug() << "VpnProtocol::setConnectionState" << textConnectionState(state);
if (m_connectionState == state) {
return;
}
if (m_connectionState == VpnConnectionState::Disconnected && state == VpnConnectionState::Disconnecting) {
if (m_connectionState == Vpn::ConnectionState::Disconnected && state == Vpn::ConnectionState::Disconnecting) {
return;
}
m_connectionState = state;
if (m_connectionState == VpnConnectionState::Disconnected) {
if (m_connectionState == Vpn::ConnectionState::Disconnected) {
m_receivedBytes = 0;
m_sentBytes = 0;
}
@ -124,17 +124,17 @@ QString VpnProtocol::routeGateway() const
return m_routeGateway;
}
QString VpnProtocol::textConnectionState(VpnConnectionState connectionState)
QString VpnProtocol::textConnectionState(Vpn::ConnectionState connectionState)
{
switch (connectionState) {
case VpnConnectionState::Unknown: return tr("Unknown");
case VpnConnectionState::Disconnected: return tr("Disconnected");
case VpnConnectionState::Preparing: return tr("Preparing");
case VpnConnectionState::Connecting: return tr("Connecting...");
case VpnConnectionState::Connected: return tr("Connected");
case VpnConnectionState::Disconnecting: return tr("Disconnecting...");
case VpnConnectionState::Reconnecting: return tr("Reconnecting...");
case VpnConnectionState::Error: return tr("Error");
case Vpn::ConnectionState::Unknown: return tr("Unknown");
case Vpn::ConnectionState::Disconnected: return tr("Disconnected");
case Vpn::ConnectionState::Preparing: return tr("Preparing");
case Vpn::ConnectionState::Connecting: return tr("Connecting...");
case Vpn::ConnectionState::Connected: return tr("Connected");
case Vpn::ConnectionState::Disconnecting: return tr("Disconnecting...");
case Vpn::ConnectionState::Reconnecting: return tr("Reconnecting...");
case Vpn::ConnectionState::Error: return tr("Error");
default:
;
}
@ -149,10 +149,10 @@ QString VpnProtocol::textConnectionState() const
bool VpnProtocol::isConnected() const
{
return m_connectionState == VpnConnectionState::Connected;
return m_connectionState == Vpn::ConnectionState::Connected;
}
bool VpnProtocol::isDisconnected() const
{
return m_connectionState == VpnConnectionState::Disconnected;
return m_connectionState == Vpn::ConnectionState::Disconnected;
}

View file

@ -12,6 +12,33 @@ using namespace amnezia;
class QTimer;
//todo change name
namespace Vpn
{
Q_NAMESPACE
enum ConnectionState {
Unknown,
Disconnected,
Preparing,
Connecting,
Connected,
Disconnecting,
Reconnecting,
Error
};
Q_ENUM_NS(ConnectionState)
static void declareQmlVpnConnectionStateEnum() {
qmlRegisterUncreatableMetaObject(
Vpn::staticMetaObject,
"ConnectionState",
1, 0,
"ConnectionState",
"Error: only enums"
);
}
}
class VpnProtocol : public QObject
{
Q_OBJECT
@ -20,10 +47,7 @@ public:
explicit VpnProtocol(const QJsonObject& configuration, QObject* parent = nullptr);
virtual ~VpnProtocol() override = default;
enum VpnConnectionState {Unknown, Disconnected, Preparing, Connecting, Connected, Disconnecting, Reconnecting, Error};
Q_ENUM(VpnConnectionState)
static QString textConnectionState(VpnConnectionState connectionState);
static QString textConnectionState(Vpn::ConnectionState connectionState);
virtual ErrorCode prepare() { return ErrorCode::NoError; }
@ -32,7 +56,7 @@ public:
virtual ErrorCode start() = 0;
virtual void stop() = 0;
VpnConnectionState connectionState() const;
Vpn::ConnectionState connectionState() const;
ErrorCode lastError() const;
QString textConnectionState() const;
void setLastError(ErrorCode lastError);
@ -44,7 +68,7 @@ public:
signals:
void bytesChanged(quint64 receivedBytes, quint64 sentBytes);
void connectionStateChanged(VpnProtocol::VpnConnectionState state);
void connectionStateChanged(Vpn::ConnectionState state);
void timeoutTimerEvent();
void protocolError(amnezia::ErrorCode e);
@ -52,13 +76,13 @@ public slots:
virtual void onTimeout(); // todo: remove?
void setBytesChanged(quint64 receivedBytes, quint64 sentBytes);
void setConnectionState(VpnProtocol::VpnConnectionState state);
void setConnectionState(Vpn::ConnectionState state);
protected:
void startTimeoutTimer();
void stopTimeoutTimer();
VpnConnectionState m_connectionState;
Vpn::ConnectionState m_connectionState;
QString m_routeGateway;
QString m_vpnLocalAddress;

View file

@ -51,7 +51,7 @@ void WireguardProtocol::stop()
connect(m_wireguardStopProcess.data(), &PrivilegedProcess::errorOccurred, this, [this](QProcess::ProcessError error) {
qDebug() << "WireguardProtocol::WireguardProtocol Stop errorOccurred" << error;
setConnectionState(VpnConnectionState::Disconnected);
setConnectionState(Vpn::ConnectionState::Disconnected);
});
connect(m_wireguardStopProcess.data(), &PrivilegedProcess::stateChanged, this, [this](QProcess::ProcessState newState) {
@ -62,12 +62,12 @@ void WireguardProtocol::stop()
if (IpcClient::Interface()) {
QRemoteObjectPendingReply<bool> result = IpcClient::Interface()->isWireguardRunning();
if (result.returnValue()) {
setConnectionState(VpnProtocol::Disconnected);
setConnectionState(Vpn::ConnectionState::Disconnected);
return;
}
} else {
qCritical() << "IPC client not initialized";
setConnectionState(VpnProtocol::Disconnected);
setConnectionState(Vpn::ConnectionState::Disconnected);
return;
}
#endif
@ -75,7 +75,7 @@ void WireguardProtocol::stop()
m_wireguardStopProcess->start();
m_wireguardStopProcess->waitForFinished(10000);
setConnectionState(VpnProtocol::Disconnected);
setConnectionState(Vpn::ConnectionState::Disconnected);
#endif
}
@ -156,7 +156,7 @@ ErrorCode WireguardProtocol::start()
return lastError();
}
setConnectionState(VpnConnectionState::Connecting);
setConnectionState(Vpn::ConnectionState::Connecting);
m_wireguardStartProcess = IpcClient::CreatePrivilegedProcess();
@ -179,7 +179,7 @@ ErrorCode WireguardProtocol::start()
connect(m_wireguardStartProcess.data(), &PrivilegedProcess::errorOccurred, this, [this](QProcess::ProcessError error) {
qDebug() << "WireguardProtocol::WireguardProtocol errorOccurred" << error;
setConnectionState(VpnConnectionState::Disconnected);
setConnectionState(Vpn::ConnectionState::Disconnected);
});
connect(m_wireguardStartProcess.data(), &PrivilegedProcess::stateChanged, this, [this](QProcess::ProcessState newState) {
@ -187,7 +187,7 @@ ErrorCode WireguardProtocol::start()
});
connect(m_wireguardStartProcess.data(), &PrivilegedProcess::finished, this, [this]() {
setConnectionState(VpnConnectionState::Connected);
setConnectionState(Vpn::ConnectionState::Connected);
});
connect(m_wireguardStartProcess.data(), &PrivilegedProcess::readyRead, this, [this]() {