diff --git a/client/client.pro b/client/client.pro index 9f2ac434..c63c2c55 100644 --- a/client/client.pro +++ b/client/client.pro @@ -2,7 +2,7 @@ QT += widgets core gui network xml TARGET = AmneziaVPN TEMPLATE = app -CONFIG += console +#CONFIG += console DEFINES += QT_DEPRECATED_WARNINGS @@ -10,52 +10,52 @@ include("3rd/QtSsh/src/ssh/ssh.pri") include("3rd/QtSsh/src/botan/botan.pri") HEADERS += \ - communicator.h \ - core/defs.h \ - core/errorstrings.h \ - core/openvpnconfigurator.h \ - core/router.h \ - core/servercontroller.h \ - debug.h \ - defines.h \ - localclient.h \ - managementserver.h \ - message.h \ - runguard.h \ - settings.h \ - ui/Controls/SlidingStackedWidget.h \ - ui/mainwindow.h \ - utils.h \ - vpnconnection.h \ - protocols/vpnprotocol.h \ - protocols/openvpnprotocol.h \ + communicator.h \ + core/defs.h \ + core/errorstrings.h \ + core/openvpnconfigurator.h \ + core/router.h \ + core/servercontroller.h \ + debug.h \ + defines.h \ + localclient.h \ + managementserver.h \ + message.h \ + runguard.h \ + settings.h \ + ui/Controls/SlidingStackedWidget.h \ + ui/mainwindow.h \ + utils.h \ + vpnconnection.h \ + protocols/vpnprotocol.h \ + protocols/openvpnprotocol.h \ SOURCES += \ - communicator.cpp \ - core/openvpnconfigurator.cpp \ - core/router.cpp \ - core/servercontroller.cpp \ - debug.cpp \ - localclient.cpp \ - main.cpp \ - managementserver.cpp \ - message.cpp \ - runguard.cpp \ - settings.cpp \ - ui/Controls/SlidingStackedWidget.cpp \ - ui/mainwindow.cpp \ - utils.cpp \ - vpnconnection.cpp \ - protocols/vpnprotocol.cpp \ - protocols/openvpnprotocol.cpp \ + communicator.cpp \ + core/openvpnconfigurator.cpp \ + core/router.cpp \ + core/servercontroller.cpp \ + debug.cpp \ + localclient.cpp \ + main.cpp \ + managementserver.cpp \ + message.cpp \ + runguard.cpp \ + settings.cpp \ + ui/Controls/SlidingStackedWidget.cpp \ + ui/mainwindow.cpp \ + utils.cpp \ + vpnconnection.cpp \ + protocols/vpnprotocol.cpp \ + protocols/openvpnprotocol.cpp \ FORMS += ui/mainwindow.ui RESOURCES += \ - resources.qrc + resources.qrc TRANSLATIONS = \ - translations/amneziavpn_ru.ts + translations/amneziavpn_ru.ts CONFIG(release, debug|release) { DESTDIR = $$PWD/../../AmneziaVPN-build/client/release diff --git a/client/core/defs.h b/client/core/defs.h index 230a4457..83c75ff0 100644 --- a/client/core/defs.h +++ b/client/core/defs.h @@ -44,6 +44,7 @@ enum ErrorCode FailedToSaveConfigData, OpenVpnConfigMissing, OpenVpnManagementServerError, + EasyRsaError, // Distro errors AmneziaServiceConnectionFailed, diff --git a/client/core/openvpnconfigurator.cpp b/client/core/openvpnconfigurator.cpp index 72389761..3d641261 100644 --- a/client/core/openvpnconfigurator.cpp +++ b/client/core/openvpnconfigurator.cpp @@ -21,12 +21,19 @@ QString OpenVpnConfigurator::getRandomString(int len) QString OpenVpnConfigurator::getEasyRsaShPath() { +#ifdef Q_OS_WIN + // easyrsa sh path should looks like + // "/Program Files (x86)/AmneziaVPN/easyrsa/easyrsa" QString easyRsaShPath = QDir::toNativeSeparators(QApplication::applicationDirPath()) + "\\easyrsa\\easyrsa"; - easyRsaShPath.replace(":", ""); + easyRsaShPath.replace("C:\\", ""); easyRsaShPath.replace("\\", "/"); easyRsaShPath.prepend("/"); - return easyRsaShPath; + //return "\"" + easyRsaShPath + "\""; + return "\"/Program Files (x86)/AmneziaVPN/easyrsa/easyrsa\""; +#else + return QDir::toNativeSeparators(QApplication::applicationDirPath()) + "/easyrsa/easyrsa"; +#endif } QProcessEnvironment OpenVpnConfigurator::prepareEnv() @@ -46,9 +53,12 @@ void OpenVpnConfigurator::initPKI(const QString &path) p.setProcessChannelMode(QProcess::MergedChannels); p.setProcessEnvironment(prepareEnv()); - QString command = QString("sh.exe"); + //QString command = QString("sh.exe"); + QString command = QString("cmd.exe"); - p.setNativeArguments(getEasyRsaShPath() + " init-pki"); + //p.setNativeArguments(getEasyRsaShPath() + " init-pki"); + p.setNativeArguments(QString("/C \"sh.exe %1\"").arg(getEasyRsaShPath() + " init-pki")); + //qDebug().noquote() << p.nativeArguments(); p.setWorkingDirectory(path); @@ -66,9 +76,13 @@ QString OpenVpnConfigurator::genReq(const QString &path, const QString &clientId p.setProcessChannelMode(QProcess::MergedChannels); p.setProcessEnvironment(prepareEnv()); - QString command = QString("sh.exe"); + //QString command = QString("sh.exe"); + QString command = QString("cmd.exe"); + + //p.setNativeArguments(getEasyRsaShPath() + " gen-req " + clientId + " nopass"); + p.setNativeArguments(QString("/C \"sh.exe %1\"").arg(getEasyRsaShPath() + " gen-req " + clientId + " nopass")); + //qDebug().noquote() << p.nativeArguments(); - p.setNativeArguments(getEasyRsaShPath() + " gen-req " + clientId + " nopass"); p.setWorkingDirectory(path); @@ -114,9 +128,8 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::createCertRequest() key.open(QIODevice::ReadOnly); connData.privKey = key.readAll(); - qDebug().noquote() << connData.request; - qDebug().noquote() << connData.privKey; - +// qDebug().noquote() << connData.request; +// qDebug().noquote() << connData.privKey; return connData; } @@ -126,6 +139,11 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(co OpenVpnConfigurator::ConnectionData connData = OpenVpnConfigurator::createCertRequest(); connData.host = credentials.hostName; + if (connData.privKey.isEmpty() || connData.request.isEmpty()) { + *errorCode = ErrorCode::EasyRsaExecutableMissing; + return connData; + } + QString reqFileName = QString("/opt/amneziavpn_data/clients/%1.req").arg(connData.clientId); ErrorCode e = ServerController::uploadTextFileToContainer(credentials, connData.request, reqFileName); if (e) { diff --git a/client/protocols/openvpnprotocol.cpp b/client/protocols/openvpnprotocol.cpp index 41f4d65d..d4e92a04 100644 --- a/client/protocols/openvpnprotocol.cpp +++ b/client/protocols/openvpnprotocol.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "communicator.h" #include "debug.h" @@ -94,8 +95,11 @@ QString OpenVpnProtocol::configPath() const void OpenVpnProtocol::writeCommand(const QString& command) { - QTextStream stream(reinterpret_cast(m_managementServer.socket())); - stream << command << endl; + QIODevice *device = dynamic_cast(m_managementServer.socket().data()); + if (device) { + QTextStream stream(device); + stream << command << endl; + } } QString OpenVpnProtocol::openVpnExecPath() const diff --git a/client/protocols/openvpnprotocol.h b/client/protocols/openvpnprotocol.h index 9bf1fbbf..16fe8bdc 100644 --- a/client/protocols/openvpnprotocol.h +++ b/client/protocols/openvpnprotocol.h @@ -15,7 +15,7 @@ class OpenVpnProtocol : public VpnProtocol public: explicit OpenVpnProtocol(const QString& args = QString(), QObject* parent = nullptr); - ~OpenVpnProtocol(); + ~OpenVpnProtocol() override; ErrorCode start() override; void stop() override;