diff --git a/client/configurators/awg_configurator.cpp b/client/configurators/awg_configurator.cpp index a9b41882..d0a1034e 100644 --- a/client/configurators/awg_configurator.cpp +++ b/client/configurators/awg_configurator.cpp @@ -3,15 +3,13 @@ #include #include -#include "core/controllers/serverController.h" - -AwgConfigurator::AwgConfigurator(std::shared_ptr settings, QObject *parent) - : WireguardConfigurator(settings, true, parent) +AwgConfigurator::AwgConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent) + : WireguardConfigurator(settings, serverController, true, parent) { } -QString AwgConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode errorCode) +QString AwgConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, + ErrorCode errorCode) { QString config = WireguardConfigurator::createConfig(credentials, container, containerConfig, errorCode); @@ -41,8 +39,8 @@ QString AwgConfigurator::createConfig(const ServerCredentials &credentials, Dock jsonConfig[config_key::responsePacketMagicHeader] = configMap.value(config_key::responsePacketMagicHeader); jsonConfig[config_key::underloadPacketMagicHeader] = configMap.value(config_key::underloadPacketMagicHeader); jsonConfig[config_key::transportPacketMagicHeader] = configMap.value(config_key::transportPacketMagicHeader); - jsonConfig[config_key::mtu] = containerConfig.value(ProtocolProps::protoToString(Proto::Awg)).toObject(). - value(config_key::mtu).toString(protocols::awg::defaultMtu); + jsonConfig[config_key::mtu] = + containerConfig.value(ProtocolProps::protoToString(Proto::Awg)).toObject().value(config_key::mtu).toString(protocols::awg::defaultMtu); return QJsonDocument(jsonConfig).toJson(); } diff --git a/client/configurators/awg_configurator.h b/client/configurators/awg_configurator.h index 8decd2d6..0a64bbb1 100644 --- a/client/configurators/awg_configurator.h +++ b/client/configurators/awg_configurator.h @@ -9,7 +9,7 @@ class AwgConfigurator : public WireguardConfigurator { Q_OBJECT public: - AwgConfigurator(std::shared_ptr settings, QObject *parent = nullptr); + AwgConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent = nullptr); QString createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode errorCode); diff --git a/client/configurators/cloak_configurator.cpp b/client/configurators/cloak_configurator.cpp index 6c719c70..d876e7b8 100644 --- a/client/configurators/cloak_configurator.cpp +++ b/client/configurators/cloak_configurator.cpp @@ -1,33 +1,30 @@ #include "cloak_configurator.h" #include -#include #include +#include -#include "core/controllers/serverController.h" #include "containers/containers_defs.h" +#include "core/controllers/serverController.h" -CloakConfigurator::CloakConfigurator(std::shared_ptr settings, QObject *parent): - ConfiguratorBase(settings, parent) +CloakConfigurator::CloakConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent) + : ConfiguratorBase(settings, serverController, parent) { - } -QString CloakConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode errorCode) +QString CloakConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, + ErrorCode errorCode) { - ServerController serverController(m_settings); - - QString cloakPublicKey = serverController.getTextFileFromContainer(container, credentials, - amnezia::protocols::cloak::ckPublicKeyPath, errorCode); + QString cloakPublicKey = + m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::cloak::ckPublicKeyPath, errorCode); cloakPublicKey.replace("\n", ""); if (errorCode != ErrorCode::NoError) { return ""; } - QString cloakBypassUid = serverController.getTextFileFromContainer(container, credentials, - amnezia::protocols::cloak::ckBypassUidKeyPath, errorCode); + QString cloakBypassUid = + m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::cloak::ckBypassUidKeyPath, errorCode); cloakBypassUid.replace("\n", ""); if (errorCode != ErrorCode::NoError) { @@ -47,8 +44,8 @@ QString CloakConfigurator::createConfig(const ServerCredentials &credentials, Do config.insert("RemoteHost", credentials.hostName); config.insert("RemotePort", "$CLOAK_SERVER_PORT"); - QString textCfg = serverController.replaceVars(QJsonDocument(config).toJson(), - serverController.genVarsForScript(credentials, container, containerConfig)); + QString textCfg = m_serverController->replaceVars(QJsonDocument(config).toJson(), + m_serverController->genVarsForScript(credentials, container, containerConfig)); return textCfg; } diff --git a/client/configurators/cloak_configurator.h b/client/configurators/cloak_configurator.h index 5dbfd190..6c2523fb 100644 --- a/client/configurators/cloak_configurator.h +++ b/client/configurators/cloak_configurator.h @@ -11,7 +11,7 @@ class CloakConfigurator : public ConfiguratorBase { Q_OBJECT public: - CloakConfigurator(std::shared_ptr settings, QObject *parent = nullptr); + CloakConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent = nullptr); QString createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode errorCode); diff --git a/client/configurators/configurator_base.cpp b/client/configurators/configurator_base.cpp index 7393cb1a..3502538c 100644 --- a/client/configurators/configurator_base.cpp +++ b/client/configurators/configurator_base.cpp @@ -1,7 +1,7 @@ #include "configurator_base.h" -ConfiguratorBase::ConfiguratorBase(std::shared_ptr settings, QObject *parent) - : QObject { parent }, m_settings(settings) +ConfiguratorBase::ConfiguratorBase(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent) + : QObject { parent }, m_settings(settings), m_serverController(serverController) { } diff --git a/client/configurators/configurator_base.h b/client/configurators/configurator_base.h index 3330e272..f63892eb 100644 --- a/client/configurators/configurator_base.h +++ b/client/configurators/configurator_base.h @@ -5,13 +5,14 @@ #include "containers/containers_defs.h" #include "core/defs.h" +#include "core/controllers/serverController.h" #include "settings.h" class ConfiguratorBase : public QObject { Q_OBJECT public: - explicit ConfiguratorBase(std::shared_ptr settings, QObject *parent = nullptr); + explicit ConfiguratorBase(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent = nullptr); virtual QString createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode errorCode) = 0; @@ -25,6 +26,8 @@ protected: void processConfigWithDnsSettings(const QPair &dns, QString &protocolConfigString); std::shared_ptr m_settings; + QSharedPointer m_serverController; + }; #endif // CONFIGURATORBASE_H diff --git a/client/configurators/ikev2_configurator.cpp b/client/configurators/ikev2_configurator.cpp index 9a8eebb0..bf1a8ad4 100644 --- a/client/configurators/ikev2_configurator.cpp +++ b/client/configurators/ikev2_configurator.cpp @@ -9,18 +9,18 @@ #include #include "containers/containers_defs.h" +#include "core/controllers/serverController.h" #include "core/scripts_registry.h" #include "core/server_defs.h" -#include "core/controllers/serverController.h" #include "utilities.h" -Ikev2Configurator::Ikev2Configurator(std::shared_ptr settings, QObject *parent) - : ConfiguratorBase(settings, parent) +Ikev2Configurator::Ikev2Configurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent) + : ConfiguratorBase(settings, serverController, parent) { } -Ikev2Configurator::ConnectionData Ikev2Configurator::prepareIkev2Config(const ServerCredentials &credentials, - DockerContainer container, ErrorCode errorCode) +Ikev2Configurator::ConnectionData Ikev2Configurator::prepareIkev2Config(const ServerCredentials &credentials, DockerContainer container, + ErrorCode errorCode) { Ikev2Configurator::ConnectionData connData; connData.host = credentials.hostName; @@ -39,18 +39,14 @@ Ikev2Configurator::ConnectionData Ikev2Configurator::prepareIkev2Config(const Se "--extKeyUsage serverAuth,clientAuth -8 \"%1\"") .arg(connData.clientId); - ServerController serverController(m_settings); - errorCode = serverController.runContainerScript(credentials, container, scriptCreateCert); + errorCode = m_serverController->runContainerScript(credentials, container, scriptCreateCert); - QString scriptExportCert = QString("pk12util -W \"%1\" -d sql:/etc/ipsec.d -n \"%2\" -o \"%3\"") - .arg(connData.password) - .arg(connData.clientId) - .arg(certFileName); - errorCode = serverController.runContainerScript(credentials, container, scriptExportCert); + QString scriptExportCert = + QString("pk12util -W \"%1\" -d sql:/etc/ipsec.d -n \"%2\" -o \"%3\"").arg(connData.password).arg(connData.clientId).arg(certFileName); + errorCode = m_serverController->runContainerScript(credentials, container, scriptExportCert); - connData.clientCert = serverController.getTextFileFromContainer(container, credentials, certFileName, errorCode); - connData.caCert = - serverController.getTextFileFromContainer(container, credentials, "/etc/ipsec.d/ca_cert_base64.p12", errorCode); + connData.clientCert = m_serverController->getTextFileFromContainer(container, credentials, certFileName, errorCode); + connData.caCert = m_serverController->getTextFileFromContainer(container, credentials, "/etc/ipsec.d/ca_cert_base64.p12", errorCode); qDebug() << "Ikev2Configurator::ConnectionData client cert size:" << connData.clientCert.size(); qDebug() << "Ikev2Configurator::ConnectionData ca cert size:" << connData.caCert.size(); @@ -58,8 +54,8 @@ Ikev2Configurator::ConnectionData Ikev2Configurator::prepareIkev2Config(const Se return connData; } -QString Ikev2Configurator::createConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode errorCode) +QString Ikev2Configurator::createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, + ErrorCode errorCode) { Q_UNUSED(containerConfig) diff --git a/client/configurators/ikev2_configurator.h b/client/configurators/ikev2_configurator.h index 53b82525..322028c1 100644 --- a/client/configurators/ikev2_configurator.h +++ b/client/configurators/ikev2_configurator.h @@ -11,7 +11,7 @@ class Ikev2Configurator : public ConfiguratorBase { Q_OBJECT public: - Ikev2Configurator(std::shared_ptr settings, QObject *parent = nullptr); + Ikev2Configurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent = nullptr); struct ConnectionData { QByteArray clientCert; // p12 client cert diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index 9631162b..ff2b4804 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -24,14 +24,14 @@ #include #include -OpenVpnConfigurator::OpenVpnConfigurator(std::shared_ptr settings, QObject *parent) - : ConfiguratorBase(settings, parent) +OpenVpnConfigurator::OpenVpnConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, + QObject *parent) + : ConfiguratorBase(settings, serverController, parent) { } OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(const ServerCredentials &credentials, - DockerContainer container, - ErrorCode errorCode) + DockerContainer container, ErrorCode errorCode) { OpenVpnConfigurator::ConnectionData connData = OpenVpnConfigurator::createCertRequest(); connData.host = credentials.hostName; @@ -43,8 +43,7 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(co QString reqFileName = QString("%1/%2.req").arg(amnezia::protocols::openvpn::clientsDirPath).arg(connData.clientId); - ServerController serverController(m_settings); - errorCode = serverController.uploadTextFileToContainer(container, credentials, connData.request, reqFileName); + errorCode = m_serverController->uploadTextFileToContainer(container, credentials, connData.request, reqFileName); if (errorCode != ErrorCode::NoError) { return connData; } @@ -54,18 +53,16 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(co return connData; } - connData.caCert = serverController.getTextFileFromContainer(container, credentials, - amnezia::protocols::openvpn::caCertPath, errorCode); - connData.clientCert = serverController.getTextFileFromContainer( - container, credentials, - QString("%1/%2.crt").arg(amnezia::protocols::openvpn::clientCertPath).arg(connData.clientId), errorCode); + connData.caCert = + m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::openvpn::caCertPath, errorCode); + connData.clientCert = m_serverController->getTextFileFromContainer( + container, credentials, QString("%1/%2.crt").arg(amnezia::protocols::openvpn::clientCertPath).arg(connData.clientId), errorCode); if (errorCode != ErrorCode::NoError) { return connData; } - connData.taKey = serverController.getTextFileFromContainer(container, credentials, - amnezia::protocols::openvpn::taKeyPath, errorCode); + connData.taKey = m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::openvpn::taKeyPath, errorCode); if (connData.caCert.isEmpty() || connData.clientCert.isEmpty() || connData.taKey.isEmpty()) { errorCode = ErrorCode::SshScpFailureError; @@ -77,10 +74,8 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(co QString OpenVpnConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode errorCode) { - ServerController serverController(m_settings); - QString config = - serverController.replaceVars(amnezia::scriptData(ProtocolScriptType::openvpn_template, container), - serverController.genVarsForScript(credentials, container, containerConfig)); + QString config = m_serverController->replaceVars(amnezia::scriptData(ProtocolScriptType::openvpn_template, container), + m_serverController->genVarsForScript(credentials, container, containerConfig)); ConnectionData connData = prepareOpenVpnConfig(credentials, container, errorCode); if (errorCode != ErrorCode::NoError) { @@ -194,12 +189,10 @@ ErrorCode OpenVpnConfigurator::signCert(DockerContainer container, const ServerC .arg(ContainerProps::containerToString(container)) .arg(clientId); - ServerController serverController(m_settings); QStringList scriptList { script_import, script_sign }; - QString script = serverController.replaceVars(scriptList.join("\n"), - serverController.genVarsForScript(credentials, container)); + QString script = m_serverController->replaceVars(scriptList.join("\n"), m_serverController->genVarsForScript(credentials, container)); - return serverController.runScript(credentials, script); + return m_serverController->runScript(credentials, script); } OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::createCertRequest() @@ -233,8 +226,8 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::createCertRequest() X509_NAME_add_entry_by_txt(x509_name, "C", MBSTRING_ASC, (unsigned char *)"ORG", -1, -1, 0); X509_NAME_add_entry_by_txt(x509_name, "O", MBSTRING_ASC, (unsigned char *)"", -1, -1, 0); - X509_NAME_add_entry_by_txt(x509_name, "CN", MBSTRING_ASC, - reinterpret_cast(clientIdUtf8.data()), clientIdUtf8.size(), -1, 0); + X509_NAME_add_entry_by_txt(x509_name, "CN", MBSTRING_ASC, reinterpret_cast(clientIdUtf8.data()), + clientIdUtf8.size(), -1, 0); // 4. set public key of x509 req ret = X509_REQ_set_pubkey(x509_req, pKey); diff --git a/client/configurators/openvpn_configurator.h b/client/configurators/openvpn_configurator.h index eb99be40..f98831db 100644 --- a/client/configurators/openvpn_configurator.h +++ b/client/configurators/openvpn_configurator.h @@ -11,7 +11,7 @@ class OpenVpnConfigurator : public ConfiguratorBase { Q_OBJECT public: - OpenVpnConfigurator(std::shared_ptr settings, QObject *parent = nullptr); + OpenVpnConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent = nullptr); struct ConnectionData { diff --git a/client/configurators/shadowsocks_configurator.cpp b/client/configurators/shadowsocks_configurator.cpp index 28162962..9cd1ee5b 100644 --- a/client/configurators/shadowsocks_configurator.cpp +++ b/client/configurators/shadowsocks_configurator.cpp @@ -1,25 +1,23 @@ #include "shadowsocks_configurator.h" #include -#include #include +#include #include "containers/containers_defs.h" #include "core/controllers/serverController.h" -ShadowSocksConfigurator::ShadowSocksConfigurator(std::shared_ptr settings, QObject *parent): - ConfiguratorBase(settings, parent) +ShadowSocksConfigurator::ShadowSocksConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, + QObject *parent) + : ConfiguratorBase(settings, serverController, parent) { - } QString ShadowSocksConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode errorCode) { - ServerController serverController(m_settings); - - QString ssKey = serverController.getTextFileFromContainer(container, credentials, - amnezia::protocols::shadowsocks::ssKeyPath, errorCode); + QString ssKey = + m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::shadowsocks::ssKeyPath, errorCode); ssKey.replace("\n", ""); if (errorCode != ErrorCode::NoError) { @@ -34,10 +32,9 @@ QString ShadowSocksConfigurator::createConfig(const ServerCredentials &credentia config.insert("timeout", 60); config.insert("method", "$SHADOWSOCKS_CIPHER"); + QString textCfg = m_serverController->replaceVars(QJsonDocument(config).toJson(), + m_serverController->genVarsForScript(credentials, container, containerConfig)); - QString textCfg = serverController.replaceVars(QJsonDocument(config).toJson(), - serverController.genVarsForScript(credentials, container, containerConfig)); - - //qDebug().noquote() << textCfg; + // qDebug().noquote() << textCfg; return textCfg; } diff --git a/client/configurators/shadowsocks_configurator.h b/client/configurators/shadowsocks_configurator.h index f67045b3..1e8d997b 100644 --- a/client/configurators/shadowsocks_configurator.h +++ b/client/configurators/shadowsocks_configurator.h @@ -10,7 +10,7 @@ class ShadowSocksConfigurator : public ConfiguratorBase { Q_OBJECT public: - ShadowSocksConfigurator(std::shared_ptr settings, QObject *parent = nullptr); + ShadowSocksConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent = nullptr); QString createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode errorCode); diff --git a/client/configurators/ssh_configurator.cpp b/client/configurators/ssh_configurator.cpp index 42e7eb47..308f5947 100644 --- a/client/configurators/ssh_configurator.cpp +++ b/client/configurators/ssh_configurator.cpp @@ -17,8 +17,8 @@ #include "core/server_defs.h" #include "utilities.h" -SshConfigurator::SshConfigurator(std::shared_ptr settings, QObject *parent) - : ConfiguratorBase(settings, parent) +SshConfigurator::SshConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent) + : ConfiguratorBase(settings, serverController, parent) { } @@ -82,8 +82,7 @@ void SshConfigurator::openSshTerminal(const ServerCredentials &credentials) // p->setNativeArguments(QString("%1@%2") // .arg(credentials.userName).arg(credentials.hostName).arg(credentials.secretData)); } else { - p->setNativeArguments( - QString("%1@%2 -pw %3").arg(credentials.userName).arg(credentials.hostName).arg(credentials.secretData)); + p->setNativeArguments(QString("%1@%2 -pw %3").arg(credentials.userName).arg(credentials.hostName).arg(credentials.secretData)); } #else p->setProgram("/bin/bash"); diff --git a/client/configurators/ssh_configurator.h b/client/configurators/ssh_configurator.h index 2f8cb550..be8c0a3b 100644 --- a/client/configurators/ssh_configurator.h +++ b/client/configurators/ssh_configurator.h @@ -11,7 +11,7 @@ class SshConfigurator : ConfiguratorBase { Q_OBJECT public: - SshConfigurator(std::shared_ptr settings, QObject *parent = nullptr); + SshConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent = nullptr); QProcessEnvironment prepareEnv(); QString convertOpenSShKey(const QString &key); diff --git a/client/configurators/wireguard_configurator.cpp b/client/configurators/wireguard_configurator.cpp index 9dfd27f9..f3ea9ea3 100644 --- a/client/configurators/wireguard_configurator.cpp +++ b/client/configurators/wireguard_configurator.cpp @@ -19,15 +19,13 @@ #include "settings.h" #include "utilities.h" -WireguardConfigurator::WireguardConfigurator(std::shared_ptr settings, bool isAwg, QObject *parent) - : ConfiguratorBase(settings, parent), m_isAwg(isAwg) +WireguardConfigurator::WireguardConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, + bool isAwg, QObject *parent) + : ConfiguratorBase(settings, serverController, parent), m_isAwg(isAwg) { - m_serverConfigPath = - m_isAwg ? amnezia::protocols::awg::serverConfigPath : amnezia::protocols::wireguard::serverConfigPath; - m_serverPublicKeyPath = - m_isAwg ? amnezia::protocols::awg::serverPublicKeyPath : amnezia::protocols::wireguard::serverPublicKeyPath; - m_serverPskKeyPath = - m_isAwg ? amnezia::protocols::awg::serverPskKeyPath : amnezia::protocols::wireguard::serverPskKeyPath; + m_serverConfigPath = m_isAwg ? amnezia::protocols::awg::serverConfigPath : amnezia::protocols::wireguard::serverConfigPath; + m_serverPublicKeyPath = m_isAwg ? amnezia::protocols::awg::serverPublicKeyPath : amnezia::protocols::wireguard::serverPublicKeyPath; + m_serverPskKeyPath = m_isAwg ? amnezia::protocols::awg::serverPskKeyPath : amnezia::protocols::wireguard::serverPskKeyPath; m_configTemplate = m_isAwg ? ProtocolScriptType::awg_template : ProtocolScriptType::wireguard_template; m_protocolName = m_isAwg ? config_key::awg : config_key::wireguard; @@ -67,8 +65,7 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::genClientKeys() WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, - ErrorCode errorCode) + const QJsonObject &containerConfig, ErrorCode errorCode) { WireguardConfigurator::ConnectionData connData = WireguardConfigurator::genClientKeys(); connData.host = credentials.hostName; @@ -79,8 +76,6 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon return connData; } - ServerController serverController(m_settings); - // Get list of already created clients (only IP addresses) QString nextIpNumber; { @@ -91,7 +86,7 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon return ErrorCode::NoError; }; - errorCode = serverController.runContainerScript(credentials, container, script, cbReadStdOut); + errorCode = m_serverController->runContainerScript(credentials, container, script, cbReadStdOut); if (errorCode != ErrorCode::NoError) { return connData; } @@ -113,8 +108,7 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon } } - QString subnetIp = - containerConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress); + QString subnetIp = containerConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress); { QStringList l = subnetIp.split(".", Qt::SkipEmptyParts); if (l.isEmpty()) { @@ -128,14 +122,13 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon } // Get keys - connData.serverPubKey = - serverController.getTextFileFromContainer(container, credentials, m_serverPublicKeyPath, errorCode); + connData.serverPubKey = m_serverController->getTextFileFromContainer(container, credentials, m_serverPublicKeyPath, errorCode); connData.serverPubKey.replace("\n", ""); if (errorCode != ErrorCode::NoError) { return connData; } - connData.pskKey = serverController.getTextFileFromContainer(container, credentials, m_serverPskKeyPath, errorCode); + connData.pskKey = m_serverController->getTextFileFromContainer(container, credentials, m_serverPskKeyPath, errorCode); connData.pskKey.replace("\n", ""); if (errorCode != ErrorCode::NoError) { @@ -149,18 +142,17 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon "AllowedIPs = %3/32\n\n") .arg(connData.clientPubKey, connData.pskKey, connData.clientIP); - errorCode = serverController.uploadTextFileToContainer(container, credentials, configPart, m_serverConfigPath, - libssh::ScpOverwriteMode::ScpAppendToExisting); + errorCode = m_serverController->uploadTextFileToContainer(container, credentials, configPart, m_serverConfigPath, + libssh::ScpOverwriteMode::ScpAppendToExisting); if (errorCode != ErrorCode::NoError) { return connData; } - QString script = QString("sudo docker exec -i $CONTAINER_NAME bash -c 'wg syncconf wg0 <(wg-quick strip %1)'") - .arg(m_serverConfigPath); + QString script = QString("sudo docker exec -i $CONTAINER_NAME bash -c 'wg syncconf wg0 <(wg-quick strip %1)'").arg(m_serverConfigPath); - errorCode = serverController.runScript( - credentials, serverController.replaceVars(script, serverController.genVarsForScript(credentials, container))); + errorCode = m_serverController->runScript( + credentials, m_serverController->replaceVars(script, m_serverController->genVarsForScript(credentials, container))); return connData; } @@ -168,10 +160,9 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon QString WireguardConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode errorCode) { - ServerController serverController(m_settings); QString scriptData = amnezia::scriptData(m_configTemplate, container); - QString config = serverController.replaceVars( - scriptData, serverController.genVarsForScript(credentials, container, containerConfig)); + QString config = + m_serverController->replaceVars(scriptData, m_serverController->genVarsForScript(credentials, container, containerConfig)); ConnectionData connData = prepareWireguardConfig(credentials, container, containerConfig, errorCode); if (errorCode != ErrorCode::NoError) { @@ -201,16 +192,16 @@ QString WireguardConfigurator::createConfig(const ServerCredentials &credentials return QJsonDocument(jConfig).toJson(); } -QString WireguardConfigurator::processConfigWithLocalSettings(const QPair &dns, - const bool isApiConfig, QString &protocolConfigString) +QString WireguardConfigurator::processConfigWithLocalSettings(const QPair &dns, const bool isApiConfig, + QString &protocolConfigString) { processConfigWithDnsSettings(dns, protocolConfigString); return protocolConfigString; } -QString WireguardConfigurator::processConfigWithExportSettings(const QPair &dns, - const bool isApiConfig, QString &protocolConfigString) +QString WireguardConfigurator::processConfigWithExportSettings(const QPair &dns, const bool isApiConfig, + QString &protocolConfigString) { processConfigWithDnsSettings(dns, protocolConfigString); diff --git a/client/configurators/wireguard_configurator.h b/client/configurators/wireguard_configurator.h index 0448a04e..5a3a8d1f 100644 --- a/client/configurators/wireguard_configurator.h +++ b/client/configurators/wireguard_configurator.h @@ -12,7 +12,8 @@ class WireguardConfigurator : public ConfiguratorBase { Q_OBJECT public: - WireguardConfigurator(std::shared_ptr settings, bool isAwg, QObject *parent = nullptr); + WireguardConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, bool isAwg, + QObject *parent = nullptr); struct ConnectionData { @@ -25,13 +26,11 @@ public: QString port; }; - QString createConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode errorCode); + QString createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, + ErrorCode errorCode); - QString processConfigWithLocalSettings(const QPair &dns, const bool isApiConfig, - QString &protocolConfigString); - QString processConfigWithExportSettings(const QPair &dns, const bool isApiConfig, - QString &protocolConfigString); + QString processConfigWithLocalSettings(const QPair &dns, const bool isApiConfig, QString &protocolConfigString); + QString processConfigWithExportSettings(const QPair &dns, const bool isApiConfig, QString &protocolConfigString); static ConnectionData genClientKeys(); diff --git a/client/configurators/xray_configurator.cpp b/client/configurators/xray_configurator.cpp index 44a04561..a1469184 100644 --- a/client/configurators/xray_configurator.cpp +++ b/client/configurators/xray_configurator.cpp @@ -8,26 +8,26 @@ #include "core/controllers/serverController.h" #include "core/scripts_registry.h" -XrayConfigurator::XrayConfigurator(std::shared_ptr settings, QObject *parent) : ConfiguratorBase(settings, parent) +XrayConfigurator::XrayConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent) + : ConfiguratorBase(settings, serverController, parent) { } QString XrayConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode errorCode) { - ServerController serverController(m_settings); - - QString config = serverController.replaceVars(amnezia::scriptData(ProtocolScriptType::xray_template, container), - serverController.genVarsForScript(credentials, container, containerConfig)); + QString config = m_serverController->replaceVars(amnezia::scriptData(ProtocolScriptType::xray_template, container), + m_serverController->genVarsForScript(credentials, container, containerConfig)); QString xrayPublicKey = - serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::xray::PublicKeyPath, errorCode); + m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::PublicKeyPath, errorCode); xrayPublicKey.replace("\n", ""); - QString xrayUuid = serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::xray::uuidPath, errorCode); + QString xrayUuid = m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::uuidPath, errorCode); xrayUuid.replace("\n", ""); - QString xrayShortId = serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::xray::shortidPath, errorCode); + QString xrayShortId = + m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::shortidPath, errorCode); xrayShortId.replace("\n", ""); if (errorCode != ErrorCode::NoError) { diff --git a/client/configurators/xray_configurator.h b/client/configurators/xray_configurator.h index 746a5762..62aa13b9 100644 --- a/client/configurators/xray_configurator.h +++ b/client/configurators/xray_configurator.h @@ -10,7 +10,7 @@ class XrayConfigurator : public ConfiguratorBase { Q_OBJECT public: - XrayConfigurator(std::shared_ptr settings, QObject *parent = nullptr); + XrayConfigurator(std::shared_ptr settings, const QSharedPointer &serverController, QObject *parent = nullptr); QString createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, ErrorCode errorCode); diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index 163c3d2b..2cb914ec 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -23,10 +23,10 @@ #include #include "containers/containers_defs.h" -#include "logger.h" +#include "core/networkUtilities.h" #include "core/scripts_registry.h" #include "core/server_defs.h" -#include "core/networkUtilities.h" +#include "logger.h" #include "settings.h" #include "utilities.h" #include "vpnConfigurationController.h" @@ -95,10 +95,9 @@ ErrorCode ServerController::runScript(const ServerCredentials &credentials, QStr return ErrorCode::NoError; } -ErrorCode -ServerController::runContainerScript(const ServerCredentials &credentials, DockerContainer container, QString script, - const std::function &cbReadStdOut, - const std::function &cbReadStdErr) +ErrorCode ServerController::runContainerScript(const ServerCredentials &credentials, DockerContainer container, QString script, + const std::function &cbReadStdOut, + const std::function &cbReadStdErr) { QString fileName = "/opt/amnezia/" + Utils::getRandomString(16) + ".sh"; Logger::appendSshLog("Run container script for " + ContainerProps::containerToString(container) + ":\n" + script); @@ -116,9 +115,8 @@ ServerController::runContainerScript(const ServerCredentials &credentials, Docke return e; } -ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container, const ServerCredentials &credentials, - const QString &file, const QString &path, - libssh::ScpOverwriteMode overwriteMode) +ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container, const ServerCredentials &credentials, const QString &file, + const QString &path, libssh::ScpOverwriteMode overwriteMode) { ErrorCode e = ErrorCode::NoError; QString tmpFileName = QString("/tmp/%1.tmp").arg(Utils::getRandomString(16)); @@ -156,12 +154,10 @@ ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container, if (e) return e; - e = runScript( - credentials, - replaceVars( - QString("sudo docker exec -i $CONTAINER_NAME sh -c \"cat %1 >> %2\"").arg(tmpFileName).arg(path), - genVarsForScript(credentials, container)), - cbReadStd, cbReadStd); + e = runScript(credentials, + replaceVars(QString("sudo docker exec -i $CONTAINER_NAME sh -c \"cat %1 >> %2\"").arg(tmpFileName).arg(path), + genVarsForScript(credentials, container)), + cbReadStd, cbReadStd); if (e) return e; @@ -172,20 +168,17 @@ ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container, return ErrorCode::ServerContainerMissingError; } - runScript(credentials, - replaceVars(QString("sudo shred -u %1").arg(tmpFileName), genVarsForScript(credentials, container))); + runScript(credentials, replaceVars(QString("sudo shred -u %1").arg(tmpFileName), genVarsForScript(credentials, container))); return e; } -QByteArray ServerController::getTextFileFromContainer(DockerContainer container, const ServerCredentials &credentials, - const QString &path, ErrorCode errorCode) +QByteArray ServerController::getTextFileFromContainer(DockerContainer container, const ServerCredentials &credentials, const QString &path, + ErrorCode errorCode) { errorCode = ErrorCode::NoError; - QString script = QString("sudo docker exec -i %1 sh -c \"xxd -p \'%2\'\"") - .arg(ContainerProps::containerToString(container)) - .arg(path); + QString script = QString("sudo docker exec -i %1 sh -c \"xxd -p \'%2\'\"").arg(ContainerProps::containerToString(container)).arg(path); QString stdOut; auto cbReadStdOut = [&](const QString &data, libssh::Client &) { @@ -197,8 +190,8 @@ QByteArray ServerController::getTextFileFromContainer(DockerContainer container, return QByteArray::fromHex(stdOut.toUtf8()); } -ErrorCode ServerController::uploadFileToHost(const ServerCredentials &credentials, const QByteArray &data, - const QString &remotePath, libssh::ScpOverwriteMode overwriteMode) +ErrorCode ServerController::uploadFileToHost(const ServerCredentials &credentials, const QByteArray &data, const QString &remotePath, + libssh::ScpOverwriteMode overwriteMode) { auto error = m_sshClient.connectToHost(credentials); if (error != ErrorCode::NoError) { @@ -244,12 +237,10 @@ ErrorCode ServerController::removeAllContainers(const ServerCredentials &credent ErrorCode ServerController::removeContainer(const ServerCredentials &credentials, DockerContainer container) { return runScript(credentials, - replaceVars(amnezia::scriptData(SharedScriptType::remove_container), - genVarsForScript(credentials, container))); + replaceVars(amnezia::scriptData(SharedScriptType::remove_container), genVarsForScript(credentials, container))); } -ErrorCode ServerController::setupContainer(const ServerCredentials &credentials, DockerContainer container, - QJsonObject &config, bool isUpdate) +ErrorCode ServerController::setupContainer(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config, bool isUpdate) { qDebug().noquote() << "ServerController::setupContainer" << ContainerProps::containerToString(container); ErrorCode e = ErrorCode::NoError; @@ -309,12 +300,11 @@ ErrorCode ServerController::setupContainer(const ServerCredentials &credentials, return startupContainerWorker(credentials, container, config); } -ErrorCode ServerController::updateContainer(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &oldConfig, QJsonObject &newConfig) +ErrorCode ServerController::updateContainer(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &oldConfig, + QJsonObject &newConfig) { bool reinstallRequired = isReinstallContainerRequired(container, oldConfig, newConfig); - qDebug() << "ServerController::updateContainer for container" << container << "reinstall required is" - << reinstallRequired; + qDebug() << "ServerController::updateContainer for container" << container << "reinstall required is" << reinstallRequired; if (reinstallRequired) { return setupContainer(credentials, container, newConfig, true); @@ -327,8 +317,7 @@ ErrorCode ServerController::updateContainer(const ServerCredentials &credentials } } -bool ServerController::isReinstallContainerRequired(DockerContainer container, const QJsonObject &oldConfig, - const QJsonObject &newConfig) +bool ServerController::isReinstallContainerRequired(DockerContainer container, const QJsonObject &oldConfig, const QJsonObject &newConfig) { Proto mainProto = ContainerProps::defaultProtocol(container); @@ -359,7 +348,7 @@ bool ServerController::isReinstallContainerRequired(DockerContainer container, c if (container == DockerContainer::Awg) { if ((oldProtoConfig.value(config_key::port).toString(protocols::awg::defaultPort) - != newProtoConfig.value(config_key::port).toString(protocols::awg::defaultPort)) + != newProtoConfig.value(config_key::port).toString(protocols::awg::defaultPort)) || (oldProtoConfig.value(config_key::junkPacketCount).toString(protocols::awg::defaultJunkPacketCount) != newProtoConfig.value(config_key::junkPacketCount).toString(protocols::awg::defaultJunkPacketCount)) || (oldProtoConfig.value(config_key::junkPacketMinSize).toString(protocols::awg::defaultJunkPacketMinSize) @@ -381,7 +370,7 @@ bool ServerController::isReinstallContainerRequired(DockerContainer container, c return true; } - if (container == DockerContainer::WireGuard){ + if (container == DockerContainer::WireGuard) { if (oldProtoConfig.value(config_key::port).toString(protocols::wireguard::defaultPort) != newProtoConfig.value(config_key::port).toString(protocols::wireguard::defaultPort)) return true; @@ -407,8 +396,7 @@ ErrorCode ServerController::installDockerWorker(const ServerCredentials &credent }; ErrorCode error = - runScript(credentials, - replaceVars(amnezia::scriptData(SharedScriptType::install_docker), genVarsForScript(credentials)), + runScript(credentials, replaceVars(amnezia::scriptData(SharedScriptType::install_docker), genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr); qDebug().noquote() << "ServerController::installDockerWorker" << stdOut; @@ -420,17 +408,13 @@ ErrorCode ServerController::installDockerWorker(const ServerCredentials &credent return error; } -ErrorCode ServerController::prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &config) +ErrorCode ServerController::prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config) { // create folder on host - return runScript( - credentials, - replaceVars(amnezia::scriptData(SharedScriptType::prepare_host), genVarsForScript(credentials, container))); + return runScript(credentials, replaceVars(amnezia::scriptData(SharedScriptType::prepare_host), genVarsForScript(credentials, container))); } -ErrorCode ServerController::buildContainerWorker(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &config) +ErrorCode ServerController::buildContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config) { ErrorCode e = uploadFileToHost(credentials, amnezia::scriptData(ProtocolScriptType::dockerfile, container).toUtf8(), amnezia::server::getDockerfileFolder(container) + "/Dockerfile"); @@ -445,8 +429,7 @@ ErrorCode ServerController::buildContainerWorker(const ServerCredentials &creden }; e = runScript(credentials, - replaceVars(amnezia::scriptData(SharedScriptType::build_container), - genVarsForScript(credentials, container, config)), + replaceVars(amnezia::scriptData(SharedScriptType::build_container), genVarsForScript(credentials, container, config)), cbReadStdOut); if (e) return e; @@ -454,8 +437,7 @@ ErrorCode ServerController::buildContainerWorker(const ServerCredentials &creden return e; } -ErrorCode ServerController::runContainerWorker(const ServerCredentials &credentials, DockerContainer container, - QJsonObject &config) +ErrorCode ServerController::runContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config) { QString stdOut; auto cbReadStdOut = [&](const QString &data, libssh::Client &) { @@ -478,8 +460,7 @@ ErrorCode ServerController::runContainerWorker(const ServerCredentials &credenti return e; } -ErrorCode ServerController::configureContainerWorker(const ServerCredentials &credentials, DockerContainer container, - QJsonObject &config) +ErrorCode ServerController::configureContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config) { QString stdOut; auto cbReadStdOut = [&](const QString &data, libssh::Client &) { @@ -501,8 +482,7 @@ ErrorCode ServerController::configureContainerWorker(const ServerCredentials &cr return e; } -ErrorCode ServerController::startupContainerWorker(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &config) +ErrorCode ServerController::startupContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config) { QString script = amnezia::scriptData(ProtocolScriptType::container_startup, container); @@ -510,8 +490,7 @@ ErrorCode ServerController::startupContainerWorker(const ServerCredentials &cred return ErrorCode::NoError; } - ErrorCode e = uploadTextFileToContainer(container, credentials, - replaceVars(script, genVarsForScript(credentials, container, config)), + ErrorCode e = uploadTextFileToContainer(container, credentials, replaceVars(script, genVarsForScript(credentials, container, config)), "/opt/amnezia/start.sh"); if (e) return e; @@ -522,8 +501,8 @@ ErrorCode ServerController::startupContainerWorker(const ServerCredentials &cred genVarsForScript(credentials, container, config))); } -ServerController::Vars ServerController::genVarsForScript(const ServerCredentials &credentials, - DockerContainer container, const QJsonObject &config) +ServerController::Vars ServerController::genVarsForScript(const ServerCredentials &credentials, DockerContainer container, + const QJsonObject &config) { const QJsonObject &openvpnConfig = config.value(ProtocolProps::protoToString(Proto::OpenVpn)).toObject(); const QJsonObject &cloakConfig = config.value(ProtocolProps::protoToString(Proto::Cloak)).toObject(); @@ -538,24 +517,19 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential vars.append({ { "$REMOTE_HOST", credentials.hostName } }); // OpenVPN vars - vars.append( - { { "$OPENVPN_SUBNET_IP", - openvpnConfig.value(config_key::subnet_address).toString(protocols::openvpn::defaultSubnetAddress) } }); - vars.append({ { "$OPENVPN_SUBNET_CIDR", - openvpnConfig.value(config_key::subnet_cidr).toString(protocols::openvpn::defaultSubnetCidr) } }); - vars.append({ { "$OPENVPN_SUBNET_MASK", - openvpnConfig.value(config_key::subnet_mask).toString(protocols::openvpn::defaultSubnetMask) } }); + vars.append({ { "$OPENVPN_SUBNET_IP", + openvpnConfig.value(config_key::subnet_address).toString(protocols::openvpn::defaultSubnetAddress) } }); + vars.append({ { "$OPENVPN_SUBNET_CIDR", openvpnConfig.value(config_key::subnet_cidr).toString(protocols::openvpn::defaultSubnetCidr) } }); + vars.append({ { "$OPENVPN_SUBNET_MASK", openvpnConfig.value(config_key::subnet_mask).toString(protocols::openvpn::defaultSubnetMask) } }); vars.append({ { "$OPENVPN_PORT", openvpnConfig.value(config_key::port).toString(protocols::openvpn::defaultPort) } }); - vars.append( - { { "$OPENVPN_TRANSPORT_PROTO", - openvpnConfig.value(config_key::transport_proto).toString(protocols::openvpn::defaultTransportProto) } }); + vars.append({ { "$OPENVPN_TRANSPORT_PROTO", + openvpnConfig.value(config_key::transport_proto).toString(protocols::openvpn::defaultTransportProto) } }); bool isNcpDisabled = openvpnConfig.value(config_key::ncp_disable).toBool(protocols::openvpn::defaultNcpDisable); vars.append({ { "$OPENVPN_NCP_DISABLE", isNcpDisabled ? protocols::openvpn::ncpDisableString : "" } }); - vars.append({ { "$OPENVPN_CIPHER", - openvpnConfig.value(config_key::cipher).toString(protocols::openvpn::defaultCipher) } }); + vars.append({ { "$OPENVPN_CIPHER", openvpnConfig.value(config_key::cipher).toString(protocols::openvpn::defaultCipher) } }); vars.append({ { "$OPENVPN_HASH", openvpnConfig.value(config_key::hash).toString(protocols::openvpn::defaultHash) } }); bool isTlsAuth = openvpnConfig.value(config_key::tls_auth).toBool(protocols::openvpn::defaultTlsAuth); @@ -566,43 +540,35 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential } vars.append({ { "$OPENVPN_ADDITIONAL_CLIENT_CONFIG", - openvpnConfig.value(config_key::additional_client_config) - .toString(protocols::openvpn::defaultAdditionalClientConfig) } }); + openvpnConfig.value(config_key::additional_client_config).toString(protocols::openvpn::defaultAdditionalClientConfig) } }); vars.append({ { "$OPENVPN_ADDITIONAL_SERVER_CONFIG", - openvpnConfig.value(config_key::additional_server_config) - .toString(protocols::openvpn::defaultAdditionalServerConfig) } }); + openvpnConfig.value(config_key::additional_server_config).toString(protocols::openvpn::defaultAdditionalServerConfig) } }); // ShadowSocks vars - vars.append({ { "$SHADOWSOCKS_SERVER_PORT", - ssConfig.value(config_key::port).toString(protocols::shadowsocks::defaultPort) } }); + vars.append({ { "$SHADOWSOCKS_SERVER_PORT", ssConfig.value(config_key::port).toString(protocols::shadowsocks::defaultPort) } }); vars.append({ { "$SHADOWSOCKS_LOCAL_PORT", ssConfig.value(config_key::local_port).toString(protocols::shadowsocks::defaultLocalProxyPort) } }); - vars.append({ { "$SHADOWSOCKS_CIPHER", - ssConfig.value(config_key::cipher).toString(protocols::shadowsocks::defaultCipher) } }); + vars.append({ { "$SHADOWSOCKS_CIPHER", ssConfig.value(config_key::cipher).toString(protocols::shadowsocks::defaultCipher) } }); vars.append({ { "$CONTAINER_NAME", ContainerProps::containerToString(container) } }); vars.append({ { "$DOCKERFILE_FOLDER", "/opt/amnezia/" + ContainerProps::containerToString(container) } }); // Cloak vars vars.append({ { "$CLOAK_SERVER_PORT", cloakConfig.value(config_key::port).toString(protocols::cloak::defaultPort) } }); - vars.append({ { "$FAKE_WEB_SITE_ADDRESS", - cloakConfig.value(config_key::site).toString(protocols::cloak::defaultRedirSite) } }); + vars.append({ { "$FAKE_WEB_SITE_ADDRESS", cloakConfig.value(config_key::site).toString(protocols::cloak::defaultRedirSite) } }); // Xray vars - vars.append({ { "$XRAY_SITE_NAME", - xrayConfig.value(config_key::site).toString(protocols::xray::defaultSite) } }); + vars.append({ { "$XRAY_SITE_NAME", xrayConfig.value(config_key::site).toString(protocols::xray::defaultSite) } }); // Wireguard vars - vars.append( - { { "$WIREGUARD_SUBNET_IP", - wireguarConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress) } }); + vars.append({ { "$WIREGUARD_SUBNET_IP", + wireguarConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress) } }); vars.append({ { "$WIREGUARD_SUBNET_CIDR", wireguarConfig.value(config_key::subnet_cidr).toString(protocols::wireguard::defaultSubnetCidr) } }); vars.append({ { "$WIREGUARD_SUBNET_MASK", wireguarConfig.value(config_key::subnet_mask).toString(protocols::wireguard::defaultSubnetMask) } }); - vars.append({ { "$WIREGUARD_SERVER_PORT", - wireguarConfig.value(config_key::port).toString(protocols::wireguard::defaultPort) } }); + vars.append({ { "$WIREGUARD_SERVER_PORT", wireguarConfig.value(config_key::port).toString(protocols::wireguard::defaultPort) } }); // IPsec vars vars.append({ { "$IPSEC_VPN_L2TP_NET", "192.168.42.0/24" } }); @@ -625,30 +591,22 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential vars.append({ { "$SECONDARY_SERVER_DNS", m_settings->secondaryDns() } }); // Sftp vars - vars.append( - { { "$SFTP_PORT", - sftpConfig.value(config_key::port).toString(QString::number(ProtocolProps::defaultPort(Proto::Sftp))) } }); + vars.append({ { "$SFTP_PORT", sftpConfig.value(config_key::port).toString(QString::number(ProtocolProps::defaultPort(Proto::Sftp))) } }); vars.append({ { "$SFTP_USER", sftpConfig.value(config_key::userName).toString() } }); vars.append({ { "$SFTP_PASSWORD", sftpConfig.value(config_key::password).toString() } }); // Amnezia wireguard vars - vars.append({ { "$AWG_SERVER_PORT", - amneziaWireguarConfig.value(config_key::port).toString(protocols::awg::defaultPort) } }); + vars.append({ { "$AWG_SERVER_PORT", amneziaWireguarConfig.value(config_key::port).toString(protocols::awg::defaultPort) } }); vars.append({ { "$JUNK_PACKET_COUNT", amneziaWireguarConfig.value(config_key::junkPacketCount).toString() } }); vars.append({ { "$JUNK_PACKET_MIN_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMinSize).toString() } }); vars.append({ { "$JUNK_PACKET_MAX_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMaxSize).toString() } }); vars.append({ { "$INIT_PACKET_JUNK_SIZE", amneziaWireguarConfig.value(config_key::initPacketJunkSize).toString() } }); - vars.append({ { "$RESPONSE_PACKET_JUNK_SIZE", - amneziaWireguarConfig.value(config_key::responsePacketJunkSize).toString() } }); - vars.append({ { "$INIT_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::initPacketMagicHeader).toString() } }); - vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } }); - vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } }); - vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", - amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } }); + vars.append({ { "$RESPONSE_PACKET_JUNK_SIZE", amneziaWireguarConfig.value(config_key::responsePacketJunkSize).toString() } }); + vars.append({ { "$INIT_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::initPacketMagicHeader).toString() } }); + vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } }); + vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } }); + vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } }); QString serverIp = NetworkUtilities::getIPAddress(credentials.hostName); if (!serverIp.isEmpty()) { @@ -684,9 +642,7 @@ void ServerController::cancelInstallation() ErrorCode ServerController::setupServerFirewall(const ServerCredentials &credentials) { - return runScript( - credentials, - replaceVars(amnezia::scriptData(SharedScriptType::setup_host_firewall), genVarsForScript(credentials))); + return runScript(credentials, replaceVars(amnezia::scriptData(SharedScriptType::setup_host_firewall), genVarsForScript(credentials))); } QString ServerController::replaceVars(const QString &script, const Vars &vars) @@ -698,8 +654,7 @@ QString ServerController::replaceVars(const QString &script, const Vars &vars) return s; } -ErrorCode ServerController::isServerPortBusy(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &config) +ErrorCode ServerController::isServerPortBusy(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config) { if (container == DockerContainer::Dns) { return ErrorCode::NoError; @@ -722,15 +677,12 @@ ErrorCode ServerController::isServerPortBusy(const ServerCredentials &credential QStringList fixedPorts = ContainerProps::fixedPortsForContainer(container); QString defaultPort("%1"); - QString port = - containerConfig.value(config_key::port).toString(defaultPort.arg(ProtocolProps::defaultPort(protocol))); - QString defaultTransportProto = - ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(protocol), protocol); + QString port = containerConfig.value(config_key::port).toString(defaultPort.arg(ProtocolProps::defaultPort(protocol))); + QString defaultTransportProto = ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(protocol), protocol); QString transportProto = containerConfig.value(config_key::transport_proto).toString(defaultTransportProto); // TODO reimplement with netstat - QString script = - QString("which lsof &>/dev/null || true && sudo lsof -i -P -n 2>/dev/null | grep -E ':%1 ").arg(port); + QString script = QString("which lsof &>/dev/null || true && sudo lsof -i -P -n 2>/dev/null | grep -E ':%1 ").arg(port); for (auto &port : fixedPorts) { script = script.append("|:%1").arg(port); } @@ -740,8 +692,7 @@ ErrorCode ServerController::isServerPortBusy(const ServerCredentials &credential script = script.append(" | grep LISTEN"); } - ErrorCode errorCode = runScript(credentials, replaceVars(script, genVarsForScript(credentials, container)), - cbReadStdOut, cbReadStdErr); + ErrorCode errorCode = runScript(credentials, replaceVars(script, genVarsForScript(credentials, container)), cbReadStdOut, cbReadStdErr); if (errorCode != ErrorCode::NoError) { return errorCode; } @@ -769,8 +720,7 @@ ErrorCode ServerController::isUserInSudo(const ServerCredentials &credentials, D }; const QString scriptData = amnezia::scriptData(SharedScriptType::check_user_in_sudo); - ErrorCode error = - runScript(credentials, replaceVars(scriptData, genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr); + ErrorCode error = runScript(credentials, replaceVars(scriptData, genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr); if (!stdOut.contains("sudo")) return ErrorCode::ServerUserNotInSudo; @@ -800,9 +750,7 @@ ErrorCode ServerController::isServerDpkgBusy(const ServerCredentials &credential return ErrorCode::ServerCancelInstallation; } stdOut.clear(); - runScript(credentials, - replaceVars(amnezia::scriptData(SharedScriptType::check_server_is_busy), - genVarsForScript(credentials)), + runScript(credentials, replaceVars(amnezia::scriptData(SharedScriptType::check_server_is_busy), genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr); if (stdOut.contains("Packet manager not found")) diff --git a/client/core/controllers/serverController.h b/client/core/controllers/serverController.h index 3df3bdca..9830a395 100644 --- a/client/core/controllers/serverController.h +++ b/client/core/controllers/serverController.h @@ -25,19 +25,18 @@ public: ErrorCode rebootServer(const ServerCredentials &credentials); ErrorCode removeAllContainers(const ServerCredentials &credentials); ErrorCode removeContainer(const ServerCredentials &credentials, DockerContainer container); - ErrorCode setupContainer(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config, - bool isUpdate = false); - ErrorCode updateContainer(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &oldConfig, QJsonObject &newConfig); + ErrorCode setupContainer(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config, bool isUpdate = false); + ErrorCode updateContainer(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &oldConfig, + QJsonObject &newConfig); ErrorCode startupContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject()); - ErrorCode uploadTextFileToContainer( - DockerContainer container, const ServerCredentials &credentials, const QString &file, const QString &path, - libssh::ScpOverwriteMode overwriteMode = libssh::ScpOverwriteMode::ScpOverwriteExisting); - QByteArray getTextFileFromContainer(DockerContainer container, const ServerCredentials &credentials, - const QString &path, ErrorCode errorCode); + ErrorCode uploadTextFileToContainer(DockerContainer container, const ServerCredentials &credentials, const QString &file, + const QString &path, + libssh::ScpOverwriteMode overwriteMode = libssh::ScpOverwriteMode::ScpOverwriteExisting); + QByteArray getTextFileFromContainer(DockerContainer container, const ServerCredentials &credentials, const QString &path, + ErrorCode errorCode); QString replaceVars(const QString &script, const Vars &vars); Vars genVarsForScript(const ServerCredentials &credentials, DockerContainer container = DockerContainer::None, @@ -47,10 +46,9 @@ public: const std::function &cbReadStdOut = nullptr, const std::function &cbReadStdErr = nullptr); - ErrorCode - runContainerScript(const ServerCredentials &credentials, DockerContainer container, QString script, - const std::function &cbReadStdOut = nullptr, - const std::function &cbReadStdErr = nullptr); + ErrorCode runContainerScript(const ServerCredentials &credentials, DockerContainer container, QString script, + const std::function &cbReadStdOut = nullptr, + const std::function &cbReadStdErr = nullptr); QString checkSshConnection(const ServerCredentials &credentials, ErrorCode errorCode); @@ -61,18 +59,14 @@ public: private: ErrorCode installDockerWorker(const ServerCredentials &credentials, DockerContainer container); - ErrorCode prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &config = QJsonObject()); + ErrorCode prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject()); ErrorCode buildContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject()); ErrorCode runContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config); - ErrorCode configureContainerWorker(const ServerCredentials &credentials, DockerContainer container, - QJsonObject &config); + ErrorCode configureContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config); - ErrorCode isServerPortBusy(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &config); - bool isReinstallContainerRequired(DockerContainer container, const QJsonObject &oldConfig, - const QJsonObject &newConfig); + ErrorCode isServerPortBusy(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config); + bool isReinstallContainerRequired(DockerContainer container, const QJsonObject &oldConfig, const QJsonObject &newConfig); ErrorCode isUserInSudo(const ServerCredentials &credentials, DockerContainer container); ErrorCode isServerDpkgBusy(const ServerCredentials &credentials, DockerContainer container); diff --git a/client/core/controllers/vpnConfigurationController.cpp b/client/core/controllers/vpnConfigurationController.cpp index ba210669..f84919e7 100644 --- a/client/core/controllers/vpnConfigurationController.cpp +++ b/client/core/controllers/vpnConfigurationController.cpp @@ -8,21 +8,22 @@ #include "configurators/wireguard_configurator.h" #include "configurators/xray_configurator.h" -VpnConfigurationsController::VpnConfigurationsController(const std::shared_ptr &settings, QObject *parent) - : QObject { parent }, m_settings(settings) +VpnConfigurationsController::VpnConfigurationsController(const std::shared_ptr &settings, + QSharedPointer serverController, QObject *parent) + : QObject { parent }, m_settings(settings), m_serverController(serverController) { } QScopedPointer VpnConfigurationsController::createConfigurator(const Proto protocol) { switch (protocol) { - case Proto::OpenVpn: return QScopedPointer(new OpenVpnConfigurator(m_settings)); - case Proto::ShadowSocks: return QScopedPointer(new ShadowSocksConfigurator(m_settings)); - case Proto::Cloak: return QScopedPointer(new CloakConfigurator(m_settings)); - case Proto::WireGuard: return QScopedPointer(new WireguardConfigurator(m_settings, false)); - case Proto::Awg: return QScopedPointer(new AwgConfigurator(m_settings)); - case Proto::Ikev2: return QScopedPointer(new Ikev2Configurator(m_settings)); - case Proto::Xray: return QScopedPointer(new XrayConfigurator(m_settings)); + case Proto::OpenVpn: return QScopedPointer(new OpenVpnConfigurator(m_settings, m_serverController)); + case Proto::ShadowSocks: return QScopedPointer(new ShadowSocksConfigurator(m_settings, m_serverController)); + case Proto::Cloak: return QScopedPointer(new CloakConfigurator(m_settings, m_serverController)); + case Proto::WireGuard: return QScopedPointer(new WireguardConfigurator(m_settings, m_serverController, false)); + case Proto::Awg: return QScopedPointer(new AwgConfigurator(m_settings, m_serverController)); + case Proto::Ikev2: return QScopedPointer(new Ikev2Configurator(m_settings, m_serverController)); + case Proto::Xray: return QScopedPointer(new XrayConfigurator(m_settings, m_serverController)); default: return QScopedPointer(); } } diff --git a/client/core/controllers/vpnConfigurationController.h b/client/core/controllers/vpnConfigurationController.h index ac0b0ac5..d0328ec5 100644 --- a/client/core/controllers/vpnConfigurationController.h +++ b/client/core/controllers/vpnConfigurationController.h @@ -12,7 +12,7 @@ class VpnConfigurationsController : public QObject { Q_OBJECT public: - explicit VpnConfigurationsController(const std::shared_ptr &settings, QObject *parent = nullptr); + explicit VpnConfigurationsController(const std::shared_ptr &settings, QSharedPointer serverController, QObject *parent = nullptr); public slots: ErrorCode createProtocolConfigForContainer(const ServerCredentials &credentials, const DockerContainer container, @@ -30,6 +30,7 @@ private: QScopedPointer createConfigurator(const Proto protocol); std::shared_ptr m_settings; + QSharedPointer m_serverController; }; #endif // VPNCONFIGIRATIONSCONTROLLER_H diff --git a/client/core/sshclient.cpp b/client/core/sshclient.cpp index 01ef7627..30322bb5 100644 --- a/client/core/sshclient.cpp +++ b/client/core/sshclient.cpp @@ -23,6 +23,13 @@ namespace libssh { ErrorCode Client::connectToHost(const ServerCredentials &credentials) { + if (m_session != nullptr) { + if (!ssh_is_connected(m_session)) { + ssh_free(m_session); + m_session = nullptr; + } + } + if (m_session == nullptr) { m_session = ssh_new(); diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index 91d07e10..a603a034 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -14,8 +14,8 @@ ConnectionController::ConnectionController(const QSharedPointer &serversModel, const QSharedPointer &containersModel, const QSharedPointer &clientManagementModel, - const QSharedPointer &vpnConnection, - const std::shared_ptr &settings, QObject *parent) + const QSharedPointer &vpnConnection, const std::shared_ptr &settings, + QObject *parent) : QObject(parent), m_serversModel(serversModel), m_containersModel(containersModel), @@ -23,12 +23,9 @@ ConnectionController::ConnectionController(const QSharedPointer &s m_vpnConnection(vpnConnection), m_settings(settings) { - connect(m_vpnConnection.get(), &VpnConnection::connectionStateChanged, this, - &ConnectionController::onConnectionStateChanged); - connect(this, &ConnectionController::connectToVpn, m_vpnConnection.get(), &VpnConnection::connectToVpn, - Qt::QueuedConnection); - connect(this, &ConnectionController::disconnectFromVpn, m_vpnConnection.get(), &VpnConnection::disconnectFromVpn, - Qt::QueuedConnection); + connect(m_vpnConnection.get(), &VpnConnection::connectionStateChanged, this, &ConnectionController::onConnectionStateChanged); + connect(this, &ConnectionController::connectToVpn, m_vpnConnection.get(), &VpnConnection::connectToVpn, Qt::QueuedConnection); + connect(this, &ConnectionController::disconnectFromVpn, m_vpnConnection.get(), &VpnConnection::disconnectFromVpn, Qt::QueuedConnection); m_state = Vpn::ConnectionState::Disconnected; } @@ -59,8 +56,7 @@ void ConnectionController::openConnection() return; } - DockerContainer container = - qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::DefaultContainerRole)); + DockerContainer container = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::DefaultContainerRole)); if (!m_containersModel->isSupportedByCurrentPlatform(container)) { emit connectionErrorOccurred(tr("The selected protocol is not supported on the current platform")); @@ -74,11 +70,12 @@ void ConnectionController::openConnection() qApp->processEvents(); - VpnConfigurationsController vpnConfigurationController(m_settings); + QSharedPointer serverController(new ServerController(m_settings)); + VpnConfigurationsController vpnConfigurationController(m_settings, serverController); QJsonObject containerConfig = m_containersModel->getContainerConfig(container); ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); - errorCode = updateProtocolConfig(container, credentials, containerConfig); + errorCode = updateProtocolConfig(container, credentials, containerConfig, serverController); if (errorCode != ErrorCode::NoError) { emit connectionErrorOccurred(errorString(errorCode)); return; @@ -87,8 +84,7 @@ void ConnectionController::openConnection() auto dns = m_serversModel->getDnsPair(serverIndex); serverConfig = m_serversModel->getServerConfig(serverIndex); - auto vpnConfiguration = - vpnConfigurationController.createVpnConfiguration(dns, serverConfig, containerConfig, container, errorCode); + auto vpnConfiguration = vpnConfigurationController.createVpnConfiguration(dns, serverConfig, containerConfig, container, errorCode); if (errorCode != ErrorCode::NoError) { emit connectionErrorOccurred(tr("unable to create configuration")); return; @@ -215,10 +211,8 @@ bool ConnectionController::isConnected() const bool ConnectionController::isProtocolConfigExists(const QJsonObject &containerConfig, const DockerContainer container) { for (Proto protocol : ContainerProps::protocolsForContainer(container)) { - QString protocolConfig = containerConfig.value(ProtocolProps::protoToString(protocol)) - .toObject() - .value(config_key::last_config) - .toString(); + QString protocolConfig = + containerConfig.value(ProtocolProps::protoToString(protocol)).toObject().value(config_key::last_config).toString(); if (protocolConfig.isEmpty()) { return false; @@ -227,24 +221,27 @@ bool ConnectionController::isProtocolConfigExists(const QJsonObject &containerCo return true; } -ErrorCode ConnectionController::updateProtocolConfig(const DockerContainer container, - const ServerCredentials &credentials, QJsonObject &containerConfig) +ErrorCode ConnectionController::updateProtocolConfig(const DockerContainer container, const ServerCredentials &credentials, + QJsonObject &containerConfig, QSharedPointer serverController) { QFutureWatcher watcher; - QFuture future = QtConcurrent::run([this, container, &credentials, &containerConfig]() { + if (serverController.isNull()) { + serverController.reset(new ServerController(m_settings)); + } + + QFuture future = QtConcurrent::run([this, container, &credentials, &containerConfig, &serverController]() { ErrorCode errorCode = ErrorCode::NoError; if (!isProtocolConfigExists(containerConfig, container)) { - VpnConfigurationsController vpnConfigurationController(m_settings); - errorCode = - vpnConfigurationController.createProtocolConfigForContainer(credentials, container, containerConfig); + VpnConfigurationsController vpnConfigurationController(m_settings, serverController); + errorCode = vpnConfigurationController.createProtocolConfigForContainer(credentials, container, containerConfig); if (errorCode != ErrorCode::NoError) { return errorCode; } m_serversModel->updateContainerConfig(container, containerConfig); errorCode = m_clientManagementModel->appendClient(container, credentials, containerConfig, - QString("Admin [%1]").arg(QSysInfo::prettyProductName())); + QString("Admin [%1]").arg(QSysInfo::prettyProductName()), serverController); if (errorCode != ErrorCode::NoError) { return errorCode; } diff --git a/client/ui/controllers/connectionController.h b/client/ui/controllers/connectionController.h index b139dddb..7c6dd969 100644 --- a/client/ui/controllers/connectionController.h +++ b/client/ui/controllers/connectionController.h @@ -16,11 +16,10 @@ public: Q_PROPERTY(bool isConnectionInProgress READ isConnectionInProgress NOTIFY connectionStateChanged) Q_PROPERTY(QString connectionStateText READ connectionStateText NOTIFY connectionStateChanged) - explicit ConnectionController(const QSharedPointer &serversModel, - const QSharedPointer &containersModel, + explicit ConnectionController(const QSharedPointer &serversModel, const QSharedPointer &containersModel, const QSharedPointer &clientManagementModel, - const QSharedPointer &vpnConnection, - const std::shared_ptr &settings, QObject *parent = nullptr); + const QSharedPointer &vpnConnection, const std::shared_ptr &settings, + QObject *parent = nullptr); ~ConnectionController() = default; @@ -41,12 +40,11 @@ public slots: void onTranslationsUpdated(); - ErrorCode updateProtocolConfig(const DockerContainer container, const ServerCredentials &credentials, - QJsonObject &containerConfig); + ErrorCode updateProtocolConfig(const DockerContainer container, const ServerCredentials &credentials, QJsonObject &containerConfig, + QSharedPointer serverController = nullptr); signals: - void connectToVpn(int serverIndex, const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &vpnConfiguration); + void connectToVpn(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &vpnConfiguration); void disconnectFromVpn(); void connectionStateChanged(); diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index 9d68dfce..4549f78c 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -95,10 +95,11 @@ void ExportController::generateConnectionConfig(const QString &clientName) QJsonObject containerConfig = m_containersModel->getContainerConfig(container); containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); - VpnConfigurationsController vpnConfigurationController(m_settings); + QSharedPointer serverController(new ServerController(m_settings)); + VpnConfigurationsController vpnConfigurationController(m_settings, serverController); ErrorCode errorCode = vpnConfigurationController.createProtocolConfigForContainer(credentials, container, containerConfig); - errorCode = m_clientManagementModel->appendClient(container, credentials, containerConfig, clientName); + errorCode = m_clientManagementModel->appendClient(container, credentials, containerConfig, clientName, serverController); if (errorCode != ErrorCode::NoError) { emit exportErrorOccurred(errorString(errorCode)); return; @@ -138,10 +139,10 @@ ErrorCode ExportController::generateNativeConfig(const DockerContainer container QJsonObject containerConfig = m_containersModel->getContainerConfig(container); containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); - VpnConfigurationsController vpnConfigurationController(m_settings); + QSharedPointer serverController(new ServerController(m_settings)); + VpnConfigurationsController vpnConfigurationController(m_settings, serverController); QString protocolConfigString; - ErrorCode errorCode = vpnConfigurationController.createProtocolConfigString(isApiConfig, dns, credentials, container, containerConfig, protocol, protocolConfigString); if (errorCode != ErrorCode::NoError) { @@ -152,7 +153,7 @@ ErrorCode ExportController::generateNativeConfig(const DockerContainer container if (protocol == Proto::OpenVpn || protocol == Proto::WireGuard || protocol == Proto::Awg) { auto clientId = jsonNativeConfig.value(config_key::clientId).toString(); - errorCode = m_clientManagementModel->appendClient(clientId, clientName, container, credentials); + errorCode = m_clientManagementModel->appendClient(clientId, clientName, container, credentials, serverController); } return errorCode; } @@ -316,7 +317,8 @@ void ExportController::exportConfig(const QString &fileName) void ExportController::updateClientManagementModel(const DockerContainer container, ServerCredentials credentials) { - ErrorCode errorCode = m_clientManagementModel->updateModel(container, credentials); + QSharedPointer serverController(new ServerController(m_settings)); + ErrorCode errorCode = m_clientManagementModel->updateModel(container, credentials, serverController); if (errorCode != ErrorCode::NoError) { emit exportErrorOccurred(errorString(errorCode)); } @@ -324,7 +326,9 @@ void ExportController::updateClientManagementModel(const DockerContainer contain void ExportController::revokeConfig(const int row, const DockerContainer container, ServerCredentials credentials) { - ErrorCode errorCode = m_clientManagementModel->revokeClient(row, container, credentials, m_serversModel->getProcessedServerIndex()); + QSharedPointer serverController(new ServerController(m_settings)); + ErrorCode errorCode = + m_clientManagementModel->revokeClient(row, container, credentials, m_serversModel->getProcessedServerIndex(), serverController); if (errorCode != ErrorCode::NoError) { emit exportErrorOccurred(errorString(errorCode)); } @@ -332,7 +336,8 @@ void ExportController::revokeConfig(const int row, const DockerContainer contain void ExportController::renameClient(const int row, const QString &clientName, const DockerContainer container, ServerCredentials credentials) { - ErrorCode errorCode = m_clientManagementModel->renameClient(row, clientName, container, credentials); + QSharedPointer serverController(new ServerController(m_settings)); + ErrorCode errorCode = m_clientManagementModel->renameClient(row, clientName, container, credentials, serverController); if (errorCode != ErrorCode::NoError) { emit exportErrorOccurred(errorString(errorCode)); } diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index 7a598872..7240adf6 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -10,11 +10,11 @@ #include "core/controllers/serverController.h" #include "core/controllers/vpnConfigurationController.h" #include "core/errorstrings.h" -#include "logger.h" #include "core/networkUtilities.h" -#include "utilities.h" +#include "logger.h" #include "ui/models/protocols/awgConfigModel.h" #include "ui/models/protocols/wireguardConfigModel.h" +#include "utilities.h" #ifdef Q_OS_IOS #include @@ -142,12 +142,12 @@ void InstallController::install(DockerContainer container, int port, TransportPr serverCredentials = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); } - ServerController serverController(m_settings); - connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); - connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); + QSharedPointer serverController(new ServerController(m_settings)); + connect(serverController.get(), &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, serverController.get(), &ServerController::cancelInstallation); QMap installedContainers; - ErrorCode errorCode = getAlreadyInstalledContainers(serverCredentials, installedContainers); + ErrorCode errorCode = getAlreadyInstalledContainers(serverCredentials, serverController, installedContainers); if (errorCode) { emit installationErrorOccurred(errorString(errorCode)); return; @@ -156,7 +156,7 @@ void InstallController::install(DockerContainer container, int port, TransportPr QString finishMessage = ""; if (!installedContainers.contains(container)) { - errorCode = serverController.setupContainer(serverCredentials, container, config); + errorCode = serverController->setupContainer(serverCredentials, container, config); if (errorCode) { emit installationErrorOccurred(errorString(errorCode)); return; @@ -174,14 +174,15 @@ void InstallController::install(DockerContainer container, int port, TransportPr } if (m_shouldCreateServer) { - installServer(container, installedContainers, serverCredentials, finishMessage); + installServer(container, installedContainers, serverCredentials, serverController, finishMessage); } else { - installContainer(container, installedContainers, serverCredentials, finishMessage); + installContainer(container, installedContainers, serverCredentials, serverController, finishMessage); } } void InstallController::installServer(const DockerContainer container, const QMap &installedContainers, - const ServerCredentials &serverCredentials, QString &finishMessage) + const ServerCredentials &serverCredentials, const QSharedPointer &serverController, + QString &finishMessage) { if (installedContainers.size() > 1) { finishMessage += tr("\nAdded containers that were already installed on the server"); @@ -195,13 +196,13 @@ void InstallController::installServer(const DockerContainer container, const QMa server.insert(config_key::description, m_settings->nextAvailableServerName()); QJsonArray containerConfigs; - VpnConfigurationsController vpnConfigurationController(m_settings); + VpnConfigurationsController vpnConfigurationController(m_settings, serverController); for (auto iterator = installedContainers.begin(); iterator != installedContainers.end(); iterator++) { auto containerConfig = iterator.value(); if (ContainerProps::isSupportedByCurrentPlatform(container)) { - auto errorCode = - vpnConfigurationController.createProtocolConfigForContainer(m_processedServerCredentials, iterator.key(), containerConfig); + auto errorCode = vpnConfigurationController.createProtocolConfigForContainer(m_processedServerCredentials, iterator.key(), + containerConfig); if (errorCode) { emit installationErrorOccurred(errorString(errorCode)); return; @@ -209,7 +210,7 @@ void InstallController::installServer(const DockerContainer container, const QMa containerConfigs.append(containerConfig); errorCode = m_clientManagementModel->appendClient(iterator.key(), serverCredentials, containerConfig, - QString("Admin [%1]").arg(QSysInfo::prettyProductName())); + QString("Admin [%1]").arg(QSysInfo::prettyProductName()), serverController); if (errorCode) { emit installationErrorOccurred(errorString(errorCode)); return; @@ -228,18 +229,20 @@ void InstallController::installServer(const DockerContainer container, const QMa } void InstallController::installContainer(const DockerContainer container, const QMap &installedContainers, - const ServerCredentials &serverCredentials, QString &finishMessage) + const ServerCredentials &serverCredentials, + const QSharedPointer &serverController, QString &finishMessage) { bool isInstalledContainerAddedToGui = false; - VpnConfigurationsController vpnConfigurationController(m_settings); + VpnConfigurationsController vpnConfigurationController(m_settings, serverController); for (auto iterator = installedContainers.begin(); iterator != installedContainers.end(); iterator++) { QJsonObject containerConfig = m_containersModel->getContainerConfig(iterator.key()); if (containerConfig.isEmpty()) { containerConfig = iterator.value(); if (ContainerProps::isSupportedByCurrentPlatform(container)) { - auto errorCode = vpnConfigurationController.createProtocolConfigForContainer(serverCredentials, iterator.key(), containerConfig); + auto errorCode = + vpnConfigurationController.createProtocolConfigForContainer(serverCredentials, iterator.key(), containerConfig); if (errorCode) { emit installationErrorOccurred(errorString(errorCode)); return; @@ -247,7 +250,7 @@ void InstallController::installContainer(const DockerContainer container, const m_serversModel->addContainerConfig(iterator.key(), containerConfig); errorCode = m_clientManagementModel->appendClient(iterator.key(), serverCredentials, containerConfig, - QString("Admin [%1]").arg(QSysInfo::prettyProductName())); + QString("Admin [%1]").arg(QSysInfo::prettyProductName()), serverController); if (errorCode) { emit installationErrorOccurred(errorString(errorCode)); return; @@ -289,14 +292,13 @@ void InstallController::scanServerForInstalledContainers() ServerCredentials serverCredentials = qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); - ServerController serverController(m_settings); - QMap installedContainers; - ErrorCode errorCode = getAlreadyInstalledContainers(serverCredentials, installedContainers); + QSharedPointer serverController(new ServerController(m_settings)); + ErrorCode errorCode = getAlreadyInstalledContainers(serverCredentials, serverController, installedContainers); if (errorCode == ErrorCode::NoError) { bool isInstalledContainerAddedToGui = false; - VpnConfigurationsController vpnConfigurationController(m_settings); + VpnConfigurationsController vpnConfigurationController(m_settings, serverController); for (auto iterator = installedContainers.begin(); iterator != installedContainers.end(); iterator++) { auto container = iterator.key(); @@ -314,7 +316,8 @@ void InstallController::scanServerForInstalledContainers() m_serversModel->addContainerConfig(container, containerConfig); errorCode = m_clientManagementModel->appendClient(container, serverCredentials, containerConfig, - QString("Admin [%1]").arg(QSysInfo::prettyProductName())); + QString("Admin [%1]").arg(QSysInfo::prettyProductName()), + serverController); if (errorCode) { emit installationErrorOccurred(errorString(errorCode)); return; @@ -335,6 +338,7 @@ void InstallController::scanServerForInstalledContainers() } ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentials &credentials, + const QSharedPointer &serverController, QMap &installedContainers) { QString stdOut; @@ -347,10 +351,9 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia return ErrorCode::NoError; }; - ServerController serverController(m_settings); QString script = QString("sudo docker ps --format '{{.Names}} {{.Ports}}'"); - ErrorCode errorCode = serverController.runScript(credentials, script, cbReadStdOut, cbReadStdErr); + ErrorCode errorCode = serverController->runScript(credentials, script, cbReadStdOut, cbReadStdErr); if (errorCode != ErrorCode::NoError) { return errorCode; } @@ -377,8 +380,8 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia containerConfig.insert(config_key::transport_proto, transportProto); if (protocol == Proto::Awg) { - QString serverConfig = serverController.getTextFileFromContainer(container, credentials, - protocols::awg::serverConfigPath, errorCode); + QString serverConfig = serverController->getTextFileFromContainer(container, credentials, + protocols::awg::serverConfigPath, errorCode); QMap serverConfigMap; auto serverConfigLines = serverConfig.split("\n"); @@ -409,7 +412,7 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia stdOut.clear(); script = QString("sudo docker inspect --format '{{.Config.Cmd}}' %1").arg(name); - ErrorCode errorCode = serverController.runScript(credentials, script, cbReadStdOut, cbReadStdErr); + ErrorCode errorCode = serverController->runScript(credentials, script, cbReadStdOut, cbReadStdErr); if (errorCode != ErrorCode::NoError) { return errorCode; } @@ -453,7 +456,7 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia stdOut.clear(); script = QString("sudo docker exec -i %1 sh -c 'cat /var/lib/tor/hidden_service/hostname'").arg(name); - ErrorCode errorCode = serverController.runScript(credentials, script, cbReadStdOut, cbReadStdErr); + ErrorCode errorCode = serverController->runScript(credentials, script, cbReadStdOut, cbReadStdErr); if (errorCode != ErrorCode::NoError) { return errorCode; } @@ -490,12 +493,12 @@ void InstallController::updateContainer(QJsonObject config) ErrorCode errorCode = ErrorCode::NoError; if (isUpdateDockerContainerRequired(container, oldContainerConfig, config)) { - ServerController serverController(m_settings); - connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); - connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); + QSharedPointer serverController(new ServerController(m_settings)); + connect(serverController.get(), &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, serverController.get(), &ServerController::cancelInstallation); - errorCode = serverController.updateContainer(serverCredentials, container, oldContainerConfig, config); - clearCachedProfile(); + errorCode = serverController->updateContainer(serverCredentials, container, oldContainerConfig, config); + clearCachedProfile(serverController); } if (errorCode == ErrorCode::NoError) { @@ -520,13 +523,11 @@ void InstallController::rebootProcessedServer() int serverIndex = m_serversModel->getProcessedServerIndex(); QString serverName = m_serversModel->data(serverIndex, ServersModel::Roles::NameRole).toString(); - const auto errorCode = m_serversModel->rebootServer(); - if (errorCode == ErrorCode::NoError) - { + QSharedPointer serverController(new ServerController(m_settings)); + const auto errorCode = m_serversModel->rebootServer(serverController); + if (errorCode == ErrorCode::NoError) { emit rebootProcessedServerFinished(tr("Server '%1' was rebooted").arg(serverName)); - } - else - { + } else { emit installationErrorOccurred(errorString(errorCode)); } } @@ -545,7 +546,8 @@ void InstallController::removeAllContainers() int serverIndex = m_serversModel->getProcessedServerIndex(); QString serverName = m_serversModel->data(serverIndex, ServersModel::Roles::NameRole).toString(); - ErrorCode errorCode = m_serversModel->removeAllContainers(); + QSharedPointer serverController(new ServerController(m_settings)); + ErrorCode errorCode = m_serversModel->removeAllContainers(serverController); if (errorCode == ErrorCode::NoError) { emit removeAllContainersFinished(tr("All containers from server '%1' have been removed").arg(serverName)); return; @@ -561,7 +563,8 @@ void InstallController::removeProcessedContainer() int container = m_containersModel->getProcessedContainerIndex(); QString containerName = m_containersModel->getProcessedContainerName(); - ErrorCode errorCode = m_serversModel->removeContainer(container); + QSharedPointer serverController(new ServerController(m_settings)); + ErrorCode errorCode = m_serversModel->removeContainer(serverController, container); if (errorCode == ErrorCode::NoError) { emit removeProcessedContainerFinished(tr("%1 has been removed from the server '%2'").arg(containerName, serverName)); @@ -593,8 +596,12 @@ void InstallController::removeApiConfig(const int serverIndex) m_serversModel->editServer(serverConfig, serverIndex); } -void InstallController::clearCachedProfile() +void InstallController::clearCachedProfile(QSharedPointer serverController) { + if (serverController.isNull()) { + serverController.reset(new ServerController(m_settings)); + } + int serverIndex = m_serversModel->getProcessedServerIndex(); DockerContainer container = static_cast(m_containersModel->getProcessedContainerIndex()); QJsonObject containerConfig = m_containersModel->getContainerConfig(container); @@ -602,7 +609,7 @@ void InstallController::clearCachedProfile() qvariant_cast(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole)); m_serversModel->clearCachedProfile(container); - m_clientManagementModel->revokeClient(containerConfig, container, serverCredentials, serverIndex); + m_clientManagementModel->revokeClient(containerConfig, container, serverCredentials, serverIndex, serverController); emit cachedProfileCleared(tr("%1 cached profile cleared").arg(ContainerProps::containerHumanNames().value(container))); } @@ -704,13 +711,15 @@ void InstallController::mountSftpDrive(const QString &port, const QString &passw process->write((password + "\n").toUtf8()); } - #endif } -bool InstallController::checkSshConnection() +bool InstallController::checkSshConnection(QSharedPointer serverController) { - ServerController serverController(m_settings); + if (serverController.isNull()) { + serverController.reset(new ServerController(m_settings)); + } + ErrorCode errorCode = ErrorCode::NoError; m_privateKeyPassphrase = ""; @@ -725,7 +734,7 @@ bool InstallController::checkSshConnection() }; QString decryptedPrivateKey; - errorCode = serverController.getDecryptedPrivateKey(m_processedServerCredentials, decryptedPrivateKey, passphraseCallback); + errorCode = serverController->getDecryptedPrivateKey(m_processedServerCredentials, decryptedPrivateKey, passphraseCallback); if (errorCode == ErrorCode::NoError) { m_processedServerCredentials.secretData = decryptedPrivateKey; } else { @@ -735,7 +744,7 @@ bool InstallController::checkSshConnection() } QString output; - output = serverController.checkSshConnection(m_processedServerCredentials, errorCode); + output = serverController->checkSshConnection(m_processedServerCredentials, errorCode); if (errorCode != ErrorCode::NoError) { emit installationErrorOccurred(errorString(errorCode)); @@ -772,7 +781,8 @@ void InstallController::addEmptyServer() emit installServerFinished(tr("Server added successfully")); } -bool InstallController::isUpdateDockerContainerRequired(const DockerContainer container, const QJsonObject &oldConfig, const QJsonObject &newConfig) +bool InstallController::isUpdateDockerContainerRequired(const DockerContainer container, const QJsonObject &oldConfig, + const QJsonObject &newConfig) { Proto mainProto = ContainerProps::defaultProtocol(container); diff --git a/client/ui/controllers/installController.h b/client/ui/controllers/installController.h index e8ccd684..c79bd162 100644 --- a/client/ui/controllers/installController.h +++ b/client/ui/controllers/installController.h @@ -37,14 +37,14 @@ public slots: void removeApiConfig(const int serverIndex); - void clearCachedProfile(); + void clearCachedProfile(QSharedPointer serverController = nullptr); QRegularExpression ipAddressPortRegExp(); QRegularExpression ipAddressRegExp(); void mountSftpDrive(const QString &port, const QString &password, const QString &username); - bool checkSshConnection(); + bool checkSshConnection(QSharedPointer serverController = nullptr); void setEncryptedPassphrase(QString passphrase); @@ -79,12 +79,15 @@ signals: private: void installServer(const DockerContainer container, const QMap &installedContainers, - const ServerCredentials &serverCredentials, QString &finishMessage); + const ServerCredentials &serverCredentials, const QSharedPointer &serverController, + QString &finishMessage); void installContainer(const DockerContainer container, const QMap &installedContainers, - const ServerCredentials &serverCredentials, QString &finishMessage); + const ServerCredentials &serverCredentials, const QSharedPointer &serverController, + QString &finishMessage); bool isServerAlreadyExists(); - ErrorCode getAlreadyInstalledContainers(const ServerCredentials &credentials, QMap &installedContainers); + ErrorCode getAlreadyInstalledContainers(const ServerCredentials &credentials, const QSharedPointer &serverController, + QMap &installedContainers); bool isUpdateDockerContainerRequired(const DockerContainer container, const QJsonObject &oldConfig, const QJsonObject &newConfig); QSharedPointer m_serversModel; diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index ae4c48dc..7d16cca3 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -64,13 +64,12 @@ void ClientManagementModel::migration(const QByteArray &clientsTableString) } } -ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCredentials credentials) +ErrorCode ClientManagementModel::updateModel(const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController) { beginResetModel(); m_clientsTable = QJsonArray(); - ServerController serverController(m_settings); - ErrorCode error = ErrorCode::NoError; QString clientsTableFile = QString("/opt/amnezia/%1/clientsTable"); @@ -80,7 +79,7 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr clientsTableFile = clientsTableFile.arg(ContainerProps::containerTypeToString(container)); } - const QByteArray clientsTableString = serverController.getTextFileFromContainer(container, credentials, clientsTableFile, error); + const QByteArray clientsTableString = serverController->getTextFileFromContainer(container, credentials, clientsTableFile, error); if (error != ErrorCode::NoError) { logger.error() << "Failed to get the clientsTable file from the server"; endResetModel(); @@ -95,9 +94,9 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr int count = 0; if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { - error = getOpenVpnClients(serverController, container, credentials, count); + error = getOpenVpnClients(container, credentials, serverController, count); } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { - error = getWireGuardClients(serverController, container, credentials, count); + error = getWireGuardClients(container, credentials, serverController, count); } if (error != ErrorCode::NoError) { endResetModel(); @@ -106,7 +105,7 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr const QByteArray newClientsTableString = QJsonDocument(m_clientsTable).toJson(); if (clientsTableString != newClientsTableString) { - error = serverController.uploadTextFileToContainer(container, credentials, newClientsTableString, clientsTableFile); + error = serverController->uploadTextFileToContainer(container, credentials, newClientsTableString, clientsTableFile); if (error != ErrorCode::NoError) { logger.error() << "Failed to upload the clientsTable file to the server"; } @@ -117,8 +116,8 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr return error; } -ErrorCode ClientManagementModel::getOpenVpnClients(ServerController &serverController, DockerContainer container, - ServerCredentials credentials, int &count) +ErrorCode ClientManagementModel::getOpenVpnClients(const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController, int &count) { ErrorCode error = ErrorCode::NoError; QString stdOut; @@ -128,8 +127,8 @@ ErrorCode ClientManagementModel::getOpenVpnClients(ServerController &serverContr }; const QString getOpenVpnClientsList = "sudo docker exec -i $CONTAINER_NAME bash -c 'ls /opt/amnezia/openvpn/pki/issued'"; - QString script = serverController.replaceVars(getOpenVpnClientsList, serverController.genVarsForScript(credentials, container)); - error = serverController.runScript(credentials, script, cbReadStdOut); + QString script = serverController->replaceVars(getOpenVpnClientsList, serverController->genVarsForScript(credentials, container)); + error = serverController->runScript(credentials, script, cbReadStdOut); if (error != ErrorCode::NoError) { logger.error() << "Failed to retrieve the list of issued certificates on the server"; return error; @@ -158,13 +157,13 @@ ErrorCode ClientManagementModel::getOpenVpnClients(ServerController &serverContr return error; } -ErrorCode ClientManagementModel::getWireGuardClients(ServerController &serverController, DockerContainer container, - ServerCredentials credentials, int &count) +ErrorCode ClientManagementModel::getWireGuardClients(const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController, int &count) { ErrorCode error = ErrorCode::NoError; const QString wireGuardConfigFile = QString("opt/amnezia/%1/wg0.conf").arg(container == DockerContainer::WireGuard ? "wireguard" : "awg"); - const QString wireguardConfigString = serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, error); + const QString wireguardConfigString = serverController->getTextFileFromContainer(container, credentials, wireGuardConfigFile, error); if (error != ErrorCode::NoError) { logger.error() << "Failed to get the wg conf file from the server"; return error; @@ -198,7 +197,7 @@ ErrorCode ClientManagementModel::getWireGuardClients(ServerController &serverCon bool ClientManagementModel::isClientExists(const QString &clientId) { - for (const QJsonValue &value : qAsConst(m_clientsTable)) { + for (const QJsonValue &value : std::as_const(m_clientsTable)) { if (value.isObject()) { QJsonObject obj = value.toObject(); if (obj.contains(configKey::clientId) && obj[configKey::clientId].toString() == clientId) { @@ -210,7 +209,8 @@ bool ClientManagementModel::isClientExists(const QString &clientId) } ErrorCode ClientManagementModel::appendClient(const DockerContainer container, const ServerCredentials &credentials, - const QJsonObject &containerConfig, const QString &clientName) + const QJsonObject &containerConfig, const QString &clientName, + const QSharedPointer &serverController) { Proto protocol; if (container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { @@ -223,22 +223,22 @@ ErrorCode ClientManagementModel::appendClient(const DockerContainer container, c auto protocolConfig = ContainerProps::getProtocolConfigFromContainer(protocol, containerConfig); - return appendClient(protocolConfig.value(config_key::clientId).toString(), clientName, container, credentials); + return appendClient(protocolConfig.value(config_key::clientId).toString(), clientName, container, credentials, serverController); } ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QString &clientName, const DockerContainer container, - ServerCredentials credentials) + const ServerCredentials &credentials, const QSharedPointer &serverController) { ErrorCode error = ErrorCode::NoError; - error = updateModel(container, credentials); + error = updateModel(container, credentials, serverController); if (error != ErrorCode::NoError) { return error; } for (int i = 0; i < m_clientsTable.size(); i++) { if (m_clientsTable.at(i).toObject().value(configKey::clientId) == clientId) { - return renameClient(i, clientName, container, credentials, true); + return renameClient(i, clientName, container, credentials, serverController, true); } } @@ -255,7 +255,6 @@ ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QSt const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson(); - ServerController serverController(m_settings); QString clientsTableFile = QString("/opt/amnezia/%1/clientsTable"); if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { clientsTableFile = clientsTableFile.arg(ContainerProps::containerTypeToString(DockerContainer::OpenVpn)); @@ -263,7 +262,7 @@ ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QSt clientsTableFile = clientsTableFile.arg(ContainerProps::containerTypeToString(container)); } - error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + error = serverController->uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); if (error != ErrorCode::NoError) { logger.error() << "Failed to upload the clientsTable file to the server"; } @@ -272,7 +271,8 @@ ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QSt } ErrorCode ClientManagementModel::renameClient(const int row, const QString &clientName, const DockerContainer container, - ServerCredentials credentials, bool addTimeStamp) + const ServerCredentials &credentials, + const QSharedPointer &serverController, bool addTimeStamp) { auto client = m_clientsTable.at(row).toObject(); auto userData = client[configKey::userData].toObject(); @@ -287,7 +287,6 @@ ErrorCode ClientManagementModel::renameClient(const int row, const QString &clie const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson(); - ServerController serverController(m_settings); QString clientsTableFile = QString("/opt/amnezia/%1/clientsTable"); if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { clientsTableFile = clientsTableFile.arg(ContainerProps::containerTypeToString(DockerContainer::OpenVpn)); @@ -295,7 +294,7 @@ ErrorCode ClientManagementModel::renameClient(const int row, const QString &clie clientsTableFile = clientsTableFile.arg(ContainerProps::containerTypeToString(container)); } - ErrorCode error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + ErrorCode error = serverController->uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); if (error != ErrorCode::NoError) { logger.error() << "Failed to upload the clientsTable file to the server"; } @@ -303,17 +302,17 @@ ErrorCode ClientManagementModel::renameClient(const int row, const QString &clie return error; } -ErrorCode ClientManagementModel::revokeClient(const int row, const DockerContainer container, ServerCredentials credentials, - const int serverIndex) +ErrorCode ClientManagementModel::revokeClient(const int row, const DockerContainer container, const ServerCredentials &credentials, + const int serverIndex, const QSharedPointer &serverController) { ErrorCode errorCode = ErrorCode::NoError; auto client = m_clientsTable.at(row).toObject(); QString clientId = client.value(configKey::clientId).toString(); if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { - errorCode = revokeOpenVpn(row, container, credentials, serverIndex); + errorCode = revokeOpenVpn(row, container, credentials, serverIndex, serverController); } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { - errorCode = revokeWireGuard(row, container, credentials); + errorCode = revokeWireGuard(row, container, credentials, serverController); } if (errorCode == ErrorCode::NoError) { @@ -340,11 +339,12 @@ ErrorCode ClientManagementModel::revokeClient(const int row, const DockerContain return errorCode; } -ErrorCode ClientManagementModel::revokeClient(const QJsonObject &containerConfig, const DockerContainer container, ServerCredentials credentials, - const int serverIndex) +ErrorCode ClientManagementModel::revokeClient(const QJsonObject &containerConfig, const DockerContainer container, + const ServerCredentials &credentials, const int serverIndex, + const QSharedPointer &serverController) { ErrorCode errorCode = ErrorCode::NoError; - errorCode = updateModel(container, credentials); + errorCode = updateModel(container, credentials, serverController); if (errorCode != ErrorCode::NoError) { return errorCode; } @@ -375,15 +375,15 @@ ErrorCode ClientManagementModel::revokeClient(const QJsonObject &containerConfig } if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { - errorCode = revokeOpenVpn(row, container, credentials, serverIndex); + errorCode = revokeOpenVpn(row, container, credentials, serverIndex, serverController); } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { - errorCode = revokeWireGuard(row, container, credentials); + errorCode = revokeWireGuard(row, container, credentials, serverController); } return errorCode; } -ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContainer container, ServerCredentials credentials, - const int serverIndex) +ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContainer container, const ServerCredentials &credentials, + const int serverIndex, const QSharedPointer &serverController) { auto client = m_clientsTable.at(row).toObject(); QString clientId = client.value(configKey::clientId).toString(); @@ -396,9 +396,8 @@ ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContai "cp pki/crl.pem .'") .arg(clientId); - ServerController serverController(m_settings); - const QString script = serverController.replaceVars(getOpenVpnCertData, serverController.genVarsForScript(credentials, container)); - ErrorCode error = serverController.runScript(credentials, script); + const QString script = serverController->replaceVars(getOpenVpnCertData, serverController->genVarsForScript(credentials, container)); + ErrorCode error = serverController->runScript(credentials, script); if (error != ErrorCode::NoError) { logger.error() << "Failed to revoke the certificate"; return error; @@ -412,7 +411,7 @@ ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContai QString clientsTableFile = QString("/opt/amnezia/%1/clientsTable"); clientsTableFile = clientsTableFile.arg(ContainerProps::containerTypeToString(DockerContainer::OpenVpn)); - error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + error = serverController->uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); if (error != ErrorCode::NoError) { logger.error() << "Failed to upload the clientsTable file to the server"; return error; @@ -421,14 +420,14 @@ ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContai return ErrorCode::NoError; } -ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerContainer container, ServerCredentials credentials) +ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController) { ErrorCode error = ErrorCode::NoError; - ServerController serverController(m_settings); const QString wireGuardConfigFile = QString("/opt/amnezia/%1/wg0.conf").arg(container == DockerContainer::WireGuard ? "wireguard" : "awg"); - const QString wireguardConfigString = serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, error); + const QString wireguardConfigString = serverController->getTextFileFromContainer(container, credentials, wireGuardConfigFile, error); if (error != ErrorCode::NoError) { logger.error() << "Failed to get the wg conf file from the server"; return error; @@ -446,7 +445,7 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont } QString newWireGuardConfig = configSections.join("["); newWireGuardConfig.insert(0, "["); - error = serverController.uploadTextFileToContainer(container, credentials, newWireGuardConfig, wireGuardConfigFile); + error = serverController->uploadTextFileToContainer(container, credentials, newWireGuardConfig, wireGuardConfigFile); if (error != ErrorCode::NoError) { logger.error() << "Failed to upload the wg conf file to the server"; return error; @@ -464,16 +463,16 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont } else { clientsTableFile = clientsTableFile.arg(ContainerProps::containerTypeToString(container)); } - error = serverController.uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); + error = serverController->uploadTextFileToContainer(container, credentials, clientsTableString, clientsTableFile); if (error != ErrorCode::NoError) { logger.error() << "Failed to upload the clientsTable file to the server"; return error; } const QString script = "sudo docker exec -i $CONTAINER_NAME bash -c 'wg syncconf wg0 <(wg-quick strip %1)'"; - error = serverController.runScript( + error = serverController->runScript( credentials, - serverController.replaceVars(script.arg(wireGuardConfigFile), serverController.genVarsForScript(credentials, container))); + serverController->replaceVars(script.arg(wireGuardConfigFile), serverController->genVarsForScript(credentials, container))); if (error != ErrorCode::NoError) { logger.error() << "Failed to execute the command 'wg syncconf' on the server"; return error; diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index 836207ba..71b84f96 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -23,15 +23,18 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; public slots: - ErrorCode updateModel(DockerContainer container, ServerCredentials credentials); + ErrorCode updateModel(const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController); ErrorCode appendClient(const DockerContainer container, const ServerCredentials &credentials, const QJsonObject &containerConfig, - const QString &clientName); + const QString &clientName, const QSharedPointer &serverController); ErrorCode appendClient(const QString &clientId, const QString &clientName, const DockerContainer container, - ServerCredentials credentials); - ErrorCode renameClient(const int row, const QString &userName, const DockerContainer container, ServerCredentials credentials, - bool addTimeStamp = false); - ErrorCode revokeClient(const int index, const DockerContainer container, ServerCredentials credentials, const int serverIndex); - ErrorCode revokeClient(const QJsonObject &containerConfig, const DockerContainer container, ServerCredentials credentials, const int serverIndex); + const ServerCredentials &credentials, const QSharedPointer &serverController); + ErrorCode renameClient(const int row, const QString &userName, const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController, bool addTimeStamp = false); + ErrorCode revokeClient(const int index, const DockerContainer container, const ServerCredentials &credentials, const int serverIndex, + const QSharedPointer &serverController); + ErrorCode revokeClient(const QJsonObject &containerConfig, const DockerContainer container, const ServerCredentials &credentials, + const int serverIndex, const QSharedPointer &serverController); protected: QHash roleNames() const override; @@ -44,11 +47,15 @@ private: void migration(const QByteArray &clientsTableString); - ErrorCode revokeOpenVpn(const int row, const DockerContainer container, ServerCredentials credentials, const int serverIndex); - ErrorCode revokeWireGuard(const int row, const DockerContainer container, ServerCredentials credentials); + ErrorCode revokeOpenVpn(const int row, const DockerContainer container, const ServerCredentials &credentials, const int serverIndex, + const QSharedPointer &serverController); + ErrorCode revokeWireGuard(const int row, const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController); - ErrorCode getOpenVpnClients(ServerController &serverController, DockerContainer container, ServerCredentials credentials, int &count); - ErrorCode getWireGuardClients(ServerController &serverController, DockerContainer container, ServerCredentials credentials, int &count); + ErrorCode getOpenVpnClients(const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController, int &count); + ErrorCode getWireGuardClients(const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController, int &count); QJsonArray m_clientsTable; diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index 99b38234..f6fbb40e 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -421,10 +421,10 @@ const QString ServersModel::getDefaultServerDefaultContainerName() return ContainerProps::containerHumanNames().value(defaultContainer); } -ErrorCode ServersModel::removeAllContainers() +ErrorCode ServersModel::removeAllContainers(const QSharedPointer &serverController) { - ServerController serverController(m_settings); - ErrorCode errorCode = serverController.removeAllContainers(m_settings->serverCredentials(m_processedServerIndex)); + + ErrorCode errorCode = serverController->removeAllContainers(m_settings->serverCredentials(m_processedServerIndex)); if (errorCode == ErrorCode::NoError) { QJsonObject s = m_servers.at(m_processedServerIndex).toObject(); @@ -436,22 +436,22 @@ ErrorCode ServersModel::removeAllContainers() return errorCode; } -ErrorCode ServersModel::rebootServer() +ErrorCode ServersModel::rebootServer(const QSharedPointer &serverController) { - ServerController serverController(m_settings); + auto credentials = m_settings->serverCredentials(m_processedServerIndex); - ErrorCode errorCode = serverController.rebootServer(credentials); + ErrorCode errorCode = serverController->rebootServer(credentials); return errorCode; } -ErrorCode ServersModel::removeContainer(const int containerIndex) +ErrorCode ServersModel::removeContainer(const QSharedPointer &serverController, const int containerIndex) { - ServerController serverController(m_settings); + auto credentials = m_settings->serverCredentials(m_processedServerIndex); auto dockerContainer = static_cast(containerIndex); - ErrorCode errorCode = serverController.removeContainer(credentials, dockerContainer); + ErrorCode errorCode = serverController->removeContainer(credentials, dockerContainer); if (errorCode == ErrorCode::NoError) { QJsonObject server = m_servers.at(m_processedServerIndex).toObject(); diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index 7f4e3f6b..e6b9226b 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -4,6 +4,7 @@ #include #include "settings.h" +#include "core/controllers/serverController.h" class ServersModel : public QAbstractListModel { @@ -88,9 +89,9 @@ public slots: void clearCachedProfile(const DockerContainer container); - ErrorCode removeContainer(const int containerIndex); - ErrorCode removeAllContainers(); - ErrorCode rebootServer(); + ErrorCode removeContainer(const QSharedPointer &serverController, const int containerIndex); + ErrorCode removeAllContainers(const QSharedPointer &serverController); + ErrorCode rebootServer(const QSharedPointer &serverController); void setDefaultContainer(const int serverIndex, const int containerIndex);