Skip to content

Commit

Permalink
feature: added page to revoke active devices
Browse files Browse the repository at this point in the history
  • Loading branch information
Nethius committed Feb 27, 2025
1 parent b352a6c commit a336db6
Show file tree
Hide file tree
Showing 12 changed files with 322 additions and 7 deletions.
6 changes: 5 additions & 1 deletion client/core/controllers/coreController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,9 @@ void CoreController::initModels()

m_apiAccountInfoModel.reset(new ApiAccountInfoModel(this));
m_engine->rootContext()->setContextProperty("ApiAccountInfoModel", m_apiAccountInfoModel.get());

m_apiDevicesModel.reset(new ApiDevicesModel(this));
m_engine->rootContext()->setContextProperty("ApiDevicesModel", m_apiDevicesModel.get());
}

void CoreController::initControllers()
Expand Down Expand Up @@ -132,7 +135,8 @@ void CoreController::initControllers()
m_systemController.reset(new SystemController(m_settings));
m_engine->rootContext()->setContextProperty("SystemController", m_systemController.get());

m_apiSettingsController.reset(new ApiSettingsController(m_serversModel, m_apiAccountInfoModel, m_apiCountryModel, m_settings));
m_apiSettingsController.reset(
new ApiSettingsController(m_serversModel, m_apiAccountInfoModel, m_apiCountryModel, m_apiDevicesModel, m_settings));
m_engine->rootContext()->setContextProperty("ApiSettingsController", m_apiSettingsController.get());

m_apiConfigsController.reset(new ApiConfigsController(m_serversModel, m_apiServicesModel, m_settings));
Expand Down
4 changes: 3 additions & 1 deletion client/core/controllers/coreController.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@
#include "ui/models/protocols/ikev2ConfigModel.h"
#endif
#include "ui/models/api/apiAccountInfoModel.h"
#include "ui/models/api/apiServicesModel.h"
#include "ui/models/api/apiCountryModel.h"
#include "ui/models/api/apiDevicesModel.h"
#include "ui/models/api/apiServicesModel.h"
#include "ui/models/appSplitTunnelingModel.h"
#include "ui/models/clientManagementModel.h"
#include "ui/models/protocols/awgConfigModel.h"
Expand Down Expand Up @@ -117,6 +118,7 @@ class CoreController : public QObject
QSharedPointer<ApiServicesModel> m_apiServicesModel;
QSharedPointer<ApiCountryModel> m_apiCountryModel;
QSharedPointer<ApiAccountInfoModel> m_apiAccountInfoModel;
QSharedPointer<ApiDevicesModel> m_apiDevicesModel;

QScopedPointer<OpenVpnConfigModel> m_openVpnConfigModel;
QScopedPointer<ShadowSocksConfigModel> m_shadowSocksConfigModel;
Expand Down
1 change: 1 addition & 0 deletions client/resources.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@
<file>ui/qml/Pages2/PageSettingsApiSupport.qml</file>
<file>ui/qml/Pages2/PageSettingsApiInstructions.qml</file>
<file>ui/qml/Pages2/PageSettingsApiNativeConfigs.qml</file>
<file>ui/qml/Pages2/PageSettingsApiDevices.qml</file>
</qresource>
<qresource prefix="/countriesFlags">
<file>images/flagKit/ZW.svg</file>
Expand Down
42 changes: 41 additions & 1 deletion client/ui/controllers/api/apiConfigsController.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "apiConfigsController.h"

#include <QEventLoop>
#include <QClipboard>
#include <QEventLoop>

