Compare commits

...
Sign in to create a new pull request.

14 commits

Author SHA1 Message Date
vladimir.kuznetsov
e47997875f Merge branch 'dev' of github.com:amnezia-vpn/amnezia-client into feature/download-native-wireguard-config-on-connect 2023-04-08 19:45:46 +03:00
vladimir.kuznetsov
b154a2204c Merge branch 'dev' of github.com:amnezia-vpn/desktop-client into feature/download-native-wireguard-config-on-connect 2023-03-19 14:42:59 +03:00
pokamest
f97e270c3a Merge branch 'dev' into feature/download-native-wireguard-config-on-
connect
2023-03-05 11:43:26 +00:00
vladimir.kuznetsov
7665bb863a Merge branch 'dev' of github.com:amnezia-vpn/desktop-client into feature/download-native-wireguard-config-on-connect 2023-02-27 19:56:29 +03:00
vladimir.kuznetsov
3340bc9ecc fixed 'Setup ccache' step 2023-01-26 20:26:39 +03:00
vladimir.kuznetsov
1b7bb014af added pictures for diagrams 2023-01-26 20:08:54 +03:00
vladimir.kuznetsov
3e650cf731 enabled ccache in CMakeLists.txt for client project 2023-01-26 19:57:56 +03:00
vladimir.kuznetsov
788539973f slightly reworked CMakeLists for the service project 2023-01-26 19:47:58 +03:00
vladimir.kuznetsov
36b25915a6 removed generation of translations for qtkeychain 2023-01-26 19:45:28 +03:00
vladimir.kuznetsov
ecc59526d1 removed unused common.cmake file 2023-01-26 19:44:24 +03:00
vladimir.kuznetsov
5a2a96982a added parameter nativeConfigParametersStorage to .vpn format config.
- if the parameter is found, parts of the native config for protocols will be downloaded (so far only wireguard) and updated
- minor refactoring of error handling, now reference are used instead of pointers
- removed temp config with allowedIps
2023-01-26 19:44:08 +03:00
vladimir.kuznetsov
a382ec0909 added config with allowedIps for testing 2023-01-26 09:13:43 +03:00
vladimir.kuznetsov
cc0b3a18d9 moved the container config to a separate diagram 2023-01-24 10:38:29 +03:00
vladimir.kuznetsov
ebd287d4b8 added documentation describing the process of importing a server config
- added documentation describing the processing of the server config when trying to open a VPN connection
- added documentation describing config for wireguard
2023-01-24 09:48:03 +03:00
40 changed files with 412 additions and 209 deletions

View file

@ -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

2
.gitignore vendored
View file

@ -129,4 +129,4 @@ captures/
client/3rd/ShadowSocks/ss_ios.xcconfig
# UML generated pics
out/
out/

View file

@ -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)

View file

@ -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)

View file

@ -13,22 +13,20 @@ CloakConfigurator::CloakConfigurator(std::shared_ptr<Settings> 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 "";
}

View file

@ -14,7 +14,7 @@ public:
CloakConfigurator(std::shared_ptr<Settings> 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

View file

@ -22,7 +22,7 @@ Ikev2Configurator::Ikev2Configurator(std::shared_ptr<Settings> 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 "";
}

View file

@ -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

View file

@ -26,13 +26,13 @@ OpenVpnConfigurator::OpenVpnConfigurator(std::shared_ptr<Settings> 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 "";
}

View file

@ -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);
};

View file

@ -13,18 +13,16 @@ ShadowSocksConfigurator::ShadowSocksConfigurator(std::shared_ptr<Settings> 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 "";
}

View file

