From d6d3bf6943895cb0c70be950a458cb22367bacef Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Tue, 17 Jan 2023 21:04:15 +0300 Subject: [PATCH] moved certificate content acquisition from ClientManagementLogic to ClientInfoLogic --- client/ui/models/clientManagementModel.cpp | 12 +++---- client/ui/models/clientManagementModel.h | 7 ++--- client/ui/pages_logic/ClientInfoLogic.cpp | 31 +++++++++++++++++-- client/ui/pages_logic/ClientInfoLogic.h | 1 + .../ui/pages_logic/ClientManagementLogic.cpp | 10 +----- .../ClientInfo/PageClientInfoOpenVPN.qml | 1 + client/ui/uilogic.cpp | 2 +- 7 files changed, 41 insertions(+), 23 deletions(-) diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 28e9d3c2..87652ff2 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -1,8 +1,8 @@ #include "clientManagementModel.h" -ClientManagementModel::ClientManagementModel(std::shared_ptr settings, QObject *parent) : - m_settings(settings), - QAbstractListModel(parent) +#include + +ClientManagementModel::ClientManagementModel(QObject *parent) : QAbstractListModel(parent) { } @@ -21,13 +21,13 @@ void ClientManagementModel::setContent(const QVector &data) endResetModel(); } -QJsonObject ClientManagementModel::getContent(Proto protocol) +QJsonObject ClientManagementModel::getContent(amnezia::Proto protocol) { QJsonObject clientsTable; for (const auto &item : m_content) { - if (protocol == Proto::OpenVpn) { + if (protocol == amnezia::Proto::OpenVpn) { clientsTable[item.toJsonObject()["openvpnCertId"].toString()] = item.toJsonObject(); - } else if (protocol == Proto::WireGuard) { + } else if (protocol == amnezia::Proto::WireGuard) { clientsTable[item.toJsonObject()["wireguardPublicKey"].toString()] = item.toJsonObject(); } } diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index c3ced1c5..5230c337 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -3,7 +3,7 @@ #include -#include "settings.h" +#include "protocols/protocols_defs.h" class ClientManagementModel : public QAbstractListModel { @@ -17,11 +17,11 @@ public: WireGuardPublicKey, }; - ClientManagementModel(std::shared_ptr settings, QObject *parent = nullptr); + ClientManagementModel(QObject *parent = nullptr); void clearData(); void setContent(const QVector &data); - QJsonObject getContent(Proto protocol); + QJsonObject getContent(amnezia::Proto protocol); int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; void setData(const QModelIndex &index, QVariant data, int role = Qt::DisplayRole); @@ -31,7 +31,6 @@ protected: QHash roleNames() const override; private: - std::shared_ptr m_settings; //TODO remove this? QVector m_content; }; diff --git a/client/ui/pages_logic/ClientInfoLogic.cpp b/client/ui/pages_logic/ClientInfoLogic.cpp index fb521eec..30a03317 100644 --- a/client/ui/pages_logic/ClientInfoLogic.cpp +++ b/client/ui/pages_logic/ClientInfoLogic.cpp @@ -32,8 +32,10 @@ void ClientInfoLogic::setCurrentClientId(int index) void ClientInfoLogic::onUpdatePage() { - set_busyIndicatorIsRunning(false); + set_pageContentVisible(false); + set_busyIndicatorIsRunning(true); + const ServerCredentials credentials = m_settings->serverCredentials(uiLogic()->selectedServerIndex); const DockerContainer container = m_settings->defaultContainer(uiLogic()->selectedServerIndex); const QString containerNameString = ContainerProps::containerHumanNames().value(container); set_labelCurrentVpnProtocolText(tr("Service: ") + containerNameString); @@ -47,12 +49,35 @@ void ClientInfoLogic::onUpdatePage() set_lineEditNameAliasText(model->data(modelIndex, ClientManagementModel::ClientRoles::NameRole).toString()); if (currentMainProtocol == Proto::OpenVpn) { - set_labelOpenVpnCertId(model->data(modelIndex, ClientManagementModel::ClientRoles::OpenVpnCertIdRole).toString()); - set_textAreaOpenVpnCertData(model->data(modelIndex, ClientManagementModel::ClientRoles::OpenVpnCertDataRole).toString()); + const QString certId = model->data(modelIndex, ClientManagementModel::ClientRoles::OpenVpnCertIdRole).toString(); + QString certData = model->data(modelIndex, ClientManagementModel::ClientRoles::OpenVpnCertDataRole).toString(); + + if (certData.isEmpty()) { + QString stdOut; + auto cbReadStdOut = [&](const QString &data, QSharedPointer proc) { + stdOut += data + "\n"; + }; + + const QString getOpenVpnCertData = QString("sudo docker exec -i $CONTAINER_NAME bash -c 'cat /opt/amnezia/openvpn/pki/issued/%1.crt'") + .arg(certId); + const QString script = m_serverController->replaceVars(getOpenVpnCertData, m_serverController->genVarsForScript(credentials, container)); + ErrorCode error = m_serverController->runScript(credentials, script, cbReadStdOut); + certData = stdOut; + m_serverController->disconnectFromHost(credentials); + if (isErrorOccured(error)) { + set_busyIndicatorIsRunning(false); + uiLogic()->closePage(); + return; + } + } + set_labelOpenVpnCertId(certId); + set_textAreaOpenVpnCertData(certData); } else if (currentMainProtocol == Proto::WireGuard) { set_textAreaWireGuardKeyData(model->data(modelIndex, ClientManagementModel::ClientRoles::WireGuardPublicKey).toString()); } } + set_pageContentVisible(true); + set_busyIndicatorIsRunning(false); } void ClientInfoLogic::onLineEditNameAliasEditingFinished() diff --git a/client/ui/pages_logic/ClientInfoLogic.h b/client/ui/pages_logic/ClientInfoLogic.h index 177000f2..5ba19887 100644 --- a/client/ui/pages_logic/ClientInfoLogic.h +++ b/client/ui/pages_logic/ClientInfoLogic.h @@ -19,6 +19,7 @@ class ClientInfoLogic : public PageLogicBase AUTO_PROPERTY(QString, labelCurrentVpnProtocolText) AUTO_PROPERTY(QString, textAreaWireGuardKeyData) AUTO_PROPERTY(bool, busyIndicatorIsRunning); + AUTO_PROPERTY(bool, pageContentVisible); public: ClientInfoLogic(UiLogic *uiLogic, QObject *parent = nullptr); diff --git a/client/ui/pages_logic/ClientManagementLogic.cpp b/client/ui/pages_logic/ClientManagementLogic.cpp index ad4dedb1..aaacb96a 100644 --- a/client/ui/pages_logic/ClientManagementLogic.cpp +++ b/client/ui/pages_logic/ClientManagementLogic.cpp @@ -87,19 +87,11 @@ ErrorCode ClientManagementLogic::getClientsList(const ServerCredentials &credent for (auto &openvpnCertId : certsIds) { openvpnCertId.replace(".crt", ""); if (!clientsTable.contains(openvpnCertId)) { - stdOut.clear(); - const QString getOpenVpnCertData = QString("sudo docker exec -i $CONTAINER_NAME bash -c 'cat /opt/amnezia/openvpn/pki/issued/%1.crt'") - .arg(openvpnCertId); - script = m_serverController->replaceVars(getOpenVpnCertData, m_serverController->genVarsForScript(credentials, container)); - error = m_serverController->runScript(credentials, script, cbReadStdOut); - if (error != ErrorCode::NoError) { - return error; - } QJsonObject client; client["openvpnCertId"] = openvpnCertId; client["clientName"] = QString("Client %1").arg(count); - client["openvpnCertData"] = stdOut; + client["openvpnCertData"] = ""; clientsTable[openvpnCertId] = client; count++; } diff --git a/client/ui/qml/Pages/ClientInfo/PageClientInfoOpenVPN.qml b/client/ui/qml/Pages/ClientInfo/PageClientInfoOpenVPN.qml index fb0b2fb9..da5ba53c 100644 --- a/client/ui/qml/Pages/ClientInfo/PageClientInfoOpenVPN.qml +++ b/client/ui/qml/Pages/ClientInfo/PageClientInfoOpenVPN.qml @@ -32,6 +32,7 @@ PageClientInfoBase { id: fl anchors.top: caption.bottom contentHeight: content.height + visible: ClientInfoLogic.pageContentVisible ColumnLayout { id: content diff --git a/client/ui/uilogic.cpp b/client/ui/uilogic.cpp index c958a2cf..546eaea4 100644 --- a/client/ui/uilogic.cpp +++ b/client/ui/uilogic.cpp @@ -89,7 +89,7 @@ UiLogic::UiLogic(std::shared_ptr settings, std::shared_ptrmoveToThread(&m_vpnConnectionThread); m_vpnConnectionThread.start();