refactoring: moved shared code into reusable functions for ApiConfigsController
This commit is contained in:
parent
d3715d00ae
commit
a77387cc4b
2 changed files with 256 additions and 221 deletions
|
@ -35,10 +35,6 @@ namespace
|
||||||
constexpr char serviceInfo[] = "service_info";
|
constexpr char serviceInfo[] = "service_info";
|
||||||
constexpr char serviceProtocol[] = "service_protocol";
|
constexpr char serviceProtocol[] = "service_protocol";
|
||||||
|
|
||||||
constexpr char aesKey[] = "aes_key";
|
|
||||||
constexpr char aesIv[] = "aes_iv";
|
|
||||||
constexpr char aesSalt[] = "aes_salt";
|
|
||||||
|
|
||||||
constexpr char apiPayload[] = "api_payload";
|
constexpr char apiPayload[] = "api_payload";
|
||||||
constexpr char keyPayload[] = "key_payload";
|
constexpr char keyPayload[] = "key_payload";
|
||||||
|
|
||||||
|
@ -47,411 +43,93 @@ namespace
|
||||||
|
|
||||||
constexpr char config[] = "config";
|
constexpr char config[] = "config";
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ApiConfigsController::ApiConfigsController(const QSharedPointer<ServersModel> &serversModel,
|
struct ProtocolData
|
||||||
const QSharedPointer<ApiServicesModel> &apiServicesModel,
|
{
|
||||||
const std::shared_ptr<Settings> &settings, QObject *parent)
|
OpenVpnConfigurator::ConnectionData certRequest;
|
||||||
: QObject(parent), m_serversModel(serversModel), m_apiServicesModel(apiServicesModel), m_settings(settings)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApiConfigsController::exportNativeConfig(const QString &serverCountryCode, const QString &fileName)
|
QString wireGuardClientPrivKey;
|
||||||
{
|
QString wireGuardClientPubKey;
|
||||||
if (fileName.isEmpty()) {
|
};
|
||||||
emit errorOccurred(ErrorCode::PermissionsError);
|
|
||||||
return false;
|
struct GatewayRequestData
|
||||||
|
{
|
||||||
|
QString osVersion;
|
||||||
|
QString appVersion;
|
||||||
|
|
||||||
|
QString installationUuid;
|
||||||
|
|
||||||
|
QString userCountryCode;
|
||||||
|
QString serverCountryCode;
|
||||||
|
QString serviceType;
|
||||||
|
QString serviceProtocol;
|
||||||
|
|
||||||
|
QJsonObject authData;
|
||||||
|
|
||||||
|
QJsonObject toJsonObject() const
|
||||||
|
{
|
||||||
|
QJsonObject obj;
|
||||||
|
if (!osVersion.isEmpty()) {
|
||||||
|
obj[configKey::osVersion] = osVersion;
|
||||||
}
|
}
|
||||||
|
if (!appVersion.isEmpty()) {
|
||||||
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
obj[configKey::appVersion] = appVersion;
|
||||||
m_settings->isStrictKillSwitchEnabled());
|
|
||||||
|
|
||||||
auto serverConfigObject = m_serversModel->getServerConfig(m_serversModel->getProcessedServerIndex());
|
|
||||||
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
|
||||||
|
|
||||||
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[apiDefs::key::cliVersion] = QString(APP_VERSION);
|
|
||||||
|
|
||||||
QByteArray responseBody;
|
|
||||||
ErrorCode errorCode = gatewayController.post(QString("%1v1/native_config"), apiPayload, responseBody);
|
|
||||||
if (errorCode != ErrorCode::NoError) {
|
|
||||||
emit errorOccurred(errorCode);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
if (!installationUuid.isEmpty()) {
|
||||||
QJsonObject jsonConfig = QJsonDocument::fromJson(responseBody).object();
|
obj[configKey::uuid] = installationUuid;
|
||||||
QString nativeConfig = jsonConfig.value(configKey::config).toString();
|
|
||||||
nativeConfig.replace("$WIREGUARD_CLIENT_PRIVATE_KEY", apiPayloadData.wireGuardClientPrivKey);
|
|
||||||
|
|
||||||
SystemController::saveFile(fileName, nativeConfig);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApiConfigsController::revokeNativeConfig(const QString &serverCountryCode)
|
|
||||||
{
|
|
||||||
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
|
||||||
m_settings->isStrictKillSwitchEnabled());
|
|
||||||
|
|
||||||
auto serverConfigObject = m_serversModel->getServerConfig(m_serversModel->getProcessedServerIndex());
|
|
||||||
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
|
||||||
|
|
||||||
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[apiDefs::key::cliVersion] = QString(APP_VERSION);
|
|
||||||
|
|
||||||
QByteArray responseBody;
|
|
||||||
ErrorCode errorCode = gatewayController.post(QString("%1v1/revoke_native_config"), apiPayload, responseBody);
|
|
||||||
if (errorCode != ErrorCode::NoError && errorCode != ErrorCode::ApiNotFoundError) {
|
|
||||||
emit errorOccurred(errorCode);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
return true;
|
if (!userCountryCode.isEmpty()) {
|
||||||
}
|
obj[configKey::userCountryCode] = userCountryCode;
|
||||||
|
|
||||||
void ApiConfigsController::prepareVpnKeyExport()
|
|
||||||
{
|
|
||||||
auto serverConfigObject = m_serversModel->getServerConfig(m_serversModel->getProcessedServerIndex());
|
|
||||||
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
|
||||||
|
|
||||||
auto vpnKey = apiConfigObject.value(apiDefs::key::vpnKey).toString();
|
|
||||||
m_vpnKey = vpnKey;
|
|
||||||
|
|
||||||
vpnKey.replace("vpn://", "");
|
|
||||||
|
|
||||||
m_qrCodes = qrCodeUtils::generateQrCodeImageSeries(vpnKey.toUtf8());
|
|
||||||
|
|
||||||
emit vpnKeyExportReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ApiConfigsController::copyVpnKeyToClipboard()
|
|
||||||
{
|
|
||||||
auto clipboard = amnApp->getClipboard();
|
|
||||||
clipboard->setText(m_vpnKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApiConfigsController::fillAvailableServices()
|
|
||||||
{
|
|
||||||
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
|
||||||
m_settings->isStrictKillSwitchEnabled());
|
|
||||||
|
|
||||||
QJsonObject apiPayload;
|
|
||||||
apiPayload[configKey::osVersion] = QSysInfo::productType();
|
|
||||||
|
|
||||||
QByteArray responseBody;
|
|
||||||
ErrorCode errorCode = gatewayController.post(QString("%1v1/services"), apiPayload, responseBody);
|
|
||||||
if (errorCode == ErrorCode::NoError) {
|
|
||||||
if (!responseBody.contains("services")) {
|
|
||||||
errorCode = ErrorCode::ApiServicesMissingError;
|
|
||||||
}
|
}
|
||||||
|
if (!serverCountryCode.isEmpty()) {
|
||||||
|
obj[configKey::serverCountryCode] = serverCountryCode;
|
||||||
}
|
}
|
||||||
|
if (!serviceType.isEmpty()) {
|
||||||
if (errorCode != ErrorCode::NoError) {
|
obj[configKey::serviceType] = serviceType;
|
||||||
emit errorOccurred(errorCode);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
if (!serviceProtocol.isEmpty()) {
|
||||||
QJsonObject data = QJsonDocument::fromJson(responseBody).object();
|
obj[configKey::serviceProtocol] = serviceProtocol;
|
||||||
m_apiServicesModel->updateModel(data);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApiConfigsController::importServiceFromGateway()
|
|
||||||
{
|
|
||||||
if (m_serversModel->isServerFromApiAlreadyExists(m_apiServicesModel->getCountryCode(), m_apiServicesModel->getSelectedServiceType(),
|
|
||||||
m_apiServicesModel->getSelectedServiceProtocol())) {
|
|
||||||
emit errorOccurred(ErrorCode::ApiConfigAlreadyAdded);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
|
||||||
m_settings->isStrictKillSwitchEnabled());
|
|
||||||
|
|
||||||
auto installationUuid = m_settings->getInstallationUuid(true);
|
|
||||||
auto userCountryCode = m_apiServicesModel->getCountryCode();
|
|
||||||
auto serviceType = m_apiServicesModel->getSelectedServiceType();
|
|
||||||
auto serviceProtocol = m_apiServicesModel->getSelectedServiceProtocol();
|
|
||||||
|
|
||||||
ApiPayloadData apiPayloadData = generateApiPayloadData(serviceProtocol);
|
|
||||||
|
|
||||||
QJsonObject apiPayload = fillApiPayload(serviceProtocol, apiPayloadData);
|
|
||||||
apiPayload[configKey::userCountryCode] = userCountryCode;
|
|
||||||
apiPayload[configKey::serviceType] = serviceType;
|
|
||||||
apiPayload[configKey::uuid] = installationUuid;
|
|
||||||
apiPayload[apiDefs::key::cliVersion] = QString(APP_VERSION);
|
|
||||||
|
|
||||||
QByteArray responseBody;
|
|
||||||
ErrorCode errorCode = gatewayController.post(QString("%1v1/config"), apiPayload, responseBody);
|
|
||||||
|
|
||||||
QJsonObject serverConfig;
|
|
||||||
if (errorCode == ErrorCode::NoError) {
|
|
||||||
fillServerConfig(serviceProtocol, apiPayloadData, responseBody, serverConfig);
|
|
||||||
|
|
||||||
QJsonObject apiConfig = serverConfig.value(configKey::apiConfig).toObject();
|
|
||||||
apiConfig.insert(configKey::userCountryCode, m_apiServicesModel->getCountryCode());
|
|
||||||
apiConfig.insert(configKey::serviceType, m_apiServicesModel->getSelectedServiceType());
|
|
||||||
apiConfig.insert(configKey::serviceProtocol, m_apiServicesModel->getSelectedServiceProtocol());
|
|
||||||
|
|
||||||
serverConfig.insert(configKey::apiConfig, apiConfig);
|
|
||||||
|
|
||||||
m_serversModel->addServer(serverConfig);
|
|
||||||
emit installServerFromApiFinished(tr("%1 installed successfully.").arg(m_apiServicesModel->getSelectedServiceName()));
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
emit errorOccurred(errorCode);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApiConfigsController::updateServiceFromGateway(const int serverIndex, const QString &newCountryCode, const QString &newCountryName,
|
|
||||||
bool reloadServiceConfig)
|
|
||||||
{
|
|
||||||
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
|
||||||
m_settings->isStrictKillSwitchEnabled());
|
|
||||||
|
|
||||||
auto serverConfig = m_serversModel->getServerConfig(serverIndex);
|
|
||||||
auto apiConfig = serverConfig.value(configKey::apiConfig).toObject();
|
|
||||||
auto authData = serverConfig.value(configKey::authData).toObject();
|
|
||||||
|
|
||||||
auto installationUuid = m_settings->getInstallationUuid(true);
|
|
||||||
auto userCountryCode = apiConfig.value(configKey::userCountryCode).toString();
|
|
||||||
auto serviceType = apiConfig.value(configKey::serviceType).toString();
|
|
||||||
auto serviceProtocol = apiConfig.value(configKey::serviceProtocol).toString();
|
|
||||||
|
|
||||||
ApiPayloadData apiPayloadData = generateApiPayloadData(serviceProtocol);
|
|
||||||
|
|
||||||
QJsonObject apiPayload = fillApiPayload(serviceProtocol, apiPayloadData);
|
|
||||||
apiPayload[configKey::userCountryCode] = userCountryCode;
|
|
||||||
apiPayload[configKey::serviceType] = serviceType;
|
|
||||||
apiPayload[configKey::uuid] = installationUuid;
|
|
||||||
apiPayload[apiDefs::key::cliVersion] = QString(APP_VERSION);
|
|
||||||
|
|
||||||
if (!newCountryCode.isEmpty()) {
|
|
||||||
apiPayload[configKey::serverCountryCode] = newCountryCode;
|
|
||||||
}
|
}
|
||||||
if (!authData.isEmpty()) {
|
if (!authData.isEmpty()) {
|
||||||
apiPayload[configKey::authData] = authData;
|
obj[configKey::authData] = authData;
|
||||||
}
|
}
|
||||||
|
return obj;
|
||||||
QByteArray responseBody;
|
|
||||||
ErrorCode errorCode = gatewayController.post(QString("%1v1/config"), apiPayload, responseBody);
|
|
||||||
|
|
||||||
QJsonObject newServerConfig;
|
|
||||||
if (errorCode == ErrorCode::NoError) {
|
|
||||||
fillServerConfig(serviceProtocol, apiPayloadData, responseBody, newServerConfig);
|
|
||||||
|
|
||||||
QJsonObject newApiConfig = newServerConfig.value(configKey::apiConfig).toObject();
|
|
||||||
newApiConfig.insert(configKey::userCountryCode, apiConfig.value(configKey::userCountryCode));
|
|
||||||
newApiConfig.insert(configKey::serviceType, apiConfig.value(configKey::serviceType));
|
|
||||||
newApiConfig.insert(configKey::serviceProtocol, apiConfig.value(configKey::serviceProtocol));
|
|
||||||
newApiConfig.insert(apiDefs::key::vpnKey, apiConfig.value(apiDefs::key::vpnKey));
|
|
||||||
|
|
||||||
newServerConfig.insert(configKey::apiConfig, newApiConfig);
|
|
||||||
newServerConfig.insert(configKey::authData, authData);
|
|
||||||
|
|
||||||
m_serversModel->editServer(newServerConfig, serverIndex);
|
|
||||||
if (reloadServiceConfig) {
|
|
||||||
emit reloadServerFromApiFinished(tr("API config reloaded"));
|
|
||||||
} else if (newCountryName.isEmpty()) {
|
|
||||||
emit updateServerFromApiFinished();
|
|
||||||
} else {
|
|
||||||
emit changeApiCountryFinished(tr("Successfully changed the country of connection to %1").arg(newCountryName));
|
|
||||||
}
|
}
|
||||||
return true;
|
};
|
||||||
} else {
|
|
||||||
emit errorOccurred(errorCode);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApiConfigsController::updateServiceFromTelegram(const int serverIndex)
|
ProtocolData generateProtocolData(const QString &protocol)
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_IOS
|
ProtocolData protocolData;
|
||||||
IosController::Instance()->requestInetAccess();
|
|
||||||
QThread::msleep(10);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
|
||||||
m_settings->isStrictKillSwitchEnabled());
|
|
||||||
|
|
||||||
auto serverConfig = m_serversModel->getServerConfig(serverIndex);
|
|
||||||
auto installationUuid = m_settings->getInstallationUuid(true);
|
|
||||||
|
|
||||||
QString serviceProtocol = serverConfig.value(configKey::protocol).toString();
|
|
||||||
ApiPayloadData apiPayloadData = generateApiPayloadData(serviceProtocol);
|
|
||||||
|
|
||||||
QJsonObject apiPayload = fillApiPayload(serviceProtocol, apiPayloadData);
|
|
||||||
apiPayload[configKey::uuid] = installationUuid;
|
|
||||||
apiPayload[configKey::accessToken] = serverConfig.value(configKey::accessToken).toString();
|
|
||||||
apiPayload[configKey::apiEndpoint] = serverConfig.value(configKey::apiEndpoint).toString();
|
|
||||||
|
|
||||||
QByteArray responseBody;
|
|
||||||
ErrorCode errorCode = gatewayController.post(QString("%1v1/proxy_config"), apiPayload, responseBody);
|
|
||||||
|
|
||||||
if (errorCode == ErrorCode::NoError) {
|
|
||||||
fillServerConfig(serviceProtocol, apiPayloadData, responseBody, serverConfig);
|
|
||||||
|
|
||||||
m_serversModel->editServer(serverConfig, serverIndex);
|
|
||||||
emit updateServerFromApiFinished();
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
emit errorOccurred(errorCode);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApiConfigsController::deactivateDevice()
|
|
||||||
{
|
|
||||||
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
|
||||||
m_settings->isStrictKillSwitchEnabled());
|
|
||||||
|
|
||||||
auto serverIndex = m_serversModel->getProcessedServerIndex();
|
|
||||||
auto serverConfigObject = m_serversModel->getServerConfig(serverIndex);
|
|
||||||
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
|
||||||
|
|
||||||
if (!apiUtils::isPremiumServer(serverConfigObject)) {
|
|
||||||
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] = apiConfigObject.value(configKey::serverCountryCode);
|
|
||||||
apiPayload[configKey::serviceType] = apiConfigObject.value(configKey::serviceType);
|
|
||||||
apiPayload[configKey::authData] = serverConfigObject.value(configKey::authData);
|
|
||||||
apiPayload[configKey::uuid] = m_settings->getInstallationUuid(true);
|
|
||||||
apiPayload[apiDefs::key::cliVersion] = QString(APP_VERSION);
|
|
||||||
|
|
||||||
QByteArray responseBody;
|
|
||||||
ErrorCode errorCode = gatewayController.post(QString("%1v1/revoke_config"), apiPayload, responseBody);
|
|
||||||
if (errorCode != ErrorCode::NoError && errorCode != ErrorCode::ApiNotFoundError) {
|
|
||||||
emit errorOccurred(errorCode);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
serverConfigObject.remove(config_key::containers);
|
|
||||||
m_serversModel->editServer(serverConfigObject, serverIndex);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApiConfigsController::deactivateExternalDevice(const QString &uuid, const QString &serverCountryCode)
|
|
||||||
{
|
|
||||||
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
|
||||||
m_settings->isStrictKillSwitchEnabled());
|
|
||||||
|
|
||||||
auto serverIndex = m_serversModel->getProcessedServerIndex();
|
|
||||||
auto serverConfigObject = m_serversModel->getServerConfig(serverIndex);
|
|
||||||
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
|
||||||
|
|
||||||
if (!apiUtils::isPremiumServer(serverConfigObject)) {
|
|
||||||
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;
|
|
||||||
apiPayload[apiDefs::key::cliVersion] = QString(APP_VERSION);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApiConfigsController::isConfigValid()
|
|
||||||
{
|
|
||||||
int serverIndex = m_serversModel->getDefaultServerIndex();
|
|
||||||
QJsonObject serverConfigObject = m_serversModel->getServerConfig(serverIndex);
|
|
||||||
auto configSource = apiUtils::getConfigSource(serverConfigObject);
|
|
||||||
|
|
||||||
if (configSource == apiDefs::ConfigSource::Telegram
|
|
||||||
&& !m_serversModel->data(serverIndex, ServersModel::Roles::HasInstalledContainers).toBool()) {
|
|
||||||
m_serversModel->removeApiConfig(serverIndex);
|
|
||||||
return updateServiceFromTelegram(serverIndex);
|
|
||||||
} else if (configSource == apiDefs::ConfigSource::AmneziaGateway
|
|
||||||
&& !m_serversModel->data(serverIndex, ServersModel::Roles::HasInstalledContainers).toBool()) {
|
|
||||||
return updateServiceFromGateway(serverIndex, "", "");
|
|
||||||
} else if (configSource && m_serversModel->isApiKeyExpired(serverIndex)) {
|
|
||||||
qDebug() << "attempt to update api config by expires_at event";
|
|
||||||
if (configSource == apiDefs::ConfigSource::AmneziaGateway) {
|
|
||||||
return updateServiceFromGateway(serverIndex, "", "");
|
|
||||||
} else {
|
|
||||||
m_serversModel->removeApiConfig(serverIndex);
|
|
||||||
return updateServiceFromTelegram(serverIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ApiConfigsController::ApiPayloadData ApiConfigsController::generateApiPayloadData(const QString &protocol)
|
|
||||||
{
|
|
||||||
ApiConfigsController::ApiPayloadData apiPayload;
|
|
||||||
if (protocol == configKey::cloak) {
|
if (protocol == configKey::cloak) {
|
||||||
apiPayload.certRequest = OpenVpnConfigurator::createCertRequest();
|
protocolData.certRequest = OpenVpnConfigurator::createCertRequest();
|
||||||
} else if (protocol == configKey::awg) {
|
} else if (protocol == configKey::awg) {
|
||||||
auto connData = WireguardConfigurator::genClientKeys();
|
auto connData = WireguardConfigurator::genClientKeys();
|
||||||
apiPayload.wireGuardClientPubKey = connData.clientPubKey;
|
protocolData.wireGuardClientPubKey = connData.clientPubKey;
|
||||||
apiPayload.wireGuardClientPrivKey = connData.clientPrivKey;
|
protocolData.wireGuardClientPrivKey = connData.clientPrivKey;
|
||||||
|
}
|
||||||
|
return protocolData;
|
||||||
}
|
}
|
||||||
return apiPayload;
|
|
||||||
}
|
|
||||||
|
|
||||||
QJsonObject ApiConfigsController::fillApiPayload(const QString &protocol, const ApiPayloadData &apiPayloadData)
|
void appendProtocolDataToApiPayload(const QString &protocol, const ProtocolData &protocolData, QJsonObject &apiPayload)
|
||||||
{
|
{
|
||||||
QJsonObject obj;
|
|
||||||
if (protocol == configKey::cloak) {
|
if (protocol == configKey::cloak) {
|
||||||
obj[configKey::certificate] = apiPayloadData.certRequest.request;
|
apiPayload[configKey::certificate] = protocolData.certRequest.request;
|
||||||
} else if (protocol == configKey::awg) {
|
} else if (protocol == configKey::awg) {
|
||||||
obj[configKey::publicKey] = apiPayloadData.wireGuardClientPubKey;
|
apiPayload[configKey::publicKey] = protocolData.wireGuardClientPubKey;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
obj[configKey::osVersion] = QSysInfo::productType();
|
ErrorCode fillServerConfig(const QString &protocol, const ProtocolData &apiPayloadData, const QByteArray &apiResponseBody,
|
||||||
obj[configKey::appVersion] = QString(APP_VERSION);
|
QJsonObject &serverConfig)
|
||||||
|
{
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ApiConfigsController::fillServerConfig(const QString &protocol, const ApiPayloadData &apiPayloadData,
|
|
||||||
const QByteArray &apiResponseBody, QJsonObject &serverConfig)
|
|
||||||
{
|
|
||||||
QString data = QJsonDocument::fromJson(apiResponseBody).object().value(config_key::config).toString();
|
QString data = QJsonDocument::fromJson(apiResponseBody).object().value(config_key::config).toString();
|
||||||
|
|
||||||
data.replace("vpn://", "");
|
data.replace("vpn://", "");
|
||||||
QByteArray ba = QByteArray::fromBase64(data.toUtf8(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
|
QByteArray ba = QByteArray::fromBase64(data.toUtf8(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
|
||||||
|
|
||||||
if (ba.isEmpty()) {
|
if (ba.isEmpty()) {
|
||||||
emit errorOccurred(ErrorCode::ApiConfigEmptyError);
|
qDebug() << "empty vpn key";
|
||||||
return;
|
return ErrorCode::ApiConfigEmptyError;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray ba_uncompressed = qUncompress(ba);
|
QByteArray ba_uncompressed = qUncompress(ba);
|
||||||
|
@ -468,7 +146,8 @@ void ApiConfigsController::fillServerConfig(const QString &protocol, const ApiPa
|
||||||
auto newServerConfig = QJsonDocument::fromJson(configStr.toUtf8()).object();
|
auto newServerConfig = QJsonDocument::fromJson(configStr.toUtf8()).object();
|
||||||
auto containers = newServerConfig.value(config_key::containers).toArray();
|
auto containers = newServerConfig.value(config_key::containers).toArray();
|
||||||
if (containers.isEmpty()) {
|
if (containers.isEmpty()) {
|
||||||
return; // todo process error
|
qDebug() << "missing containers field";
|
||||||
|
return ErrorCode::ApiConfigEmptyError;
|
||||||
}
|
}
|
||||||
auto container = containers.at(0).toObject();
|
auto container = containers.at(0).toObject();
|
||||||
QString containerName = ContainerProps::containerTypeToString(DockerContainer::Awg);
|
QString containerName = ContainerProps::containerTypeToString(DockerContainer::Awg);
|
||||||
|
@ -509,12 +188,372 @@ void ApiConfigsController::fillServerConfig(const QString &protocol, const ApiPa
|
||||||
auto apiConfig = QJsonObject::fromVariantMap(map);
|
auto apiConfig = QJsonObject::fromVariantMap(map);
|
||||||
|
|
||||||
if (newServerConfig.value(config_key::configVersion).toInt() == apiDefs::ConfigSource::AmneziaGateway) {
|
if (newServerConfig.value(config_key::configVersion).toInt() == apiDefs::ConfigSource::AmneziaGateway) {
|
||||||
apiConfig.insert(configKey::serviceInfo, QJsonDocument::fromJson(apiResponseBody).object().value(configKey::serviceInfo).toObject());
|
apiConfig.insert(configKey::serviceInfo,
|
||||||
|
QJsonDocument::fromJson(apiResponseBody).object().value(configKey::serviceInfo).toObject());
|
||||||
}
|
}
|
||||||
|
|
||||||
serverConfig[configKey::apiConfig] = apiConfig;
|
serverConfig[configKey::apiConfig] = apiConfig;
|
||||||
|
|
||||||
return;
|
return ErrorCode::NoError;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ApiConfigsController::ApiConfigsController(const QSharedPointer<ServersModel> &serversModel,
|
||||||
|
const QSharedPointer<ApiServicesModel> &apiServicesModel,
|
||||||
|
const std::shared_ptr<Settings> &settings, QObject *parent)
|
||||||
|
: QObject(parent), m_serversModel(serversModel), m_apiServicesModel(apiServicesModel), m_settings(settings)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiConfigsController::exportNativeConfig(const QString &serverCountryCode, const QString &fileName)
|
||||||
|
{
|
||||||
|
if (fileName.isEmpty()) {
|
||||||
|
emit errorOccurred(ErrorCode::PermissionsError);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto serverConfigObject = m_serversModel->getServerConfig(m_serversModel->getProcessedServerIndex());
|
||||||
|
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
||||||
|
|
||||||
|
GatewayRequestData gatewayRequestData { QSysInfo::productType(),
|
||||||
|
QString(APP_VERSION),
|
||||||
|
m_settings->getInstallationUuid(true),
|
||||||
|
apiConfigObject.value(configKey::userCountryCode).toString(),
|
||||||
|
serverCountryCode,
|
||||||
|
apiConfigObject.value(configKey::serviceType).toString(),
|
||||||
|
m_apiServicesModel->getSelectedServiceProtocol(),
|
||||||
|
serverConfigObject.value(configKey::authData).toObject() };
|
||||||
|
|
||||||
|
QString protocol = apiConfigObject.value(configKey::serviceProtocol).toString();
|
||||||
|
ProtocolData protocolData = generateProtocolData(protocol);
|
||||||
|
|
||||||
|
QJsonObject apiPayload = gatewayRequestData.toJsonObject();
|
||||||
|
appendProtocolDataToApiPayload(gatewayRequestData.serviceProtocol, protocolData, apiPayload);
|
||||||
|
|
||||||
|
QByteArray responseBody;
|
||||||
|
ErrorCode errorCode = executeRequest(QString("%1v1/native_config"), apiPayload, responseBody);
|
||||||
|
if (errorCode != ErrorCode::NoError) {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonObject jsonConfig = QJsonDocument::fromJson(responseBody).object();
|
||||||
|
QString nativeConfig = jsonConfig.value(configKey::config).toString();
|
||||||
|
nativeConfig.replace("$WIREGUARD_CLIENT_PRIVATE_KEY", protocolData.wireGuardClientPrivKey);
|
||||||
|
|
||||||
|
SystemController::saveFile(fileName, nativeConfig);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiConfigsController::revokeNativeConfig(const QString &serverCountryCode)
|
||||||
|
{
|
||||||
|
auto serverConfigObject = m_serversModel->getServerConfig(m_serversModel->getProcessedServerIndex());
|
||||||
|
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
||||||
|
|
||||||
|
GatewayRequestData gatewayRequestData { QSysInfo::productType(),
|
||||||
|
QString(APP_VERSION),
|
||||||
|
m_settings->getInstallationUuid(true),
|
||||||
|
apiConfigObject.value(configKey::userCountryCode).toString(),
|
||||||
|
serverCountryCode,
|
||||||
|
apiConfigObject.value(configKey::serviceType).toString(),
|
||||||
|
m_apiServicesModel->getSelectedServiceProtocol(),
|
||||||
|
serverConfigObject.value(configKey::authData).toObject() };
|
||||||
|
|
||||||
|
QJsonObject apiPayload = gatewayRequestData.toJsonObject();
|
||||||
|
|
||||||
|
QByteArray responseBody;
|
||||||
|
ErrorCode errorCode = executeRequest(QString("%1v1/revoke_native_config"), apiPayload, responseBody);
|
||||||
|
if (errorCode != ErrorCode::NoError && errorCode != ErrorCode::ApiNotFoundError) {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApiConfigsController::prepareVpnKeyExport()
|
||||||
|
{
|
||||||
|
auto serverConfigObject = m_serversModel->getServerConfig(m_serversModel->getProcessedServerIndex());
|
||||||
|
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
||||||
|
|
||||||
|
auto vpnKey = apiConfigObject.value(apiDefs::key::vpnKey).toString();
|
||||||
|
m_vpnKey = vpnKey;
|
||||||
|
|
||||||
|
vpnKey.replace("vpn://", "");
|
||||||
|
|
||||||
|
m_qrCodes = qrCodeUtils::generateQrCodeImageSeries(vpnKey.toUtf8());
|
||||||
|
|
||||||
|
emit vpnKeyExportReady();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApiConfigsController::copyVpnKeyToClipboard()
|
||||||
|
{
|
||||||
|
auto clipboard = amnApp->getClipboard();
|
||||||
|
clipboard->setText(m_vpnKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiConfigsController::fillAvailableServices()
|
||||||
|
{
|
||||||
|
QJsonObject apiPayload;
|
||||||
|
apiPayload[configKey::osVersion] = QSysInfo::productType();
|
||||||
|
|
||||||
|
QByteArray responseBody;
|
||||||
|
ErrorCode errorCode = executeRequest(QString("%1v1/services"), apiPayload, responseBody);
|
||||||
|
if (errorCode == ErrorCode::NoError) {
|
||||||
|
if (!responseBody.contains("services")) {
|
||||||
|
errorCode = ErrorCode::ApiServicesMissingError;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errorCode != ErrorCode::NoError) {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonObject data = QJsonDocument::fromJson(responseBody).object();
|
||||||
|
m_apiServicesModel->updateModel(data);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiConfigsController::importServiceFromGateway()
|
||||||
|
{
|
||||||
|
GatewayRequestData gatewayRequestData { QSysInfo::productType(),
|
||||||
|
QString(APP_VERSION),
|
||||||
|
m_settings->getInstallationUuid(true),
|
||||||
|
m_apiServicesModel->getCountryCode(),
|
||||||
|
"",
|
||||||
|
m_apiServicesModel->getSelectedServiceType(),
|
||||||
|
m_apiServicesModel->getSelectedServiceProtocol(),
|
||||||
|
QJsonObject() };
|
||||||
|
|
||||||
|
if (m_serversModel->isServerFromApiAlreadyExists(gatewayRequestData.userCountryCode, gatewayRequestData.serviceType,
|
||||||
|
gatewayRequestData.serviceProtocol)) {
|
||||||
|
emit errorOccurred(ErrorCode::ApiConfigAlreadyAdded);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProtocolData protocolData = generateProtocolData(gatewayRequestData.serviceProtocol);
|
||||||
|
|
||||||
|
QJsonObject apiPayload = gatewayRequestData.toJsonObject();
|
||||||
|
appendProtocolDataToApiPayload(gatewayRequestData.serviceProtocol, protocolData, apiPayload);
|
||||||
|
|
||||||
|
QByteArray responseBody;
|
||||||
|
ErrorCode errorCode = executeRequest(QString("%1v1/config"), apiPayload, responseBody);
|
||||||
|
|
||||||
|
QJsonObject serverConfig;
|
||||||
|
if (errorCode == ErrorCode::NoError) {
|
||||||
|
errorCode = fillServerConfig(gatewayRequestData.serviceProtocol, protocolData, responseBody, serverConfig);
|
||||||
|
if (errorCode != ErrorCode::NoError) {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonObject apiConfig = serverConfig.value(configKey::apiConfig).toObject();
|
||||||
|
apiConfig.insert(configKey::userCountryCode, m_apiServicesModel->getCountryCode());
|
||||||
|
apiConfig.insert(configKey::serviceType, m_apiServicesModel->getSelectedServiceType());
|
||||||
|
apiConfig.insert(configKey::serviceProtocol, m_apiServicesModel->getSelectedServiceProtocol());
|
||||||
|
|
||||||
|
serverConfig.insert(configKey::apiConfig, apiConfig);
|
||||||
|
|
||||||
|
m_serversModel->addServer(serverConfig);
|
||||||
|
emit installServerFromApiFinished(tr("%1 installed successfully.").arg(m_apiServicesModel->getSelectedServiceName()));
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiConfigsController::updateServiceFromGateway(const int serverIndex, const QString &newCountryCode, const QString &newCountryName,
|
||||||
|
bool reloadServiceConfig)
|
||||||
|
{
|
||||||
|
auto serverConfig = m_serversModel->getServerConfig(serverIndex);
|
||||||
|
auto apiConfig = serverConfig.value(configKey::apiConfig).toObject();
|
||||||
|
|
||||||
|
GatewayRequestData gatewayRequestData { QSysInfo::productType(),
|
||||||
|
QString(APP_VERSION),
|
||||||
|
m_settings->getInstallationUuid(true),
|
||||||
|
apiConfig.value(configKey::userCountryCode).toString(),
|
||||||
|
newCountryCode,
|
||||||
|
apiConfig.value(configKey::serviceType).toString(),
|
||||||
|
apiConfig.value(configKey::serviceProtocol).toString(),
|
||||||
|
serverConfig.value(configKey::authData).toObject() };
|
||||||
|
|
||||||
|
ProtocolData protocolData = generateProtocolData(gatewayRequestData.serviceProtocol);
|
||||||
|
|
||||||
|
QJsonObject apiPayload = gatewayRequestData.toJsonObject();
|
||||||
|
appendProtocolDataToApiPayload(gatewayRequestData.serviceProtocol, protocolData, apiPayload);
|
||||||
|
|
||||||
|
QByteArray responseBody;
|
||||||
|
ErrorCode errorCode = executeRequest(QString("%1v1/config"), apiPayload, responseBody);
|
||||||
|
|
||||||
|
QJsonObject newServerConfig;
|
||||||
|
if (errorCode == ErrorCode::NoError) {
|
||||||
|
errorCode = fillServerConfig(gatewayRequestData.serviceProtocol, protocolData, responseBody, newServerConfig);
|
||||||
|
if (errorCode != ErrorCode::NoError) {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonObject newApiConfig = newServerConfig.value(configKey::apiConfig).toObject();
|
||||||
|
newApiConfig.insert(configKey::userCountryCode, apiConfig.value(configKey::userCountryCode));
|
||||||
|
newApiConfig.insert(configKey::serviceType, apiConfig.value(configKey::serviceType));
|
||||||
|
newApiConfig.insert(configKey::serviceProtocol, apiConfig.value(configKey::serviceProtocol));
|
||||||
|
newApiConfig.insert(apiDefs::key::vpnKey, apiConfig.value(apiDefs::key::vpnKey));
|
||||||
|
|
||||||
|
newServerConfig.insert(configKey::apiConfig, newApiConfig);
|
||||||
|
newServerConfig.insert(configKey::authData, gatewayRequestData.authData);
|
||||||
|
|
||||||
|
m_serversModel->editServer(newServerConfig, serverIndex);
|
||||||
|
if (reloadServiceConfig) {
|
||||||
|
emit reloadServerFromApiFinished(tr("API config reloaded"));
|
||||||
|
} else if (newCountryName.isEmpty()) {
|
||||||
|
emit updateServerFromApiFinished();
|
||||||
|
} else {
|
||||||
|
emit changeApiCountryFinished(tr("Successfully changed the country of connection to %1").arg(newCountryName));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiConfigsController::updateServiceFromTelegram(const int serverIndex)
|
||||||
|
{
|
||||||
|
#ifdef Q_OS_IOS
|
||||||
|
IosController::Instance()->requestInetAccess();
|
||||||
|
QThread::msleep(10);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
||||||
|
m_settings->isStrictKillSwitchEnabled());
|
||||||
|
|
||||||
|
auto serverConfig = m_serversModel->getServerConfig(serverIndex);
|
||||||
|
auto installationUuid = m_settings->getInstallationUuid(true);
|
||||||
|
|
||||||
|
QString serviceProtocol = serverConfig.value(configKey::protocol).toString();
|
||||||
|
ProtocolData protocolData = generateProtocolData(serviceProtocol);
|
||||||
|
|
||||||
|
QJsonObject apiPayload;
|
||||||
|
appendProtocolDataToApiPayload(serviceProtocol, protocolData, apiPayload);
|
||||||
|
apiPayload[configKey::uuid] = installationUuid;
|
||||||
|
apiPayload[configKey::osVersion] = QSysInfo::productType();
|
||||||
|
apiPayload[configKey::appVersion] = QString(APP_VERSION);
|
||||||
|
apiPayload[configKey::accessToken] = serverConfig.value(configKey::accessToken).toString();
|
||||||
|
apiPayload[configKey::apiEndpoint] = serverConfig.value(configKey::apiEndpoint).toString();
|
||||||
|
|
||||||
|
QByteArray responseBody;
|
||||||
|
ErrorCode errorCode = gatewayController.post(QString("%1v1/proxy_config"), apiPayload, responseBody);
|
||||||
|
|
||||||
|
if (errorCode == ErrorCode::NoError) {
|
||||||
|
errorCode = fillServerConfig(serviceProtocol, protocolData, responseBody, serverConfig);
|
||||||
|
if (errorCode != ErrorCode::NoError) {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_serversModel->editServer(serverConfig, serverIndex);
|
||||||
|
emit updateServerFromApiFinished();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiConfigsController::deactivateDevice()
|
||||||
|
{
|
||||||
|
auto serverIndex = m_serversModel->getProcessedServerIndex();
|
||||||
|
auto serverConfigObject = m_serversModel->getServerConfig(serverIndex);
|
||||||
|
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
||||||
|
|
||||||
|
if (!apiUtils::isPremiumServer(serverConfigObject)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GatewayRequestData gatewayRequestData { QSysInfo::productType(),
|
||||||
|
QString(APP_VERSION),
|
||||||
|
m_settings->getInstallationUuid(true),
|
||||||
|
apiConfigObject.value(configKey::userCountryCode).toString(),
|
||||||
|
apiConfigObject.value(configKey::serverCountryCode).toString(),
|
||||||
|
apiConfigObject.value(configKey::serviceType).toString(),
|
||||||
|
"",
|
||||||
|
serverConfigObject.value(configKey::authData).toObject() };
|
||||||
|
|
||||||
|
QJsonObject apiPayload = gatewayRequestData.toJsonObject();
|
||||||
|
|
||||||
|
QByteArray responseBody;
|
||||||
|
ErrorCode errorCode = executeRequest(QString("%1v1/revoke_config"), apiPayload, responseBody);
|
||||||
|
if (errorCode != ErrorCode::NoError && errorCode != ErrorCode::ApiNotFoundError) {
|
||||||
|
emit errorOccurred(errorCode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
serverConfigObject.remove(config_key::containers);
|
||||||
|
m_serversModel->editServer(serverConfigObject, serverIndex);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiConfigsController::deactivateExternalDevice(const QString &uuid, const QString &serverCountryCode)
|
||||||
|
{
|
||||||
|
auto serverIndex = m_serversModel->getProcessedServerIndex();
|
||||||
|
auto serverConfigObject = m_serversModel->getServerConfig(serverIndex);
|
||||||
|
auto apiConfigObject = serverConfigObject.value(configKey::apiConfig).toObject();
|
||||||
|
|
||||||
|
if (!apiUtils::isPremiumServer(serverConfigObject)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GatewayRequestData gatewayRequestData { QSysInfo::productType(),
|
||||||
|
QString(APP_VERSION),
|
||||||
|
uuid,
|
||||||
|
apiConfigObject.value(configKey::userCountryCode).toString(),
|
||||||
|
serverCountryCode,
|
||||||
|
apiConfigObject.value(configKey::serviceType).toString(),
|
||||||
|
"",
|
||||||
|
serverConfigObject.value(configKey::authData).toObject() };
|
||||||
|
|
||||||
|
QJsonObject apiPayload = gatewayRequestData.toJsonObject();
|
||||||
|
|
||||||
|
QByteArray responseBody;
|
||||||
|
ErrorCode errorCode = executeRequest(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);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApiConfigsController::isConfigValid()
|
||||||
|
{
|
||||||
|
int serverIndex = m_serversModel->getDefaultServerIndex();
|
||||||
|
QJsonObject serverConfigObject = m_serversModel->getServerConfig(serverIndex);
|
||||||
|
auto configSource = apiUtils::getConfigSource(serverConfigObject);
|
||||||
|
|
||||||
|
if (configSource == apiDefs::ConfigSource::Telegram
|
||||||
|
&& !m_serversModel->data(serverIndex, ServersModel::Roles::HasInstalledContainers).toBool()) {
|
||||||
|
m_serversModel->removeApiConfig(serverIndex);
|
||||||
|
return updateServiceFromTelegram(serverIndex);
|
||||||
|
} else if (configSource == apiDefs::ConfigSource::AmneziaGateway
|
||||||
|
&& !m_serversModel->data(serverIndex, ServersModel::Roles::HasInstalledContainers).toBool()) {
|
||||||
|
return updateServiceFromGateway(serverIndex, "", "");
|
||||||
|
} else if (configSource && m_serversModel->isApiKeyExpired(serverIndex)) {
|
||||||
|
qDebug() << "attempt to update api config by expires_at event";
|
||||||
|
if (configSource == apiDefs::ConfigSource::AmneziaGateway) {
|
||||||
|
return updateServiceFromGateway(serverIndex, "", "");
|
||||||
|
} else {
|
||||||
|
m_serversModel->removeApiConfig(serverIndex);
|
||||||
|
return updateServiceFromTelegram(serverIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<QString> ApiConfigsController::getQrCodes()
|
QList<QString> ApiConfigsController::getQrCodes()
|
||||||
|
@ -531,3 +570,10 @@ QString ApiConfigsController::getVpnKey()
|
||||||
{
|
{
|
||||||
return m_vpnKey;
|
return m_vpnKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorCode ApiConfigsController::executeRequest(const QString &endpoint, const QJsonObject &apiPayload, QByteArray &responseBody)
|
||||||
|
{
|
||||||
|
GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs,
|
||||||
|
m_settings->isStrictKillSwitchEnabled());
|
||||||
|
return gatewayController.post(endpoint, apiPayload, responseBody);
|
||||||
|
}
|
||||||
|
|
|
@ -46,23 +46,12 @@ signals:
|
||||||
void vpnKeyExportReady();
|
void vpnKeyExportReady();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct ApiPayloadData
|
|
||||||
{
|
|
||||||
OpenVpnConfigurator::ConnectionData certRequest;
|
|
||||||
|
|
||||||
QString wireGuardClientPrivKey;
|
|
||||||
QString wireGuardClientPubKey;
|
|
||||||
};
|
|
||||||
|
|
||||||
ApiPayloadData generateApiPayloadData(const QString &protocol);
|
|
||||||
QJsonObject fillApiPayload(const QString &protocol, const ApiPayloadData &apiPayloadData);
|
|
||||||
void fillServerConfig(const QString &protocol, const ApiPayloadData &apiPayloadData, const QByteArray &apiResponseBody,
|
|
||||||
QJsonObject &serverConfig);
|
|
||||||
|
|
||||||
QList<QString> getQrCodes();
|
QList<QString> getQrCodes();
|
||||||
int getQrCodesCount();
|
int getQrCodesCount();
|
||||||
QString getVpnKey();
|
QString getVpnKey();
|
||||||
|
|
||||||
|
ErrorCode executeRequest(const QString &endpoint, const QJsonObject &apiPayload, QByteArray &responseBody);
|
||||||
|
|
||||||
QList<QString> m_qrCodes;
|
QList<QString> m_qrCodes;
|
||||||
QString m_vpnKey;
|
QString m_vpnKey;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue