From 7aa22227b5dd17f87037ce0b02f1608c4ca85a94 Mon Sep 17 00:00:00 2001 From: vkamn Date: Wed, 3 Jun 2026 17:09:02 +0800 Subject: [PATCH] fix: fixed revoke admin user --- .../ui/controllers/connectionUiController.cpp | 31 +++++++++++++++++++ .../ui/controllers/connectionUiController.h | 2 ++ client/ui/models/clientManagementModel.cpp | 2 ++ client/ui/models/clientManagementModel.h | 3 +- client/ui/qml/Pages2/PageShare.qml | 9 +++--- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/client/ui/controllers/connectionUiController.cpp b/client/ui/controllers/connectionUiController.cpp index 368e33fa2..3b23082f1 100644 --- a/client/ui/controllers/connectionUiController.cpp +++ b/client/ui/controllers/connectionUiController.cpp @@ -8,6 +8,8 @@ #include "amneziaApplication.h" #include "core/controllers/serversController.h" +#include "core/models/containerConfig.h" +#include "core/utils/containerEnum.h" ConnectionUiController::ConnectionUiController(ConnectionController* connectionController, ServersController* serversController, @@ -169,3 +171,32 @@ bool ConnectionUiController::isConnected() const { return m_isConnected; } + +bool ConnectionUiController::isRevokeBlockedDuringActiveConnection(const QString &serverId, int containerIndex, + const QString &clientId) const +{ + if (clientId.isEmpty() || (!isConnected() && !isConnectionInProgress())) { + return false; + } + + if (m_serversController->getDefaultServerId() != serverId) { + return false; + } + + if (static_cast(m_serversController->getDefaultContainer(serverId)) != containerIndex) { + return false; + } + + const auto adminConfig = m_serversController->selfHostedAdminConfig(serverId); + if (!adminConfig.has_value()) { + return false; + } + + const QString connectionClientId = + adminConfig->containerConfig(static_cast(containerIndex)).protocolConfig.clientId(); + if (connectionClientId.isEmpty()) { + return false; + } + + return connectionClientId == clientId || connectionClientId.contains(clientId); +} diff --git a/client/ui/controllers/connectionUiController.h b/client/ui/controllers/connectionUiController.h index cc82bb7b3..08c51692d 100644 --- a/client/ui/controllers/connectionUiController.h +++ b/client/ui/controllers/connectionUiController.h @@ -35,6 +35,8 @@ public slots: void openConnection(); void closeConnection(); + bool isRevokeBlockedDuringActiveConnection(const QString &serverId, int containerIndex, const QString &clientId) const; + ErrorCode getLastConnectionError(); void onConnectionStateChanged(Vpn::ConnectionState state); diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index ae982cc85..0346fdfff 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -27,6 +27,7 @@ QVariant ClientManagementModel::data(const QModelIndex &index, int role) const auto userData = client.value(configKey::userData).toObject(); switch (role) { + case ClientIdRole: return client.value(configKey::clientId).toString(); case ClientNameRole: return userData.value(configKey::clientName).toString(); case CreationDateRole: return userData.value(configKey::creationDate).toString(); case LatestHandshakeRole: return userData.value(configKey::latestHandshake).toString(); @@ -62,6 +63,7 @@ void ClientManagementModel::updateClientName(int row, const QString &newName) QHash ClientManagementModel::roleNames() const { QHash roles; + roles[ClientIdRole] = "clientId"; roles[ClientNameRole] = "clientName"; roles[CreationDateRole] = "creationDate"; roles[LatestHandshakeRole] = "latestHandshake"; diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index 13c7eb146..956e006a5 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -10,7 +10,8 @@ class ClientManagementModel : public QAbstractListModel public: enum Roles { - ClientNameRole = Qt::UserRole + 1, + ClientIdRole = Qt::UserRole + 1, + ClientNameRole, CreationDateRole, LatestHandshakeRole, DataReceivedRole, diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index 06ad01e78..20db93b62 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -851,11 +851,10 @@ PageType { var noButtonFunction = function() { } - var isActiveConfigForCurrentClient = ServersUiController.isDefaultServerCurrentlyProcessed() - && ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex - - if ((ConnectionController.isConnectionInProgress || ConnectionController.isConnected) - && isActiveConfigForCurrentClient) { + if (ConnectionController.isRevokeBlockedDuringActiveConnection( + ServersUiController.processedServerId, + ServersUiController.processedContainerIndex, + clientId)) { PageController.showNotificationMessage("Unable to revoke current config during active connection") } else { showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction)