diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index f165dd74..6140bbce 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -798,32 +798,44 @@ SshConnection *ServerController::connectToHost(const SshConnectionParameters &ss ErrorCode ServerController::getClientsList(const ServerCredentials &credentials, DockerContainer container, Proto mainProtocol, QJsonObject &clietns) { + ErrorCode error = ErrorCode::NoError; QString stdOut; auto cbReadStdOut = [&](const QString &data, QSharedPointer proc) { stdOut += data + "\n"; }; - ErrorCode error = ErrorCode::NoError; + auto mainProtocolString = ProtocolProps::protoToString(mainProtocol); + + const QString clientsTableFile = QString("opt/amnezia/%1/clientsTable").arg(mainProtocolString); + QByteArray clientsTableString = getTextFileFromContainer(container, credentials, clientsTableFile, &error); + if (error != ErrorCode::NoError) { + return error; + } + QJsonObject clientsTable = QJsonDocument::fromJson(clientsTableString).object(); + int count = 0; + if (mainProtocol == Proto::OpenVpn) { - error = runScript(credentials, - replaceVars(QString("sudo docker exec -i $CONTAINER_NAME bash -c 'ls /opt/amnezia/openvpn/pki/issued'"), - genVarsForScript(credentials, container)), cbReadStdOut); - // TODO error processing + const QString getOpenVpnClientsList = "sudo docker exec -i $CONTAINER_NAME bash -c 'ls /opt/amnezia/openvpn/pki/issued'"; + error = runScript(credentials, replaceVars(getOpenVpnClientsList, genVarsForScript(credentials, container)), cbReadStdOut); + if (error != ErrorCode::NoError) { + return error; + } + if (!stdOut.isEmpty()) { QStringList certsIds = stdOut.split("\n", Qt::SkipEmptyParts); certsIds.removeAll("AmneziaReq.crt"); - QByteArray clientsTableString = getTextFileFromContainer(container, credentials, "opt/amnezia/openvpn/clientsTable"); - QJsonObject clientsTable = QJsonDocument::fromJson(clientsTableString).object(); - int count = 0; for (auto &openvpnCertId : certsIds) { openvpnCertId.replace(".crt", ""); if (!clientsTable.contains(openvpnCertId)) { stdOut.clear(); - error = runScript(credentials, - replaceVars(QString("sudo docker exec -i $CONTAINER_NAME bash -c 'cat /opt/amnezia/openvpn/pki/issued/%1.crt'").arg(openvpnCertId), - genVarsForScript(credentials, container)), cbReadStdOut); - // TODO error processing + const QString getOpenVpnCertData = QString("sudo docker exec -i $CONTAINER_NAME bash -c 'cat /opt/amnezia/openvpn/pki/issued/%1.crt'") + .arg(openvpnCertId); + error = runScript(credentials, replaceVars(getOpenVpnCertData, genVarsForScript(credentials, container)), cbReadStdOut); + if (error != ErrorCode::NoError) { + return error; + } + QJsonObject client; client["openvpnCertId"] = openvpnCertId; client["clientName"] = QString("Client %1").arg(count); @@ -832,54 +844,53 @@ ErrorCode ServerController::getClientsList(const ServerCredentials &credentials, count++; } } - QByteArray newClientsTableString = QJsonDocument(clientsTable).toJson(); - if (clientsTableString != newClientsTableString) { - error = uploadTextFileToContainer(container, credentials, newClientsTableString, "opt/amnezia/openvpn/clientsTable"); - } - // TODO error processing - clietns = clientsTable; } } else if (mainProtocol == Proto::WireGuard) { - QString wireguardConfigString = getTextFileFromContainer(container, credentials, "opt/amnezia/wireguard/wg0.conf"); + const QString wireGuardConfigFile = "opt/amnezia/wireguard/wg0.conf"; + QString wireguardConfigString = getTextFileFromContainer(container, credentials, wireGuardConfigFile, &error); + if (error != ErrorCode::NoError) { + return error; + } - auto configSections = wireguardConfigString.split("[", Qt::SkipEmptyParts); - QJsonObject clientsTable; - int count = 0; - for (const auto §ion : configSections) { - auto configLines = section.split("\n", Qt::SkipEmptyParts); - if (!configLines.contains("Peer]")) { - continue; + auto configLines = wireguardConfigString.split("\n", Qt::SkipEmptyParts); + QStringList wireguardKeys; + for (const auto &line : configLines) { + auto configPair = line.split(" = ", Qt::SkipEmptyParts); + if (configPair.front() == "PublicKey") { + wireguardKeys.push_back(configPair.back()); } - QJsonObject client; - for (const auto &line : configLines) { - auto configPair = line.split(" = ", Qt::SkipEmptyParts); - if (configPair.front() == "# Name") { - client["clientName"] = configPair.size() == 2 ? configPair.back() : ""; - } else if (configPair.front() == "PublicKey") { - client["wireguardPublicKey"] = configPair.back(); - } - } - if (client["clientName"].isNull()) { + } + + for (auto &wireguardKey : wireguardKeys) { + if (!clientsTable.contains(wireguardKey)) { + QJsonObject client; client["clientName"] = QString("Client %1").arg(count); + client["wireguardPublicKey"] = wireguardKey; + clientsTable[wireguardKey] = client; count++; } - clientsTable[client["wireguardPublicKey"].toString()] = client; } - // TODO error processing - clietns = clientsTable; } + QByteArray newClientsTableString = QJsonDocument(clientsTable).toJson(); + if (clientsTableString != newClientsTableString) { + error = uploadTextFileToContainer(container, credentials, newClientsTableString, clientsTableFile); + } + + if (error != ErrorCode::NoError) { + return error; + } + + clietns = clientsTable; + return error; } ErrorCode ServerController::setClientsList(const ServerCredentials &credentials, DockerContainer container, Proto mainProtocol, QJsonObject &clietns) { - ErrorCode error = ErrorCode::NoError; - if (mainProtocol == Proto::OpenVpn) { - error = uploadTextFileToContainer(container, credentials, QJsonDocument(clietns).toJson(), "opt/amnezia/openvpn/clientsTable"); - } else if (mainProtocol == Proto::WireGuard) { - - } + auto mainProtocolString = ProtocolProps::protoToString(mainProtocol); + const QString clientsTableFile = QString("opt/amnezia/%1/clientsTable").arg(mainProtocolString); + ErrorCode error = uploadTextFileToContainer(container, credentials, QJsonDocument(clietns).toJson(), clientsTableFile); return error; } diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 7791e3db..9e372d37 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -21,11 +21,15 @@ void ClientManagementModel::setContent(const QVector &data) endResetModel(); } -QJsonObject ClientManagementModel::getContent() +QJsonObject ClientManagementModel::getContent(Proto protocol) { QJsonObject clientsTable; for (const auto &item : m_content) { - clientsTable[item.toJsonObject()["openvpnCertId"].toString()] = item.toJsonObject(); + if (protocol == Proto::OpenVpn) { + clientsTable[item.toJsonObject()["openvpnCertId"].toString()] = item.toJsonObject(); + } else if (protocol == Proto::WireGuard) { + clientsTable[item.toJsonObject()["wireguardPublicKey"].toString()] = item.toJsonObject(); + } } return clientsTable; } diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index 81f1197e..e8678baf 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -21,7 +21,7 @@ public: void clearData(); void setContent(const QVector &data); - QJsonObject getContent(); + QJsonObject getContent(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); diff --git a/client/ui/pages_logic/ClientInfoLogic.cpp b/client/ui/pages_logic/ClientInfoLogic.cpp index 6065288e..779b7884 100644 --- a/client/ui/pages_logic/ClientInfoLogic.cpp +++ b/client/ui/pages_logic/ClientInfoLogic.cpp @@ -1,5 +1,9 @@ #include "ClientInfoLogic.h" +#include + +#include "defines.h" +#include "core/errorstrings.h" #include "core/servercontroller.h" #include "ui/models/clientManagementModel.h" #include "ui/uilogic.h" @@ -16,7 +20,7 @@ void ClientInfoLogic::setCurrentClientId(int index) } void ClientInfoLogic::onUpdatePage() -{ +{ DockerContainer selectedContainer = m_settings->defaultContainer(uiLogic()->selectedServerIndex); QString selectedContainerName = ContainerProps::containerHumanNames().value(selectedContainer); set_labelCurrentVpnProtocolText(tr("Service: ") + selectedContainerName); @@ -39,20 +43,26 @@ void ClientInfoLogic::onUpdatePage() } void ClientInfoLogic::onLineEditNameAliasEditingFinished() -{ +{ auto model = qobject_cast(uiLogic()->clientManagementModel()); auto modelIndex = model->index(m_currentClientIndex); model->setData(modelIndex, m_lineEditNameAliasText, ClientManagementModel::ClientRoles::NameRole); - auto clientsTable = model->getContent(); + DockerContainer selectedContainer = m_settings->defaultContainer(uiLogic()->selectedServerIndex); auto protocols = ContainerProps::protocolsForContainer(selectedContainer); if (!protocols.empty()) { auto currentMainProtocol = protocols.front(); - m_serverController->setClientsList(m_settings->serverCredentials(uiLogic()->selectedServerIndex), + auto clientsTable = model->getContent(currentMainProtocol); + ErrorCode error = m_serverController->setClientsList(m_settings->serverCredentials(uiLogic()->selectedServerIndex), selectedContainer, currentMainProtocol, clientsTable); + if (error != ErrorCode::NoError) { + QMessageBox::warning(nullptr, APPLICATION_NAME, + tr("An error occurred while getting the list of clients.") + "\n" + errorString(error)); + return; + } } } diff --git a/client/ui/pages_logic/ClientManagementLogic.cpp b/client/ui/pages_logic/ClientManagementLogic.cpp index 7e88d715..7e63e3dd 100644 --- a/client/ui/pages_logic/ClientManagementLogic.cpp +++ b/client/ui/pages_logic/ClientManagementLogic.cpp @@ -1,5 +1,9 @@ #include "ClientManagementLogic.h" +#include + +#include "defines.h" +#include "core/errorstrings.h" #include "core/servercontroller.h" #include "ui/pages_logic/ClientInfoLogic.h" #include "ui/models/clientManagementModel.h" @@ -24,8 +28,13 @@ void ClientManagementLogic::onUpdatePage() if (!protocols.empty()) { m_currentMainProtocol = protocols.front(); - ErrorCode e = m_serverController->getClientsList(m_settings->serverCredentials(uiLogic()->selectedServerIndex), + ErrorCode error = m_serverController->getClientsList(m_settings->serverCredentials(uiLogic()->selectedServerIndex), selectedContainer, m_currentMainProtocol, clients); + if (error != ErrorCode::NoError) { + QMessageBox::warning(nullptr, APPLICATION_NAME, + tr("An error occurred while getting the list of clients.") + "\n" + errorString(error)); + return; + } } QVector clientsArray; for (auto &clientId : clients.keys()) {