From 8599b206788ed258ba0901844fa1dd7ebdb291e7 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 18 Dec 2023 13:17:39 +0700 Subject: [PATCH 1/8] full access config no longer contains the last_config field --- client/ui/controllers/exportController.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index 9930926f..3ad8862f 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -48,6 +48,19 @@ void ExportController::generateFullAccessConfig() int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex(); QJsonObject config = m_settings->server(serverIndex); + QJsonArray containers = config.value(config_key::containers).toArray(); + for (auto i = 0; i < containers.size(); i++) { + auto container = containers.at(i).toObject(); + auto containerType = ContainerProps::containerFromString(container.value(config_key::container).toString()); + auto containerConfig = container.value(ContainerProps::containerTypeToString(containerType)).toObject(); + + containerConfig.remove(config_key::last_config); + + container[ContainerProps::containerTypeToString(containerType)] = containerConfig; + containers.replace(i, container); + } + config[config_key::containers] = containers; + QByteArray compressedConfig = QJsonDocument(config).toJson(); compressedConfig = qCompress(compressedConfig, 8); m_config = QString("vpn://%1") From f37c8e5fd45df5fe14f9966a910b7b00bc2db813 Mon Sep 17 00:00:00 2001 From: KsZnak Date: Wed, 20 Dec 2023 19:14:15 +0200 Subject: [PATCH 2/8] Update amneziavpn_ru.ts --- client/translations/amneziavpn_ru.ts | 46 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index 4f24e540..6ef99dff 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -92,7 +92,7 @@ Configure your server - Настроить ваш сервер + Настроить свой сервер @@ -174,7 +174,7 @@ Added containers that were already installed on the server - + Добавлены сервисы и протоколы, которые были ранее установлены на сервер @@ -1012,17 +1012,17 @@ Already installed containers were found on the server. All installed containers Allow application screenshots - + Разрешить скриншоты приложения Auto start - + Автозапуск Launch the application every time the device is starts - + Открывать приложение при запуске устройства @@ -1353,7 +1353,7 @@ Already installed containers were found on the server. All installed containers Clear cached profiles? - Удалить кэш Amnezia с сервера? + Удалить кэш Amnezia? @@ -1680,7 +1680,7 @@ and will not be shared or disclosed to the Amnezia or any third parties All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties - + Все введенные вами данные останутся строго конфиденциальными и не будут переданы или раскрыты Amnezia или третьим лицам @@ -1978,12 +1978,12 @@ and will not be shared or disclosed to the Amnezia or any third parties Save ShadowSocks config - + Сохраните конфигурацию ShadowSocks Save Cloak config - + Сохранить конфигурацию Cloak @@ -1993,12 +1993,12 @@ and will not be shared or disclosed to the Amnezia or any third parties ShadowSocks native format - + Нативный формат ShadowSocks Cloak native format - + Нативный формат Cloak @@ -2008,23 +2008,23 @@ and will not be shared or disclosed to the Amnezia or any third parties Share full access to the server and VPN - + Поделиться полным доступом к серверу Use for your own devices, or share with those you trust to manage the server. - + Используйте для собственных устройств или передайте управление сервером тем, кому вы доверяете. Users - + Пользователи User name - + Имя пользователя @@ -2059,7 +2059,7 @@ and will not be shared or disclosed to the Amnezia or any third parties The user will no longer be able to connect to your server. - + Пользователь больше не сможет подключаться к вашему серверу @@ -2104,24 +2104,24 @@ and will not be shared or disclosed to the Amnezia or any third parties Full access to the server and VPN - + Полный доступ к серверу и VPN We recommend that you use full access to the server only for your own additional devices. - + Мы рекомендуем использовать полный доступ к серверу только для собственных устройств. If you share full access with other people, they can remove and add protocols and services to the server, which will cause the VPN to work incorrectly for all users. - + Если вы поделитесь полным доступом с другими людьми, то они смогут удалять и добавлять протоколы и сервисы на сервер, что приведет к некорректной работе VPN для всех пользователей. Server - + Сервер @@ -2537,7 +2537,7 @@ and will not be shared or disclosed to the Amnezia or any third parties The config does not contain any containers and credentials for connecting to the server - + Конфиг не содержит контейнеров и учетных данных для подключения к серверу Failed to save config to disk @@ -2814,7 +2814,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin Sftp file sharing service - is secure FTP service - Сервис обмена файлами Sftp - безопасный FTP-сервис + Файловое хранилище для безопасного хранения данных @@ -2959,7 +2959,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin Show connection settings - + Показать настройки подключения From 41aaac7d32c8bba00337798bc1371251ed781132 Mon Sep 17 00:00:00 2001 From: KsZnak Date: Wed, 20 Dec 2023 20:16:35 +0200 Subject: [PATCH 3/8] Update amneziavpn_ru.ts --- client/translations/amneziavpn_ru.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index 6ef99dff..af86594d 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -1978,7 +1978,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Save ShadowSocks config - Сохраните конфигурацию ShadowSocks + Сохранить конфигурацию ShadowSocks @@ -1993,12 +1993,12 @@ and will not be shared or disclosed to the Amnezia or any third parties ShadowSocks native format - Нативный формат ShadowSocks + ShadowSocks нативный формат Cloak native format - Нативный формат Cloak + Cloak нативный формат From 7aac9f9d0e1a6971cf4acc178e810d3d04fda30f Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 21 Dec 2023 17:47:34 +0700 Subject: [PATCH 4/8] fixed hang after creating configuration on connection - config created on connection is displayed as admin (platform name) on the client management page - added config creation time on the client management page --- client/amnezia_application.cpp | 1 + client/configurators/vpn_configurator.h | 1 + client/ui/models/clientManagementModel.cpp | 15 +++++++++++---- client/ui/models/clientManagementModel.h | 3 ++- client/ui/qml/Pages2/PageShare.qml | 2 +- client/vpnconnection.cpp | 6 +++++- 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 40aab515..34c0862b 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -330,6 +330,7 @@ void AmneziaApplication::initModels() ServerCredentials credentials) { m_serversModel->reloadContainerConfig(); m_clientManagementModel->appendClient(clientId, clientName, container, credentials); + emit m_configurator->clientModelUpdated(); }); } diff --git a/client/configurators/vpn_configurator.h b/client/configurators/vpn_configurator.h index 61dc2ac6..7164bd8e 100644 --- a/client/configurators/vpn_configurator.h +++ b/client/configurators/vpn_configurator.h @@ -46,6 +46,7 @@ public: signals: void newVpnConfigCreated(const QString &clientId, const QString &clientName, const DockerContainer container, ServerCredentials credentials); + void clientModelUpdated(); }; #endif // VPN_CONFIGURATOR_H diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 8ec31d02..45495836 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -15,6 +15,7 @@ namespace constexpr char clientName[] = "clientName"; constexpr char container[] = "container"; constexpr char userData[] = "userData"; + constexpr char creationDate[] = "creationDate"; } } @@ -40,6 +41,7 @@ QVariant ClientManagementModel::data(const QModelIndex &index, int role) const switch (role) { case ClientNameRole: return userData.value(configKey::clientName).toString(); + case CreationDateRole: return userData.value(configKey::creationDate).toString(); } return QVariant(); @@ -200,19 +202,20 @@ ErrorCode ClientManagementModel::appendClient(const QString &clientId, const QSt for (int i = 0; i < m_clientsTable.size(); i++) { 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; client[configKey::clientId] = clientId; QJsonObject userData; userData[configKey::clientName] = clientName; + userData[configKey::creationDate] = QDateTime::currentDateTime().toString(); client[configKey::userData] = userData; m_clientsTable.push_back(client); - endResetModel(); + endInsertRows(); 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, - ServerCredentials credentials) + ServerCredentials credentials, bool addTimeStamp) { auto client = m_clientsTable.at(row).toObject(); auto userData = client[configKey::userData].toObject(); userData[configKey::clientName] = clientName; + if (addTimeStamp) { + userData[configKey::creationDate] = QDateTime::currentDateTime().toString(); + } client[configKey::userData] = userData; m_clientsTable.replace(row, client); @@ -369,5 +375,6 @@ QHash ClientManagementModel::roleNames() const { QHash roles; roles[ClientNameRole] = "clientName"; + roles[CreationDateRole] = "creationDate"; return roles; } diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index 6b6adf68..6df7f802 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -14,6 +14,7 @@ class ClientManagementModel : public QAbstractListModel public: enum Roles { ClientNameRole = Qt::UserRole + 1, + CreationDateRole }; ClientManagementModel(std::shared_ptr settings, QObject *parent = nullptr); @@ -26,7 +27,7 @@ public slots: ErrorCode appendClient(const QString &clientId, const QString &clientName, const DockerContainer container, ServerCredentials credentials); 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); protected: diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index 38010b8f..41e9497a 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -578,7 +578,7 @@ PageType { Layout.bottomMargin: 24 headerText: clientName - descriptionText: serverSelector.text + descriptionText: qsTr("Creation date: ") + creationDate } BasicButtonType { diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 80163ef1..d67767bd 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -246,7 +247,10 @@ QString VpnConnection::createVpnConfigurationForProto(int serverIndex, const Ser 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; From 9290775ab5247c5b27bec459138d483154b4fd21 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 21 Dec 2023 23:34:27 +0700 Subject: [PATCH 5/8] added removal of last_config when revoke admin config on client management panel --- client/amnezia_application.cpp | 2 ++ client/ui/controllers/exportController.cpp | 15 ++++++++----- client/ui/models/clientManagementModel.cpp | 26 +++++++++++++++++++--- client/ui/models/clientManagementModel.h | 3 +++ client/ui/models/servers_model.cpp | 8 +++++++ client/ui/models/servers_model.h | 1 + 6 files changed, 46 insertions(+), 9 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 40aab515..14f6befe 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -324,6 +324,8 @@ void AmneziaApplication::initModels() m_clientManagementModel.reset(new ClientManagementModel(m_settings, this)); m_engine->rootContext()->setContextProperty("ClientManagementModel", m_clientManagementModel.get()); + connect(m_clientManagementModel.get(), &ClientManagementModel::adminConfigRevoked, + m_serversModel.get(), &ServersModel::clearCachedProfile); connect(m_configurator.get(), &VpnConfigurator::newVpnConfigCreated, this, [this](const QString &clientId, const QString &clientName, const DockerContainer container, diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index 3ad8862f..9209f4cd 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -50,14 +50,17 @@ void ExportController::generateFullAccessConfig() QJsonArray containers = config.value(config_key::containers).toArray(); for (auto i = 0; i < containers.size(); i++) { - auto container = containers.at(i).toObject(); - auto containerType = ContainerProps::containerFromString(container.value(config_key::container).toString()); - auto containerConfig = container.value(ContainerProps::containerTypeToString(containerType)).toObject(); + auto containerConfig = containers.at(i).toObject(); + auto containerType = ContainerProps::containerFromString(containerConfig.value(config_key::container).toString()); - containerConfig.remove(config_key::last_config); + for (auto protocol : ContainerProps::protocolsForContainer(containerType)) { + auto protocolConfig = containerConfig.value(ProtocolProps::protoToString(protocol)).toObject(); - container[ContainerProps::containerTypeToString(containerType)] = containerConfig; - containers.replace(i, container); + protocolConfig.remove(config_key::last_config); + containerConfig[ProtocolProps::protoToString(protocol)] = protocolConfig; + } + + containers.replace(i, containerConfig); } config[config_key::containers] = containers; diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 8ec31d02..15c23229 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -257,13 +257,33 @@ ErrorCode ClientManagementModel::renameClient(const int row, const QString &clie ErrorCode ClientManagementModel::revokeClient(const int row, const DockerContainer container, ServerCredentials credentials) { + ErrorCode errorCode = ErrorCode::NoError; + if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { - return revokeOpenVpn(row, container, credentials); + errorCode = revokeOpenVpn(row, container, credentials); } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { - return revokeWireGuard(row, container, credentials); + errorCode = revokeWireGuard(row, container, credentials); } - return ErrorCode::NoError; + + if (errorCode == ErrorCode::NoError) { + auto client = m_clientsTable.at(row).toObject(); + QString clientId = client.value(configKey::clientId).toString(); + + const auto server = m_settings->defaultServer(); + QJsonArray containers = server.value(config_key::containers).toArray(); + for (auto i = 0; i < containers.size(); i++) { + auto containerConfig = containers.at(i).toObject(); + auto containerType = ContainerProps::containerFromString(containerConfig.value(config_key::container).toString()); + auto protocolConfig = containerConfig.value(ContainerProps::containerTypeToString(containerType)).toObject(); + + if (protocolConfig.value(config_key::last_config).toString().contains(clientId)) { + emit adminConfigRevoked(container); + } + } + } + + return errorCode; } ErrorCode ClientManagementModel::revokeOpenVpn(const int row, const DockerContainer container, diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index 6b6adf68..864bd297 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -32,6 +32,9 @@ public slots: protected: QHash roleNames() const override; +signals: + void adminConfigRevoked(const DockerContainer container); + private: bool isClientExists(const QString &clientId); diff --git a/client/ui/models/servers_model.cpp b/client/ui/models/servers_model.cpp index ad927fce..b8bfbbc5 100644 --- a/client/ui/models/servers_model.cpp +++ b/client/ui/models/servers_model.cpp @@ -479,6 +479,14 @@ void ServersModel::clearCachedProfiles() updateContainersModel(); } +void ServersModel::clearCachedProfile(const DockerContainer container) +{ + m_settings->clearLastConnectionConfig(m_currentlyProcessedServerIndex, container); + + m_servers.replace(m_currentlyProcessedServerIndex, m_settings->server(m_currentlyProcessedServerIndex)); + updateContainersModel(); +} + bool ServersModel::isAmneziaDnsContainerInstalled(const int serverIndex) { QJsonObject server = m_servers.at(serverIndex).toObject(); diff --git a/client/ui/models/servers_model.h b/client/ui/models/servers_model.h index 901605e2..af88febb 100644 --- a/client/ui/models/servers_model.h +++ b/client/ui/models/servers_model.h @@ -84,6 +84,7 @@ public slots: void addContainerConfig(const int containerIndex, const QJsonObject config); void clearCachedProfiles(); + void clearCachedProfile(const DockerContainer container); ErrorCode removeContainer(const int containerIndex); ErrorCode removeAllContainers(); From a68f19d72f4a1c673b864c0308024a97024f6736 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 24 Dec 2023 12:25:05 +0700 Subject: [PATCH 6/8] added migration from version 3 of client management to version 4 --- client/ui/models/clientManagementModel.cpp | 19 +++++++++++++++++++ client/ui/models/clientManagementModel.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 8ec31d02..81237917 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -45,6 +45,23 @@ QVariant ClientManagementModel::data(const QModelIndex &index, int role) const return QVariant(); } +void ClientManagementModel::migration(const QByteArray &clientsTableString) +{ + QJsonObject clientsTable = QJsonDocument::fromJson(clientsTableString).object(); + + for (auto &clientId : clientsTable.keys()) { + QJsonObject client; + client[configKey::clientId] = clientId; + + QJsonObject userData; + userData[configKey::clientName] = clientsTable.value(clientId).toObject().value(configKey::clientName); + client[configKey::userData] = userData; + + m_clientsTable.push_back(client); + } + +} + ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCredentials credentials) { beginResetModel(); @@ -67,6 +84,8 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr m_clientsTable = QJsonDocument::fromJson(clientsTableString).array(); if (m_clientsTable.isEmpty()) { + migration(clientsTableString); + int count = 0; if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index 6b6adf68..4bbe3e27 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -35,6 +35,8 @@ protected: private: bool isClientExists(const QString &clientId); + void migration(const QByteArray &clientsTableString); + ErrorCode revokeOpenVpn(const int row, const DockerContainer container, ServerCredentials credentials); ErrorCode revokeWireGuard(const int row, const DockerContainer container, ServerCredentials credentials); From 8f53d563a42f616f41f8474f50c931eb108fda2d Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 25 Dec 2023 22:49:24 +0700 Subject: [PATCH 7/8] moved the client table for cloak and ss to the openvpn folder --- client/ui/models/clientManagementModel.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 81237917..08a95353 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -71,8 +71,14 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr ErrorCode error = ErrorCode::NoError; - const QString clientsTableFile = - QString("/opt/amnezia/%1/clientsTable").arg(ContainerProps::containerTypeToString(container)); + QString clientsTableFile = QString("/opt/amnezia/%1/clientsTable"); + if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks + || container == DockerContainer::Cloak) { + clientsTableFile = clientsTableFile.arg(ContainerProps::containerTypeToString(DockerContainer::OpenVpn)); + } else { + clientsTableFile = clientsTableFile.arg(ContainerProps::containerTypeToString(container)); + } + const QByteArray clientsTableString = serverController.getTextFileFromContainer(container, credentials, clientsTableFile, &error); if (error != ErrorCode::NoError) { From 3e0a5104e799157f3d398b366a4ce7dc965cf5ee Mon Sep 17 00:00:00 2001 From: KsZnak Date: Mon, 25 Dec 2023 19:18:23 +0200 Subject: [PATCH 8/8] Update amneziavpn_ru.ts --- client/translations/amneziavpn_ru.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index af86594d..58171e67 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -196,7 +196,7 @@ Already installed containers were found on the server. All installed containers All containers from server '%1' have been removed - Все протоклы и сервисы были удалены с сервера '%1' + Все протоколы и сервисы были удалены с сервера '%1' @@ -1703,7 +1703,7 @@ and will not be shared or disclosed to the Amnezia or any third parties What is the level of internet control in your region? - Какой уровень контроля интеренета в вашем регионе? + Какой уровень контроля интернета в вашем регионе?