added getting the config from the cloud service
This commit is contained in:
parent
5c121ea48d
commit
25f8283edd
27 changed files with 399 additions and 139 deletions
109
client/ui/controllers/cloudController.cpp
Normal file
109
client/ui/controllers/cloudController.cpp
Normal 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;
|
||||
}
|
||||
43
client/ui/controllers/cloudController.h
Normal file
43
client/ui/controllers/cloudController.h
Normal 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
|
||||
|
|
@ -40,6 +40,7 @@ void ConnectionController::openConnection()
|
|||
}
|
||||
|
||||
qApp->processEvents();
|
||||
|
||||
emit connectToVpn(serverIndex, credentials, container, containerConfig);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#include <QStandardPaths>
|
||||
|
||||
#include "core/errorstrings.h"
|
||||
#include "core/servercontroller.h"
|
||||
#include "core/controllers/serverController.h"
|
||||
#include "utilities.h"
|
||||
|
||||
namespace
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue