added getting the config from the cloud service

This commit is contained in:
vladimir.kuznetsov 2023-10-12 20:48:03 +05:00
parent 5c121ea48d
commit 25f8283edd
27 changed files with 399 additions and 139 deletions

View file

@ -0,0 +1,109 @@
#include "cloudController.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QEventLoop>
#include "configurators/openvpn_configurator.h"
CloudController::CloudController(const QSharedPointer<ServersModel> &serversModel,
const QSharedPointer<ContainersModel> &containersModel, QObject *parent)
: QObject(parent), m_serversModel(serversModel), m_containersModel(containersModel)
{
}
QString CloudController::genPublicKey(ServiceTypeId serviceTypeId)
{
switch (serviceTypeId)
{
case ServiceTypeId::AmneziaFreeRuWG: return ".";
case ServiceTypeId::AmneziaFreeRuCloak: return ".";
case ServiceTypeId::AmneziaFreeRuAWG: return ".";
case ServiceTypeId::AmneziaFreeRuReverseWG: return ".";
case ServiceTypeId::AmneziaFreeRuReverseCloak: return ".";
case ServiceTypeId::AmneziaFreeRuReverseAWG: return ".";
}
}
QString CloudController::genCertificateRequest(ServiceTypeId serviceTypeId)
{
switch (serviceTypeId)
{
case ServiceTypeId::AmneziaFreeRuWG: return "";
case ServiceTypeId::AmneziaFreeRuCloak: {
auto data = OpenVpnConfigurator::createCertRequest();
return data.request;
}
case ServiceTypeId::AmneziaFreeRuAWG: return "";
case ServiceTypeId::AmneziaFreeRuReverseWG: return "";
case ServiceTypeId::AmneziaFreeRuReverseCloak: return "";
case ServiceTypeId::AmneziaFreeRuReverseAWG: return "";
}
}
bool CloudController::updateServerConfigFromCloud()
{
auto serverConfig = m_serversModel->getDefaultServerConfig();
auto containerConfig = serverConfig.value(config_key::containers).toArray();
if (serverConfig.value(config_key::configVersion).toInt() && containerConfig.isEmpty()) {
QNetworkAccessManager manager;
QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QString endpoint = serverConfig.value(config_key::apiEdnpoint).toString();
request.setUrl(endpoint.replace("https", "http")); //
ServiceTypeId serviceTypeId = static_cast<ServiceTypeId>(serverConfig.value(config_key::serviceTypeId).toInt());
QJsonObject obj;
obj[config_key::serviceTypeId] = serviceTypeId;
obj[config_key::accessToken] = serverConfig.value(config_key::accessToken);
obj[config_key::publicKey] = genPublicKey(serviceTypeId);
obj[config_key::certificate] = genCertificateRequest(serviceTypeId);
QByteArray requestBody = QJsonDocument(obj).toJson();
QScopedPointer<QNetworkReply> reply;
reply.reset(manager.post(request, requestBody));
QEventLoop wait;
QObject::connect(reply.get(), &QNetworkReply::finished, &wait, &QEventLoop::quit);
wait.exec();
if(reply->error() == QNetworkReply::NoError){
QString contents = QString::fromUtf8(reply->readAll());
auto data = QJsonDocument::fromJson(contents.toUtf8()).object().value(config_key::config).toString();
data.replace("vpn://", "");
QByteArray ba = QByteArray::fromBase64(data.toUtf8(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
QByteArray ba_uncompressed = qUncompress(ba);
if (!ba_uncompressed.isEmpty()) {
ba = ba_uncompressed;
}
QJsonObject cloudConfig = QJsonDocument::fromJson(ba).object();
serverConfig.insert("cloudConfig", cloudConfig);
serverConfig.insert(config_key::dns1, cloudConfig.value(config_key::dns1));
serverConfig.insert(config_key::dns2, cloudConfig.value(config_key::dns2));
serverConfig.insert(config_key::containers, cloudConfig.value(config_key::containers));
serverConfig.insert(config_key::hostName, cloudConfig.value(config_key::hostName));
serverConfig.insert(config_key::defaultContainer, cloudConfig.value(config_key::defaultContainer));
m_serversModel->editServer(serverConfig);
emit serverConfigUpdated();
} else{
QString err = reply->errorString();
qDebug() << reply->error();
qDebug() << err;
qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
emit errorOccurred(tr("Error when retrieving configuration from cloud server"));
return false;
}
}
return true;
}

View file

@ -0,0 +1,43 @@
#ifndef CLOUDCONTROLLER_H
#define CLOUDCONTROLLER_H
#include <QObject>
#include "ui/models/containers_model.h"
#include "ui/models/servers_model.h"
class CloudController : public QObject
{
Q_OBJECT
enum ServiceTypeId
{
AmneziaFreeRuWG = 0,
AmneziaFreeRuCloak,
AmneziaFreeRuAWG,
AmneziaFreeRuReverseWG,
AmneziaFreeRuReverseCloak,
AmneziaFreeRuReverseAWG
};
public:
explicit CloudController(const QSharedPointer<ServersModel> &serversModel,
const QSharedPointer<ContainersModel> &containersModel, QObject *parent = nullptr);
public slots:
bool updateServerConfigFromCloud();
signals:
void errorOccurred(const QString &errorMessage);
void serverConfigUpdated();
private:
QString genPublicKey(ServiceTypeId serviceTypeId);
QString genCertificateRequest(ServiceTypeId serviceTypeId);
QSharedPointer<ServersModel> m_serversModel;
QSharedPointer<ContainersModel> m_containersModel;
};
#endif // CLOUDCONTROLLER_H

View file

@ -40,6 +40,7 @@ void ConnectionController::openConnection()
}
qApp->processEvents();
emit connectToVpn(serverIndex, credentials, container, containerConfig);
}

View file

@ -141,7 +141,9 @@ void ImportController::importConfig()
credentials.userName = m_config.value(config_key::userName).toString();
credentials.secretData = m_config.value(config_key::password).toString();
if (credentials.isValid() || m_config.contains(config_key::containers)) {
if (credentials.isValid()
|| m_config.contains(config_key::containers)
|| m_config.contains(config_key::configVersion)) { // todo
m_serversModel->addServer(m_config);
m_serversModel->setDefaultServerIndex(m_serversModel->getServersCount() - 1);
@ -167,7 +169,11 @@ QJsonObject ImportController::extractAmneziaConfig(QString &data)
ba = ba_uncompressed;
}
return QJsonDocument::fromJson(ba).object();
QJsonObject config = QJsonDocument::fromJson(ba).object();
qDebug() << config;
return config;
}
QJsonObject ImportController::extractOpenVpnConfig(const QString &data)

View file

@ -7,7 +7,7 @@
#include <QStandardPaths>
#include "core/errorstrings.h"
#include "core/servercontroller.h"
#include "core/controllers/serverController.h"
#include "utilities.h"
namespace