Merge pull request #527 from amnezia-vpn/feature/api-awg

added support for awg configs for api
This commit is contained in:
pokamest 2024-01-31 12:04:54 -08:00 committed by GitHub
commit 30a0ac0def
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 66 additions and 35 deletions

View file

@ -128,7 +128,8 @@ open class ProtocolConfig protected constructor(
} }
private fun processExcludedRoutes() { private fun processExcludedRoutes() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && excludedRoutes.isNotEmpty()) {
// todo: rewrite, taking into account the current routes
// for older versions of Android, build a list of subnets without excluded routes // for older versions of Android, build a list of subnets without excluded routes
// and add them to routes // and add them to routes
val ipRangeSet = IpRangeSet() val ipRangeSet = IpRangeSet()

View file

@ -31,11 +31,11 @@ public:
QString processConfigWithLocalSettings(QString config); QString processConfigWithLocalSettings(QString config);
QString processConfigWithExportSettings(QString config); QString processConfigWithExportSettings(QString config);
static ConnectionData genClientKeys();
private: private:
ConnectionData prepareWireguardConfig(const ServerCredentials &credentials, DockerContainer container, ConnectionData prepareWireguardConfig(const ServerCredentials &credentials, DockerContainer container,
const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr); const QJsonObject &containerConfig, ErrorCode *errorCode = nullptr);
ConnectionData genClientKeys();
bool m_isAwg; bool m_isAwg;
QString m_serverConfigPath; QString m_serverConfigPath;

View file

@ -5,12 +5,14 @@
#include <QNetworkReply> #include <QNetworkReply>
#include "configurators/openvpn_configurator.h" #include "configurators/openvpn_configurator.h"
#include "configurators/wireguard_configurator.h"
namespace namespace
{ {
namespace configKey namespace configKey
{ {
constexpr char cloak[] = "cloak"; constexpr char cloak[] = "cloak";
constexpr char awg[] = "awg";
constexpr char apiEdnpoint[] = "api_endpoint"; constexpr char apiEdnpoint[] = "api_endpoint";
constexpr char accessToken[] = "api_key"; constexpr char accessToken[] = "api_key";
@ -26,33 +28,42 @@ ApiController::ApiController(const QSharedPointer<ServersModel> &serversModel,
{ {
} }
QString ApiController::genPublicKey(const QString &protocol) void ApiController::processCloudConfig(const QString &protocol, const ApiController::ApiPayloadData &apiPayloadData, QString &config)
{
if (protocol == configKey::cloak) {
return ".";
}
return QString();
}
QString ApiController::genCertificateRequest(const QString &protocol)
{
if (protocol == configKey::cloak) {
m_certRequest = OpenVpnConfigurator::createCertRequest();
return m_certRequest.request;
}
return QString();
}
void ApiController::processCloudConfig(const QString &protocol, QString &config)
{ {
if (protocol == configKey::cloak) { if (protocol == configKey::cloak) {
config.replace("<key>", "<key>\n"); config.replace("<key>", "<key>\n");
config.replace("$OPENVPN_PRIV_KEY", m_certRequest.privKey); config.replace("$OPENVPN_PRIV_KEY", apiPayloadData.certRequest.privKey);
return; return;
} else if (protocol == configKey::awg) {
config.replace("$WIREGUARD_CLIENT_PRIVATE_KEY", apiPayloadData.wireGuardClientPrivKey);
} }
return; return;
} }
ApiController::ApiPayloadData ApiController::generateApiPayloadData(const QString &protocol)
{
ApiController::ApiPayloadData apiPayload;
if (protocol == configKey::cloak) {
apiPayload.certRequest = OpenVpnConfigurator::createCertRequest();
} else if (protocol == configKey::awg) {
auto connData = WireguardConfigurator::genClientKeys();
apiPayload.wireGuardClientPubKey = connData.clientPubKey;
apiPayload.wireGuardClientPrivKey = connData.clientPrivKey;
}
return apiPayload;
}
QJsonObject ApiController::fillApiPayload(const QString &protocol, const ApiController::ApiPayloadData &apiPayloadData)
{
QJsonObject obj;
if (protocol == configKey::cloak) {
obj[configKey::certificate] = apiPayloadData.certRequest.request;
} else if (protocol == configKey::awg) {
obj[configKey::publicKey] = apiPayloadData.wireGuardClientPubKey;
}
return obj;
}
bool ApiController::updateServerConfigFromApi() bool ApiController::updateServerConfigFromApi()
{ {
auto serverConfig = m_serversModel->getDefaultServerConfig(); auto serverConfig = m_serversModel->getDefaultServerConfig();
@ -71,13 +82,9 @@ bool ApiController::updateServerConfigFromApi()
QString protocol = serverConfig.value(configKey::protocol).toString(); QString protocol = serverConfig.value(configKey::protocol).toString();
QJsonObject obj; auto apiPayloadData = generateApiPayloadData(protocol);
obj[configKey::publicKey] = genPublicKey(protocol); QByteArray requestBody = QJsonDocument(fillApiPayload(protocol, apiPayloadData)).toJson();
obj[configKey::certificate] = genCertificateRequest(protocol);
QByteArray requestBody = QJsonDocument(obj).toJson();
qDebug() << requestBody;
QScopedPointer<QNetworkReply> reply; QScopedPointer<QNetworkReply> reply;
reply.reset(manager.post(request, requestBody)); reply.reset(manager.post(request, requestBody));
@ -100,7 +107,7 @@ bool ApiController::updateServerConfigFromApi()
} }
QString configStr = ba; QString configStr = ba;
processCloudConfig(protocol, configStr); processCloudConfig(protocol, apiPayloadData, configStr);
QJsonObject cloudConfig = QJsonDocument::fromJson(configStr.toUtf8()).object(); QJsonObject cloudConfig = QJsonDocument::fromJson(configStr.toUtf8()).object();

View file

@ -22,15 +22,19 @@ signals:
void errorOccurred(const QString &errorMessage); void errorOccurred(const QString &errorMessage);
private: private:
QString genPublicKey(const QString &protocol); struct ApiPayloadData {
QString genCertificateRequest(const QString &protocol); OpenVpnConfigurator::ConnectionData certRequest;
void processCloudConfig(const QString &protocol, QString &config); QString wireGuardClientPrivKey;
QString wireGuardClientPubKey;
};
ApiPayloadData generateApiPayloadData(const QString &protocol);
QJsonObject fillApiPayload(const QString &protocol, const ApiController::ApiPayloadData &apiPayloadData);
void processCloudConfig(const QString &protocol, const ApiController::ApiPayloadData &apiPayloadData, QString &config);
QSharedPointer<ServersModel> m_serversModel; QSharedPointer<ServersModel> m_serversModel;
QSharedPointer<ContainersModel> m_containersModel; QSharedPointer<ContainersModel> m_containersModel;
OpenVpnConfigurator::ConnectionData m_certRequest;
}; };
#endif // APICONTROLLER_H #endif // APICONTROLLER_H

View file

@ -388,6 +388,25 @@ void VpnConnection::createProtocolConnections()
void VpnConnection::appendSplitTunnelingConfig() void VpnConnection::appendSplitTunnelingConfig()
{ {
if (m_vpnConfiguration.value(config_key::configVersion).toInt()) {
auto protocolName = m_vpnConfiguration.value(config_key::vpnproto).toString();
if (protocolName == ProtocolProps::protoToString(Proto::Awg)) {
auto configData = m_vpnConfiguration.value(protocolName + "_config_data").toObject();
QJsonArray allowedIpsJsonArray = QJsonArray::fromStringList(configData.value("allowed_ips").toString().split(","));
QJsonArray defaultAllowedIP = QJsonArray::fromStringList(QString("0.0.0.0/0, ::/0").split(","));
if (allowedIpsJsonArray != defaultAllowedIP) {
allowedIpsJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString());
allowedIpsJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString());
m_vpnConfiguration.insert(config_key::splitTunnelType, Settings::RouteMode::VpnOnlyForwardSites);
m_vpnConfiguration.insert(config_key::splitTunnelSites, allowedIpsJsonArray);
return;
}
}
}
auto routeMode = m_settings->routeMode(); auto routeMode = m_settings->routeMode();
auto sites = m_settings->getVpnIps(routeMode); auto sites = m_settings->getVpnIps(routeMode);
@ -397,7 +416,7 @@ void VpnConnection::appendSplitTunnelingConfig()
} }
// Allow traffic to Amezia DNS // Allow traffic to Amezia DNS
if (routeMode == Settings::VpnOnlyForwardSites){ if (routeMode == Settings::VpnOnlyForwardSites) {
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString()); sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString());
sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString()); sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString());
} }