Skip to content

Commit dbe1a06

Browse files
authored
feat: pass uuid, appversion, osversion, app language to all gateway requests (#2944)
1 parent d251d5f commit dbe1a06

11 files changed

Lines changed: 213 additions & 241 deletions

client/cmake/sources.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ set(HEADERS ${HEADERS}
6464
${CLIENT_ROOT_DIR}/../common/crypto/cryptoUtils.h
6565
${CLIENT_ROOT_DIR}/ui/utils/qmlUtils.h
6666
${CLIENT_ROOT_DIR}/core/utils/api/apiUtils.h
67+
${CLIENT_ROOT_DIR}/core/utils/api/gatewayPayloadBuilder.h
6768
${CLIENT_ROOT_DIR}/core/utils/osSignalHandler.h
6869
${CLIENT_ROOT_DIR}/core/utils/utilities.h
6970
${CLIENT_ROOT_DIR}/core/utils/managementServer.h
@@ -147,6 +148,7 @@ set(SOURCES ${SOURCES}
147148
${CLIENT_ROOT_DIR}/../common/crypto/cryptoUtils.cpp
148149
${CLIENT_ROOT_DIR}/ui/utils/qmlUtils.cpp
149150
${CLIENT_ROOT_DIR}/core/utils/api/apiUtils.cpp
151+
${CLIENT_ROOT_DIR}/core/utils/api/gatewayPayloadBuilder.cpp
150152
${CLIENT_ROOT_DIR}/core/utils/serverConfigUtils.cpp
151153
${CLIENT_ROOT_DIR}/core/utils/osSignalHandler.cpp
152154
${CLIENT_ROOT_DIR}/core/utils/utilities.cpp

client/core/controllers/api/newsController.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#include "core/controllers/gatewayController.h"
44
#include "core/repositories/secureServersRepository.h"
5+
#include "core/utils/api/apiUtils.h"
6+
#include "core/utils/api/gatewayPayloadBuilder.h"
57
#include "core/utils/constants/apiKeys.h"
68
#include "core/utils/constants/apiConstants.h"
79
#include <QtConcurrent/QtConcurrent>
@@ -81,15 +83,12 @@ QFuture<QPair<ErrorCode, QJsonArray>> NewsController::fetchNews()
8183
m_appSettingsRepository->isStrictKillSwitchEnabled(),
8284
m_appSettingsRepository);
8385

84-
QJsonObject payload;
85-
payload.insert("locale", m_appSettingsRepository->getAppLanguage().name().split("_").first());
86-
87-
if (services.contains(apiDefs::key::userCountryCode)) {
88-
payload.insert(apiDefs::key::userCountryCode, services.value(apiDefs::key::userCountryCode));
89-
}
90-
if (services.contains(apiDefs::key::serviceType)) {
91-
payload.insert(apiDefs::key::serviceType, services.value(apiDefs::key::serviceType));
92-
}
86+
// both country codes and service types are arrays here, one entry per gateway stack the user has
87+
const QJsonObject payload = GatewayPayloadBuilder(m_appSettingsRepository)
88+
.addField(apiDefs::key::locale, apiUtils::getAppLanguageCode(m_appSettingsRepository))
89+
.addField(apiDefs::key::userCountryCode, services.value(apiDefs::key::userCountryCode))
90+
.addField(apiDefs::key::serviceType, services.value(apiDefs::key::serviceType))
91+
.build();
9392

9493
auto future = gatewayController->postAsync(QString("%1v1/news"), payload);
9594
return future.then([gatewayController](QPair<ErrorCode, QByteArray> result) -> QPair<ErrorCode, QJsonArray> {

client/core/controllers/api/servicesCatalogController.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#include "servicesCatalogController.h"
22

33
#include <QJsonDocument>
4-
#include <QSysInfo>
54
#include <QJsonArray>
65
#include <QEventLoop>
76
#include <QDebug>
@@ -11,6 +10,7 @@
1110
#include <limits>
1211

1312
#include "core/controllers/gatewayController.h"
13+
#include "core/utils/api/gatewayPayloadBuilder.h"
1414
#include "core/utils/serverConfigUtils.h"
1515
#include "core/utils/constants/apiKeys.h"
1616
#include "core/utils/constants/apiConstants.h"
@@ -212,11 +212,9 @@ ServicesCatalogController::ServicesCatalogController(SecureAppSettingsRepository
212212

213213
ErrorCode ServicesCatalogController::fillAvailableServices(QJsonObject &servicesData)
214214
{
215-
QJsonObject apiPayload;
216-
apiPayload[apiDefs::key::osVersion] = QSysInfo::productType();
217-
apiPayload[apiDefs::key::appVersion] = QString(APP_VERSION);
218-
apiPayload[apiDefs::key::cliName] = QString(APPLICATION_NAME);
219-
apiPayload[apiDefs::key::appLanguage] = m_appSettingsRepository->getAppLanguage().name().split("_").first();
215+
QJsonObject apiPayload = GatewayPayloadBuilder(m_appSettingsRepository)
216+
.addField(apiDefs::key::cliName, QString(APPLICATION_NAME))
217+
.build();
220218

221219
QByteArray responseBody;
222220
ErrorCode errorCode = executeRequest(QString("%1v1/services"), apiPayload, responseBody);

client/core/controllers/api/subscriptionController.cpp

Lines changed: 98 additions & 205 deletions
Large diffs are not rendered by default.

client/core/controllers/api/subscriptionController.h

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,6 @@ class SubscriptionController
2727
QString xrayUuid;
2828
};
2929

30-
struct GatewayRequestData
31-
{
32-
QString osVersion;
33-
QString appVersion;
34-
QString appLanguage;
35-
QString installationUuid;
36-
QString userCountryCode;
37-
QString serverCountryCode;
38-
QString serviceType;
39-
QString serviceProtocol;
40-
QJsonObject authData;
41-
42-
QJsonObject toJsonObject() const;
43-
};
44-
4530
struct CaptchaInfo {
4631
QString captchaId;
4732
QString captchaImageBase64;
@@ -53,7 +38,8 @@ class SubscriptionController
5338
SecureAppSettingsRepository* appSettingsRepository);
5439

5540
ProtocolData generateProtocolData(const QString &protocol);
56-
void appendProtocolDataToApiPayload(const QString &protocol, const ProtocolData &protocolData, QJsonObject &apiPayload);
41+
42+
static QString publicKeyForProtocol(const QString &protocol, const ProtocolData &protocolData);
5743

5844
ErrorCode importServiceFromGateway(const QString &userCountryCode, const QString &serviceType,
5945
const QString &serviceProtocol, const ProtocolData &protocolData,

client/core/controllers/updateController.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
#include <QUrl>
66
#include <QJsonDocument>
77
#include <QJsonObject>
8-
#include <QSysInfo>
98
#include <QTimer>
109

1110
#include "amneziaApplication.h"
1211
#include "logger.h"
1312
#include "version.h"
1413
#include "core/controllers/gatewayController.h"
14+
#include "core/utils/api/gatewayPayloadBuilder.h"
1515
#include "core/utils/constants/apiKeys.h"
1616
#include "core/utils/selfhosted/scriptsRegistry.h"
1717

@@ -98,10 +98,9 @@ void UpdateController::fetchGatewayUrl()
9898
m_appSettingsRepository->isStrictKillSwitchEnabled(),
9999
m_appSettingsRepository);
100100

101-
QJsonObject apiPayload;
102-
apiPayload[apiDefs::key::cliVersion] = QString(APP_VERSION);
103-
apiPayload[apiDefs::key::osVersion] = QSysInfo::productType();
104-
apiPayload[apiDefs::key::installationUuid] = m_appSettingsRepository->getInstallationUuid(true);
101+
QJsonObject apiPayload = GatewayPayloadBuilder(m_appSettingsRepository)
102+
.addField(apiDefs::key::cliVersion, QString(APP_VERSION))
103+
.build();
105104

106105
// Workaround: wait before contacting gateway to avoid rate limit triggered by other requests (news etc.)
107106
QTimer::singleShot(1000, this, [this, gatewayController, apiPayload]() {

client/core/utils/api/apiUtils.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "apiUtils.h"
22

3+
#include "core/repositories/secureAppSettingsRepository.h"
34
#include "core/utils/serverConfigUtils.h"
45
#include "core/utils/constants/configKeys.h"
56
#include <QDateTime>
@@ -48,6 +49,14 @@ namespace
4849
}
4950
}
5051

52+
QString apiUtils::getAppLanguageCode(const SecureAppSettingsRepository *appSettingsRepository)
53+
{
54+
if (appSettingsRepository == nullptr) {
55+
return {};
56+
}
57+
return appSettingsRepository->getAppLanguage().name().split("_").first();
58+
}
59+
5160
bool apiUtils::isSubscriptionExpired(const QString &subscriptionEndDate)
5261
{
5362
if (subscriptionEndDate.isEmpty()) {

client/core/utils/api/apiUtils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@
1111
#include "core/utils/routeModes.h"
1212
#include "core/utils/commonStructs.h"
1313

14+
class SecureAppSettingsRepository;
15+
1416
namespace apiUtils
1517
{
18+
QString getAppLanguageCode(const SecureAppSettingsRepository *appSettingsRepository);
19+
1620
bool isSubscriptionExpired(const QString &subscriptionEndDate);
1721

1822
bool isSubscriptionExpiringSoon(const QString &subscriptionEndDate, int withinDays = 30);
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include "gatewayPayloadBuilder.h"
2+
3+
#include <QJsonArray>
4+
#include <QSysInfo>
5+
6+
#include "core/repositories/secureAppSettingsRepository.h"
7+
#include "core/utils/api/apiUtils.h"
8+
#include "core/utils/constants/apiKeys.h"
9+
#include "version.h"
10+
11+
namespace
12+
{
13+
bool isEmptyValue(const QJsonValue &value)
14+
{
15+
switch (value.type()) {
16+
case QJsonValue::Null:
17+
case QJsonValue::Undefined:
18+
return true;
19+
case QJsonValue::String:
20+
return value.toString().isEmpty();
21+
case QJsonValue::Object:
22+
return value.toObject().isEmpty();
23+
case QJsonValue::Array:
24+
return value.toArray().isEmpty();
25+
default:
26+
return false;
27+
}
28+
}
29+
}
30+
31+
GatewayPayloadBuilder::GatewayPayloadBuilder(const SecureAppSettingsRepository *appSettingsRepository)
32+
{
33+
m_payload[apiDefs::key::osVersion] = QSysInfo::productType();
34+
m_payload[apiDefs::key::appVersion] = QString(APP_VERSION);
35+
36+
if (appSettingsRepository == nullptr) {
37+
qWarning() << "SecureAppSettingsRepository is null, skip app language and installation uuid";
38+
return;
39+
}
40+
41+
m_payload[apiDefs::key::appLanguage] = apiUtils::getAppLanguageCode(appSettingsRepository);
42+
m_payload[apiDefs::key::installationUuid] = appSettingsRepository->getInstallationUuid(true);
43+
}
44+
45+
GatewayPayloadBuilder &GatewayPayloadBuilder::addField(QLatin1String key, const QJsonValue &value)
46+
{
47+
if (!isEmptyValue(value)) {
48+
m_payload[key] = value;
49+
}
50+
return *this;
51+
}
52+
53+
QJsonObject GatewayPayloadBuilder::build() const
54+
{
55+
return m_payload;
56+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#ifndef GATEWAYPAYLOADBUILDER_H
2+
#define GATEWAYPAYLOADBUILDER_H
3+
4+
#include <QJsonObject>
5+
#include <QJsonValue>
6+
#include <QLatin1String>
7+
8+
class SecureAppSettingsRepository;
9+
10+
class GatewayPayloadBuilder
11+
{
12+
public:
13+
explicit GatewayPayloadBuilder(const SecureAppSettingsRepository *appSettingsRepository);
14+
15+
GatewayPayloadBuilder &addField(QLatin1String key, const QJsonValue &value);
16+
QJsonObject build() const;
17+
18+
private:
19+
QJsonObject m_payload;
20+
};
21+
22+
#endif // GATEWAYPAYLOADBUILDER_H

0 commit comments

Comments
 (0)