amnezia-client/client/core/models/servers/serverConfig.cpp

167 lines
6.7 KiB
C++

#include "serverConfig.h"
#include <QJsonArray>
#include "apiV1ServerConfig.h"
#include "apiV2ServerConfig.h"
#include "containers/containers_defs.h"
#include "core/models/protocols/awgProtocolConfig.h"
#include "core/models/protocols/cloakProtocolConfig.h"
#include "core/models/protocols/openvpnProtocolConfig.h"
#include "core/models/protocols/protocolConfig.h"
#include "core/models/protocols/shadowsocksProtocolConfig.h"
#include "core/models/protocols/xrayProtocolConfig.h"
#include "protocols/protocols_defs.h"
#include "selfHostedServerConfig.h"
using namespace amnezia;
ServerConfig::ServerConfig(const QJsonObject &serverConfigObject)
{
type = static_cast<ServerConfigType>(serverConfigObject.value(config_key::configVersion).toInt(0));
hostName = serverConfigObject.value(config_key::hostName).toString();
dns1 = serverConfigObject.value(config_key::dns1).toString();
dns2 = serverConfigObject.value(config_key::dns2).toString();
defaultContainer = serverConfigObject.value(config_key::defaultContainer).toString();
crc = serverConfigObject.value(config_key::crc).toInt(0);
nameOverriddenByUser = serverConfigObject.value(config_key::nameOverriddenByUser).toBool(false);
auto containers = serverConfigObject.value(config_key::containers).toArray();
for (const auto &container : std::as_const(containers)) {
auto containerObject = container.toObject();
auto containerName = containerObject.value(config_key::container).toString();
ContainerConfig containerConfig;
containerConfig.containerName = containerName;
auto protocols = ContainerProps::protocolsForContainer(ContainerProps::containerFromString(containerName));
for (const auto &protocol : protocols) {
auto protocolName = ProtocolProps::protoToString(protocol);
auto protocolConfigObject = containerObject.value(protocolName).toObject();
switch (protocol) {
case Proto::OpenVpn: {
containerConfig.protocolConfigs.insert(protocolName,
QSharedPointer<OpenVpnProtocolConfig>::create(protocolConfigObject, protocolName));
break;
}
case Proto::ShadowSocks: {
containerConfig.protocolConfigs.insert(
protocolName, QSharedPointer<ShadowsocksProtocolConfig>::create(protocolConfigObject, protocolName));
break;
}
case Proto::Cloak: {
containerConfig.protocolConfigs.insert(protocolName,
QSharedPointer<CloakProtocolConfig>::create(protocolConfigObject, protocolName));
break;
}
case Proto::WireGuard: {
containerConfig.protocolConfigs.insert(protocolName,
QSharedPointer<WireGuardProtocolConfig>::create(protocolConfigObject, protocolName));
break;
}
case Proto::Awg: {
containerConfig.protocolConfigs.insert(protocolName,
QSharedPointer<AwgProtocolConfig>::create(protocolConfigObject, protocolName));
break;
}
case Proto::Xray: {
containerConfig.protocolConfigs.insert(protocolName,
QSharedPointer<XrayProtocolConfig>::create(protocolConfigObject, protocolName));
break;
}
case Proto::Ikev2: break;
case Proto::L2tp: break;
case Proto::SSXray: break;
case Proto::TorWebSite: break;
case Proto::Dns: break;
case Proto::Sftp: break;
case Proto::Socks5Proxy: break;
default: break;
}
}
containerConfigs.insert(containerName, containerConfig);
}
}
QSharedPointer<ServerConfig> ServerConfig::createServerConfig(const QJsonObject &serverConfigObject)
{
auto type = static_cast<ServerConfigType>(serverConfigObject.value(config_key::configVersion).toInt(0));
switch (type) {
case ServerConfigType::SelfHosted: return QSharedPointer<SelfHostedServerConfig>::create(serverConfigObject);
case ServerConfigType::ApiV1: return QSharedPointer<ApiV1ServerConfig>::create(serverConfigObject);
case ServerConfigType::ApiV2: return QSharedPointer<ApiV2ServerConfig>::create(serverConfigObject);
}
}
ServerConfigVariant ServerConfig::getServerConfigVariant(const QSharedPointer<ServerConfig> &serverConfig)
{
ServerConfigVariant variant;
switch (serverConfig->type) {
case amnezia::ServerConfigType::SelfHosted: variant = qSharedPointerCast<SelfHostedServerConfig>(serverConfig); break;
case amnezia::ServerConfigType::ApiV1: variant = qSharedPointerCast<ApiV1ServerConfig>(serverConfig); break;
case amnezia::ServerConfigType::ApiV2: variant = qSharedPointerCast<ApiV2ServerConfig>(serverConfig); break;
}
return variant;
}
QJsonObject ServerConfig::toJson() const
{
QJsonObject json;
if (type != ServerConfigType::SelfHosted) {
json[config_key::configVersion] = static_cast<int>(type);
}
if (!hostName.isEmpty()) {
json[config_key::hostName] = hostName;
}
if (!dns1.isEmpty()) {
json[config_key::dns1] = dns1;
}
if (!dns2.isEmpty()) {
json[config_key::dns2] = dns2;
}
if (!defaultContainer.isEmpty()) {
json[config_key::defaultContainer] = defaultContainer;
}
if (!containerConfigs.isEmpty()) {
QJsonArray containersArray;
for (const auto &containerConfig : containerConfigs) {
QJsonObject containerObject;
containerObject[config_key::container] = containerConfig.containerName;
if (!containerConfig.protocolConfigs.isEmpty()) {
for (const auto &protocolConfig : containerConfig.protocolConfigs) {
QJsonObject protocolJson = protocolConfig->toJson();
if (!protocolJson.isEmpty()) {
containerObject[protocolConfig->protocolName] = protocolJson;
}
}
}
containersArray.append(containerObject);
}
if (!containersArray.isEmpty()) {
json[config_key::containers] = containersArray;
}
}
return json;
}
void ServerConfig::updateProtocolConfig(const QString &containerName, const QMap<QString, QSharedPointer<ProtocolConfig>> &protocolConfigs)
{
if (containerConfigs.contains(containerName)) {
ContainerConfig &containerConfig = containerConfigs[containerName];
containerConfig.protocolConfigs = protocolConfigs;
}
}