Files
amnezia-client/client/configurators/vpn_configurator.cpp
T

128 lines
5.0 KiB
C++
Raw Normal View History

2021-05-10 02:33:31 +03:00
#include "vpn_configurator.h"
#include "cloak_configurator.h"
2021-10-04 19:07:49 +03:00
#include "ikev2_configurator.h"
#include "openvpn_configurator.h"
#include "shadowsocks_configurator.h"
2022-08-25 17:35:28 +03:00
#include "ssh_configurator.h"
#include "wireguard_configurator.h"
2023-09-30 16:05:23 -04:00
#include "awg_configurator.h"
2021-05-10 02:33:31 +03:00
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
2021-05-10 02:33:31 +03:00
2021-09-09 20:15:44 +03:00
#include "containers/containers_defs.h"
2022-08-25 17:35:28 +03:00
#include "settings.h"
#include "utilities.h"
2021-05-10 02:33:31 +03:00
VpnConfigurator::VpnConfigurator(std::shared_ptr<Settings> settings, QObject *parent)
: ConfiguratorBase(settings, parent)
2021-10-04 19:07:49 +03:00
{
openVpnConfigurator = std::shared_ptr<OpenVpnConfigurator>(new OpenVpnConfigurator(settings, this));
shadowSocksConfigurator = std::shared_ptr<ShadowSocksConfigurator>(new ShadowSocksConfigurator(settings, this));
cloakConfigurator = std::shared_ptr<CloakConfigurator>(new CloakConfigurator(settings, this));
wireguardConfigurator = std::shared_ptr<WireguardConfigurator>(new WireguardConfigurator(settings, false, this));
ikev2Configurator = std::shared_ptr<Ikev2Configurator>(new Ikev2Configurator(settings, this));
sshConfigurator = std::shared_ptr<SshConfigurator>(new SshConfigurator(settings, this));
2023-10-06 17:19:44 +05:00
awgConfigurator = std::shared_ptr<AwgConfigurator>(new AwgConfigurator(settings, this));
2021-10-04 19:07:49 +03:00
}
2021-05-10 02:33:31 +03:00
QString VpnConfigurator::genVpnProtocolConfig(const ServerCredentials &credentials, DockerContainer container,
2023-11-21 20:13:51 +07:00
const QJsonObject &containerConfig, Proto proto, QString &clientId, ErrorCode *errorCode)
2021-05-10 02:33:31 +03:00
{
switch (proto) {
case Proto::OpenVpn:
2023-11-21 20:13:51 +07:00
return openVpnConfigurator->genOpenVpnConfig(credentials, container, containerConfig, clientId, errorCode);
2021-05-10 02:33:31 +03:00
case Proto::ShadowSocks:
2022-08-25 17:35:28 +03:00
return shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, errorCode);
2021-05-10 02:33:31 +03:00
case Proto::Cloak: return cloakConfigurator->genCloakConfig(credentials, container, containerConfig, errorCode);
2021-05-10 02:33:31 +03:00
case Proto::WireGuard:
2023-11-21 20:13:51 +07:00
return wireguardConfigurator->genWireguardConfig(credentials, container, containerConfig, clientId, errorCode);
2021-05-10 02:33:31 +03:00
2023-10-06 17:19:44 +05:00
case Proto::Awg:
2023-11-21 20:13:51 +07:00
return awgConfigurator->genAwgConfig(credentials, container, containerConfig, clientId, errorCode);
case Proto::Ikev2: return ikev2Configurator->genIkev2Config(credentials, container, containerConfig, errorCode);
2021-10-04 19:07:49 +03:00
default: return "";
2021-05-10 02:33:31 +03:00
}
}
2021-09-24 13:14:35 +03:00
2022-02-01 19:48:59 +03:00
QPair<QString, QString> VpnConfigurator::getDnsForConfig(int serverIndex)
2021-10-02 21:56:47 +03:00
{
2022-02-01 19:48:59 +03:00
QPair<QString, QString> dns;
2022-08-25 17:35:28 +03:00
bool useAmneziaDns = m_settings->useAmneziaDns();
const QJsonObject &server = m_settings->server(serverIndex);
2022-02-01 19:48:59 +03:00
dns.first = server.value(config_key::dns1).toString();
dns.second = server.value(config_key::dns2).toString();
if (dns.first.isEmpty() || !Utils::checkIPv4Format(dns.first)) {
2022-08-25 17:35:28 +03:00
if (useAmneziaDns && m_settings->containers(serverIndex).contains(DockerContainer::Dns)) {
2022-02-01 19:48:59 +03:00
dns.first = protocols::dns::amneziaDnsIp;
} else
dns.first = m_settings->primaryDns();
2022-02-01 19:48:59 +03:00
}
if (dns.second.isEmpty() || !Utils::checkIPv4Format(dns.second)) {
2022-08-25 17:35:28 +03:00
dns.second = m_settings->secondaryDns();
2022-02-01 19:48:59 +03:00
}
qDebug() << "VpnConfigurator::getDnsForConfig" << dns.first << dns.second;
return dns;
}
QString &VpnConfigurator::processConfigWithDnsSettings(int serverIndex, DockerContainer container, Proto proto,
QString &config)
2022-02-01 19:48:59 +03:00
{
auto dns = getDnsForConfig(serverIndex);
config.replace("$PRIMARY_DNS", dns.first);
config.replace("$SECONDARY_DNS", dns.second);
return config;
}
QString &VpnConfigurator::processConfigWithLocalSettings(int serverIndex, DockerContainer container, Proto proto,
QString &config)
2022-02-01 19:48:59 +03:00
{
processConfigWithDnsSettings(serverIndex, container, proto, config);
2021-10-04 19:07:49 +03:00
if (proto == Proto::OpenVpn) {
config = openVpnConfigurator->processConfigWithLocalSettings(config, serverIndex);
2021-10-02 21:56:47 +03:00
}
return config;
}
QString &VpnConfigurator::processConfigWithExportSettings(int serverIndex, DockerContainer container, Proto proto,
QString &config)
2021-10-02 21:56:47 +03:00
{
2022-02-01 19:48:59 +03:00
processConfigWithDnsSettings(serverIndex, container, proto, config);
2021-10-04 19:07:49 +03:00
if (proto == Proto::OpenVpn) {
2022-08-25 17:35:28 +03:00
config = openVpnConfigurator->processConfigWithExportSettings(config);
2021-10-02 21:56:47 +03:00
}
return config;
}
2021-09-24 13:14:35 +03:00
void VpnConfigurator::updateContainerConfigAfterInstallation(DockerContainer container, QJsonObject &containerConfig,
const QString &stdOut)
2021-09-24 13:14:35 +03:00
{
Proto mainProto = ContainerProps::defaultProtocol(container);
2021-09-24 13:14:35 +03:00
if (container == DockerContainer::TorWebSite) {
QJsonObject protocol = containerConfig.value(ProtocolProps::protoToString(mainProto)).toObject();
qDebug() << "amnezia-tor onions" << stdOut;
2022-07-30 16:20:41 +03:00
QString onion = stdOut;
onion.replace("\n", "");
protocol.insert(config_key::site, onion);
2021-09-24 13:14:35 +03:00
containerConfig.insert(ProtocolProps::protoToString(mainProto), protocol);
}
}