#include "amnezia_application.h"
#include "configurators/wireguard_configurator.h"
Expand Down Expand Up @@ -251,6 +251,7 @@ bool ApiConfigsController::updateServiceFromGateway(const int serverIndex, const

newServerConfig.insert(configKey::apiConfig, newApiConfig);
newServerConfig.insert(configKey::authData, authData);
// newServerConfig.insert(

m_serversModel->editServer(newServerConfig, serverIndex);
if (reloadServiceConfig) {
Expand Down Expand Up @@ -354,6 +355,45 @@ bool ApiConfigsController::deactivateDevice()
return true;
}

bool ApiConfigsController::deactivateExternalDevice(const QString &uuid, const QString &serverCountryCode)
{
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs);

auto serverIndex = m_serversModel->getProcessedServerIndex();
auto serverConfigObject = m_serversModel->getServerConfig(serverIndex);
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();

if (apiUtils::getConfigType(serverConfigObject) != apiDefs::ConfigType::AmneziaPremiumV2) {
return true;
}

QString protocol = apiConfigObject.value(configKey::serviceProtocol).toString();
ApiPayloadData apiPayloadData = generateApiPayloadData(protocol);

QJsonObject apiPayload = fillApiPayload(protocol, apiPayloadData);
apiPayload[configKey::userCountryCode] = apiConfigObject.value(configKey::userCountryCode);
apiPayload[configKey::serverCountryCode] = serverCountryCode;
apiPayload[configKey::serviceType] = apiConfigObject.value(configKey::serviceType);
apiPayload[configKey::authData] = serverConfigObject.value(configKey::authData);
apiPayload[configKey::uuid] = uuid;

QByteArray responseBody;
ErrorCode errorCode = gatewayController.post(QString("%1v1/revoke_config"), apiPayload, responseBody);
if (errorCode != ErrorCode::NoError && errorCode != ErrorCode::ApiNotFoundError) {
emit errorOccurred(errorCode);
return false;
}

if (uuid == m_settings->getInstallationUuid(true)) {
serverConfigObject.remove(config_key::containers);
m_serversModel->editServer(serverConfigObject, serverIndex);
}

emit externalDeviceDeactivated();

return true;
}

bool ApiConfigsController::isConfigValid()
{
int serverIndex = m_serversModel->getDefaultServerIndex();
Expand Down
3 changes: 3 additions & 0 deletions client/ui/controllers/api/apiConfigsController.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public slots:
bool reloadServiceConfig = false);
bool updateServiceFromTelegram(const int serverIndex);
bool deactivateDevice();
bool deactivateExternalDevice(const QString &uuid, const QString &serverCountryCode);

bool isConfigValid();

Expand All @@ -44,6 +45,8 @@ public slots:

void vpnKeyExportReady();

void externalDeviceDeactivated();

private:
struct ApiPayloadData
{
Expand Down
8 changes: 8 additions & 0 deletions client/ui/controllers/api/apiSettingsController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@ namespace
ApiSettingsController::ApiSettingsController(const QSharedPointer<ServersModel> &serversModel,
const QSharedPointer<ApiAccountInfoModel> &apiAccountInfoModel,
const QSharedPointer<ApiCountryModel> &apiCountryModel,
const QSharedPointer<ApiDevicesModel> &apiDevicesModel,
const std::shared_ptr<Settings> &settings, QObject *parent)
: QObject(parent),
m_serversModel(serversModel),
m_apiAccountInfoModel(apiAccountInfoModel),
m_apiCountryModel(apiCountryModel),
m_apiDevicesModel(apiDevicesModel),
m_settings(settings)
{
}
Expand Down Expand Up @@ -73,6 +75,7 @@ bool ApiSettingsController::getAccountInfo(bool reload)

if (reload) {
updateApiCountryModel();
updateApiDevicesModel();
}

return true;
Expand All @@ -83,3 +86,8 @@ void ApiSettingsController::updateApiCountryModel()
m_apiCountryModel->updateModel(m_apiAccountInfoModel->getAvailableCountries(), "");
m_apiCountryModel->updateIssuedConfigsInfo(m_apiAccountInfoModel->getIssuedConfigsInfo());
}

void ApiSettingsController::updateApiDevicesModel()
{
m_apiDevicesModel->updateModel(m_apiAccountInfoModel->getIssuedConfigsInfo());
}
7 changes: 5 additions & 2 deletions client/ui/controllers/api/apiSettingsController.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,22 @@

#include "ui/models/api/apiAccountInfoModel.h"
#include "ui/models/api/apiCountryModel.h"
#include "ui/models/api/apiDevicesModel.h"
#include "ui/models/servers_model.h"

class ApiSettingsController : public QObject
{
Q_OBJECT
public:
ApiSettingsController(const QSharedPointer<ServersModel> &serversModel, const QSharedPointer<ApiAccountInfoModel> &apiAccountInfoModel,
const QSharedPointer<ApiCountryModel> &apiCountryModel, const std::shared_ptr<Settings> &settings,
QObject *parent = nullptr);
const QSharedPointer<ApiCountryModel> &apiCountryModel, const QSharedPointer<ApiDevicesModel> &apiDevicesModel,
const std::shared_ptr<Settings> &settings, QObject *parent = nullptr);
~ApiSettingsController();

public slots:
bool getAccountInfo(bool reload);
void updateApiCountryModel();
void updateApiDevicesModel();

