moved certificate content acquisition from ClientManagementLogic to ClientInfoLogic

This commit is contained in:
vladimir.kuznetsov 2023-01-17 21:04:15 +03:00
parent f6e8346841
commit d6d3bf6943
7 changed files with 41 additions and 23 deletions

View file

@ -1,8 +1,8 @@
#include "clientManagementModel.h" #include "clientManagementModel.h"
ClientManagementModel::ClientManagementModel(std::shared_ptr<Settings> settings, QObject *parent) : #include <QJsonObject>
m_settings(settings),
QAbstractListModel(parent) ClientManagementModel::ClientManagementModel(QObject *parent) : QAbstractListModel(parent)
{ {
} }
@ -21,13 +21,13 @@ void ClientManagementModel::setContent(const QVector<QVariant> &data)
endResetModel(); endResetModel();
} }
QJsonObject ClientManagementModel::getContent(Proto protocol) QJsonObject ClientManagementModel::getContent(amnezia::Proto protocol)
{ {
QJsonObject clientsTable; QJsonObject clientsTable;
for (const auto &item : m_content) { for (const auto &item : m_content) {
if (protocol == Proto::OpenVpn) { if (protocol == amnezia::Proto::OpenVpn) {
clientsTable[item.toJsonObject()["openvpnCertId"].toString()] = item.toJsonObject(); 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(); clientsTable[item.toJsonObject()["wireguardPublicKey"].toString()] = item.toJsonObject();
} }
} }

View file

@ -3,7 +3,7 @@
#include <QAbstractListModel> #include <QAbstractListModel>
#include "settings.h" #include "protocols/protocols_defs.h"
class ClientManagementModel : public QAbstractListModel class ClientManagementModel : public QAbstractListModel
{ {
@ -17,11 +17,11 @@ public:
WireGuardPublicKey, WireGuardPublicKey,
}; };
ClientManagementModel(std::shared_ptr<Settings> settings, QObject *parent = nullptr); ClientManagementModel(QObject *parent = nullptr);
void clearData(); void clearData();
void setContent(const QVector<QVariant> &data); void setContent(const QVector<QVariant> &data);
QJsonObject getContent(Proto protocol); QJsonObject getContent(amnezia::Proto protocol);
int rowCount(const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
void setData(const QModelIndex &index, QVariant data, int role = Qt::DisplayRole); void setData(const QModelIndex &index, QVariant data, int role = Qt::DisplayRole);
@ -31,7 +31,6 @@ protected:
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
private: private:
std::shared_ptr<Settings> m_settings; //TODO remove this?
QVector<QVariant> m_content; QVector<QVariant> m_content;
}; };

View file

@ -32,8 +32,10 @@ void ClientInfoLogic::setCurrentClientId(int index)
void ClientInfoLogic::onUpdatePage() 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 DockerContainer container = m_settings->defaultContainer(uiLogic()->selectedServerIndex);
const QString containerNameString = ContainerProps::containerHumanNames().value(container); const QString containerNameString = ContainerProps::containerHumanNames().value(container);
set_labelCurrentVpnProtocolText(tr("Service: ") + containerNameString); set_labelCurrentVpnProtocolText(tr("Service: ") + containerNameString);
@ -47,12 +49,35 @@ void ClientInfoLogic::onUpdatePage()
set_lineEditNameAliasText(model->data(modelIndex, ClientManagementModel::ClientRoles::NameRole).toString()); set_lineEditNameAliasText(model->data(modelIndex, ClientManagementModel::ClientRoles::NameRole).toString());
if (currentMainProtocol == Proto::OpenVpn) { if (currentMainProtocol == Proto::OpenVpn) {
set_labelOpenVpnCertId(model->data(modelIndex, ClientManagementModel::ClientRoles::OpenVpnCertIdRole).toString()); const QString certId = model->data(modelIndex, ClientManagementModel::ClientRoles::OpenVpnCertIdRole).toString();
set_textAreaOpenVpnCertData(model->data(modelIndex, ClientManagementModel::ClientRoles::OpenVpnCertDataRole).toString()); QString certData = model->data(modelIndex, ClientManagementModel::ClientRoles::OpenVpnCertDataRole).toString();
if (certData.isEmpty()) {
QString stdOut;
auto cbReadStdOut = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> 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) { } else if (currentMainProtocol == Proto::WireGuard) {
set_textAreaWireGuardKeyData(model->data(modelIndex, ClientManagementModel::ClientRoles::WireGuardPublicKey).toString()); set_textAreaWireGuardKeyData(model->data(modelIndex, ClientManagementModel::ClientRoles::WireGuardPublicKey).toString());
} }
} }
set_pageContentVisible(true);
set_busyIndicatorIsRunning(false);
} }
void ClientInfoLogic::onLineEditNameAliasEditingFinished() void ClientInfoLogic::onLineEditNameAliasEditingFinished()

View file

@ -19,6 +19,7 @@ class ClientInfoLogic : public PageLogicBase
AUTO_PROPERTY(QString, labelCurrentVpnProtocolText) AUTO_PROPERTY(QString, labelCurrentVpnProtocolText)
AUTO_PROPERTY(QString, textAreaWireGuardKeyData) AUTO_PROPERTY(QString, textAreaWireGuardKeyData)
AUTO_PROPERTY(bool, busyIndicatorIsRunning); AUTO_PROPERTY(bool, busyIndicatorIsRunning);
AUTO_PROPERTY(bool, pageContentVisible);
public: public:
ClientInfoLogic(UiLogic *uiLogic, QObject *parent = nullptr); ClientInfoLogic(UiLogic *uiLogic, QObject *parent = nullptr);

View file

@ -87,19 +87,11 @@ ErrorCode ClientManagementLogic::getClientsList(const ServerCredentials &credent
for (auto &openvpnCertId : certsIds) { for (auto &openvpnCertId : certsIds) {
openvpnCertId.replace(".crt", ""); openvpnCertId.replace(".crt", "");
if (!clientsTable.contains(openvpnCertId)) { 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; QJsonObject client;
client["openvpnCertId"] = openvpnCertId; client["openvpnCertId"] = openvpnCertId;
client["clientName"] = QString("Client %1").arg(count); client["clientName"] = QString("Client %1").arg(count);
client["openvpnCertData"] = stdOut; client["openvpnCertData"] = "";
clientsTable[openvpnCertId] = client; clientsTable[openvpnCertId] = client;
count++; count++;
} }

View file

@ -32,6 +32,7 @@ PageClientInfoBase {
id: fl id: fl
anchors.top: caption.bottom anchors.top: caption.bottom
contentHeight: content.height contentHeight: content.height
visible: ClientInfoLogic.pageContentVisible
ColumnLayout { ColumnLayout {
id: content id: content

View file

@ -89,7 +89,7 @@ UiLogic::UiLogic(std::shared_ptr<Settings> settings, std::shared_ptr<VpnConfigur
{ {
m_containersModel = new ContainersModel(settings, this); m_containersModel = new ContainersModel(settings, this);
m_protocolsModel = new ProtocolsModel(settings, this); m_protocolsModel = new ProtocolsModel(settings, this);
m_clientManagementModel = new ClientManagementModel(settings, this); m_clientManagementModel = new ClientManagementModel(this);
m_vpnConnection = new VpnConnection(settings, configurator, serverController); m_vpnConnection = new VpnConnection(settings, configurator, serverController);
m_vpnConnection->moveToThread(&m_vpnConnectionThread); m_vpnConnection->moveToThread(&m_vpnConnectionThread);
m_vpnConnectionThread.start(); m_vpnConnectionThread.start();