mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-05-08 14:33:23 +00:00
fix: apply WG interface params on hot-swap
This commit is contained in:
@@ -25,6 +25,34 @@ constexpr const char* WG_RUNTIME_DIR = "/var/run/amneziawg";
|
|||||||
namespace {
|
namespace {
|
||||||
Logger logger("WireguardUtilsLinux");
|
Logger logger("WireguardUtilsLinux");
|
||||||
Logger logwireguard("WireguardGo");
|
Logger logwireguard("WireguardGo");
|
||||||
|
|
||||||
|
bool appendAwgInterfaceParams(const InterfaceConfig& config, QTextStream& out) {
|
||||||
|
bool hasParams = false;
|
||||||
|
const auto appendField = [&](const char* key, const QString& value) {
|
||||||
|
if (!value.isEmpty()) {
|
||||||
|
out << key << "=" << value << "\n";
|
||||||
|
hasParams = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
appendField("jc", config.m_junkPacketCount);
|
||||||
|
appendField("jmin", config.m_junkPacketMinSize);
|
||||||
|
appendField("jmax", config.m_junkPacketMaxSize);
|
||||||
|
appendField("s1", config.m_initPacketJunkSize);
|
||||||
|
appendField("s2", config.m_responsePacketJunkSize);
|
||||||
|
appendField("s3", config.m_cookieReplyPacketJunkSize);
|
||||||
|
appendField("s4", config.m_transportPacketJunkSize);
|
||||||
|
appendField("h1", config.m_initPacketMagicHeader);
|
||||||
|
appendField("h2", config.m_responsePacketMagicHeader);
|
||||||
|
appendField("h3", config.m_underloadPacketMagicHeader);
|
||||||
|
appendField("h4", config.m_transportPacketMagicHeader);
|
||||||
|
|
||||||
|
for (const QString& key : config.m_specialJunk.keys()) {
|
||||||
|
out << key.toLower() << "=" << config.m_specialJunk.value(key) << "\n";
|
||||||
|
hasParams = true;
|
||||||
|
}
|
||||||
|
return hasParams;
|
||||||
|
}
|
||||||
}; // namespace
|
}; // namespace
|
||||||
|
|
||||||
WireguardUtilsLinux::WireguardUtilsLinux(QObject* parent)
|
WireguardUtilsLinux::WireguardUtilsLinux(QObject* parent)
|
||||||
@@ -59,7 +87,6 @@ void WireguardUtilsLinux::tunnelErrorOccurred(QProcess::ProcessError error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool WireguardUtilsLinux::addInterface(const InterfaceConfig& config) {
|
bool WireguardUtilsLinux::addInterface(const InterfaceConfig& config) {
|
||||||
Q_UNUSED(config);
|
|
||||||
if (m_tunnel.state() != QProcess::NotRunning) {
|
if (m_tunnel.state() != QProcess::NotRunning) {
|
||||||
logger.warning() << "Unable to start: tunnel process already running";
|
logger.warning() << "Unable to start: tunnel process already running";
|
||||||
return false;
|
return false;
|
||||||
@@ -104,45 +131,7 @@ bool WireguardUtilsLinux::addInterface(const InterfaceConfig& config) {
|
|||||||
QTextStream out(&message);
|
QTextStream out(&message);
|
||||||
out << "private_key=" << QString(privateKey.toHex()) << "\n";
|
out << "private_key=" << QString(privateKey.toHex()) << "\n";
|
||||||
out << "replace_peers=true\n";
|
out << "replace_peers=true\n";
|
||||||
|
appendAwgInterfaceParams(config, out);
|
||||||
|
|
||||||
if (!config.m_junkPacketCount.isEmpty()) {
|
|
||||||
out << "jc=" << config.m_junkPacketCount << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_junkPacketMinSize.isEmpty()) {
|
|
||||||
out << "jmin=" << config.m_junkPacketMinSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_junkPacketMaxSize.isEmpty()) {
|
|
||||||
out << "jmax=" << config.m_junkPacketMaxSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_initPacketJunkSize.isEmpty()) {
|
|
||||||
out << "s1=" << config.m_initPacketJunkSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_responsePacketJunkSize.isEmpty()) {
|
|
||||||
out << "s2=" << config.m_responsePacketJunkSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_cookieReplyPacketJunkSize.isEmpty()) {
|
|
||||||
out << "s3=" << config.m_cookieReplyPacketJunkSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_transportPacketJunkSize.isEmpty()) {
|
|
||||||
out << "s4=" << config.m_transportPacketJunkSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_initPacketMagicHeader.isEmpty()) {
|
|
||||||
out << "h1=" << config.m_initPacketMagicHeader << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_responsePacketMagicHeader.isEmpty()) {
|
|
||||||
out << "h2=" << config.m_responsePacketMagicHeader << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_underloadPacketMagicHeader.isEmpty()) {
|
|
||||||
out << "h3=" << config.m_underloadPacketMagicHeader << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_transportPacketMagicHeader.isEmpty()) {
|
|
||||||
out << "h4=" << config.m_transportPacketMagicHeader << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const QString& key : config.m_specialJunk.keys()) {
|
|
||||||
out << key.toLower() << "=" << config.m_specialJunk.value(key) << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
int err = uapiErrno(uapiCommand(message));
|
int err = uapiErrno(uapiCommand(message));
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
@@ -201,7 +190,6 @@ bool WireguardUtilsLinux::deleteInterface() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// dummy implementations for now
|
|
||||||
bool WireguardUtilsLinux::updatePeer(const InterfaceConfig& config) {
|
bool WireguardUtilsLinux::updatePeer(const InterfaceConfig& config) {
|
||||||
QByteArray publicKey =
|
QByteArray publicKey =
|
||||||
QByteArray::fromBase64(qPrintable(config.m_serverPublicKey));
|
QByteArray::fromBase64(qPrintable(config.m_serverPublicKey));
|
||||||
@@ -214,6 +202,7 @@ bool WireguardUtilsLinux::updatePeer(const InterfaceConfig& config) {
|
|||||||
QString message;
|
QString message;
|
||||||
QTextStream out(&message);
|
QTextStream out(&message);
|
||||||
out << "set=1\n";
|
out << "set=1\n";
|
||||||
|
appendAwgInterfaceParams(config, out);
|
||||||
out << "public_key=" << QString(publicKey.toHex()) << "\n";
|
out << "public_key=" << QString(publicKey.toHex()) << "\n";
|
||||||
if (!config.m_serverPskKey.isNull()) {
|
if (!config.m_serverPskKey.isNull()) {
|
||||||
out << "preshared_key=" << QString(pskKey.toHex()) << "\n";
|
out << "preshared_key=" << QString(pskKey.toHex()) << "\n";
|
||||||
|
|||||||
@@ -24,6 +24,34 @@ constexpr const char* WG_RUNTIME_DIR = "/var/run/amneziawg";
|
|||||||
namespace {
|
namespace {
|
||||||
Logger logger("WireguardUtilsMacos");
|
Logger logger("WireguardUtilsMacos");
|
||||||
Logger logwireguard("WireguardGo");
|
Logger logwireguard("WireguardGo");
|
||||||
|
|
||||||
|
bool appendAwgInterfaceParams(const InterfaceConfig& config, QTextStream& out) {
|
||||||
|
bool hasParams = false;
|
||||||
|
const auto appendField = [&](const char* key, const QString& value) {
|
||||||
|
if (!value.isEmpty()) {
|
||||||
|
out << key << "=" << value << "\n";
|
||||||
|
hasParams = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
appendField("jc", config.m_junkPacketCount);
|
||||||
|
appendField("jmin", config.m_junkPacketMinSize);
|
||||||
|
appendField("jmax", config.m_junkPacketMaxSize);
|
||||||
|
appendField("s1", config.m_initPacketJunkSize);
|
||||||
|
appendField("s2", config.m_responsePacketJunkSize);
|
||||||
|
appendField("s3", config.m_cookieReplyPacketJunkSize);
|
||||||
|
appendField("s4", config.m_transportPacketJunkSize);
|
||||||
|
appendField("h1", config.m_initPacketMagicHeader);
|
||||||
|
appendField("h2", config.m_responsePacketMagicHeader);
|
||||||
|
appendField("h3", config.m_underloadPacketMagicHeader);
|
||||||
|
appendField("h4", config.m_transportPacketMagicHeader);
|
||||||
|
|
||||||
|
for (const QString& key : config.m_specialJunk.keys()) {
|
||||||
|
out << key.toLower() << "=" << config.m_specialJunk.value(key) << "\n";
|
||||||
|
hasParams = true;
|
||||||
|
}
|
||||||
|
return hasParams;
|
||||||
|
}
|
||||||
}; // namespace
|
}; // namespace
|
||||||
|
|
||||||
WireguardUtilsMacos::WireguardUtilsMacos(QObject* parent)
|
WireguardUtilsMacos::WireguardUtilsMacos(QObject* parent)
|
||||||
@@ -58,7 +86,6 @@ void WireguardUtilsMacos::tunnelErrorOccurred(QProcess::ProcessError error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool WireguardUtilsMacos::addInterface(const InterfaceConfig& config) {
|
bool WireguardUtilsMacos::addInterface(const InterfaceConfig& config) {
|
||||||
Q_UNUSED(config);
|
|
||||||
if (m_tunnel.state() != QProcess::NotRunning) {
|
if (m_tunnel.state() != QProcess::NotRunning) {
|
||||||
logger.warning() << "Unable to start: tunnel process already running";
|
logger.warning() << "Unable to start: tunnel process already running";
|
||||||
return false;
|
return false;
|
||||||
@@ -103,44 +130,7 @@ bool WireguardUtilsMacos::addInterface(const InterfaceConfig& config) {
|
|||||||
QTextStream out(&message);
|
QTextStream out(&message);
|
||||||
out << "private_key=" << QString(privateKey.toHex()) << "\n";
|
out << "private_key=" << QString(privateKey.toHex()) << "\n";
|
||||||
out << "replace_peers=true\n";
|
out << "replace_peers=true\n";
|
||||||
|
appendAwgInterfaceParams(config, out);
|
||||||
if (!config.m_junkPacketCount.isEmpty()) {
|
|
||||||
out << "jc=" << config.m_junkPacketCount << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_junkPacketMinSize.isEmpty()) {
|
|
||||||
out << "jmin=" << config.m_junkPacketMinSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_junkPacketMaxSize.isEmpty()) {
|
|
||||||
out << "jmax=" << config.m_junkPacketMaxSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_initPacketJunkSize.isEmpty()) {
|
|
||||||
out << "s1=" << config.m_initPacketJunkSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_responsePacketJunkSize.isEmpty()) {
|
|
||||||
out << "s2=" << config.m_responsePacketJunkSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_cookieReplyPacketJunkSize.isEmpty()) {
|
|
||||||
out << "s3=" << config.m_cookieReplyPacketJunkSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_transportPacketJunkSize.isEmpty()) {
|
|
||||||
out << "s4=" << config.m_transportPacketJunkSize << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_initPacketMagicHeader.isEmpty()) {
|
|
||||||
out << "h1=" << config.m_initPacketMagicHeader << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_responsePacketMagicHeader.isEmpty()) {
|
|
||||||
out << "h2=" << config.m_responsePacketMagicHeader << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_underloadPacketMagicHeader.isEmpty()) {
|
|
||||||
out << "h3=" << config.m_underloadPacketMagicHeader << "\n";
|
|
||||||
}
|
|
||||||
if (!config.m_transportPacketMagicHeader.isEmpty()) {
|
|
||||||
out << "h4=" << config.m_transportPacketMagicHeader << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const QString& key : config.m_specialJunk.keys()) {
|
|
||||||
out << key.toLower() << "=" << config.m_specialJunk.value(key) << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
int err = uapiErrno(uapiCommand(message));
|
int err = uapiErrno(uapiCommand(message));
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
@@ -200,7 +190,6 @@ bool WireguardUtilsMacos::deleteInterface() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// dummy implementations for now
|
|
||||||
bool WireguardUtilsMacos::updatePeer(const InterfaceConfig& config) {
|
bool WireguardUtilsMacos::updatePeer(const InterfaceConfig& config) {
|
||||||
QByteArray publicKey =
|
QByteArray publicKey =
|
||||||
QByteArray::fromBase64(qPrintable(config.m_serverPublicKey));
|
QByteArray::fromBase64(qPrintable(config.m_serverPublicKey));
|
||||||
@@ -214,6 +203,7 @@ bool WireguardUtilsMacos::updatePeer(const InterfaceConfig& config) {
|
|||||||
QString message;
|
QString message;
|
||||||
QTextStream out(&message);
|
QTextStream out(&message);
|
||||||
out << "set=1\n";
|
out << "set=1\n";
|
||||||
|
appendAwgInterfaceParams(config, out);
|
||||||
out << "public_key=" << QString(publicKey.toHex()) << "\n";
|
out << "public_key=" << QString(publicKey.toHex()) << "\n";
|
||||||
if (!config.m_serverPskKey.isNull()) {
|
if (!config.m_serverPskKey.isNull()) {
|
||||||
out << "preshared_key=" << QString(pskKey.toHex()) << "\n";
|
out << "preshared_key=" << QString(pskKey.toHex()) << "\n";
|
||||||
|
|||||||
@@ -20,6 +20,34 @@
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
Logger logger("WireguardUtilsWindows");
|
Logger logger("WireguardUtilsWindows");
|
||||||
|
|
||||||
|
bool appendAwgInterfaceParams(const InterfaceConfig& config, QTextStream& out) {
|
||||||
|
bool hasParams = false;
|
||||||
|
const auto appendField = [&](const char* key, const QString& value) {
|
||||||
|
if (!value.isEmpty()) {
|
||||||
|
out << key << "=" << value << "\n";
|
||||||
|
hasParams = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
appendField("jc", config.m_junkPacketCount);
|
||||||
|
appendField("jmin", config.m_junkPacketMinSize);
|
||||||
|
appendField("jmax", config.m_junkPacketMaxSize);
|
||||||
|
appendField("s1", config.m_initPacketJunkSize);
|
||||||
|
appendField("s2", config.m_responsePacketJunkSize);
|
||||||
|
appendField("s3", config.m_cookieReplyPacketJunkSize);
|
||||||
|
appendField("s4", config.m_transportPacketJunkSize);
|
||||||
|
appendField("h1", config.m_initPacketMagicHeader);
|
||||||
|
appendField("h2", config.m_responsePacketMagicHeader);
|
||||||
|
appendField("h3", config.m_underloadPacketMagicHeader);
|
||||||
|
appendField("h4", config.m_transportPacketMagicHeader);
|
||||||
|
|
||||||
|
for (const QString& key : config.m_specialJunk.keys()) {
|
||||||
|
out << key.toLower() << "=" << config.m_specialJunk.value(key) << "\n";
|
||||||
|
hasParams = true;
|
||||||
|
}
|
||||||
|
return hasParams;
|
||||||
|
}
|
||||||
}; // namespace
|
}; // namespace
|
||||||
|
|
||||||
std::unique_ptr<WireguardUtilsWindows> WireguardUtilsWindows::create(
|
std::unique_ptr<WireguardUtilsWindows> WireguardUtilsWindows::create(
|
||||||
@@ -165,6 +193,7 @@ bool WireguardUtilsWindows::updatePeer(const InterfaceConfig& config) {
|
|||||||
QString message;
|
QString message;
|
||||||
QTextStream out(&message);
|
QTextStream out(&message);
|
||||||
out << "set=1\n";
|
out << "set=1\n";
|
||||||
|
appendAwgInterfaceParams(config, out);
|
||||||
out << "public_key=" << QString(publicKey.toHex()) << "\n";
|
out << "public_key=" << QString(publicKey.toHex()) << "\n";
|
||||||
if (!config.m_serverPskKey.isNull()) {
|
if (!config.m_serverPskKey.isNull()) {
|
||||||
out << "preshared_key=" << QString(pskKey.toHex()) << "\n";
|
out << "preshared_key=" << QString(pskKey.toHex()) << "\n";
|
||||||
|
|||||||
Reference in New Issue
Block a user