signals:
void errorOccurred(ErrorCode errorCode);
Expand All @@ -27,6 +29,7 @@ public slots:
QSharedPointer<ServersModel> m_serversModel;
QSharedPointer<ApiAccountInfoModel> m_apiAccountInfoModel;
QSharedPointer<ApiCountryModel> m_apiCountryModel;
QSharedPointer<ApiDevicesModel> m_apiDevicesModel;

std::shared_ptr<Settings> m_settings;
};
Expand Down
1 change: 1 addition & 0 deletions client/ui/controllers/pageController.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ namespace PageLoader
PageSettingsApiSupport,
PageSettingsApiInstructions,
PageSettingsApiNativeConfigs,
PageSettingsApiDevices,

PageServiceSftpSettings,
PageServiceTorWebsiteSettings,
Expand Down
82 changes: 82 additions & 0 deletions client/ui/models/api/apiDevicesModel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#include "apiDevicesModel.h"

#include <QJsonObject>

#include "core/api/apiDefs.h"
#include "logger.h"

namespace
{
Logger logger("ApiDevicesModel");

constexpr QLatin1String gatewayAccount("gateway_account");
}

ApiDevicesModel::ApiDevicesModel(QObject *parent) : QAbstractListModel(parent)
{
}

int ApiDevicesModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return m_issuedConfigs.size();
}

QVariant ApiDevicesModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() < 0 || index.row() >= static_cast<int>(rowCount()))
return QVariant();

IssuedConfigInfo issuedConfigInfo = m_issuedConfigs.at(index.row());

switch (role) {
case OsVersionRole: {
return issuedConfigInfo.osVersion;
}
case SupportTagRole: {
return issuedConfigInfo.installationUuid;
}
case CountryCodeRole: {
return issuedConfigInfo.countryCode;
}
}

return QVariant();
}

void ApiDevicesModel::updateModel(const QJsonArray &issuedConfigs)
{
beginResetModel();

m_issuedConfigs.clear();
for (int i = 0; i < issuedConfigs.size(); i++) {
IssuedConfigInfo issuedConfigInfo;
QJsonObject issuedConfigObject = issuedConfigs.at(i).toObject();

if (issuedConfigObject.value(apiDefs::key::sourceType).toString() != gatewayAccount) {
continue;
}

issuedConfigInfo.installationUuid = issuedConfigObject.value(apiDefs::key::installationUuid).toString();
issuedConfigInfo.workerLastUpdated = issuedConfigObject.value(apiDefs::key::workerLastUpdated).toString();
issuedConfigInfo.lastDownloaded = issuedConfigObject.value(apiDefs::key::lastDownloaded).toString();
issuedConfigInfo.sourceType = issuedConfigObject.value(apiDefs::key::sourceType).toString();
issuedConfigInfo.osVersion = issuedConfigObject.value(apiDefs::key::osVersion).toString();

issuedConfigInfo.countryName = issuedConfigObject.value(apiDefs::key::serverCountryName).toString();
issuedConfigInfo.countryCode = issuedConfigObject.value(apiDefs::key::serverCountryCode).toString();

m_issuedConfigs.push_back(issuedConfigInfo);
}

endResetModel();
}

QHash<int, QByteArray> ApiDevicesModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[OsVersionRole] = "osVersion";
roles[SupportTagRole] = "supportTag";
roles[CountryCodeRole] = "countryCode";
return roles;
}
46 changes: 46 additions & 0 deletions client/ui/models/api/apiDevicesModel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#ifndef APIDEVICESMODEL_H
#define APIDEVICESMODEL_H

#include <QAbstractListModel>
#include <QJsonArray>
#include <QVector>

class ApiDevicesModel : public QAbstractListModel
{
Q_OBJECT

public:
enum Roles {
OsVersionRole = Qt::UserRole + 1,
SupportTagRole,
CountryCodeRole
};

explicit ApiDevicesModel(QObject *parent = nullptr);

int rowCount(const QModelIndex &parent = QModelIndex()) const override;

QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

public slots:
void updateModel(const QJsonArray &issuedConfigs);

protected:
QHash<int, QByteArray> roleNames() const override;

private:
struct IssuedConfigInfo
{
QString installationUuid;
QString workerLastUpdated;
QString lastDownloaded;
QString sourceType;
QString osVersion;

QString countryName;
QString countryCode;
};

QVector<IssuedConfigInfo> m_issuedConfigs;
};
#endif // APIDEVICESMODEL_H
Loading

0 comments on commit a336db6

Please sign in to comment.