diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 5087e92a..03ecf86d 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -92,7 +92,6 @@ ErrorCode ServerController::runScript(const ServerCredentials &credentials, QStr return ErrorCode::NoError; } - ErrorCode ServerController::runContainerScript(const ServerCredentials &credentials, DockerContainer container, QString script, const std::function &cbReadStdOut, @@ -203,21 +202,6 @@ QByteArray ServerController::getTextFileFromContainer(DockerContainer container, return QByteArray::fromHex(stdOut.toUtf8()); } -ErrorCode ServerController::checkOpenVpnServer(DockerContainer container, const ServerCredentials &credentials) -{ - QString caCert = ServerController::getTextFileFromContainer(container, - credentials, protocols::openvpn::caCertPath); - QString taKey = ServerController::getTextFileFromContainer(container, - credentials, protocols::openvpn::taKeyPath); - - if (!caCert.isEmpty() && !taKey.isEmpty()) { - return ErrorCode::NoError; - } - else { - return ErrorCode::ServerCheckFailed; - } -} - ErrorCode ServerController::uploadFileToHost(const ServerCredentials &credentials, const QByteArray &data, const QString &remotePath, libssh::SftpOverwriteMode overwriteMode) { diff --git a/client/core/servercontroller.h b/client/core/servercontroller.h index 0547cbf0..99ae3cd6 100644 --- a/client/core/servercontroller.h +++ b/client/core/servercontroller.h @@ -22,12 +22,6 @@ public: typedef QList> Vars; -// ErrorCode fromSshConnectionErrorCode(QSsh::SshError error); - - // QSsh exitCode and exitStatus are different things -// ErrorCode fromSshProcessExitStatus(int exitStatus); - -// QSsh::SshConnectionParameters sshParams(const ServerCredentials &credentials); void disconnectFromHost(const ServerCredentials &credentials); ErrorCode removeAllContainers(const ServerCredentials &credentials); @@ -36,27 +30,20 @@ public: QJsonObject &config, bool isUpdate = false); ErrorCode updateContainer(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &oldConfig, QJsonObject &newConfig); + ErrorCode getAlreadyInstalledContainers(const ServerCredentials &credentials, QMap &installedContainers); // create initial config - generate passwords, etc QJsonObject createContainerInitialConfig(DockerContainer container, int port, TransportProto tp); - bool isReinstallContainerRequred(DockerContainer container, const QJsonObject &oldConfig, const QJsonObject &newConfig); + ErrorCode uploadTextFileToContainer(DockerContainer container, const ServerCredentials &credentials, + const QString &file, const QString &path, + libssh::SftpOverwriteMode overwriteMode = libssh::SftpOverwriteMode::SftpOverwriteExisting); - ErrorCode checkOpenVpnServer(DockerContainer container, const ServerCredentials &credentials); - - ErrorCode uploadFileToHost(const ServerCredentials &credentials, const QByteArray &data, - const QString &remotePath, libssh::SftpOverwriteMode overwriteMode = libssh::SftpOverwriteMode::SftpOverwriteExisting); - - ErrorCode uploadTextFileToContainer(DockerContainer container, - const ServerCredentials &credentials, const QString &file, const QString &path, - libssh::SftpOverwriteMode overwriteMode = libssh::SftpOverwriteMode::SftpOverwriteExisting); - - QByteArray getTextFileFromContainer(DockerContainer container, - const ServerCredentials &credentials, const QString &path, ErrorCode *errorCode = nullptr); - - ErrorCode setupServerFirewall(const ServerCredentials &credentials); + QByteArray getTextFileFromContainer(DockerContainer container, const ServerCredentials &credentials, + const QString &path, ErrorCode *errorCode = nullptr); QString replaceVars(const QString &script, const Vars &vars); + Vars genVarsForScript(const ServerCredentials &credentials, DockerContainer container = DockerContainer::None, const QJsonObject &config = QJsonObject()); ErrorCode runScript(const ServerCredentials &credentials, QString script, const std::function &cbReadStdOut = nullptr, @@ -66,12 +53,9 @@ public: const std::function &cbReadStdOut = nullptr, const std::function &cbReadStdErr = nullptr); - Vars genVarsForScript(const ServerCredentials &credentials, DockerContainer container = DockerContainer::None, const QJsonObject &config = QJsonObject()); - QString checkSshConnection(const ServerCredentials &credentials, ErrorCode *errorCode = nullptr); void setCancelInstallation(const bool cancel); - ErrorCode getAlreadyInstalledContainers(const ServerCredentials &credentials, QMap &installedContainers); void setPassphraseCallback(const std::function &callback); ErrorCode getDecryptedPrivateKey(const ServerCredentials &credentials, QString &decryptedPrivateKey); @@ -82,7 +66,14 @@ private: ErrorCode runContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config); ErrorCode configureContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config); ErrorCode startupContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject()); + ErrorCode isServerPortBusy(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config); + bool isReinstallContainerRequred(DockerContainer container, const QJsonObject &oldConfig, const QJsonObject &newConfig); + + ErrorCode uploadFileToHost(const ServerCredentials &credentials, const QByteArray &data, + const QString &remotePath, libssh::SftpOverwriteMode overwriteMode = libssh::SftpOverwriteMode::SftpOverwriteExisting); + + ErrorCode setupServerFirewall(const ServerCredentials &credentials); std::shared_ptr m_settings; std::shared_ptr m_configurator; diff --git a/client/ui/pages_logic/StartPageLogic.cpp b/client/ui/pages_logic/StartPageLogic.cpp index 8873f11d..cddd6d40 100644 --- a/client/ui/pages_logic/StartPageLogic.cpp +++ b/client/ui/pages_logic/StartPageLogic.cpp @@ -10,6 +10,7 @@ #include #include +#include #ifdef Q_OS_ANDROID #include @@ -131,11 +132,20 @@ void StartPageLogic::onPushButtonConnect() set_pushButtonConnectText(tr("Connecting...")); ErrorCode errorCode = ErrorCode::NoError; -#ifdef Q_DEBUG - //QString output = m_serverController->checkSshConnection(serverCredentials, &e); -#else - QString output; -#endif + + if (pushButtonConnectKeyChecked()) { + auto passphraseCallback = [this]() { + emit showPassphraseRequestMessage(); + QEventLoop loop; + QObject::connect(this, &StartPageLogic::passphraseDialogClosed, &loop, &QEventLoop::quit); + loop.exec(); + + return m_privateKeyPassphrase; + }; + m_serverController->setPassphraseCallback(passphraseCallback); + } + + QString output = m_serverController->checkSshConnection(serverCredentials, &errorCode); if (pushButtonConnectKeyChecked()) { QString decryptedPrivateKey; diff --git a/client/ui/pages_logic/StartPageLogic.h b/client/ui/pages_logic/StartPageLogic.h index 6f21c105..a20fd6c7 100644 --- a/client/ui/pages_logic/StartPageLogic.h +++ b/client/ui/pages_logic/StartPageLogic.h @@ -23,6 +23,8 @@ class StartPageLogic : public PageLogicBase AUTO_PROPERTY(QString, labelWaitInfoText) AUTO_PROPERTY(bool, pushButtonBackFromStartVisible) + AUTO_PROPERTY(QString, privateKeyPassphrase); + READONLY_PROPERTY(QRegularExpression, ipAddressPortRegex) public: Q_INVOKABLE void onUpdatePage() override; @@ -47,5 +49,8 @@ public: explicit StartPageLogic(UiLogic *uiLogic, QObject *parent = nullptr); ~StartPageLogic() = default; +signals: + void showPassphraseRequestMessage(); + void passphraseDialogClosed(); }; #endif // START_PAGE_LOGIC_H diff --git a/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp b/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp index 5259a6e0..708073a6 100644 --- a/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp +++ b/client/ui/pages_logic/protocols/ShadowSocksLogic.cpp @@ -104,15 +104,13 @@ void ShadowSocksLogic::onPushButtonSaveClicked() progressBarFunc.setTextVisibleFunc(true); progressBarFunc.setTextFunc(QString("Configuring...")); - ErrorCode e = uiLogic()->pageLogic()->doInstallAction([this, containerConfig, &newContainerConfig](){ + auto installAction = [this, containerConfig, &newContainerConfig]() { return m_serverController->updateContainer(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex), - uiLogic()->m_selectedDockerContainer, - containerConfig, - newContainerConfig); - }, - pageFunc, progressBarFunc, - saveButtonFunc, waitInfoFunc, - busyInfoFuncy, cancelButtonFunc); + uiLogic()->m_selectedDockerContainer, containerConfig, newContainerConfig); + }; + ErrorCode e = uiLogic()->pageLogic()->doInstallAction(installAction, pageFunc, progressBarFunc, + saveButtonFunc, waitInfoFunc, + busyInfoFuncy, cancelButtonFunc); if (!e) { m_settings->setContainerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, newContainerConfig); diff --git a/client/ui/qml/Pages/PageStart.qml b/client/ui/qml/Pages/PageStart.qml index eacb607d..85c63b4d 100644 --- a/client/ui/qml/Pages/PageStart.qml +++ b/client/ui/qml/Pages/PageStart.qml @@ -10,6 +10,14 @@ PageBase { page: PageEnum.Start logic: StartPageLogic + Connections { + target: StartPageLogic + + function onShowPassphraseRequestMessage() { + popupWithTextField.open() + } + } + BackButton { id: back_from_start visible: pageLoader.depth > 1 @@ -325,4 +333,22 @@ PageBase { } } } + + PopupWithTextField { + id: popupWithTextField + placeholderText: "Enter private key passphrase" + yesFunc: function() { + editingFinished() + close() + StartPageLogic.passphraseDialogClosed() + text = "" + } + noFunc: function() { + close() + StartPageLogic.passphraseDialogClosed() + } + onEditingFinished: { + StartPageLogic.privateKeyPassphrase = text + } + } } diff --git a/client/ui/qml/main.qml b/client/ui/qml/main.qml index 5439ad8e..d91c013f 100644 --- a/client/ui/qml/main.qml +++ b/client/ui/qml/main.qml @@ -238,9 +238,6 @@ Window { popupWarning.popupWarningText = message popupWarning.open() } - function onShowPassphraseRequestMessage() { - popupWithTextField.open() - } } MessageDialog { @@ -362,21 +359,4 @@ Window { PopupWarning { id: popupWarning } - PopupWithTextField { - id: popupWithTextField - placeholderText: "Enter private key passphrase" - yesFunc: function() { - editingFinished() - close() - UiLogic.passphraseDialogClosed() - text = "" - } - noFunc: function() { - close() - UiLogic.passphraseDialogClosed() - } - onEditingFinished: { - UiLogic.privateKeyPassphrase = text - } - } } diff --git a/client/ui/uilogic.cpp b/client/ui/uilogic.cpp index 5a541b42..2b66d6c9 100644 --- a/client/ui/uilogic.cpp +++ b/client/ui/uilogic.cpp @@ -150,16 +150,6 @@ void UiLogic::initalizeUiLogic() connect(m_notificationHandler, &NotificationHandler::connectRequested, pageLogic(), &VpnLogic::onConnect); connect(m_notificationHandler, &NotificationHandler::disconnectRequested, pageLogic(), &VpnLogic::onDisconnect); - auto passphraseCallback = [this]() { - emit showPassphraseRequestMessage(); - QEventLoop loop; - QObject::connect(this, &UiLogic::passphraseDialogClosed, &loop, &QEventLoop::quit); - loop.exec(); - - return m_privateKeyPassphrase; - }; - m_serverController->setPassphraseCallback(passphraseCallback); - if (m_settings->serversCount() > 0) { if (m_settings->defaultServerIndex() < 0) m_settings->setDefaultServer(0); emit goToPage(Page::Vpn, true, false); diff --git a/client/ui/uilogic.h b/client/ui/uilogic.h index ae7074e6..3a5559f2 100644 --- a/client/ui/uilogic.h +++ b/client/ui/uilogic.h @@ -62,7 +62,6 @@ class UiLogic : public QObject AUTO_PROPERTY(bool, pageEnabled) AUTO_PROPERTY(int, pagesStackDepth) AUTO_PROPERTY(int, currentPageValue) - AUTO_PROPERTY(QString, privateKeyPassphrase); READONLY_PROPERTY(QObject *, containersModel) READONLY_PROPERTY(QObject *, protocolsModel) @@ -136,9 +135,6 @@ signals: void toggleLogPanel(); void showWarningMessage(QString message); - void showPassphraseRequestMessage(); - void passphraseDialogClosed(); - private slots: // containers - INOUT arg void installServer(QPair &container);