@ -13,7 +13,7 @@ public:
ShadowSocksConfigurator(std::shared_ptr<Settings> 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

View file

@ -25,8 +25,8 @@ VpnConfigurator::VpnConfigurator(std::shared_ptr<Settings> settings, QObject *pa
sshConfigurator = std::shared_ptr<SshConfigurator>(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<Proto, QString> &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<QString, QString> VpnConfigurator::getDnsForConfig(int serverIndex)
{
QPair<QString, QString> dns;

View file

@ -22,17 +22,17 @@ public:
VpnConfigurator(std::shared_ptr<Settings> 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<QString, QString> 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<Proto, QString> &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> openVpnConfigurator;
std::shared_ptr<ShadowSocksConfigurator> shadowSocksConfigurator;

View file

@ -6,7 +6,8 @@
#include <QDebug>
#include <QTemporaryFile>
#include <QJsonDocument>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <openssl/rand.h>
#include <openssl/rsa.h>
@ -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<Proto, QString> &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;
}

View file

@ -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<Proto, QString> &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

View file

@ -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;
}

View file

@ -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<ErrorCode (const QString &, libssh::Client &)> &cbReadStdOut = nullptr,
const std::function<ErrorCode (const QString &, libssh::Client &)> &cbReadStdErr = nullptr);
QString checkSshConnection(const ServerCredentials &credentials, ErrorCode *errorCode = nullptr);
QString checkSshConnection(const ServerCredentials &credentials, ErrorCode &errorCode);
void setCancelInstallation(const bool cancel);

View file

@ -64,6 +64,8 @@ constexpr char isThirdPartyConfig[] = "isThirdPartyConfig";
constexpr char openvpn[] = "openvpn";
constexpr char wireguard[] = "wireguard";
constexpr char nativeConfigParametrsStorage[] = "nativeConfigParametrsStorage";
}
namespace protocols {

View file

@ -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);

View file

@ -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;

View file

@ -232,61 +232,69 @@ QMap<Proto, QString> 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<Proto, QString> 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;
}

View file

@ -41,15 +41,12 @@ public:
ErrorCode lastError() const;
static QMap<Proto, QString> 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<VpnProtocol> m_vpnProtocol;
private:
bool shouldProcessLastConfigWithRemoteSettings(const int serverIndex, const Proto proto);
std::shared_ptr<Settings> m_settings;
std::shared_ptr<VpnConfigurator> m_configurator;

3
docs/README.md Normal file
View file

@ -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

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -0,0 +1,31 @@
@startjson serverConfigWithWriteAccess
{
"containers : array":
[
{
"container : string": "amnezia-openvpn",
"openvpn : array": "<color:blue>openvpn container config"
},
{
"container : string": "amnezia-openvpn-cloak",
"openvpn : array": "<color:blue>openvpn container config",
"cloak : array": "<color:blue>cloak container config"
},
{
"container : string": "amnezia-shadowsocks",
"openvpn : array": "<color:blue>openvpn container config",
"shadowsocks : array": "<color:blue>shadowsocks container config"
},
{
"container : string": "amnezia-wireguard",
"wireguard : array": "<color:blue>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

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View file

@ -0,0 +1,30 @@
@startjson serverConfigWithoutWriteAccessV1
{
"containers : array":
[
{
"container : string": "amnezia-openvpn",
"openvpn : array": "<color:blue>openvpn container config"
},
{
"container : string": "amnezia-openvpn-cloak",
"openvpn : array": "<color:blue>openvpn container config",
"cloak : array": "<color:blue>cloak container config"
},
{
"container : string": "amnezia-shadowsocks",
"openvpn : array": "<color:blue>openvpn container config",
"shadowsocks : array": "<color:blue>shadowsocks container config"
},
{
"container : string": "amnezia-wireguard",
"wireguard : array": "<color:blue>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

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -0,0 +1,32 @@
@startjson serverConfigWithoutWriteAccessV2
{
"containers : array":
[
{
"container : string": "amnezia-openvpn",
"openvpn : array": "<color:blue>openvpn container config"
},
{
"container : string": "amnezia-openvpn-cloak",
"openvpn : array": "<color:blue>openvpn container config",
"cloak : array": "<color:blue>cloak container config"
},
{
"container : string": "amnezia-shadowsocks",
"openvpn : array": "<color:blue>openvpn container config",
"shadowsocks : array": "<color:blue>shadowsocks container config"
},
{
"container : string": "amnezia-wireguard",
"wireguard : array": "<color:blue>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

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View file

@ -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()

View file

@ -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()

View file

@ -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)

View file

@ -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()