Merge pull request #473 from amnezia-vpn/bugfix/new-client-on-connection

fixed hang after creating configuration on connection
This commit is contained in:
pokamest 2023-12-25 12:21:44 -05:00 committed by GitHub
commit f1a0b7f0ef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 21 additions and 7 deletions

View file

@ -330,6 +330,7 @@ void AmneziaApplication::initModels()
ServerCredentials credentials) { ServerCredentials credentials) {
m_serversModel->reloadContainerConfig(); m_serversModel->reloadContainerConfig();
m_clientManagementModel->appendClient(clientId, clientName, container, credentials); m_clientManagementModel->appendClient(clientId, clientName, container, credentials);
emit m_configurator->clientModelUpdated();
}); });
} }

View file

@ -46,6 +46,7 @@ public:
signals: signals:
void newVpnConfigCreated(const QString &clientId, const QString &clientName, const DockerContainer container, void newVpnConfigCreated(const QString &clientId, const QString &clientName, const DockerContainer container,
ServerCredentials credentials); ServerCredentials credentials);
void clientModelUpdated();
}; };
#endif // VPN_CONFIGURATOR_H #endif // VPN_CONFIGURATOR_H

View file

@ -15,6 +15,7 @@ namespace
constexpr char clientName[] = "clientName"; constexpr char clientName[] = "clientName";
constexpr char container[] = "container"; constexpr char container[] = "container";
constexpr char userData[] = "userData"; constexpr char userData[] = "userData";
constexpr char creationDate[] = "creationDate";
} }
} }
@ -40,6 +41,7 @@ QVariant ClientManagementModel::data(const QModelIndex &index, int role) const
switch (role) { switch (role) {
case ClientNameRole: return userData.value(configKey::clientName).toString(); case ClientNameRole: return userData.value(configKey::clientName).toString();
case CreationDateRole: return userData.value(configKey::creationDate).toString();
} }
return QVariant(); return QVariant();
@ -200,19 +202,20 @@ ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QSt
for (int i = 0; i < m_clientsTable.size(); i++) { for (int i = 0; i < m_clientsTable.size(); i++) {
if (m_clientsTable.at(i).toObject().value(configKey::clientId) == clientId) { if (m_clientsTable.at(i).toObject().value(configKey::clientId) == clientId) {
return renameClient(i, clientName, container, credentials); return renameClient(i, clientName, container, credentials, true);
} }
} }
beginResetModel(); beginInsertRows(QModelIndex(), rowCount(), 1);
QJsonObject client; QJsonObject client;
client[configKey::clientId] = clientId; client[configKey::clientId] = clientId;
QJsonObject userData; QJsonObject userData;
userData[configKey::clientName] = clientName; userData[configKey::clientName] = clientName;
userData[configKey::creationDate] = QDateTime::currentDateTime().toString();
client[configKey::userData] = userData; client[configKey::userData] = userData;
m_clientsTable.push_back(client); m_clientsTable.push_back(client);
endResetModel(); endInsertRows();
const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson(); const QByteArray clientsTableString = QJsonDocument(m_clientsTable).toJson();
@ -229,11 +232,14 @@ ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QSt
} }
ErrorCode ClientManagementModel::renameClient(const int row, const QString &clientName, const DockerContainer container, ErrorCode ClientManagementModel::renameClient(const int row, const QString &clientName, const DockerContainer container,
ServerCredentials credentials) ServerCredentials credentials, bool addTimeStamp)
{ {
auto client = m_clientsTable.at(row).toObject(); auto client = m_clientsTable.at(row).toObject();
auto userData = client[configKey::userData].toObject(); auto userData = client[configKey::userData].toObject();
userData[configKey::clientName] = clientName; userData[configKey::clientName] = clientName;
if (addTimeStamp) {
userData[configKey::creationDate] = QDateTime::currentDateTime().toString();
}
client[configKey::userData] = userData; client[configKey::userData] = userData;
m_clientsTable.replace(row, client); m_clientsTable.replace(row, client);
@ -389,5 +395,6 @@ QHash<int, QByteArray> ClientManagementModel::roleNames() const
{ {
QHash<int, QByteArray> roles; QHash<int, QByteArray> roles;
roles[ClientNameRole] = "clientName"; roles[ClientNameRole] = "clientName";
roles[CreationDateRole] = "creationDate";
return roles; return roles;
} }

View file

@ -14,6 +14,7 @@ class ClientManagementModel : public QAbstractListModel
public: public:
enum Roles { enum Roles {
ClientNameRole = Qt::UserRole + 1, ClientNameRole = Qt::UserRole + 1,
CreationDateRole
}; };
ClientManagementModel(std::shared_ptr<Settings> settings, QObject *parent = nullptr); ClientManagementModel(std::shared_ptr<Settings> settings, QObject *parent = nullptr);
@ -26,7 +27,7 @@ public slots:
ErrorCode appendClient(const QString &clientId, const QString &clientName, const DockerContainer container, ErrorCode appendClient(const QString &clientId, const QString &clientName, const DockerContainer container,
ServerCredentials credentials); ServerCredentials credentials);
ErrorCode renameClient(const int row, const QString &userName, const DockerContainer container, ErrorCode renameClient(const int row, const QString &userName, const DockerContainer container,
ServerCredentials credentials); ServerCredentials credentials, bool addTimeStamp = false);
ErrorCode revokeClient(const int index, const DockerContainer container, ServerCredentials credentials); ErrorCode revokeClient(const int index, const DockerContainer container, ServerCredentials credentials);
protected: protected:

View file

@ -581,7 +581,7 @@ PageType {
Layout.bottomMargin: 24 Layout.bottomMargin: 24
headerText: clientName headerText: clientName
descriptionText: serverSelector.text descriptionText: qsTr("Creation date: ") + creationDate
} }
BasicButtonType { BasicButtonType {

View file

@ -4,6 +4,7 @@
#include <QFile> #include <QFile>
#include <QHostInfo> #include <QHostInfo>
#include <QJsonObject> #include <QJsonObject>
#include <QEventLoop>
#include <configurators/cloak_configurator.h> #include <configurators/cloak_configurator.h>
#include <configurators/openvpn_configurator.h> #include <configurators/openvpn_configurator.h>
@ -250,7 +251,10 @@ QString VpnConnection::createVpnConfigurationForProto(int serverIndex, const Ser
m_settings->setProtocolConfig(serverIndex, container, proto, protoObject); m_settings->setProtocolConfig(serverIndex, container, proto, protoObject);
} }
emit m_configurator->newVpnConfigCreated(clientId, "unnamed client", container, credentials); QEventLoop wait;
emit m_configurator->newVpnConfigCreated(clientId, QString("Admin [%1]").arg(QSysInfo::prettyProductName()), container, credentials);
QObject::connect(m_configurator.get(), &VpnConfigurator::clientModelUpdated, &wait, &QEventLoop::quit);
wait.exec();
} }
return configData; return configData;