diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 4d3722262..e9c378692 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -322,6 +322,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 9930926f1..9209f4cdb 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -48,6 +48,22 @@ 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 containerConfig = containers.at(i).toObject(); + auto containerType = ContainerProps::containerFromString(containerConfig.value(config_key::container).toString()); + + for (auto protocol : ContainerProps::protocolsForContainer(containerType)) { + auto protocolConfig = containerConfig.value(ProtocolProps::protoToString(protocol)).toObject(); + + protocolConfig.remove(config_key::last_config); + containerConfig[ProtocolProps::protoToString(protocol)] = protocolConfig; + } + + containers.replace(i, containerConfig); + } + config[config_key::containers] = containers; + QByteArray compressedConfig = QJsonDocument(config).toJson(); compressedConfig = qCompress(compressedConfig, 8); m_config = QString("vpn://%1") diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 8ec31d02f..15c23229b 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 6b6adf682..864bd2970 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 ad927fceb..b8bfbbc5b 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 901605e29..af88febb8 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();