diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ca7ac87d..8f50cae2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -68,15 +68,6 @@ jobs: BUILD_ARCH: 64 steps: - - name: 'Get sources' - uses: actions/checkout@v3 - with: - submodules: 'true' - fetch-depth: 10 - - - name: 'Setup ccache' - uses: hendrikmuhs/ccache-action@v1.2 - - name: 'Install Qt' uses: jurplel/install-qt-action@v3 with: @@ -94,7 +85,16 @@ jobs: - name: 'Setup mvsc' uses: ilammy/msvc-dev-cmd@v1 with: - arch: 'x64' + arch: 'x64' + + - name: 'Get sources' + uses: actions/checkout@v3 + with: + submodules: 'true' + fetch-depth: 10 + + - name: 'Setup ccache' + uses: hendrikmuhs/ccache-action@v1.2 - name: 'Build project' shell: cmd diff --git a/.gitignore b/.gitignore index 562b2ee7..88a3b397 100644 --- a/.gitignore +++ b/.gitignore @@ -129,4 +129,4 @@ captures/ client/3rd/ShadowSocks/ss_ios.xcconfig # UML generated pics -out/ \ No newline at end of file +out/ diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 1085d4dc..827734df 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -31,7 +31,7 @@ set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "Autogen") find_package(Qt6 REQUIRED COMPONENTS Widgets Core Gui Network Xml RemoteObjects Quick Svg QuickControls2 - Core5Compat Concurrent + Core5Compat Concurrent LinguistTools ) set(LIBS ${LIBS} Qt6::Widgets Qt6::Core Qt6::Gui @@ -47,13 +47,11 @@ if(IOS) WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) endif() -set(IS_CI ${CI}) -if(IS_CI) - message("Detected CI env") - find_program(CCACHE "ccache") - if(CCACHE) - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE}") - endif() +find_program(CCACHE_FOUND ccache) +if(CCACHE_FOUND) + message("found ccache") + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) + set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) endif() include(${CMAKE_CURRENT_LIST_DIR}/cmake/3rdparty.cmake) diff --git a/client/cmake/3rdparty.cmake b/client/cmake/3rdparty.cmake index 44120cf5..81e7b34d 100644 --- a/client/cmake/3rdparty.cmake +++ b/client/cmake/3rdparty.cmake @@ -100,6 +100,7 @@ add_subdirectory(${CLIENT_ROOT_DIR}/3rd/libssh) add_compile_definitions(_WINSOCKAPI_) set(LIBS ${LIBS} ssh) +set(BUILD_TRANSLATIONS OFF CACHE BOOL "" FORCE) set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) set(BUILD_WITH_QT6 ON) add_subdirectory(${CLIENT_ROOT_DIR}/3rd/qtkeychain) diff --git a/client/configurators/cloak_configurator.cpp b/client/configurators/cloak_configurator.cpp index 6206d141..57c4d3a1 100644 --- a/client/configurators/cloak_configurator.cpp +++ b/client/configurators/cloak_configurator.cpp @@ -13,22 +13,20 @@ CloakConfigurator::CloakConfigurator(std::shared_ptr settings, QObject } -QString CloakConfigurator::genCloakConfig(const ServerCredentials &credentials, - DockerContainer container, const QJsonObject &containerConfig, ErrorCode *errorCode) +QString CloakConfigurator::genCloakConfig(const ServerCredentials &credentials, DockerContainer container, + const QJsonObject &containerConfig, ErrorCode &errorCode) { - ErrorCode e = ErrorCode::NoError; ServerController serverController(m_settings); QString cloakPublicKey = serverController.getTextFileFromContainer(container, credentials, - amnezia::protocols::cloak::ckPublicKeyPath, &e); + amnezia::protocols::cloak::ckPublicKeyPath, errorCode); cloakPublicKey.replace("\n", ""); QString cloakBypassUid = serverController.getTextFileFromContainer(container, credentials, - amnezia::protocols::cloak::ckBypassUidKeyPath, &e); + amnezia::protocols::cloak::ckBypassUidKeyPath, errorCode); cloakBypassUid.replace("\n", ""); - if (e) { - if (errorCode) *errorCode = e; + if (errorCode) { return ""; } diff --git a/client/configurators/cloak_configurator.h b/client/configurators/cloak_configurator.h index cf6cd002..7a0adc16 100644 --- a/client/configurators/cloak_configurator.h +++ b/client/configurators/cloak_configurator.h @@ -14,7 +14,7 @@ public: CloakConfigurator(std::shared_ptr settings, QObject *parent = nullptr); QString genCloakConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, ErrorCode &errorCode); }; #endif // CLOAK_CONFIGURATOR_H diff --git a/client/configurators/ikev2_configurator.cpp b/client/configurators/ikev2_configurator.cpp index 7ed83da1..45243c00 100644 --- a/client/configurators/ikev2_configurator.cpp +++ b/client/configurators/ikev2_configurator.cpp @@ -22,7 +22,7 @@ Ikev2Configurator::Ikev2Configurator(std::shared_ptr settings, QObject } Ikev2Configurator::ConnectionData Ikev2Configurator::prepareIkev2Config(const ServerCredentials &credentials, - DockerContainer container, ErrorCode *errorCode) + DockerContainer container, ErrorCode &errorCode) { Ikev2Configurator::ConnectionData connData; connData.host = credentials.hostName; @@ -42,16 +42,16 @@ Ikev2Configurator::ConnectionData Ikev2Configurator::prepareIkev2Config(const Se .arg(connData.clientId); ServerController serverController(m_settings); - ErrorCode e = serverController.runContainerScript(credentials, container, scriptCreateCert); + errorCode = 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); - e = serverController.runContainerScript(credentials, container, scriptExportCert); + errorCode = serverController.runContainerScript(credentials, container, scriptExportCert); - connData.clientCert = serverController.getTextFileFromContainer(container, credentials, certFileName, &e); - connData.caCert = serverController.getTextFileFromContainer(container, credentials, "/etc/ipsec.d/ca_cert_base64.p12", &e); + connData.clientCert = serverController.getTextFileFromContainer(container, credentials, certFileName, errorCode); + connData.caCert = 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(); @@ -60,12 +60,12 @@ Ikev2Configurator::ConnectionData Ikev2Configurator::prepareIkev2Config(const Se } QString Ikev2Configurator::genIkev2Config(const ServerCredentials &credentials, - DockerContainer container, const QJsonObject &containerConfig, ErrorCode *errorCode) + DockerContainer container, const QJsonObject &containerConfig, ErrorCode &errorCode) { Q_UNUSED(containerConfig) ConnectionData connData = prepareIkev2Config(credentials, container, errorCode); - if (errorCode && *errorCode) { + if (errorCode) { return ""; } diff --git a/client/configurators/ikev2_configurator.h b/client/configurators/ikev2_configurator.h index a7d379f2..1bc2bd05 100644 --- a/client/configurators/ikev2_configurator.h +++ b/client/configurators/ikev2_configurator.h @@ -22,14 +22,13 @@ public: }; QString genIkev2Config(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, ErrorCode &errorCode); QString genIkev2Config(const ConnectionData &connData); QString genMobileConfig(const ConnectionData &connData); QString genStrongSwanConfig(const ConnectionData &connData); - ConnectionData prepareIkev2Config(const ServerCredentials &credentials, - DockerContainer container, ErrorCode *errorCode = nullptr); + ConnectionData prepareIkev2Config(const ServerCredentials &credentials, DockerContainer container, ErrorCode &errorCode); }; #endif // IKEV2_CONFIGURATOR_H diff --git a/client/configurators/openvpn_configurator.cpp b/client/configurators/openvpn_configurator.cpp index 456aeb4d..59f93974 100644 --- a/client/configurators/openvpn_configurator.cpp +++ b/client/configurators/openvpn_configurator.cpp @@ -26,13 +26,13 @@ OpenVpnConfigurator::OpenVpnConfigurator(std::shared_ptr settings, QOb } OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(const ServerCredentials &credentials, - DockerContainer container, ErrorCode *errorCode) + DockerContainer container, ErrorCode &errorCode) { OpenVpnConfigurator::ConnectionData connData = OpenVpnConfigurator::createCertRequest(); connData.host = credentials.hostName; if (connData.privKey.isEmpty() || connData.request.isEmpty()) { - if (errorCode) *errorCode = ErrorCode::OpenSslFailed; + errorCode = ErrorCode::OpenSslFailed; return connData; } @@ -41,45 +41,44 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(co arg(connData.clientId); ServerController serverController(m_settings); - ErrorCode e = serverController.uploadTextFileToContainer(container, credentials, connData.request, reqFileName); - if (e) { - if (errorCode) *errorCode = e; + errorCode = serverController.uploadTextFileToContainer(container, credentials, connData.request, reqFileName); + if (errorCode) { return connData; } - e = signCert(container, credentials, connData.clientId); - if (e) { - if (errorCode) *errorCode = e; + errorCode = signCert(container, credentials, connData.clientId); + if (errorCode) { return connData; } - connData.caCert = serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::openvpn::caCertPath, &e); + 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), &e); + QString("%1/%2.crt").arg(amnezia::protocols::openvpn::clientCertPath).arg(connData.clientId), errorCode); - if (e) { - if (errorCode) *errorCode = e; + + if (errorCode) { return connData; } - connData.taKey = serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::openvpn::taKeyPath, &e); + connData.taKey = serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::openvpn::taKeyPath, errorCode); if (connData.caCert.isEmpty() || connData.clientCert.isEmpty() || connData.taKey.isEmpty()) { - if (errorCode) *errorCode = ErrorCode::SshSftpFailureError; + errorCode = ErrorCode::SshSftpFailureError; } return connData; } QString OpenVpnConfigurator::genOpenVpnConfig(const ServerCredentials &credentials, - DockerContainer container, const QJsonObject &containerConfig, ErrorCode *errorCode) + 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)); ConnectionData connData = prepareOpenVpnConfig(credentials, container, errorCode); - if (errorCode && *errorCode) { + if (errorCode) { return ""; } diff --git a/client/configurators/openvpn_configurator.h b/client/configurators/openvpn_configurator.h index 3b84e0a0..b5a90dde 100644 --- a/client/configurators/openvpn_configurator.h +++ b/client/configurators/openvpn_configurator.h @@ -24,7 +24,7 @@ public: }; QString genOpenVpnConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, ErrorCode &errorCode); QString processConfigWithLocalSettings(QString jsonConfig); QString processConfigWithExportSettings(QString jsonConfig); @@ -36,7 +36,7 @@ private: ConnectionData createCertRequest(); ConnectionData prepareOpenVpnConfig(const ServerCredentials &credentials, - DockerContainer container, ErrorCode *errorCode = nullptr); + DockerContainer container, ErrorCode &errorCode); }; diff --git a/client/configurators/shadowsocks_configurator.cpp b/client/configurators/shadowsocks_configurator.cpp index a71064c8..21487764 100644 --- a/client/configurators/shadowsocks_configurator.cpp +++ b/client/configurators/shadowsocks_configurator.cpp @@ -13,18 +13,16 @@ ShadowSocksConfigurator::ShadowSocksConfigurator(std::shared_ptr setti } -QString ShadowSocksConfigurator::genShadowSocksConfig(const ServerCredentials &credentials, - DockerContainer container, const QJsonObject &containerConfig, ErrorCode *errorCode) +QString ShadowSocksConfigurator::genShadowSocksConfig(const ServerCredentials &credentials, DockerContainer container, + const QJsonObject &containerConfig, ErrorCode &errorCode) { - ErrorCode e = ErrorCode::NoError; ServerController serverController(m_settings); QString ssKey = serverController.getTextFileFromContainer(container, credentials, - amnezia::protocols::shadowsocks::ssKeyPath, &e); + amnezia::protocols::shadowsocks::ssKeyPath, errorCode); ssKey.replace("\n", ""); - if (e) { - if (errorCode) *errorCode = e; + if (errorCode) { return ""; } diff --git a/client/configurators/shadowsocks_configurator.h b/client/configurators/shadowsocks_configurator.h index b03149eb..a3276278 100644 --- a/client/configurators/shadowsocks_configurator.h +++ b/client/configurators/shadowsocks_configurator.h @@ -13,7 +13,7 @@ public: ShadowSocksConfigurator(std::shared_ptr settings, QObject *parent = nullptr); QString genShadowSocksConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, ErrorCode &errorCode); }; #endif // SHADOWSOCKS_CONFIGURATOR_H diff --git a/client/configurators/vpn_configurator.cpp b/client/configurators/vpn_configurator.cpp index ceb6a5a4..937ccb7f 100644 --- a/client/configurators/vpn_configurator.cpp +++ b/client/configurators/vpn_configurator.cpp @@ -25,8 +25,8 @@ VpnConfigurator::VpnConfigurator(std::shared_ptr settings, QObject *pa sshConfigurator = std::shared_ptr(new SshConfigurator(settings, this)); } -QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentials, - DockerContainer container, const QJsonObject &containerConfig, Proto proto, ErrorCode *errorCode) +QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentials, DockerContainer container, + const QJsonObject &containerConfig, Proto proto, ErrorCode &errorCode) { switch (proto) { case Proto::OpenVpn: @@ -49,6 +49,25 @@ QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentia } } +ErrorCode VpnConfigurator::processLastConfigWithRemoteSettings(QMap &lastVpnConfigs, + const int serverIndex, const Proto proto) +{ + switch (proto) { + case Proto::OpenVpn: + return ErrorCode::NotImplementedError; + case Proto::ShadowSocks: + return ErrorCode::NotImplementedError; + case Proto::Cloak: + return ErrorCode::NotImplementedError; + case Proto::WireGuard: + return wireguardConfigurator->processLastConfigWithRemoteSettings(lastVpnConfigs, serverIndex); + case Proto::Ikev2: + return ErrorCode::NotImplementedError; + default: + return ErrorCode::ConfigMissing; + } +} + QPair VpnConfigurator::getDnsForConfig(int serverIndex) { QPair dns; diff --git a/client/configurators/vpn_configurator.h b/client/configurators/vpn_configurator.h index 5d0fcfee..55c0691f 100644 --- a/client/configurators/vpn_configurator.h +++ b/client/configurators/vpn_configurator.h @@ -22,17 +22,17 @@ public: VpnConfigurator(std::shared_ptr settings, QObject *parent = nullptr); QString genVpnProtocolConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, Proto proto, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, Proto proto, ErrorCode &errorCode); QPair getDnsForConfig(int serverIndex); QString &processConfigWithDnsSettings(int serverIndex, DockerContainer container, Proto proto, QString &config); QString &processConfigWithLocalSettings(int serverIndex, DockerContainer container, Proto proto, QString &config); QString &processConfigWithExportSettings(int serverIndex, DockerContainer container, Proto proto, QString &config); + ErrorCode processLastConfigWithRemoteSettings(QMap &lastVpnConfigs, const int serverIndex, const Proto proto); // workaround for containers which is not support normal configaration - void updateContainerConfigAfterInstallation(DockerContainer container, - QJsonObject &containerConfig, const QString &stdOut); + void updateContainerConfigAfterInstallation(DockerContainer container, QJsonObject &containerConfig, const QString &stdOut); std::shared_ptr openVpnConfigurator; std::shared_ptr shadowSocksConfigurator; diff --git a/client/configurators/wireguard_configurator.cpp b/client/configurators/wireguard_configurator.cpp index f7ab1657..b0122fbc 100644 --- a/client/configurators/wireguard_configurator.cpp +++ b/client/configurators/wireguard_configurator.cpp @@ -6,7 +6,8 @@ #include #include #include - +#include +#include #include #include @@ -59,17 +60,16 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::genClientKeys() } WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardConfig(const ServerCredentials &credentials, - DockerContainer container, const QJsonObject &containerConfig, ErrorCode *errorCode) + DockerContainer container, const QJsonObject &containerConfig, ErrorCode &errorCode) { WireguardConfigurator::ConnectionData connData = WireguardConfigurator::genClientKeys(); connData.host = credentials.hostName; if (connData.clientPrivKey.isEmpty() || connData.clientPubKey.isEmpty()) { - if (errorCode) *errorCode = ErrorCode::InternalError; + errorCode = ErrorCode::InternalError; return connData; } - ErrorCode e = ErrorCode::NoError; ServerController serverController(m_settings); // Get list of already created clients (only IP addreses) @@ -82,9 +82,8 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon return ErrorCode::NoError; }; - e = serverController.runContainerScript(credentials, container, script, cbReadStdOut); - if (errorCode && e) { - *errorCode = e; + errorCode = serverController.runContainerScript(credentials, container, script, cbReadStdOut); + if (errorCode) { return connData; } @@ -99,7 +98,7 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon else { int next = ips.last().split(".").last().toInt() + 1; if (next > 254) { - if (errorCode) *errorCode = ErrorCode::AddressPoolError; + errorCode = ErrorCode::AddressPoolError; return connData; } nextIpNumber = QString::number(next); @@ -110,7 +109,7 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon { QStringList l = subnetIp.split(".", Qt::SkipEmptyParts); if (l.isEmpty()) { - if (errorCode) *errorCode = ErrorCode::AddressPoolError; + errorCode = ErrorCode::AddressPoolError; return connData; } l.removeLast(); @@ -120,18 +119,16 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon } // Get keys - connData.serverPubKey = serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::wireguard::serverPublicKeyPath, &e); + connData.serverPubKey = serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::wireguard::serverPublicKeyPath, errorCode); connData.serverPubKey.replace("\n", ""); - if (e) { - if (errorCode) *errorCode = e; + if (errorCode) { return connData; } - connData.pskKey = serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::wireguard::serverPskKeyPath, &e); + connData.pskKey = serverController.getTextFileFromContainer(container, credentials, amnezia::protocols::wireguard::serverPskKeyPath, errorCode); connData.pskKey.replace("\n", ""); - if (e) { - if (errorCode) *errorCode = e; + if (errorCode) { return connData; } @@ -145,15 +142,15 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon arg(connData.pskKey). arg(connData.clientIP); - e = serverController.uploadTextFileToContainer(container, credentials, configPart, + errorCode = serverController.uploadTextFileToContainer(container, credentials, configPart, protocols::wireguard::serverConfigPath, libssh::SftpOverwriteMode::SftpAppendToExisting); - if (e) { - if (errorCode) *errorCode = e; + + if (errorCode) { return connData; } - e = serverController.runScript(credentials, + errorCode = serverController.runScript(credentials, serverController.replaceVars("sudo docker exec -i $CONTAINER_NAME bash -c 'wg syncconf wg0 <(wg-quick strip /opt/amnezia/wireguard/wg0.conf)'", serverController.genVarsForScript(credentials, container))); @@ -161,14 +158,14 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon } QString WireguardConfigurator::genWireguardConfig(const ServerCredentials &credentials, - DockerContainer container, const QJsonObject &containerConfig, ErrorCode *errorCode) + DockerContainer container, const QJsonObject &containerConfig, ErrorCode &errorCode) { ServerController serverController(m_settings); QString config = serverController.replaceVars(amnezia::scriptData(ProtocolScriptType::wireguard_template, container), serverController.genVarsForScript(credentials, container, containerConfig)); ConnectionData connData = prepareWireguardConfig(credentials, container, containerConfig, errorCode); - if (errorCode && *errorCode) { + if (errorCode) { return ""; } @@ -209,3 +206,49 @@ QString WireguardConfigurator::processConfigWithExportSettings(QString config) return config; } + +ErrorCode WireguardConfigurator::processLastConfigWithRemoteSettings(QMap &lastVpnConfigs, const int serverIndex) +{ + QString allowedIps; + ErrorCode errorCode = ErrorCode::NoError; + QNetworkAccessManager manager; + QObject::connect(&manager, &QNetworkAccessManager::finished, this, [this, &allowedIps, &errorCode](QNetworkReply *reply) { + if (reply->error()) { + qDebug() << reply->errorString(); + errorCode = ErrorCode::InternalError; + emit remoteProcessingFinished(); + return; + } + + allowedIps = reply->readAll(); + emit remoteProcessingFinished(); + }); + QNetworkRequest request; + const QJsonObject serverSettings = m_settings->server(serverIndex); + request.setUrl(serverSettings.value(config_key::nativeConfigParametrsStorage).toString()); + manager.get(request); + + QEventLoop wait; + QObject::connect(this, &WireguardConfigurator::remoteProcessingFinished, &wait, &QEventLoop::quit); + wait.exec(); + + if (errorCode == ErrorCode::NoError) { + allowedIps = allowedIps.trimmed(); + QString config = lastVpnConfigs.value(Proto::WireGuard); + QJsonObject lastConfigJson = QJsonDocument::fromJson(config.toUtf8()).object(); + QStringList configLines = lastConfigJson.value(config_key::config).toString().split("\n"); + + for (auto &line : configLines) { + if (line.contains("AllowedIPs")) { + line = allowedIps; + } + } + + QJsonObject newConfigJson; + newConfigJson[config_key::config] = configLines.join("\n"); + lastVpnConfigs[Proto::WireGuard] = QString(QJsonDocument(newConfigJson).toJson());; + + return ErrorCode::NoError; + } + return errorCode; +} diff --git a/client/configurators/wireguard_configurator.h b/client/configurators/wireguard_configurator.h index ab903d29..f3cb2c0a 100644 --- a/client/configurators/wireguard_configurator.h +++ b/client/configurators/wireguard_configurator.h @@ -7,7 +7,7 @@ #include "configurator_base.h" #include "core/defs.h" -class WireguardConfigurator : ConfiguratorBase +class WireguardConfigurator : public ConfiguratorBase { Q_OBJECT public: @@ -23,17 +23,22 @@ public: }; QString genWireguardConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); + const QJsonObject &containerConfig, ErrorCode &errorCode); QString processConfigWithLocalSettings(QString config); QString processConfigWithExportSettings(QString config); + ErrorCode processLastConfigWithRemoteSettings(QMap &lastVpnConfigs, const int serverIndex); private: ConnectionData prepareWireguardConfig(const ServerCredentials &credentials, - DockerContainer container, const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); + DockerContainer container, const QJsonObject &containerConfig, + ErrorCode &errorCode); ConnectionData genClientKeys(); + +signals: + void remoteProcessingFinished(); }; #endif // WIREGUARD_CONFIGURATOR_H diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 74ebf1b0..8a9b2ce5 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -178,10 +178,9 @@ ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container, } QByteArray ServerController::getTextFileFromContainer(DockerContainer container, - const ServerCredentials &credentials, const QString &path, ErrorCode *errorCode) + const ServerCredentials &credentials, const QString &path, ErrorCode &errorCode) { - - if (errorCode) *errorCode = ErrorCode::NoError; + errorCode = ErrorCode::NoError; QString script = QString("sudo docker exec -i %1 sh -c \"xxd -p \'%2\'\""). arg(ContainerProps::containerToString(container)).arg(path); @@ -193,7 +192,7 @@ QByteArray ServerController::getTextFileFromContainer(DockerContainer container, return ErrorCode::NoError; }; - *errorCode = runScript(credentials, script, cbReadStdOut); + errorCode = runScript(credentials, script, cbReadStdOut); qDebug().noquote() << "Copy file from container stdout : \n" << stdOut; @@ -580,7 +579,7 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential return vars; } -QString ServerController::checkSshConnection(const ServerCredentials &credentials, ErrorCode *errorCode) +QString ServerController::checkSshConnection(const ServerCredentials &credentials, ErrorCode &errorCode) { QString stdOut; auto cbReadStdOut = [&](const QString &data, libssh::Client &) { @@ -592,10 +591,7 @@ QString ServerController::checkSshConnection(const ServerCredentials &credential return ErrorCode::NoError; }; - ErrorCode e = runScript(credentials, - amnezia::scriptData(SharedScriptType::check_connection), cbReadStdOut, cbReadStdErr); - - if (errorCode) *errorCode = e; + errorCode = runScript(credentials, amnezia::scriptData(SharedScriptType::check_connection), cbReadStdOut, cbReadStdErr); return stdOut; } diff --git a/client/core/servercontroller.h b/client/core/servercontroller.h index 2611a191..5835aa41 100644 --- a/client/core/servercontroller.h +++ b/client/core/servercontroller.h @@ -38,7 +38,7 @@ public: libssh::SftpOverwriteMode overwriteMode = libssh::SftpOverwriteMode::SftpOverwriteExisting); QByteArray getTextFileFromContainer(DockerContainer container, const ServerCredentials &credentials, - const QString &path, ErrorCode *errorCode = nullptr); + const QString &path, ErrorCode &errorCode); QString replaceVars(const QString &script, const Vars &vars); Vars genVarsForScript(const ServerCredentials &credentials, DockerContainer container = DockerContainer::None, const QJsonObject &config = QJsonObject()); @@ -51,7 +51,7 @@ public: const std::function &cbReadStdOut = nullptr, const std::function &cbReadStdErr = nullptr); - QString checkSshConnection(const ServerCredentials &credentials, ErrorCode *errorCode = nullptr); + QString checkSshConnection(const ServerCredentials &credentials, ErrorCode &errorCode); void setCancelInstallation(const bool cancel); diff --git a/client/protocols/protocols_defs.h b/client/protocols/protocols_defs.h index c5f15d5b..dd9712b4 100644 --- a/client/protocols/protocols_defs.h +++ b/client/protocols/protocols_defs.h @@ -64,6 +64,8 @@ constexpr char isThirdPartyConfig[] = "isThirdPartyConfig"; constexpr char openvpn[] = "openvpn"; constexpr char wireguard[] = "wireguard"; +constexpr char nativeConfigParametrsStorage[] = "nativeConfigParametrsStorage"; + } namespace protocols { diff --git a/client/ui/pages_logic/ShareConnectionLogic.cpp b/client/ui/pages_logic/ShareConnectionLogic.cpp index 821cc0fc..d478ecb0 100644 --- a/client/ui/pages_logic/ShareConnectionLogic.cpp +++ b/client/ui/pages_logic/ShareConnectionLogic.cpp @@ -80,12 +80,12 @@ void ShareConnectionLogic::onPushButtonShareAmneziaGenerateClicked() QJsonObject containerConfig = m_settings->containerConfig(serverIndex, container); containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); - ErrorCode e = ErrorCode::NoError; + ErrorCode errorCode = ErrorCode::NoError; for (Proto p: ContainerProps::protocolsForContainer(container)) { QJsonObject protoConfig = m_settings->protocolConfig(serverIndex, container, p); - QString cfg = m_configurator->genVpnProtocolConfig(credentials, container, containerConfig, p, &e); - if (e) { + QString cfg = m_configurator->genVpnProtocolConfig(credentials, container, containerConfig, p, errorCode); + if (errorCode) { cfg = "Error generating config"; break; } @@ -94,7 +94,7 @@ void ShareConnectionLogic::onPushButtonShareAmneziaGenerateClicked() } QByteArray ba; - if (!e) { + if (!errorCode) { serverConfig = m_settings->server(serverIndex); serverConfig.remove(config_key::userName); serverConfig.remove(config_key::password); @@ -132,8 +132,8 @@ void ShareConnectionLogic::onPushButtonShareOpenVpnGenerateClicked() const QJsonObject &containerConfig = m_settings->containerConfig(serverIndex, container); - ErrorCode e = ErrorCode::NoError; - QString cfg = m_configurator->openVpnConfigurator->genOpenVpnConfig(credentials, container, containerConfig, &e); + ErrorCode errorCode = ErrorCode::NoError; + QString cfg = m_configurator->openVpnConfigurator->genOpenVpnConfig(credentials, container, containerConfig, errorCode); cfg = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::OpenVpn, cfg); set_textEditShareOpenVpnCodeText(QJsonDocument::fromJson(cfg.toUtf8()).object()[config_key::config].toString()); @@ -151,8 +151,8 @@ void ShareConnectionLogic::onPushButtonShareShadowSocksGenerateClicked() if (cfg.isEmpty()) { const QJsonObject &containerConfig = m_settings->containerConfig(serverIndex, container); - ErrorCode e = ErrorCode::NoError; - cfg = m_configurator->shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, &e); + ErrorCode errorCode = ErrorCode::NoError; + cfg = m_configurator->shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, errorCode); } QJsonObject ssConfig = QJsonDocument::fromJson(cfg.toUtf8()).object(); @@ -195,8 +195,8 @@ void ShareConnectionLogic::onPushButtonShareCloakGenerateClicked() if (cfg.isEmpty()) { const QJsonObject &containerConfig = m_settings->containerConfig(serverIndex, container); - ErrorCode e = ErrorCode::NoError; - cfg = m_configurator->cloakConfigurator->genCloakConfig(credentials, container, containerConfig, &e); + ErrorCode errorCode = ErrorCode::NoError; + cfg = m_configurator->cloakConfigurator->genCloakConfig(credentials, container, containerConfig, errorCode); } QJsonObject cloakConfig = QJsonDocument::fromJson(cfg.toUtf8()).object(); @@ -215,7 +215,7 @@ void ShareConnectionLogic::onPushButtonShareWireGuardGenerateClicked() const QJsonObject &containerConfig = m_settings->containerConfig(serverIndex, container); ErrorCode e = ErrorCode::NoError; - QString cfg = m_configurator->wireguardConfigurator->genWireguardConfig(credentials, container, containerConfig, &e); + QString cfg = m_configurator->wireguardConfigurator->genWireguardConfig(credentials, container, containerConfig, e); if (e) { emit uiLogic()->showWarningMessage(tr("Error occurred while generating the config.") + "\n" + tr("Error message: ") + errorString(e) + "\n" + @@ -239,7 +239,8 @@ void ShareConnectionLogic::onPushButtonShareIkev2GenerateClicked() DockerContainer container = uiLogic()->m_selectedDockerContainer; ServerCredentials credentials = m_settings->serverCredentials(serverIndex); - Ikev2Configurator::ConnectionData connData = m_configurator->ikev2Configurator->prepareIkev2Config(credentials, container); + ErrorCode errorCode = ErrorCode::NoError; + Ikev2Configurator::ConnectionData connData = m_configurator->ikev2Configurator->prepareIkev2Config(credentials, container, errorCode); QString cfg = m_configurator->ikev2Configurator->genIkev2Config(connData); cfg = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::Ikev2, cfg); diff --git a/client/ui/pages_logic/StartPageLogic.cpp b/client/ui/pages_logic/StartPageLogic.cpp index 8d9c33f6..91efe9ba 100644 --- a/client/ui/pages_logic/StartPageLogic.cpp +++ b/client/ui/pages_logic/StartPageLogic.cpp @@ -153,7 +153,7 @@ void StartPageLogic::onPushButtonConnect() QString output; if (errorCode == ErrorCode::NoError) { - output = serverController.checkSshConnection(serverCredentials, &errorCode); + output = serverController.checkSshConnection(serverCredentials, errorCode); } bool ok = true; diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index c9e97e03..4f369fff 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -232,61 +232,69 @@ QMap VpnConnection::getLastVpnConfig(const QJsonObject &containe return configs; } -QString VpnConnection::createVpnConfigurationForProto(int serverIndex, - const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, Proto proto, - ErrorCode *errorCode) +QString VpnConnection::createVpnConfigurationForProto(int serverIndex, const ServerCredentials &credentials, + DockerContainer container, const QJsonObject &containerConfig, + Proto proto, ErrorCode &errorCode) { - ErrorCode e = ErrorCode::NoError; QMap lastVpnConfig = getLastVpnConfig(containerConfig); QString configData; - if (lastVpnConfig.contains(proto)) { + + if (shouldProcessLastConfigWithRemoteSettings(serverIndex, proto)) { + errorCode = m_configurator->processLastConfigWithRemoteSettings(lastVpnConfig, serverIndex, proto); + + if (errorCode) { + return ""; + } + + configData = lastVpnConfig.value(proto); + + if (serverIndex >= 0) { + QJsonObject protoObject = m_settings->protocolConfig(serverIndex, container, proto); + protoObject.insert(config_key::last_config, configData); + m_settings->setProtocolConfig(serverIndex, container, proto, protoObject); + } + configData = m_configurator->processConfigWithLocalSettings(serverIndex, container, proto, configData); + } else if (lastVpnConfig.contains(proto)) { configData = lastVpnConfig.value(proto); configData = m_configurator->processConfigWithLocalSettings(serverIndex, container, proto, configData); - } - else { - configData = m_configurator->genVpnProtocolConfig(credentials, - container, containerConfig, proto, &e); + } else if (credentials.isValid()) { + configData = m_configurator->genVpnProtocolConfig(credentials, container, containerConfig, proto, errorCode); QString configDataBeforeLocalProcessing = configData; configData = m_configurator->processConfigWithLocalSettings(serverIndex, container, proto, configData); - - if (errorCode && e) { - *errorCode = e; + if (errorCode) { return ""; } - if (serverIndex >= 0) { qDebug() << "VpnConnection::createVpnConfiguration: saving config for server #" << serverIndex << container << proto; QJsonObject protoObject = m_settings->protocolConfig(serverIndex, container, proto); protoObject.insert(config_key::last_config, configDataBeforeLocalProcessing); m_settings->setProtocolConfig(serverIndex, container, proto, protoObject); } + } else { + errorCode = ErrorCode::InternalError; + return ""; } - if (errorCode) *errorCode = e; return configData; } QJsonObject VpnConnection::createVpnConfiguration(int serverIndex, - const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode) + const ServerCredentials &credentials, DockerContainer container, + const QJsonObject &containerConfig, ErrorCode &errorCode) { - ErrorCode e = ErrorCode::NoError; QJsonObject vpnConfiguration; - for (ProtocolEnumNS::Proto proto : ContainerProps::protocolsForContainer(container)) { QJsonObject vpnConfigData = QJsonDocument::fromJson( - createVpnConfigurationForProto( - serverIndex, credentials, container, containerConfig, proto, &e).toUtf8()). - object(); - - if (e) { - if (errorCode) *errorCode = e; + createVpnConfigurationForProto(serverIndex, credentials, + container, containerConfig, + proto, errorCode).toUtf8()).object(); + if (errorCode) { return {}; } @@ -334,10 +342,10 @@ void VpnConnection::connectToVpn(int serverIndex, m_vpnProtocol.reset(); } - ErrorCode e = ErrorCode::NoError; + ErrorCode errorCode = ErrorCode::NoError; - m_vpnConfiguration = createVpnConfiguration(serverIndex, credentials, container, containerConfig); - if (e) { + m_vpnConfiguration = createVpnConfiguration(serverIndex, credentials, container, containerConfig, errorCode); + if (errorCode) { emit connectionStateChanged(VpnProtocol::Error); return; } @@ -370,8 +378,8 @@ void VpnConnection::connectToVpn(int serverIndex, createProtocolConnections(); - e = m_vpnProtocol.data()->start(); - if (e) emit VpnProtocol::Error; + errorCode = m_vpnProtocol.data()->start(); + if (errorCode) emit VpnProtocol::Error; } void VpnConnection::createProtocolConnections() { @@ -469,3 +477,14 @@ bool VpnConnection::isDisconnected() const return m_vpnProtocol.data()->isDisconnected(); } + +bool VpnConnection::shouldProcessLastConfigWithRemoteSettings(const int serverIndex, const Proto proto) +{ + const QJsonObject serverSettings = m_settings->server(serverIndex); + if (serverSettings.contains(config_key::nativeConfigParametrsStorage)) { + if (proto == Proto::WireGuard) { + return true; + } + } + return false; +} diff --git a/client/vpnconnection.h b/client/vpnconnection.h index 8dea7478..c088f882 100644 --- a/client/vpnconnection.h +++ b/client/vpnconnection.h @@ -41,15 +41,12 @@ public: ErrorCode lastError() const; static QMap getLastVpnConfig(const QJsonObject &containerConfig); - QString createVpnConfigurationForProto(int serverIndex, - const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, Proto proto, - ErrorCode *errorCode = nullptr); - - QJsonObject createVpnConfiguration(int serverIndex, - const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); - + QString createVpnConfigurationForProto(int serverIndex, const ServerCredentials &credentials, + DockerContainer container, const QJsonObject &containerConfig, + Proto proto, ErrorCode &errorCode); + QJsonObject createVpnConfiguration(int serverIndex, const ServerCredentials &credentials, DockerContainer container, + const QJsonObject &containerConfig, ErrorCode &errorCode); bool isConnected() const; bool isDisconnected() const; @@ -93,6 +90,8 @@ protected: QSharedPointer m_vpnProtocol; private: + bool shouldProcessLastConfigWithRemoteSettings(const int serverIndex, const Proto proto); + std::shared_ptr m_settings; std::shared_ptr m_configurator; diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..70328bbf --- /dev/null +++ b/docs/README.md @@ -0,0 +1,3 @@ +To convert the text description of the chart into an image, you can use: +* Any online service, just google plantuml online +* Install plugin for vscode - PlantUML \ No newline at end of file diff --git a/docs/configs/containerConfig/wireguard/wireguardContainerConfig.plantuml b/docs/configs/containerConfig/wireguard/wireguardContainerConfig.plantuml new file mode 100644 index 00000000..b28f9675 --- /dev/null +++ b/docs/configs/containerConfig/wireguard/wireguardContainerConfig.plantuml @@ -0,0 +1,11 @@ +@startjson wireguardContainerConfig +{ + "container : string": "amnezia-wireguard", + "wireguard : array": + { + "last_config : string": "native wireguard config", + "port : string": "port number", + "transport_proto : string": "udp" + } +} +@endjson diff --git a/docs/configs/containerConfig/wireguard/wireguardContainerConfig.png b/docs/configs/containerConfig/wireguard/wireguardContainerConfig.png new file mode 100644 index 00000000..4c32bca5 Binary files /dev/null and b/docs/configs/containerConfig/wireguard/wireguardContainerConfig.png differ diff --git a/docs/configs/serverConfigImportProcess.plantuml b/docs/configs/serverConfigImportProcess.plantuml new file mode 100644 index 00000000..06450cb7 --- /dev/null +++ b/docs/configs/serverConfigImportProcess.plantuml @@ -0,0 +1,23 @@ +@startuml serverConfigImportProcess +start + +:import server config in any format; +:decode server config into json; + +if (server config contains valid server credentials || containers) then (yes) + :show json server config to user; + if (user clicked continue import) then (yes) + :append server config to app internal settings; + else (no) + :remove imported config; + endif +else (no) + :show error; + note right + now only output to the log + end note + stop +endif + +stop +@enduml diff --git a/docs/configs/serverConfigImportProcess.png b/docs/configs/serverConfigImportProcess.png new file mode 100644 index 00000000..0cad0b8b Binary files /dev/null and b/docs/configs/serverConfigImportProcess.png differ diff --git a/docs/configs/serverConfigProcessingOnConnection.plantuml b/docs/configs/serverConfigProcessingOnConnection.plantuml new file mode 100644 index 00000000..1634ba3d --- /dev/null +++ b/docs/configs/serverConfigProcessingOnConnection.plantuml @@ -0,0 +1,21 @@ +@startuml serverConfigProcessingOnConnection +start + +:connect button clicked; +:createVpnConfiguration(); +:createVpnConfigurationForProto(); + +if (serverConfig.contains(nativeConfigParametrsStorage)) then (yes) + :update last_config with data from nativeConfigParametrsStorage; +else if (serverConfig.contains(last_config)) then (yes) + :do nothing special; +else if (serverConfig.contains(admin credentials)) then (yes) + :generate new native config; + :save config in last_config; +else + :return empty config and error; + stop +endif +:continue connect process; +stop +@enduml diff --git a/docs/configs/serverConfigProcessingOnConnection.png b/docs/configs/serverConfigProcessingOnConnection.png new file mode 100644 index 00000000..e855b798 Binary files /dev/null and b/docs/configs/serverConfigProcessingOnConnection.png differ diff --git a/docs/configs/serverConfigWithWriteAccess.plantuml b/docs/configs/serverConfigWithWriteAccess.plantuml new file mode 100644 index 00000000..af62bc1c --- /dev/null +++ b/docs/configs/serverConfigWithWriteAccess.plantuml @@ -0,0 +1,31 @@ +@startjson serverConfigWithWriteAccess +{ + "containers : array": + [ + { + "container : string": "amnezia-openvpn", + "openvpn : array": "openvpn container config" + }, + { + "container : string": "amnezia-openvpn-cloak", + "openvpn : array": "openvpn container config", + "cloak : array": "cloak container config" + }, + { + "container : string": "amnezia-shadowsocks", + "openvpn : array": "openvpn container config", + "shadowsocks : array": "shadowsocks container config" + }, + { + "container : string": "amnezia-wireguard", + "wireguard : array": "wireguard container config" + } + ], + "defaultContainer : string": "container name", + "description : string": "server name alias", + "hostName : string": "server address", + "password : string": "password for user", + "port : string": "port number", + "userName : string": "user for ssh connection" +} +@endjson diff --git a/docs/configs/serverConfigWithWriteAccess.png b/docs/configs/serverConfigWithWriteAccess.png new file mode 100644 index 00000000..ad934a8d Binary files /dev/null and b/docs/configs/serverConfigWithWriteAccess.png differ diff --git a/docs/configs/serverConfigWithoutWriteAccessV1.plantuml b/docs/configs/serverConfigWithoutWriteAccessV1.plantuml new file mode 100644 index 00000000..079bfc50 --- /dev/null +++ b/docs/configs/serverConfigWithoutWriteAccessV1.plantuml @@ -0,0 +1,30 @@ +@startjson serverConfigWithoutWriteAccessV1 +{ + "containers : array": + [ + { + "container : string": "amnezia-openvpn", + "openvpn : array": "openvpn container config" + }, + { + "container : string": "amnezia-openvpn-cloak", + "openvpn : array": "openvpn container config", + "cloak : array": "cloak container config" + }, + { + "container : string": "amnezia-shadowsocks", + "openvpn : array": "openvpn container config", + "shadowsocks : array": "shadowsocks container config" + }, + { + "container : string": "amnezia-wireguard", + "wireguard : array": "wireguard container config" + } + ], + "defaultContainer : string": "container name", + "description : string": "server name alias", + "dns1 : string": "dns address", + "dns2 : string": "dns address", + "hostName : string": "server address" +} +@endjson diff --git a/docs/configs/serverConfigWithoutWriteAccessV1.png b/docs/configs/serverConfigWithoutWriteAccessV1.png new file mode 100644 index 00000000..15cd408c Binary files /dev/null and b/docs/configs/serverConfigWithoutWriteAccessV1.png differ diff --git a/docs/configs/serverConfigWithoutWriteAccessV2.plantuml b/docs/configs/serverConfigWithoutWriteAccessV2.plantuml new file mode 100644 index 00000000..916ac648 --- /dev/null +++ b/docs/configs/serverConfigWithoutWriteAccessV2.plantuml @@ -0,0 +1,32 @@ +@startjson serverConfigWithoutWriteAccessV2 +{ + "containers : array": + [ + { + "container : string": "amnezia-openvpn", + "openvpn : array": "openvpn container config" + }, + { + "container : string": "amnezia-openvpn-cloak", + "openvpn : array": "openvpn container config", + "cloak : array": "cloak container config" + }, + { + "container : string": "amnezia-shadowsocks", + "openvpn : array": "openvpn container config", + "shadowsocks : array": "shadowsocks container config" + }, + { + "container : string": "amnezia-wireguard", + "wireguard : array": "wireguard container config" + } + ], + "defaultContainer : string": "container name", + "description : string": "server name alias", + "dns1 : string": "dns address", + "dns2 : string": "dns address", + "hostName : string": "server address", + "version : number": "2", + "nativeConfigParametrsStorage : string": "storage address" +} +@endjson diff --git a/docs/configs/serverConfigWithoutWriteAccessV2.png b/docs/configs/serverConfigWithoutWriteAccessV2.png new file mode 100644 index 00000000..adbbc54b Binary files /dev/null and b/docs/configs/serverConfigWithoutWriteAccessV2.png differ diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt index 567e9d49..cfb3beb2 100644 --- a/service/CMakeLists.txt +++ b/service/CMakeLists.txt @@ -7,10 +7,6 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(NOT IOS AND NOT ANDROID) - #include(common.cmake) -#if (qtservice-uselib) -# add_subdirectory(buildlib) -#endif() add_subdirectory(server) endif() diff --git a/service/common.cmake b/service/common.cmake deleted file mode 100644 index 2d497e05..00000000 --- a/service/common.cmake +++ /dev/null @@ -1,18 +0,0 @@ -set(QTSERVICE_LIBNAME QtSolutions_Service-head) -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - if(APPLE) - set(QTSERVICE_LIBNAME ${QTSERVICE_LIBNAME}_debug) - elseif(WIN32) - set(QTSERVICE_LIBNAME ${QTSERVICE_LIBNAME}_d) - endif() -endif() - -set(QTSERVICE_LIBDIR ${CMAKE_CURRENT_LIST_DIR}/lib) - -if(UNIX) - if(qtservice-uselib) - if(NOT qtservice-buildlib) - set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH} ${QTSERVICE_LIBDIR}) - endif() - endif() -endif() diff --git a/service/server/CMakeLists.txt b/service/server/CMakeLists.txt index 687b382a..bee2f5dc 100644 --- a/service/server/CMakeLists.txt +++ b/service/server/CMakeLists.txt @@ -6,10 +6,20 @@ project(${PROJECT}) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) -find_package(Qt6 REQUIRED COMPONENTS Core Network RemoteObjects Core5Compat) qt_standard_project_setup() -set(HEADERS +add_executable(${PROJECT}) + +find_package(Qt6 REQUIRED COMPONENTS Core + Network RemoteObjects Core5Compat +) + +target_link_libraries(${PROJECT} PRIVATE + Qt6::Core Qt6::Network + Qt6::RemoteObjects Qt6::Core5Compat +) + +target_sources(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../../client/utilities.h ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipc.h ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipcserver.h @@ -18,9 +28,7 @@ set(HEADERS ${CMAKE_CURRENT_LIST_DIR}/logger.h ${CMAKE_CURRENT_LIST_DIR}/router.h ${CMAKE_CURRENT_LIST_DIR}/systemservice.h -) -set(SOURCES ${CMAKE_CURRENT_LIST_DIR}/../../client/utilities.cpp ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipcserver.cpp ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipcserverprocess.cpp @@ -32,17 +40,15 @@ set(SOURCES ) if(WIN32) - set(HEADERS ${HEADERS} + target_sources(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/tapcontroller_win.h ${CMAKE_CURRENT_LIST_DIR}/router_win.h - ) - set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/tapcontroller_win.cpp ${CMAKE_CURRENT_LIST_DIR}/router_win.cpp ) - set(LIBS + target_link_libraries(${PROJECT} PRIVATE user32 rasapi32 shlwapi @@ -54,43 +60,36 @@ if(WIN32) Kernel32 ) - add_compile_definitions(_WINSOCKAPI_) + target_compile_definitions(${PROJECT} PRIVATE _WINSOCKAPI_) endif() if(APPLE) - set(HEADERS ${HEADERS} + target_sources(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/helper_route_mac.h ${CMAKE_CURRENT_LIST_DIR}/router_mac.h - ) - set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/helper_route_mac.c ${CMAKE_CURRENT_LIST_DIR}/router_mac.cpp ) endif() if(LINUX) - set(HEADERS ${HEADERS} + target_sources(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/router_linux.h - ) - set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/router_linux.cpp ) endif() include(${CMAKE_CURRENT_LIST_DIR}/../src/qtservice.cmake) -include_directories( - ${CMAKE_CURRENT_LIST_DIR} +target_include_directories(${PROJECT} PRIVATE + ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/../../client ${CMAKE_CURRENT_LIST_DIR}/../../ipc ${CMAKE_CURRENT_BINARY_DIR} ) -add_executable(${PROJECT} ${SOURCES} ${HEADERS}) -target_link_libraries(${PROJECT} PRIVATE Qt6::Core Qt6::Network Qt6::RemoteObjects Qt6::Core5Compat ${LIBS}) - qt_add_repc_sources(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipc_interface.rep) if(NOT IOS) qt_add_repc_sources(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipc_process_interface.rep) diff --git a/service/src/qtservice.cmake b/service/src/qtservice.cmake index 4a429fab..5b8ce8af 100644 --- a/service/src/qtservice.cmake +++ b/service/src/qtservice.cmake @@ -1,29 +1,27 @@ -include_directories(${CMAKE_CURRENT_LIST_DIR}) - -#include(${CMAKE_CURRENT_LIST_DIR}/../common.cmake) - -if(NOT WIN32) - set(LIBS ${LIBS} Qt6::Network) -elseif(WIN32) - set(LIBS ${LIBS} user32) +if(${PROJECT} STREQUAL "") + message(FATAL_ERROR "You must set PROJECT variable") endif() -set(HEADERS ${HEADERS} +target_include_directories(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) + +if(NOT WIN32) + target_include_directories(${PROJECT} PRIVATE Qt6::Network) +elseif(WIN32) + target_include_directories(${PROJECT} PRIVATE user32) +endif() + +target_sources(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/qtservice.h ${CMAKE_CURRENT_LIST_DIR}/qtservice_p.h -) -set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/qtservice.cpp ) if(UNIX) - set(HEADERS ${HEADERS} + target_sources(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/qtunixsocket.h ${CMAKE_CURRENT_LIST_DIR}/qtunixserversocket.h - ) - set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/qtservice_unix.cpp ${CMAKE_CURRENT_LIST_DIR}/qtunixsocket.cpp ${CMAKE_CURRENT_LIST_DIR}/qtunixserversocket.cpp @@ -31,7 +29,7 @@ if(UNIX) endif() if(WIN32) - set(SOURCES ${SOURCES} + target_sources(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/qtservice_win.cpp ) endif()