feat: finish adding params
This commit is contained in:
parent
9ad3ace7e7
commit
89ed4d03a3
26 changed files with 5249 additions and 2002 deletions
|
|
@ -39,6 +39,15 @@ QString AwgConfigurator::createConfig(const ServerCredentials &credentials, Dock
|
||||||
jsonConfig[config_key::responsePacketMagicHeader] = configMap.value(config_key::responsePacketMagicHeader);
|
jsonConfig[config_key::responsePacketMagicHeader] = configMap.value(config_key::responsePacketMagicHeader);
|
||||||
jsonConfig[config_key::underloadPacketMagicHeader] = configMap.value(config_key::underloadPacketMagicHeader);
|
jsonConfig[config_key::underloadPacketMagicHeader] = configMap.value(config_key::underloadPacketMagicHeader);
|
||||||
jsonConfig[config_key::transportPacketMagicHeader] = configMap.value(config_key::transportPacketMagicHeader);
|
jsonConfig[config_key::transportPacketMagicHeader] = configMap.value(config_key::transportPacketMagicHeader);
|
||||||
|
jsonConfig[config_key::specialJunk1] = configMap.value(amnezia::config_key::specialJunk1);
|
||||||
|
jsonConfig[config_key::specialJunk2] = configMap.value(amnezia::config_key::specialJunk2);
|
||||||
|
jsonConfig[config_key::specialJunk3] = configMap.value(amnezia::config_key::specialJunk3);
|
||||||
|
jsonConfig[config_key::specialJunk4] = configMap.value(amnezia::config_key::specialJunk4);
|
||||||
|
jsonConfig[config_key::specialJunk5] = configMap.value(amnezia::config_key::specialJunk5);
|
||||||
|
jsonConfig[config_key::controlledJunk1] = configMap.value(amnezia::config_key::controlledJunk1);
|
||||||
|
jsonConfig[config_key::controlledJunk2] = configMap.value(amnezia::config_key::controlledJunk2);
|
||||||
|
jsonConfig[config_key::controlledJunk3] = configMap.value(amnezia::config_key::controlledJunk3);
|
||||||
|
jsonConfig[config_key::specialHandshakeTimeout] = configMap.value(amnezia::config_key::specialHandshakeTimeout);
|
||||||
jsonConfig[config_key::mtu] =
|
jsonConfig[config_key::mtu] =
|
||||||
containerConfig.value(ProtocolProps::protoToString(Proto::Awg)).toObject().value(config_key::mtu).toString(protocols::awg::defaultMtu);
|
containerConfig.value(ProtocolProps::protoToString(Proto::Awg)).toObject().value(config_key::mtu).toString(protocols::awg::defaultMtu);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -366,8 +366,27 @@ bool ServerController::isReinstallContainerRequired(DockerContainer container, c
|
||||||
!= newProtoConfig.value(config_key::responsePacketMagicHeader).toString(protocols::awg::defaultResponsePacketMagicHeader))
|
!= newProtoConfig.value(config_key::responsePacketMagicHeader).toString(protocols::awg::defaultResponsePacketMagicHeader))
|
||||||
|| (oldProtoConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader)
|
|| (oldProtoConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader)
|
||||||
!= newProtoConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader))
|
!= newProtoConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader))
|
||||||
|| (oldProtoConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader)
|
|| (oldProtoConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader))
|
||||||
!= newProtoConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader)))
|
!= newProtoConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader)
|
||||||
|
|| (oldProtoConfig.value(config_key::specialJunk1).toString(protocols::awg::defaultSpecialJunk1))
|
||||||
|
!= newProtoConfig.value(config_key::specialJunk1).toString(protocols::awg::defaultSpecialJunk1)
|
||||||
|
|| (oldProtoConfig.value(config_key::specialJunk2).toString(protocols::awg::defaultSpecialJunk2))
|
||||||
|
!= newProtoConfig.value(config_key::specialJunk2).toString(protocols::awg::defaultSpecialJunk2)
|
||||||
|
|| (oldProtoConfig.value(config_key::specialJunk3).toString(protocols::awg::defaultSpecialJunk3))
|
||||||
|
!= newProtoConfig.value(config_key::specialJunk3).toString(protocols::awg::defaultSpecialJunk3)
|
||||||
|
|| (oldProtoConfig.value(config_key::specialJunk4).toString(protocols::awg::defaultSpecialJunk4))
|
||||||
|
!= newProtoConfig.value(config_key::specialJunk4).toString(protocols::awg::defaultSpecialJunk4)
|
||||||
|
|| (oldProtoConfig.value(config_key::specialJunk5).toString(protocols::awg::defaultSpecialJunk5))
|
||||||
|
!= newProtoConfig.value(config_key::specialJunk5).toString(protocols::awg::defaultSpecialJunk5)
|
||||||
|
|| (oldProtoConfig.value(config_key::controlledJunk1).toString(protocols::awg::defaultControlledJunk1))
|
||||||
|
!= newProtoConfig.value(config_key::controlledJunk1).toString(protocols::awg::defaultControlledJunk1)
|
||||||
|
|| (oldProtoConfig.value(config_key::controlledJunk2).toString(protocols::awg::defaultControlledJunk2))
|
||||||
|
!= newProtoConfig.value(config_key::controlledJunk2).toString(protocols::awg::defaultControlledJunk2)
|
||||||
|
|| (oldProtoConfig.value(config_key::controlledJunk3).toString(protocols::awg::defaultControlledJunk3))
|
||||||
|
!= newProtoConfig.value(config_key::controlledJunk3).toString(protocols::awg::defaultControlledJunk3)
|
||||||
|
|| (oldProtoConfig.value(config_key::specialHandshakeTimeout).toString(protocols::awg::defaultSpecialHandshakeTimeout))
|
||||||
|
!= newProtoConfig.value(config_key::specialHandshakeTimeout).toString(protocols::awg::defaultSpecialHandshakeTimeout))
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -455,7 +474,7 @@ ErrorCode ServerController::buildContainerWorker(const ServerCredentials &creden
|
||||||
runScript(credentials,
|
runScript(credentials,
|
||||||
replaceVars(amnezia::scriptData(SharedScriptType::build_container), genVarsForScript(credentials, container, config)),
|
replaceVars(amnezia::scriptData(SharedScriptType::build_container), genVarsForScript(credentials, container, config)),
|
||||||
cbReadStdOut, cbReadStdErr);
|
cbReadStdOut, cbReadStdErr);
|
||||||
|
|
||||||
if (stdOut.contains("doesn't work on cgroups v2"))
|
if (stdOut.contains("doesn't work on cgroups v2"))
|
||||||
return ErrorCode::ServerDockerOnCgroupsV2;
|
return ErrorCode::ServerDockerOnCgroupsV2;
|
||||||
if (stdOut.contains("cgroup mountpoint does not exist"))
|
if (stdOut.contains("cgroup mountpoint does not exist"))
|
||||||
|
|
@ -638,6 +657,15 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential
|
||||||
vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } });
|
vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } });
|
||||||
vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } });
|
vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } });
|
||||||
vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } });
|
vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } });
|
||||||
|
vars.append({ { "$SPECIAL_JUNK_1", amneziaWireguarConfig.value(config_key::specialJunk1).toString() } });
|
||||||
|
vars.append({ { "$SPECIAL_JUNK_2", amneziaWireguarConfig.value(config_key::specialJunk2).toString() } });
|
||||||
|
vars.append({ { "$SPECIAL_JUNK_3", amneziaWireguarConfig.value(config_key::specialJunk3).toString() } });
|
||||||
|
vars.append({ { "$SPECIAL_JUNK_4", amneziaWireguarConfig.value(config_key::specialJunk4).toString() } });
|
||||||
|
vars.append({ { "$SPECIAL_JUNK_5", amneziaWireguarConfig.value(config_key::specialJunk5).toString() } });
|
||||||
|
vars.append({ { "$CONTROLLED_JUNK_1", amneziaWireguarConfig.value(config_key::controlledJunk1).toString() } });
|
||||||
|
vars.append({ { "$CONTROLLED_JUNK_2", amneziaWireguarConfig.value(config_key::controlledJunk2).toString() } });
|
||||||
|
vars.append({ { "$CONTROLLED_JUNK_3", amneziaWireguarConfig.value(config_key::controlledJunk3).toString() } });
|
||||||
|
vars.append({ { "$SPECIAL_HANDSHAKE_TIMEOUT", amneziaWireguarConfig.value(config_key::specialHandshakeTimeout).toString() } });
|
||||||
|
|
||||||
// Socks5 proxy vars
|
// Socks5 proxy vars
|
||||||
vars.append({ { "$SOCKS5_PROXY_PORT", socks5ProxyConfig.value(config_key::port).toString(protocols::socks5Proxy::defaultPort) } });
|
vars.append({ { "$SOCKS5_PROXY_PORT", socks5ProxyConfig.value(config_key::port).toString(protocols::socks5Proxy::defaultPort) } });
|
||||||
|
|
|
||||||
|
|
@ -404,6 +404,34 @@ bool Daemon::parseConfig(const QJsonObject& obj, InterfaceConfig& config) {
|
||||||
config.m_transportPacketMagicHeader = obj.value("H4").toString();
|
config.m_transportPacketMagicHeader = obj.value("H4").toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!obj.value("I1").isNull()) {
|
||||||
|
config.m_specialJunk["I1"] = obj.value("I1").toString();
|
||||||
|
}
|
||||||
|
if (!obj.value("I2").isNull()) {
|
||||||
|
config.m_specialJunk["I2"] = obj.value("I2").toString();
|
||||||
|
}
|
||||||
|
if (!obj.value("I3").isNull()) {
|
||||||
|
config.m_specialJunk["I3"] = obj.value("I3").toString();
|
||||||
|
}
|
||||||
|
if (!obj.value("I4").isNull()) {
|
||||||
|
config.m_specialJunk["I4"] = obj.value("I4").toString();
|
||||||
|
}
|
||||||
|
if (!obj.value("I5").isNull()) {
|
||||||
|
config.m_specialJunk["I5"] = obj.value("I5").toString();
|
||||||
|
}
|
||||||
|
if (!obj.value("J1").isNull()) {
|
||||||
|
config.m_controlledJunk["J1"] = obj.value("J1").toString();
|
||||||
|
}
|
||||||
|
if (!obj.value("J2").isNull()) {
|
||||||
|
config.m_controlledJunk["J2"] = obj.value("J2").toString();
|
||||||
|
}
|
||||||
|
if (!obj.value("J3").isNull()) {
|
||||||
|
config.m_controlledJunk["J3"] = obj.value("J3").toString();
|
||||||
|
}
|
||||||
|
if (!obj.value("Itime").isNull()) {
|
||||||
|
config.m_specialHandshakeTimeout = obj.value("Itime").toString();
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,16 @@ QString InterfaceConfig::toWgConf(const QMap<QString, QString>& extra) const {
|
||||||
out << "H4 = " << m_transportPacketMagicHeader << "\n";
|
out << "H4 = " << m_transportPacketMagicHeader << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const QString& key : m_specialJunk.keys()) {
|
||||||
|
out << key << " = " << m_specialJunk[key] << "\n";
|
||||||
|
}
|
||||||
|
for (const QString& key : m_controlledJunk.keys()) {
|
||||||
|
out << key << " = " << m_controlledJunk[key] << "\n";
|
||||||
|
}
|
||||||
|
if (!m_specialHandshakeTimeout.isNull()) {
|
||||||
|
out << "Itime = " << m_specialHandshakeTimeout << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
// If any extra config was provided, append it now.
|
// If any extra config was provided, append it now.
|
||||||
for (const QString& key : extra.keys()) {
|
for (const QString& key : extra.keys()) {
|
||||||
out << key << " = " << extra[key] << "\n";
|
out << key << " = " << extra[key] << "\n";
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,9 @@ class InterfaceConfig {
|
||||||
QString m_responsePacketMagicHeader;
|
QString m_responsePacketMagicHeader;
|
||||||
QString m_underloadPacketMagicHeader;
|
QString m_underloadPacketMagicHeader;
|
||||||
QString m_transportPacketMagicHeader;
|
QString m_transportPacketMagicHeader;
|
||||||
|
QMap<QString, QString> m_specialJunk;
|
||||||
|
QMap<QString, QString> m_controlledJunk;
|
||||||
|
QString m_specialHandshakeTimeout;
|
||||||
|
|
||||||
QJsonObject toJson() const;
|
QJsonObject toJson() const;
|
||||||
QString toWgConf(
|
QString toWgConf(
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ LocalSocketController::LocalSocketController() {
|
||||||
m_socket = new QLocalSocket(this);
|
m_socket = new QLocalSocket(this);
|
||||||
connect(m_socket, &QLocalSocket::connected, this,
|
connect(m_socket, &QLocalSocket::connected, this,
|
||||||
&LocalSocketController::daemonConnected);
|
&LocalSocketController::daemonConnected);
|
||||||
connect(m_socket, &QLocalSocket::disconnected, this,
|
connect(m_socket, &QLocalSocket::disconnected, this,
|
||||||
[&] { errorOccurred(QLocalSocket::PeerClosedError); });
|
[&] { errorOccurred(QLocalSocket::PeerClosedError); });
|
||||||
connect(m_socket, &QLocalSocket::errorOccurred, this,
|
connect(m_socket, &QLocalSocket::errorOccurred, this,
|
||||||
&LocalSocketController::errorOccurred);
|
&LocalSocketController::errorOccurred);
|
||||||
|
|
@ -135,7 +135,7 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
||||||
|
|
||||||
// set up IPv6 unique-local-address, ULA, with "fd00::/8" prefix, not globally routable.
|
// set up IPv6 unique-local-address, ULA, with "fd00::/8" prefix, not globally routable.
|
||||||
// this will be default IPv6 gateway, OS recognizes that IPv6 link is local and switches to IPv4.
|
// this will be default IPv6 gateway, OS recognizes that IPv6 link is local and switches to IPv4.
|
||||||
// Otherwise some OSes (Linux) try IPv6 forever and hang.
|
// Otherwise some OSes (Linux) try IPv6 forever and hang.
|
||||||
// https://en.wikipedia.org/wiki/Unique_local_address (RFC 4193)
|
// https://en.wikipedia.org/wiki/Unique_local_address (RFC 4193)
|
||||||
// https://man7.org/linux/man-pages/man5/gai.conf.5.html
|
// https://man7.org/linux/man-pages/man5/gai.conf.5.html
|
||||||
json.insert("deviceIpv6Address", "fd58:baa6:dead::1"); // simply "dead::1" is globally-routable, don't use it
|
json.insert("deviceIpv6Address", "fd58:baa6:dead::1"); // simply "dead::1" is globally-routable, don't use it
|
||||||
|
|
@ -241,6 +241,15 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
||||||
json.insert(amnezia::config_key::responsePacketMagicHeader, wgConfig.value(amnezia::config_key::responsePacketMagicHeader));
|
json.insert(amnezia::config_key::responsePacketMagicHeader, wgConfig.value(amnezia::config_key::responsePacketMagicHeader));
|
||||||
json.insert(amnezia::config_key::underloadPacketMagicHeader, wgConfig.value(amnezia::config_key::underloadPacketMagicHeader));
|
json.insert(amnezia::config_key::underloadPacketMagicHeader, wgConfig.value(amnezia::config_key::underloadPacketMagicHeader));
|
||||||
json.insert(amnezia::config_key::transportPacketMagicHeader, wgConfig.value(amnezia::config_key::transportPacketMagicHeader));
|
json.insert(amnezia::config_key::transportPacketMagicHeader, wgConfig.value(amnezia::config_key::transportPacketMagicHeader));
|
||||||
|
json.insert(amnezia::config_key::specialJunk1, wgConfig.value(amnezia::config_key::specialJunk1));
|
||||||
|
json.insert(amnezia::config_key::specialJunk2, wgConfig.value(amnezia::config_key::specialJunk2));
|
||||||
|
json.insert(amnezia::config_key::specialJunk3, wgConfig.value(amnezia::config_key::specialJunk3));
|
||||||
|
json.insert(amnezia::config_key::specialJunk4, wgConfig.value(amnezia::config_key::specialJunk4));
|
||||||
|
json.insert(amnezia::config_key::specialJunk5, wgConfig.value(amnezia::config_key::specialJunk5));
|
||||||
|
json.insert(amnezia::config_key::controlledJunk1, wgConfig.value(amnezia::config_key::controlledJunk1));
|
||||||
|
json.insert(amnezia::config_key::controlledJunk2, wgConfig.value(amnezia::config_key::controlledJunk2));
|
||||||
|
json.insert(amnezia::config_key::controlledJunk3, wgConfig.value(amnezia::config_key::controlledJunk3));
|
||||||
|
json.insert(amnezia::config_key::specialHandshakeTimeout, wgConfig.value(amnezia::config_key::specialHandshakeTimeout));
|
||||||
} else if (!wgConfig.value(amnezia::config_key::junkPacketCount).isUndefined()
|
} else if (!wgConfig.value(amnezia::config_key::junkPacketCount).isUndefined()
|
||||||
&& !wgConfig.value(amnezia::config_key::junkPacketMinSize).isUndefined()
|
&& !wgConfig.value(amnezia::config_key::junkPacketMinSize).isUndefined()
|
||||||
&& !wgConfig.value(amnezia::config_key::junkPacketMaxSize).isUndefined()
|
&& !wgConfig.value(amnezia::config_key::junkPacketMaxSize).isUndefined()
|
||||||
|
|
@ -249,7 +258,16 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
||||||
&& !wgConfig.value(amnezia::config_key::initPacketMagicHeader).isUndefined()
|
&& !wgConfig.value(amnezia::config_key::initPacketMagicHeader).isUndefined()
|
||||||
&& !wgConfig.value(amnezia::config_key::responsePacketMagicHeader).isUndefined()
|
&& !wgConfig.value(amnezia::config_key::responsePacketMagicHeader).isUndefined()
|
||||||
&& !wgConfig.value(amnezia::config_key::underloadPacketMagicHeader).isUndefined()
|
&& !wgConfig.value(amnezia::config_key::underloadPacketMagicHeader).isUndefined()
|
||||||
&& !wgConfig.value(amnezia::config_key::transportPacketMagicHeader).isUndefined()) {
|
&& !wgConfig.value(amnezia::config_key::transportPacketMagicHeader).isUndefined()
|
||||||
|
&& !wgConfig.value(amnezia::config_key::specialJunk1).isUndefined()
|
||||||
|
&& !wgConfig.value(amnezia::config_key::specialJunk2).isUndefined()
|
||||||
|
&& !wgConfig.value(amnezia::config_key::specialJunk3).isUndefined()
|
||||||
|
&& !wgConfig.value(amnezia::config_key::specialJunk4).isUndefined()
|
||||||
|
&& !wgConfig.value(amnezia::config_key::specialJunk5).isUndefined()
|
||||||
|
&& !wgConfig.value(amnezia::config_key::controlledJunk1).isUndefined()
|
||||||
|
&& !wgConfig.value(amnezia::config_key::controlledJunk2).isUndefined()
|
||||||
|
&& !wgConfig.value(amnezia::config_key::controlledJunk3).isUndefined()
|
||||||
|
&& !wgConfig.value(amnezia::config_key::specialHandshakeTimeout).isUndefined()) {
|
||||||
json.insert(amnezia::config_key::junkPacketCount, wgConfig.value(amnezia::config_key::junkPacketCount));
|
json.insert(amnezia::config_key::junkPacketCount, wgConfig.value(amnezia::config_key::junkPacketCount));
|
||||||
json.insert(amnezia::config_key::junkPacketMinSize, wgConfig.value(amnezia::config_key::junkPacketMinSize));
|
json.insert(amnezia::config_key::junkPacketMinSize, wgConfig.value(amnezia::config_key::junkPacketMinSize));
|
||||||
json.insert(amnezia::config_key::junkPacketMaxSize, wgConfig.value(amnezia::config_key::junkPacketMaxSize));
|
json.insert(amnezia::config_key::junkPacketMaxSize, wgConfig.value(amnezia::config_key::junkPacketMaxSize));
|
||||||
|
|
@ -259,6 +277,15 @@ void LocalSocketController::activate(const QJsonObject &rawConfig) {
|
||||||
json.insert(amnezia::config_key::responsePacketMagicHeader, wgConfig.value(amnezia::config_key::responsePacketMagicHeader));
|
json.insert(amnezia::config_key::responsePacketMagicHeader, wgConfig.value(amnezia::config_key::responsePacketMagicHeader));
|
||||||
json.insert(amnezia::config_key::underloadPacketMagicHeader, wgConfig.value(amnezia::config_key::underloadPacketMagicHeader));
|
json.insert(amnezia::config_key::underloadPacketMagicHeader, wgConfig.value(amnezia::config_key::underloadPacketMagicHeader));
|
||||||
json.insert(amnezia::config_key::transportPacketMagicHeader, wgConfig.value(amnezia::config_key::transportPacketMagicHeader));
|
json.insert(amnezia::config_key::transportPacketMagicHeader, wgConfig.value(amnezia::config_key::transportPacketMagicHeader));
|
||||||
|
json.insert(amnezia::config_key::specialJunk1, wgConfig.value(amnezia::config_key::specialJunk1));
|
||||||
|
json.insert(amnezia::config_key::specialJunk2, wgConfig.value(amnezia::config_key::specialJunk2));
|
||||||
|
json.insert(amnezia::config_key::specialJunk3, wgConfig.value(amnezia::config_key::specialJunk3));
|
||||||
|
json.insert(amnezia::config_key::specialJunk4, wgConfig.value(amnezia::config_key::specialJunk4));
|
||||||
|
json.insert(amnezia::config_key::specialJunk5, wgConfig.value(amnezia::config_key::specialJunk5));
|
||||||
|
json.insert(amnezia::config_key::controlledJunk1, wgConfig.value(amnezia::config_key::controlledJunk1));
|
||||||
|
json.insert(amnezia::config_key::controlledJunk2, wgConfig.value(amnezia::config_key::controlledJunk2));
|
||||||
|
json.insert(amnezia::config_key::controlledJunk3, wgConfig.value(amnezia::config_key::controlledJunk3));
|
||||||
|
json.insert(amnezia::config_key::specialHandshakeTimeout, wgConfig.value(amnezia::config_key::specialHandshakeTimeout));
|
||||||
}
|
}
|
||||||
|
|
||||||
write(json);
|
write(json);
|
||||||
|
|
|
||||||
|
|
@ -134,6 +134,16 @@ bool WireguardUtilsLinux::addInterface(const InterfaceConfig& config) {
|
||||||
out << "h4=" << config.m_transportPacketMagicHeader << "\n";
|
out << "h4=" << config.m_transportPacketMagicHeader << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const QString& key : config.m_specialJunk.keys()) {
|
||||||
|
out << key.toLower() << "=" << config.m_specialJunk.value(key) << "\n";
|
||||||
|
}
|
||||||
|
for (const QString& key : config.m_controlledJunk.keys()) {
|
||||||
|
out << key.toLower() << "=" << config.m_controlledJunk.value(key) << "\n";
|
||||||
|
}
|
||||||
|
if (!config.m_specialHandshakeTimeout.isEmpty()) {
|
||||||
|
out << "itime=" << config.m_specialHandshakeTimeout << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
int err = uapiErrno(uapiCommand(message));
|
int err = uapiErrno(uapiCommand(message));
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
logger.error() << "Interface configuration failed:" << strerror(err);
|
logger.error() << "Interface configuration failed:" << strerror(err);
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,15 @@ namespace amnezia
|
||||||
constexpr char responsePacketMagicHeader[] = "H2";
|
constexpr char responsePacketMagicHeader[] = "H2";
|
||||||
constexpr char underloadPacketMagicHeader[] = "H3";
|
constexpr char underloadPacketMagicHeader[] = "H3";
|
||||||
constexpr char transportPacketMagicHeader[] = "H4";
|
constexpr char transportPacketMagicHeader[] = "H4";
|
||||||
|
constexpr char specialJunk1[] = "I1";
|
||||||
|
constexpr char specialJunk2[] = "I2";
|
||||||
|
constexpr char specialJunk3[] = "I3";
|
||||||
|
constexpr char specialJunk4[] = "I4";
|
||||||
|
constexpr char specialJunk5[] = "I5";
|
||||||
|
constexpr char controlledJunk1[] = "J1";
|
||||||
|
constexpr char controlledJunk2[] = "J2";
|
||||||
|
constexpr char controlledJunk3[] = "J3";
|
||||||
|
constexpr char specialHandshakeTimeout[] = "Itime";
|
||||||
|
|
||||||
constexpr char openvpn[] = "openvpn";
|
constexpr char openvpn[] = "openvpn";
|
||||||
constexpr char wireguard[] = "wireguard";
|
constexpr char wireguard[] = "wireguard";
|
||||||
|
|
@ -218,6 +227,15 @@ namespace amnezia
|
||||||
constexpr char defaultResponsePacketMagicHeader[] = "3288052141";
|
constexpr char defaultResponsePacketMagicHeader[] = "3288052141";
|
||||||
constexpr char defaultTransportPacketMagicHeader[] = "2528465083";
|
constexpr char defaultTransportPacketMagicHeader[] = "2528465083";
|
||||||
constexpr char defaultUnderloadPacketMagicHeader[] = "1766607858";
|
constexpr char defaultUnderloadPacketMagicHeader[] = "1766607858";
|
||||||
|
constexpr char defaultSpecialJunk1[] = "";
|
||||||
|
constexpr char defaultSpecialJunk2[] = "";
|
||||||
|
constexpr char defaultSpecialJunk3[] = "";
|
||||||
|
constexpr char defaultSpecialJunk4[] = "";
|
||||||
|
constexpr char defaultSpecialJunk5[] = "";
|
||||||
|
constexpr char defaultControlledJunk1[] = "";
|
||||||
|
constexpr char defaultControlledJunk2[] = "";
|
||||||
|
constexpr char defaultControlledJunk3[] = "";
|
||||||
|
constexpr char defaultSpecialHandshakeTimeout[] = "0";
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace socks5Proxy
|
namespace socks5Proxy
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
FROM amneziavpn/amnezia-wg:latest
|
FROM marko1777/awg:latest
|
||||||
|
|
||||||
LABEL maintainer="AmneziaVPN"
|
LABEL maintainer="AmneziaVPN"
|
||||||
|
|
||||||
|
|
@ -10,7 +10,7 @@ RUN mkdir -p /opt/amnezia
|
||||||
RUN echo -e "#!/bin/bash\ntail -f /dev/null" > /opt/amnezia/start.sh
|
RUN echo -e "#!/bin/bash\ntail -f /dev/null" > /opt/amnezia/start.sh
|
||||||
RUN chmod a+x /opt/amnezia/start.sh
|
RUN chmod a+x /opt/amnezia/start.sh
|
||||||
|
|
||||||
# Tune network
|
# Tune network
|
||||||
RUN echo -e " \n\
|
RUN echo -e " \n\
|
||||||
fs.file-max = 51200 \n\
|
fs.file-max = 51200 \n\
|
||||||
\n\
|
\n\
|
||||||
|
|
@ -40,7 +40,7 @@ RUN echo -e " \n\
|
||||||
echo -e " \n\
|
echo -e " \n\
|
||||||
* soft nofile 51200 \n\
|
* soft nofile 51200 \n\
|
||||||
* hard nofile 51200 \n\
|
* hard nofile 51200 \n\
|
||||||
" | sed -e 's/^\s\+//g' | tee -a /etc/security/limits.conf
|
" | sed -e 's/^\s\+//g' | tee -a /etc/security/limits.conf
|
||||||
|
|
||||||
ENTRYPOINT [ "dumb-init", "/opt/amnezia/start.sh" ]
|
ENTRYPOINT [ "dumb-init", "/opt/amnezia/start.sh" ]
|
||||||
CMD [ "" ]
|
CMD [ "" ]
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,14 @@ H1 = $INIT_PACKET_MAGIC_HEADER
|
||||||
H2 = $RESPONSE_PACKET_MAGIC_HEADER
|
H2 = $RESPONSE_PACKET_MAGIC_HEADER
|
||||||
H3 = $UNDERLOAD_PACKET_MAGIC_HEADER
|
H3 = $UNDERLOAD_PACKET_MAGIC_HEADER
|
||||||
H4 = $TRANSPORT_PACKET_MAGIC_HEADER
|
H4 = $TRANSPORT_PACKET_MAGIC_HEADER
|
||||||
I1 = $I1
|
I1 = $SPECIAL_JUNK_1
|
||||||
I2 = $I2
|
I2 = $SPECIAL_JUNK_2
|
||||||
I3 = $I3
|
I3 = $SPECIAL_JUNK_3
|
||||||
I4 = $I4
|
I4 = $SPECIAL_JUNK_4
|
||||||
I5 = $I5
|
I5 = $SPECIAL_JUNK_5
|
||||||
J1 = $J1
|
J1 = $CONTROLLED_JUNK_1
|
||||||
J2 = $J2
|
J2 = $CONTROLLED_JUNK_2
|
||||||
J3 = $J3
|
J3 = $CONTROLLED_JUNK_3
|
||||||
Itime = $I_TIME
|
Itime = $SPECIAL_HANDSHAKE_TIMEOUT
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
|
||||||
|
|
@ -11,15 +11,15 @@ H1 = $INIT_PACKET_MAGIC_HEADER
|
||||||
H2 = $RESPONSE_PACKET_MAGIC_HEADER
|
H2 = $RESPONSE_PACKET_MAGIC_HEADER
|
||||||
H3 = $UNDERLOAD_PACKET_MAGIC_HEADER
|
H3 = $UNDERLOAD_PACKET_MAGIC_HEADER
|
||||||
H4 = $TRANSPORT_PACKET_MAGIC_HEADER
|
H4 = $TRANSPORT_PACKET_MAGIC_HEADER
|
||||||
I1 = $I1
|
I1 = $SPECIAL_JUNK_1
|
||||||
I2 = $I2
|
I2 = $SPECIAL_JUNK_2
|
||||||
I3 = $I3
|
I3 = $SPECIAL_JUNK_3
|
||||||
I4 = $I4
|
I4 = $SPECIAL_JUNK_4
|
||||||
I5 = $I5
|
I5 = $SPECIAL_JUNK_5
|
||||||
J1 = $J1
|
J1 = $CONTROLLED_JUNK_1
|
||||||
J2 = $J2
|
J2 = $CONTROLLED_JUNK_2
|
||||||
J3 = $J3
|
J3 = $CONTROLLED_JUNK_3
|
||||||
Itime = $I_TIME
|
Itime = $SPECIAL_HANDSHAKE_TIMEOUT
|
||||||
|
|
||||||
[Peer]
|
[Peer]
|
||||||
PublicKey = $WIREGUARD_SERVER_PUBLIC_KEY
|
PublicKey = $WIREGUARD_SERVER_PUBLIC_KEY
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -358,7 +358,7 @@
|
||||||
<context>
|
<context>
|
||||||
<name>ContextMenuType</name>
|
<name>ContextMenuType</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Controls2/ContextMenuType.qml" line="10"/>
|
<location filename="../ui/qml/Controls2/ContextMenuType.qml" line="9"/>
|
||||||
<source>C&ut</source>
|
<source>C&ut</source>
|
||||||
<translation>Вырезать</translation>
|
<translation>Вырезать</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
@ -368,12 +368,12 @@
|
||||||
<translation>Копировать</translation>
|
<translation>Копировать</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Controls2/ContextMenuType.qml" line="20"/>
|
<location filename="../ui/qml/Controls2/ContextMenuType.qml" line="21"/>
|
||||||
<source>&Paste</source>
|
<source>&Paste</source>
|
||||||
<translation>Вставить</translation>
|
<translation>Вставить</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Controls2/ContextMenuType.qml" line="27"/>
|
<location filename="../ui/qml/Controls2/ContextMenuType.qml" line="29"/>
|
||||||
<source>&SelectAll</source>
|
<source>&SelectAll</source>
|
||||||
<translation>Выбрать всё</translation>
|
<translation>Выбрать всё</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
@ -436,17 +436,17 @@ Can't be disabled for current server</source>
|
||||||
<context>
|
<context>
|
||||||
<name>ImportController</name>
|
<name>ImportController</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/importController.cpp" line="650"/>
|
<location filename="../ui/controllers/importController.cpp" line="677"/>
|
||||||
<source>Scanned %1 of %2.</source>
|
<source>Scanned %1 of %2.</source>
|
||||||
<translation>Отсканировано %1 из %2.</translation>
|
<translation>Отсканировано %1 из %2.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/importController.cpp" line="685"/>
|
<location filename="../ui/controllers/importController.cpp" line="712"/>
|
||||||
<source>This configuration contains an OpenVPN setup. OpenVPN configurations can include malicious scripts, so only add it if you fully trust the provider of this config. </source>
|
<source>This configuration contains an OpenVPN setup. OpenVPN configurations can include malicious scripts, so only add it if you fully trust the provider of this config. </source>
|
||||||
<translation>Эта конфигурация содержит настройки OpenVPN. Конфигурации OpenVPN могут содержать вредоносные скрипты, поэтому добавляйте их только в том случае, если полностью доверяете источнику этого файла. </translation>
|
<translation>Эта конфигурация содержит настройки OpenVPN. Конфигурации OpenVPN могут содержать вредоносные скрипты, поэтому добавляйте их только в том случае, если полностью доверяете источнику этого файла. </translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/importController.cpp" line="689"/>
|
<location filename="../ui/controllers/importController.cpp" line="716"/>
|
||||||
<source><br>In the imported configuration, potentially dangerous lines were found:</source>
|
<source><br>In the imported configuration, potentially dangerous lines were found:</source>
|
||||||
<translation><br>В импортированной конфигурации обнаружены потенциально опасные строки:</translation>
|
<translation><br>В импортированной конфигурации обнаружены потенциально опасные строки:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
@ -454,71 +454,71 @@ Can't be disabled for current server</source>
|
||||||
<context>
|
<context>
|
||||||
<name>InstallController</name>
|
<name>InstallController</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="156"/>
|
<location filename="../ui/controllers/installController.cpp" line="175"/>
|
||||||
<source>%1 installed successfully. </source>
|
<source>%1 installed successfully. </source>
|
||||||
<translation>%1 успешно установлен. </translation>
|
<translation>%1 успешно установлен. </translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="158"/>
|
<location filename="../ui/controllers/installController.cpp" line="177"/>
|
||||||
<source>%1 is already installed on the server. </source>
|
<source>%1 is already installed on the server. </source>
|
||||||
<translation>%1 уже установлен на сервер. </translation>
|
<translation>%1 уже установлен на сервер. </translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="178"/>
|
<location filename="../ui/controllers/installController.cpp" line="197"/>
|
||||||
<source>
|
<source>
|
||||||
Added containers that were already installed on the server</source>
|
Added containers that were already installed on the server</source>
|
||||||
<translation>
|
<translation>
|
||||||
Добавлены сервисы и протоколы, которые были ранее установлены на сервер</translation>
|
Добавлены сервисы и протоколы, которые были ранее установлены на сервер</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="258"/>
|
<location filename="../ui/controllers/installController.cpp" line="277"/>
|
||||||
<source>
|
<source>
|
||||||
Already installed containers were found on the server. All installed containers have been added to the application</source>
|
Already installed containers were found on the server. All installed containers have been added to the application</source>
|
||||||
<translation>
|
<translation>
|
||||||
На сервере обнаружены установленные протоколы и сервисы. Все они были добавлены в приложение</translation>
|
На сервере обнаружены установленные протоколы и сервисы. Все они были добавлены в приложение</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="582"/>
|
<location filename="../ui/controllers/installController.cpp" line="611"/>
|
||||||
<source>Settings updated successfully</source>
|
<source>Settings updated successfully</source>
|
||||||
<translation>Настройки успешно обновлены</translation>
|
<translation>Настройки успешно обновлены</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="599"/>
|
<location filename="../ui/controllers/installController.cpp" line="628"/>
|
||||||
<source>Server '%1' was rebooted</source>
|
<source>Server '%1' was rebooted</source>
|
||||||
<translation>Сервер '%1' был перезагружен</translation>
|
<translation>Сервер '%1' был перезагружен</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="611"/>
|
<location filename="../ui/controllers/installController.cpp" line="640"/>
|
||||||
<source>Server '%1' was removed</source>
|
<source>Server '%1' was removed</source>
|
||||||
<translation>Сервер '%1' был удален</translation>
|
<translation>Сервер '%1' был удален</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="622"/>
|
<location filename="../ui/controllers/installController.cpp" line="651"/>
|
||||||
<source>All containers from server '%1' have been removed</source>
|
<source>All containers from server '%1' have been removed</source>
|
||||||
<translation>Все протоколы и сервисы были удалены с сервера '%1'</translation>
|
<translation>Все протоколы и сервисы были удалены с сервера '%1'</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="640"/>
|
<location filename="../ui/controllers/installController.cpp" line="669"/>
|
||||||
<source>%1 has been removed from the server '%2'</source>
|
<source>%1 has been removed from the server '%2'</source>
|
||||||
<translation>%1 был удален с сервера '%2'</translation>
|
<translation>%1 был удален с сервера '%2'</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="649"/>
|
<location filename="../ui/controllers/installController.cpp" line="678"/>
|
||||||
<source>Api config removed</source>
|
<source>Api config removed</source>
|
||||||
<translation>Конфигурация API удалена</translation>
|
<translation>Конфигурация API удалена</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="671"/>
|
<location filename="../ui/controllers/installController.cpp" line="700"/>
|
||||||
<source>%1 cached profile cleared</source>
|
<source>%1 cached profile cleared</source>
|
||||||
<translation>%1 закэшированный профиль очищен</translation>
|
<translation>%1 закэшированный профиль очищен</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="810"/>
|
<location filename="../ui/controllers/installController.cpp" line="839"/>
|
||||||
<source>Please login as the user</source>
|
<source>Please login as the user</source>
|
||||||
<translation>Пожалуйста, войдите в систему от имени пользователя</translation>
|
<translation>Пожалуйста, войдите в систему от имени пользователя</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/installController.cpp" line="838"/>
|
<location filename="../ui/controllers/installController.cpp" line="867"/>
|
||||||
<source>Server added successfully</source>
|
<source>Server added successfully</source>
|
||||||
<translation>Сервер успешно добавлен</translation>
|
<translation>Сервер успешно добавлен</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
@ -690,42 +690,42 @@ Thank you for staying with us!</source>
|
||||||
<translation>MTU</translation>
|
<translation>MTU</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="181"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="180"/>
|
||||||
<source>Server settings</source>
|
<source>Server settings</source>
|
||||||
<translation>Настройки сервера</translation>
|
<translation>Настройки сервера</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="191"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="190"/>
|
||||||
<source>Port</source>
|
<source>Port</source>
|
||||||
<translation>Порт</translation>
|
<translation>Порт</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="278"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="277"/>
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<translation>Сохранить</translation>
|
<translation>Сохранить</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="288"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="287"/>
|
||||||
<source>Save settings?</source>
|
<source>Save settings?</source>
|
||||||
<translation>Сохранить настройки?</translation>
|
<translation>Сохранить настройки?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="289"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="288"/>
|
||||||
<source>Only the settings for this device will be changed</source>
|
<source>Only the settings for this device will be changed</source>
|
||||||
<translation>Будут изменены настройки только для этого устройства</translation>
|
<translation>Будут изменены настройки только для этого устройства</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="290"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="289"/>
|
||||||
<source>Continue</source>
|
<source>Continue</source>
|
||||||
<translation>Продолжить</translation>
|
<translation>Продолжить</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="291"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="290"/>
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<translation>Отменить</translation>
|
<translation>Отменить</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="295"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgClientSettings.qml" line="294"/>
|
||||||
<source>Unable change settings while there is an active connection</source>
|
<source>Unable change settings while there is an active connection</source>
|
||||||
<translation>Невозможно изменить настройки во время активного соединения</translation>
|
<translation>Невозможно изменить настройки во время активного соединения</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
@ -743,12 +743,12 @@ Thank you for staying with us!</source>
|
||||||
<translation>Порт</translation>
|
<translation>Порт</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="366"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="511"/>
|
||||||
<source>All users with whom you shared a connection with will no longer be able to connect to it.</source>
|
<source>All users with whom you shared a connection with will no longer be able to connect to it.</source>
|
||||||
<translation>Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.</translation>
|
<translation>Все пользователи, с которыми вы поделились конфигурацией вашего VPN, больше не смогут к нему подключаться.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="338"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="483"/>
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<translation>Сохранить</translation>
|
<translation>Сохранить</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
@ -793,42 +793,87 @@ Thank you for staying with us!</source>
|
||||||
<translation>H2 - Response packet magic header</translation>
|
<translation>H2 - Response packet magic header</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="288"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="306"/>
|
||||||
<source>H4 - Transport packet magic header</source>
|
<source>H4 - Transport packet magic header</source>
|
||||||
<translation>H4 - Transport packet magic header</translation>
|
<translation>H4 - Transport packet magic header</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="306"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="288"/>
|
||||||
<source>H3 - Underload packet magic header</source>
|
<source>H3 - Underload packet magic header</source>
|
||||||
<translation>H3 - Underload packet magic header</translation>
|
<translation>H3 - Underload packet magic header</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="324"/>
|
||||||
|
<source>I1 - First special junk packet</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="339"/>
|
||||||
|
<source>I2 - Second special junk packet</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="354"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="354"/>
|
||||||
|
<source>I3 - Third special junk packet</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="369"/>
|
||||||
|
<source>I4 - Fourth special junk packet</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="384"/>
|
||||||
|
<source>I5 - Fifth special junk packet</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="399"/>
|
||||||
|
<source>J1 - First controlled junk packet</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="414"/>
|
||||||
|
<source>J2 - Second controlled junk packet</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="429"/>
|
||||||
|
<source>J3 - Third controlled junk packet</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="444"/>
|
||||||
|
<source>Itime - Special handshake timeout</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="499"/>
|
||||||
<source>The values of the H1-H4 fields must be unique</source>
|
<source>The values of the H1-H4 fields must be unique</source>
|
||||||
<translation>Значения в полях H1-H4 должны быть уникальными</translation>
|
<translation>Значения в полях H1-H4 должны быть уникальными</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="360"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="505"/>
|
||||||
<source>The value of the field S1 + message initiation size (148) must not equal S2 + message response size (92)</source>
|
<source>The value of the field S1 + message initiation size (148) must not equal S2 + message response size (92)</source>
|
||||||
<translation>Значение в поле S1 + размер инициации сообщения (148) не должно равняться значению в поле S2 + размер ответа на сообщение (92)</translation>
|
<translation>Значение в поле S1 + размер инициации сообщения (148) не должно равняться значению в поле S2 + размер ответа на сообщение (92)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="365"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="510"/>
|
||||||
<source>Save settings?</source>
|
<source>Save settings?</source>
|
||||||
<translation>Сохранить настройки?</translation>
|
<translation>Сохранить настройки?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="367"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="512"/>
|
||||||
<source>Continue</source>
|
<source>Continue</source>
|
||||||
<translation>Продолжить</translation>
|
<translation>Продолжить</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="368"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="513"/>
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<translation>Отменить</translation>
|
<translation>Отменить</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="372"/>
|
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="517"/>
|
||||||
<source>Unable change settings while there is an active connection</source>
|
<source>Unable change settings while there is an active connection</source>
|
||||||
<translation>Невозможно изменить настройки во время активного соединения</translation>
|
<translation>Невозможно изменить настройки во время активного соединения</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
@ -4766,12 +4811,12 @@ For more detailed information, you can
|
||||||
<context>
|
<context>
|
||||||
<name>SettingsController</name>
|
<name>SettingsController</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/settingsController.cpp" line="170"/>
|
<location filename="../ui/controllers/settingsController.cpp" line="199"/>
|
||||||
<source>All settings have been reset to default values</source>
|
<source>All settings have been reset to default values</source>
|
||||||
<translation>Все настройки сброшены до значений по умолчанию</translation>
|
<translation>Все настройки сброшены до значений по умолчанию</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/controllers/settingsController.cpp" line="148"/>
|
<location filename="../ui/controllers/settingsController.cpp" line="175"/>
|
||||||
<source>Backup file is corrupted</source>
|
<source>Backup file is corrupted</source>
|
||||||
<translation>Файл резервной копии поврежден</translation>
|
<translation>Файл резервной копии поврежден</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -483,6 +483,15 @@ void ApiConfigsController::fillServerConfig(const QString &protocol, const ApiPa
|
||||||
containerConfig[config_key::responsePacketMagicHeader] = protocolConfig.value(config_key::responsePacketMagicHeader);
|
containerConfig[config_key::responsePacketMagicHeader] = protocolConfig.value(config_key::responsePacketMagicHeader);
|
||||||
containerConfig[config_key::underloadPacketMagicHeader] = protocolConfig.value(config_key::underloadPacketMagicHeader);
|
containerConfig[config_key::underloadPacketMagicHeader] = protocolConfig.value(config_key::underloadPacketMagicHeader);
|
||||||
containerConfig[config_key::transportPacketMagicHeader] = protocolConfig.value(config_key::transportPacketMagicHeader);
|
containerConfig[config_key::transportPacketMagicHeader] = protocolConfig.value(config_key::transportPacketMagicHeader);
|
||||||
|
containerConfig[config_key::specialJunk1] = protocolConfig.value(config_key::specialJunk1);
|
||||||
|
containerConfig[config_key::specialJunk2] = protocolConfig.value(config_key::specialJunk2);
|
||||||
|
containerConfig[config_key::specialJunk3] = protocolConfig.value(config_key::specialJunk3);
|
||||||
|
containerConfig[config_key::specialJunk4] = protocolConfig.value(config_key::specialJunk4);
|
||||||
|
containerConfig[config_key::specialJunk5] = protocolConfig.value(config_key::specialJunk5);
|
||||||
|
containerConfig[config_key::controlledJunk1] = protocolConfig.value(config_key::controlledJunk1);
|
||||||
|
containerConfig[config_key::controlledJunk2] = protocolConfig.value(config_key::controlledJunk2);
|
||||||
|
containerConfig[config_key::controlledJunk3] = protocolConfig.value(config_key::controlledJunk3);
|
||||||
|
containerConfig[config_key::specialHandshakeTimeout] = protocolConfig.value(config_key::specialHandshakeTimeout);
|
||||||
container[containerName] = containerConfig;
|
container[containerName] = containerConfig;
|
||||||
containers.replace(0, container);
|
containers.replace(0, container);
|
||||||
newServerConfig[config_key::containers] = containers;
|
newServerConfig[config_key::containers] = containers;
|
||||||
|
|
|
||||||
|
|
@ -285,6 +285,15 @@ void ImportController::processNativeWireGuardConfig()
|
||||||
clientProtocolConfig[config_key::responsePacketMagicHeader] = "2";
|
clientProtocolConfig[config_key::responsePacketMagicHeader] = "2";
|
||||||
clientProtocolConfig[config_key::underloadPacketMagicHeader] = "3";
|
clientProtocolConfig[config_key::underloadPacketMagicHeader] = "3";
|
||||||
clientProtocolConfig[config_key::transportPacketMagicHeader] = "4";
|
clientProtocolConfig[config_key::transportPacketMagicHeader] = "4";
|
||||||
|
clientProtocolConfig[config_key::specialJunk1] = "";
|
||||||
|
clientProtocolConfig[config_key::specialJunk2] = "";
|
||||||
|
clientProtocolConfig[config_key::specialJunk3] = "";
|
||||||
|
clientProtocolConfig[config_key::specialJunk4] = "";
|
||||||
|
clientProtocolConfig[config_key::specialJunk5] = "";
|
||||||
|
clientProtocolConfig[config_key::controlledJunk1] = "";
|
||||||
|
clientProtocolConfig[config_key::controlledJunk2] = "";
|
||||||
|
clientProtocolConfig[config_key::controlledJunk3] = "";
|
||||||
|
clientProtocolConfig[config_key::specialHandshakeTimeout] = "0";
|
||||||
|
|
||||||
clientProtocolConfig[config_key::isObfuscationEnabled] = true;
|
clientProtocolConfig[config_key::isObfuscationEnabled] = true;
|
||||||
|
|
||||||
|
|
@ -443,7 +452,16 @@ QJsonObject ImportController::extractWireGuardConfig(const QString &data)
|
||||||
&& !configMap.value(config_key::responsePacketJunkSize).isEmpty() && !configMap.value(config_key::initPacketMagicHeader).isEmpty()
|
&& !configMap.value(config_key::responsePacketJunkSize).isEmpty() && !configMap.value(config_key::initPacketMagicHeader).isEmpty()
|
||||||
&& !configMap.value(config_key::responsePacketMagicHeader).isEmpty()
|
&& !configMap.value(config_key::responsePacketMagicHeader).isEmpty()
|
||||||
&& !configMap.value(config_key::underloadPacketMagicHeader).isEmpty()
|
&& !configMap.value(config_key::underloadPacketMagicHeader).isEmpty()
|
||||||
&& !configMap.value(config_key::transportPacketMagicHeader).isEmpty()) {
|
&& !configMap.value(config_key::transportPacketMagicHeader).isEmpty()
|
||||||
|
&& !configMap.value(config_key::specialJunk1).isEmpty()
|
||||||
|
&& !configMap.value(config_key::specialJunk2).isEmpty()
|
||||||
|
&& !configMap.value(config_key::specialJunk3).isEmpty()
|
||||||
|
&& !configMap.value(config_key::specialJunk4).isEmpty()
|
||||||
|
&& !configMap.value(config_key::specialJunk5).isEmpty()
|
||||||
|
&& !configMap.value(config_key::controlledJunk1).isEmpty()
|
||||||
|
&& !configMap.value(config_key::controlledJunk2).isEmpty()
|
||||||
|
&& !configMap.value(config_key::controlledJunk3).isEmpty()
|
||||||
|
&& !configMap.value(config_key::specialHandshakeTimeout).isEmpty()) {
|
||||||
lastConfig[config_key::junkPacketCount] = configMap.value(config_key::junkPacketCount);
|
lastConfig[config_key::junkPacketCount] = configMap.value(config_key::junkPacketCount);
|
||||||
lastConfig[config_key::junkPacketMinSize] = configMap.value(config_key::junkPacketMinSize);
|
lastConfig[config_key::junkPacketMinSize] = configMap.value(config_key::junkPacketMinSize);
|
||||||
lastConfig[config_key::junkPacketMaxSize] = configMap.value(config_key::junkPacketMaxSize);
|
lastConfig[config_key::junkPacketMaxSize] = configMap.value(config_key::junkPacketMaxSize);
|
||||||
|
|
@ -453,6 +471,15 @@ QJsonObject ImportController::extractWireGuardConfig(const QString &data)
|
||||||
lastConfig[config_key::responsePacketMagicHeader] = configMap.value(config_key::responsePacketMagicHeader);
|
lastConfig[config_key::responsePacketMagicHeader] = configMap.value(config_key::responsePacketMagicHeader);
|
||||||
lastConfig[config_key::underloadPacketMagicHeader] = configMap.value(config_key::underloadPacketMagicHeader);
|
lastConfig[config_key::underloadPacketMagicHeader] = configMap.value(config_key::underloadPacketMagicHeader);
|
||||||
lastConfig[config_key::transportPacketMagicHeader] = configMap.value(config_key::transportPacketMagicHeader);
|
lastConfig[config_key::transportPacketMagicHeader] = configMap.value(config_key::transportPacketMagicHeader);
|
||||||
|
lastConfig[config_key::specialJunk1] = configMap.value(config_key::specialJunk1);
|
||||||
|
lastConfig[config_key::specialJunk2] = configMap.value(config_key::specialJunk2);
|
||||||
|
lastConfig[config_key::specialJunk3] = configMap.value(config_key::specialJunk3);
|
||||||
|
lastConfig[config_key::specialJunk4] = configMap.value(config_key::specialJunk4);
|
||||||
|
lastConfig[config_key::specialJunk5] = configMap.value(config_key::specialJunk5);
|
||||||
|
lastConfig[config_key::controlledJunk1] = configMap.value(config_key::controlledJunk1);
|
||||||
|
lastConfig[config_key::controlledJunk2] = configMap.value(config_key::controlledJunk2);
|
||||||
|
lastConfig[config_key::controlledJunk3] = configMap.value(config_key::controlledJunk3);
|
||||||
|
lastConfig[config_key::specialHandshakeTimeout] = configMap.value(config_key::specialHandshakeTimeout);
|
||||||
protocolName = "awg";
|
protocolName = "awg";
|
||||||
m_configType = ConfigTypes::Awg;
|
m_configType = ConfigTypes::Awg;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,16 @@ void InstallController::install(DockerContainer container, int port, TransportPr
|
||||||
QString underloadPacketMagicHeader = headersValueList.at(2);
|
QString underloadPacketMagicHeader = headersValueList.at(2);
|
||||||
QString transportPacketMagicHeader = headersValueList.at(3);
|
QString transportPacketMagicHeader = headersValueList.at(3);
|
||||||
|
|
||||||
|
const QString specialJunk1 = headersValueList.at(4);
|
||||||
|
const QString specialJunk2 = headersValueList.at(5);
|
||||||
|
const QString specialJunk3 = headersValueList.at(6);
|
||||||
|
const QString specialJunk4 = headersValueList.at(7);
|
||||||
|
const QString specialJunk5 = headersValueList.at(8);
|
||||||
|
const QString controlledJunk1 = headersValueList.at(9);
|
||||||
|
const QString controlledJunk2 = headersValueList.at(10);
|
||||||
|
const QString controlledJunk3 = headersValueList.at(11);
|
||||||
|
const QString specialHandshakeTimeout = headersValueList.at(12);
|
||||||
|
|
||||||
containerConfig[config_key::junkPacketCount] = junkPacketCount;
|
containerConfig[config_key::junkPacketCount] = junkPacketCount;
|
||||||
containerConfig[config_key::junkPacketMinSize] = junkPacketMinSize;
|
containerConfig[config_key::junkPacketMinSize] = junkPacketMinSize;
|
||||||
containerConfig[config_key::junkPacketMaxSize] = junkPacketMaxSize;
|
containerConfig[config_key::junkPacketMaxSize] = junkPacketMaxSize;
|
||||||
|
|
@ -108,6 +118,15 @@ void InstallController::install(DockerContainer container, int port, TransportPr
|
||||||
containerConfig[config_key::responsePacketMagicHeader] = responsePacketMagicHeader;
|
containerConfig[config_key::responsePacketMagicHeader] = responsePacketMagicHeader;
|
||||||
containerConfig[config_key::underloadPacketMagicHeader] = underloadPacketMagicHeader;
|
containerConfig[config_key::underloadPacketMagicHeader] = underloadPacketMagicHeader;
|
||||||
containerConfig[config_key::transportPacketMagicHeader] = transportPacketMagicHeader;
|
containerConfig[config_key::transportPacketMagicHeader] = transportPacketMagicHeader;
|
||||||
|
containerConfig[config_key::specialJunk1] = specialJunk1;
|
||||||
|
containerConfig[config_key::specialJunk2] = specialJunk2;
|
||||||
|
containerConfig[config_key::specialJunk3] = specialJunk3;
|
||||||
|
containerConfig[config_key::specialJunk4] = specialJunk4;
|
||||||
|
containerConfig[config_key::specialJunk5] = specialJunk5;
|
||||||
|
containerConfig[config_key::controlledJunk1] = controlledJunk1;
|
||||||
|
containerConfig[config_key::controlledJunk2] = controlledJunk2;
|
||||||
|
containerConfig[config_key::controlledJunk3] = controlledJunk3;
|
||||||
|
containerConfig[config_key::specialHandshakeTimeout] = specialHandshakeTimeout;
|
||||||
} else if (container == DockerContainer::Sftp) {
|
} else if (container == DockerContainer::Sftp) {
|
||||||
containerConfig.insert(config_key::userName, protocols::sftp::defaultUserName);
|
containerConfig.insert(config_key::userName, protocols::sftp::defaultUserName);
|
||||||
containerConfig.insert(config_key::password, Utils::getRandomString(16));
|
containerConfig.insert(config_key::password, Utils::getRandomString(16));
|
||||||
|
|
@ -400,6 +419,16 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia
|
||||||
serverConfigMap.value(config_key::underloadPacketMagicHeader);
|
serverConfigMap.value(config_key::underloadPacketMagicHeader);
|
||||||
containerConfig[config_key::transportPacketMagicHeader] =
|
containerConfig[config_key::transportPacketMagicHeader] =
|
||||||
serverConfigMap.value(config_key::transportPacketMagicHeader);
|
serverConfigMap.value(config_key::transportPacketMagicHeader);
|
||||||
|
containerConfig[config_key::specialJunk1] = serverConfigMap.value(config_key::specialJunk1);
|
||||||
|
containerConfig[config_key::specialJunk2] = serverConfigMap.value(config_key::specialJunk2);
|
||||||
|
containerConfig[config_key::specialJunk3] = serverConfigMap.value(config_key::specialJunk3);
|
||||||
|
containerConfig[config_key::specialJunk4] = serverConfigMap.value(config_key::specialJunk4);
|
||||||
|
containerConfig[config_key::specialJunk5] = serverConfigMap.value(config_key::specialJunk5);
|
||||||
|
containerConfig[config_key::controlledJunk1] = serverConfigMap.value(config_key::controlledJunk1);
|
||||||
|
containerConfig[config_key::controlledJunk2] = serverConfigMap.value(config_key::controlledJunk2);
|
||||||
|
containerConfig[config_key::controlledJunk3] = serverConfigMap.value(config_key::controlledJunk3);
|
||||||
|
containerConfig[config_key::specialHandshakeTimeout] = serverConfigMap.value(config_key::specialHandshakeTimeout);
|
||||||
|
|
||||||
|
|
||||||
} else if (protocol == Proto::WireGuard) {
|
} else if (protocol == Proto::WireGuard) {
|
||||||
QString serverConfig = serverController->getTextFileFromContainer(container, credentials,
|
QString serverConfig = serverController->getTextFileFromContainer(container, credentials,
|
||||||
|
|
|
||||||
|
|
@ -25,18 +25,34 @@ bool AwgConfigModel::setData(const QModelIndex &index, const QVariant &value, in
|
||||||
case Roles::PortRole: m_serverProtocolConfig.insert(config_key::port, value.toString()); break;
|
case Roles::PortRole: m_serverProtocolConfig.insert(config_key::port, value.toString()); break;
|
||||||
|
|
||||||
case Roles::ClientMtuRole: m_clientProtocolConfig.insert(config_key::mtu, value.toString()); break;
|
case Roles::ClientMtuRole: m_clientProtocolConfig.insert(config_key::mtu, value.toString()); break;
|
||||||
case Roles::ClientJunkPacketCountRole: m_clientProtocolConfig.insert(config_key::junkPacketCount, value.toString()); break;
|
case Roles::ClientJunkPacketCountRole:
|
||||||
case Roles::ClientJunkPacketMinSizeRole: m_clientProtocolConfig.insert(config_key::junkPacketMinSize, value.toString()); break;
|
m_clientProtocolConfig.insert(config_key::junkPacketCount, value.toString());
|
||||||
case Roles::ClientJunkPacketMaxSizeRole: m_clientProtocolConfig.insert(config_key::junkPacketMaxSize, value.toString()); break;
|
break;
|
||||||
|
case Roles::ClientJunkPacketMinSizeRole:
|
||||||
|
m_clientProtocolConfig.insert(config_key::junkPacketMinSize, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ClientJunkPacketMaxSizeRole:
|
||||||
|
m_clientProtocolConfig.insert(config_key::junkPacketMaxSize, value.toString());
|
||||||
|
break;
|
||||||
|
|
||||||
case Roles::ServerJunkPacketCountRole: m_serverProtocolConfig.insert(config_key::junkPacketCount, value.toString()); break;
|
case Roles::ServerJunkPacketCountRole:
|
||||||
case Roles::ServerJunkPacketMinSizeRole: m_serverProtocolConfig.insert(config_key::junkPacketMinSize, value.toString()); break;
|
m_serverProtocolConfig.insert(config_key::junkPacketCount, value.toString());
|
||||||
case Roles::ServerJunkPacketMaxSizeRole: m_serverProtocolConfig.insert(config_key::junkPacketMaxSize, value.toString()); break;
|
break;
|
||||||
case Roles::ServerInitPacketJunkSizeRole: m_serverProtocolConfig.insert(config_key::initPacketJunkSize, value.toString()); break;
|
case Roles::ServerJunkPacketMinSizeRole:
|
||||||
|
m_serverProtocolConfig.insert(config_key::junkPacketMinSize, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerJunkPacketMaxSizeRole:
|
||||||
|
m_serverProtocolConfig.insert(config_key::junkPacketMaxSize, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerInitPacketJunkSizeRole:
|
||||||
|
m_serverProtocolConfig.insert(config_key::initPacketJunkSize, value.toString());
|
||||||
|
break;
|
||||||
case Roles::ServerResponsePacketJunkSizeRole:
|
case Roles::ServerResponsePacketJunkSizeRole:
|
||||||
m_serverProtocolConfig.insert(config_key::responsePacketJunkSize, value.toString());
|
m_serverProtocolConfig.insert(config_key::responsePacketJunkSize, value.toString());
|
||||||
break;
|
break;
|
||||||
case Roles::ServerInitPacketMagicHeaderRole: m_serverProtocolConfig.insert(config_key::initPacketMagicHeader, value.toString()); break;
|
case Roles::ServerInitPacketMagicHeaderRole:
|
||||||
|
m_serverProtocolConfig.insert(config_key::initPacketMagicHeader, value.toString());
|
||||||
|
break;
|
||||||
case Roles::ServerResponsePacketMagicHeaderRole:
|
case Roles::ServerResponsePacketMagicHeaderRole:
|
||||||
m_serverProtocolConfig.insert(config_key::responsePacketMagicHeader, value.toString());
|
m_serverProtocolConfig.insert(config_key::responsePacketMagicHeader, value.toString());
|
||||||
break;
|
break;
|
||||||
|
|
@ -46,6 +62,33 @@ bool AwgConfigModel::setData(const QModelIndex &index, const QVariant &value, in
|
||||||
case Roles::ServerTransportPacketMagicHeaderRole:
|
case Roles::ServerTransportPacketMagicHeaderRole:
|
||||||
m_serverProtocolConfig.insert(config_key::transportPacketMagicHeader, value.toString());
|
m_serverProtocolConfig.insert(config_key::transportPacketMagicHeader, value.toString());
|
||||||
break;
|
break;
|
||||||
|
case Roles::ServerSpecialJunk1Role:
|
||||||
|
m_serverProtocolConfig.insert(config_key::specialJunk1, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerSpecialJunk2Role:
|
||||||
|
m_serverProtocolConfig.insert(config_key::specialJunk2, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerSpecialJunk3Role:
|
||||||
|
m_serverProtocolConfig.insert(config_key::specialJunk3, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerSpecialJunk4Role:
|
||||||
|
m_serverProtocolConfig.insert(config_key::specialJunk4, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerSpecialJunk5Role:
|
||||||
|
m_serverProtocolConfig.insert(config_key::specialJunk5, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerControlledJunk1Role:
|
||||||
|
m_serverProtocolConfig.insert(config_key::controlledJunk1, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerControlledJunk2Role:
|
||||||
|
m_serverProtocolConfig.insert(config_key::controlledJunk2, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerControlledJunk3Role:
|
||||||
|
m_serverProtocolConfig.insert(config_key::controlledJunk3, value.toString());
|
||||||
|
break;
|
||||||
|
case Roles::ServerSpecialHandshakeTimeoutRole:
|
||||||
|
m_serverProtocolConfig.insert(config_key::specialHandshakeTimeout, value.toString());
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit dataChanged(index, index, QList { role });
|
emit dataChanged(index, index, QList { role });
|
||||||
|
|
@ -71,11 +114,25 @@ QVariant AwgConfigModel::data(const QModelIndex &index, int role) const
|
||||||
case Roles::ServerJunkPacketMinSizeRole: return m_serverProtocolConfig.value(config_key::junkPacketMinSize);
|
case Roles::ServerJunkPacketMinSizeRole: return m_serverProtocolConfig.value(config_key::junkPacketMinSize);
|
||||||
case Roles::ServerJunkPacketMaxSizeRole: return m_serverProtocolConfig.value(config_key::junkPacketMaxSize);
|
case Roles::ServerJunkPacketMaxSizeRole: return m_serverProtocolConfig.value(config_key::junkPacketMaxSize);
|
||||||
case Roles::ServerInitPacketJunkSizeRole: return m_serverProtocolConfig.value(config_key::initPacketJunkSize);
|
case Roles::ServerInitPacketJunkSizeRole: return m_serverProtocolConfig.value(config_key::initPacketJunkSize);
|
||||||
case Roles::ServerResponsePacketJunkSizeRole: return m_serverProtocolConfig.value(config_key::responsePacketJunkSize);
|
case Roles::ServerResponsePacketJunkSizeRole:
|
||||||
|
return m_serverProtocolConfig.value(config_key::responsePacketJunkSize);
|
||||||
case Roles::ServerInitPacketMagicHeaderRole: return m_serverProtocolConfig.value(config_key::initPacketMagicHeader);
|
case Roles::ServerInitPacketMagicHeaderRole: return m_serverProtocolConfig.value(config_key::initPacketMagicHeader);
|
||||||
case Roles::ServerResponsePacketMagicHeaderRole: return m_serverProtocolConfig.value(config_key::responsePacketMagicHeader);
|
case Roles::ServerResponsePacketMagicHeaderRole:
|
||||||
case Roles::ServerUnderloadPacketMagicHeaderRole: return m_serverProtocolConfig.value(config_key::underloadPacketMagicHeader);
|
return m_serverProtocolConfig.value(config_key::responsePacketMagicHeader);
|
||||||
case Roles::ServerTransportPacketMagicHeaderRole: return m_serverProtocolConfig.value(config_key::transportPacketMagicHeader);
|
case Roles::ServerUnderloadPacketMagicHeaderRole:
|
||||||
|
return m_serverProtocolConfig.value(config_key::underloadPacketMagicHeader);
|
||||||
|
case Roles::ServerTransportPacketMagicHeaderRole:
|
||||||
|
return m_serverProtocolConfig.value(config_key::transportPacketMagicHeader);
|
||||||
|
case Roles::ServerSpecialJunk1Role: return m_serverProtocolConfig.value(config_key::specialJunk1);
|
||||||
|
case Roles::ServerSpecialJunk2Role: return m_serverProtocolConfig.value(config_key::specialJunk2);
|
||||||
|
case Roles::ServerSpecialJunk3Role: return m_serverProtocolConfig.value(config_key::specialJunk3);
|
||||||
|
case Roles::ServerSpecialJunk4Role: return m_serverProtocolConfig.value(config_key::specialJunk4);
|
||||||
|
case Roles::ServerSpecialJunk5Role: return m_serverProtocolConfig.value(config_key::specialJunk5);
|
||||||
|
case Roles::ServerControlledJunk1Role: return m_serverProtocolConfig.value(config_key::controlledJunk1);
|
||||||
|
case Roles::ServerControlledJunk2Role: return m_serverProtocolConfig.value(config_key::controlledJunk2);
|
||||||
|
case Roles::ServerControlledJunk3Role: return m_serverProtocolConfig.value(config_key::controlledJunk3);
|
||||||
|
case Roles::ServerSpecialHandshakeTimeoutRole:
|
||||||
|
return m_serverProtocolConfig.value(config_key::specialHandshakeTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
@ -90,12 +147,15 @@ void AwgConfigModel::updateModel(const QJsonObject &config)
|
||||||
|
|
||||||
QJsonObject serverProtocolConfig = config.value(config_key::awg).toObject();
|
QJsonObject serverProtocolConfig = config.value(config_key::awg).toObject();
|
||||||
|
|
||||||
auto defaultTransportProto = ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(Proto::Awg), Proto::Awg);
|
auto defaultTransportProto =
|
||||||
|
ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(Proto::Awg), Proto::Awg);
|
||||||
m_serverProtocolConfig.insert(config_key::transport_proto,
|
m_serverProtocolConfig.insert(config_key::transport_proto,
|
||||||
serverProtocolConfig.value(config_key::transport_proto).toString(defaultTransportProto));
|
serverProtocolConfig.value(config_key::transport_proto).toString(defaultTransportProto));
|
||||||
m_serverProtocolConfig[config_key::last_config] = serverProtocolConfig.value(config_key::last_config);
|
m_serverProtocolConfig[config_key::last_config] = serverProtocolConfig.value(config_key::last_config);
|
||||||
m_serverProtocolConfig[config_key::subnet_address] = serverProtocolConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress);
|
m_serverProtocolConfig[config_key::subnet_address] =
|
||||||
m_serverProtocolConfig[config_key::port] = serverProtocolConfig.value(config_key::port).toString(protocols::awg::defaultPort);
|
serverProtocolConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress);
|
||||||
|
m_serverProtocolConfig[config_key::port] =
|
||||||
|
serverProtocolConfig.value(config_key::port).toString(protocols::awg::defaultPort);
|
||||||
m_serverProtocolConfig[config_key::junkPacketCount] =
|
m_serverProtocolConfig[config_key::junkPacketCount] =
|
||||||
serverProtocolConfig.value(config_key::junkPacketCount).toString(protocols::awg::defaultJunkPacketCount);
|
serverProtocolConfig.value(config_key::junkPacketCount).toString(protocols::awg::defaultJunkPacketCount);
|
||||||
m_serverProtocolConfig[config_key::junkPacketMinSize] =
|
m_serverProtocolConfig[config_key::junkPacketMinSize] =
|
||||||
|
|
@ -105,25 +165,51 @@ void AwgConfigModel::updateModel(const QJsonObject &config)
|
||||||
m_serverProtocolConfig[config_key::initPacketJunkSize] =
|
m_serverProtocolConfig[config_key::initPacketJunkSize] =
|
||||||
serverProtocolConfig.value(config_key::initPacketJunkSize).toString(protocols::awg::defaultInitPacketJunkSize);
|
serverProtocolConfig.value(config_key::initPacketJunkSize).toString(protocols::awg::defaultInitPacketJunkSize);
|
||||||
m_serverProtocolConfig[config_key::responsePacketJunkSize] =
|
m_serverProtocolConfig[config_key::responsePacketJunkSize] =
|
||||||
serverProtocolConfig.value(config_key::responsePacketJunkSize).toString(protocols::awg::defaultResponsePacketJunkSize);
|
serverProtocolConfig.value(config_key::responsePacketJunkSize)
|
||||||
|
.toString(protocols::awg::defaultResponsePacketJunkSize);
|
||||||
m_serverProtocolConfig[config_key::initPacketMagicHeader] =
|
m_serverProtocolConfig[config_key::initPacketMagicHeader] =
|
||||||
serverProtocolConfig.value(config_key::initPacketMagicHeader).toString(protocols::awg::defaultInitPacketMagicHeader);
|
serverProtocolConfig.value(config_key::initPacketMagicHeader)
|
||||||
|
.toString(protocols::awg::defaultInitPacketMagicHeader);
|
||||||
m_serverProtocolConfig[config_key::responsePacketMagicHeader] =
|
m_serverProtocolConfig[config_key::responsePacketMagicHeader] =
|
||||||
serverProtocolConfig.value(config_key::responsePacketMagicHeader).toString(protocols::awg::defaultResponsePacketMagicHeader);
|
serverProtocolConfig.value(config_key::responsePacketMagicHeader)
|
||||||
|
.toString(protocols::awg::defaultResponsePacketMagicHeader);
|
||||||
m_serverProtocolConfig[config_key::underloadPacketMagicHeader] =
|
m_serverProtocolConfig[config_key::underloadPacketMagicHeader] =
|
||||||
serverProtocolConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader);
|
serverProtocolConfig.value(config_key::underloadPacketMagicHeader)
|
||||||
|
.toString(protocols::awg::defaultUnderloadPacketMagicHeader);
|
||||||
m_serverProtocolConfig[config_key::transportPacketMagicHeader] =
|
m_serverProtocolConfig[config_key::transportPacketMagicHeader] =
|
||||||
serverProtocolConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader);
|
serverProtocolConfig.value(config_key::transportPacketMagicHeader)
|
||||||
|
.toString(protocols::awg::defaultTransportPacketMagicHeader);
|
||||||
|
m_serverProtocolConfig[config_key::specialJunk1] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk1).toString(protocols::awg::defaultSpecialJunk1);
|
||||||
|
m_serverProtocolConfig[config_key::specialJunk2] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk2).toString(protocols::awg::defaultSpecialJunk2);
|
||||||
|
m_serverProtocolConfig[config_key::specialJunk3] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk3).toString(protocols::awg::defaultSpecialJunk3);
|
||||||
|
m_serverProtocolConfig[config_key::specialJunk4] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk4).toString(protocols::awg::defaultSpecialJunk4);
|
||||||
|
m_serverProtocolConfig[config_key::specialJunk5] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk5).toString(protocols::awg::defaultSpecialJunk5);
|
||||||
|
m_serverProtocolConfig[config_key::controlledJunk1] =
|
||||||
|
serverProtocolConfig.value(config_key::controlledJunk1).toString(protocols::awg::defaultControlledJunk1);
|
||||||
|
m_serverProtocolConfig[config_key::controlledJunk2] =
|
||||||
|
serverProtocolConfig.value(config_key::controlledJunk2).toString(protocols::awg::defaultControlledJunk2);
|
||||||
|
m_serverProtocolConfig[config_key::controlledJunk3] =
|
||||||
|
serverProtocolConfig.value(config_key::controlledJunk3).toString(protocols::awg::defaultControlledJunk3);
|
||||||
|
m_serverProtocolConfig[config_key::specialHandshakeTimeout] =
|
||||||
|
serverProtocolConfig.value(config_key::specialHandshakeTimeout).toString(protocols::awg::defaultSpecialHandshakeTimeout);
|
||||||
|
|
||||||
auto lastConfig = m_serverProtocolConfig.value(config_key::last_config).toString();
|
auto lastConfig = m_serverProtocolConfig.value(config_key::last_config).toString();
|
||||||
QJsonObject clientProtocolConfig = QJsonDocument::fromJson(lastConfig.toUtf8()).object();
|
QJsonObject clientProtocolConfig = QJsonDocument::fromJson(lastConfig.toUtf8()).object();
|
||||||
m_clientProtocolConfig[config_key::mtu] = clientProtocolConfig[config_key::mtu].toString(protocols::awg::defaultMtu);
|
m_clientProtocolConfig[config_key::mtu] = clientProtocolConfig[config_key::mtu].toString(protocols::awg::defaultMtu);
|
||||||
m_clientProtocolConfig[config_key::junkPacketCount] =
|
m_clientProtocolConfig[config_key::junkPacketCount] =
|
||||||
clientProtocolConfig.value(config_key::junkPacketCount).toString(m_serverProtocolConfig[config_key::junkPacketCount].toString());
|
clientProtocolConfig.value(config_key::junkPacketCount)
|
||||||
|
.toString(m_serverProtocolConfig[config_key::junkPacketCount].toString());
|
||||||
m_clientProtocolConfig[config_key::junkPacketMinSize] =
|
m_clientProtocolConfig[config_key::junkPacketMinSize] =
|
||||||
clientProtocolConfig.value(config_key::junkPacketMinSize).toString(m_serverProtocolConfig[config_key::junkPacketMinSize].toString());
|
clientProtocolConfig.value(config_key::junkPacketMinSize)
|
||||||
|
.toString(m_serverProtocolConfig[config_key::junkPacketMinSize].toString());
|
||||||
m_clientProtocolConfig[config_key::junkPacketMaxSize] =
|
m_clientProtocolConfig[config_key::junkPacketMaxSize] =
|
||||||
clientProtocolConfig.value(config_key::junkPacketMaxSize).toString(m_serverProtocolConfig[config_key::junkPacketMaxSize].toString());
|
clientProtocolConfig.value(config_key::junkPacketMaxSize)
|
||||||
|
.toString(m_serverProtocolConfig[config_key::junkPacketMaxSize].toString());
|
||||||
endResetModel();
|
endResetModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -189,6 +275,16 @@ QHash<int, QByteArray> AwgConfigModel::roleNames() const
|
||||||
roles[ServerUnderloadPacketMagicHeaderRole] = "serverUnderloadPacketMagicHeader";
|
roles[ServerUnderloadPacketMagicHeaderRole] = "serverUnderloadPacketMagicHeader";
|
||||||
roles[ServerTransportPacketMagicHeaderRole] = "serverTransportPacketMagicHeader";
|
roles[ServerTransportPacketMagicHeaderRole] = "serverTransportPacketMagicHeader";
|
||||||
|
|
||||||
|
roles[ServerSpecialJunk1Role] = "specialJunk1";
|
||||||
|
roles[ServerSpecialJunk2Role] = "specialJunk2";
|
||||||
|
roles[ServerSpecialJunk3Role] = "specialJunk3";
|
||||||
|
roles[ServerSpecialJunk4Role] = "specialJunk4";
|
||||||
|
roles[ServerSpecialJunk5Role] = "specialJunk5";
|
||||||
|
roles[ServerControlledJunk1Role] = "controlledJunk1";
|
||||||
|
roles[ServerControlledJunk2Role] = "controlledJunk2";
|
||||||
|
roles[ServerControlledJunk3Role] = "controlledJunk3";
|
||||||
|
roles[ServerSpecialHandshakeTimeoutRole] = "specialHandshakeTimeout";
|
||||||
|
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -197,37 +293,67 @@ AwgConfig::AwgConfig(const QJsonObject &serverProtocolConfig)
|
||||||
auto lastConfig = serverProtocolConfig.value(config_key::last_config).toString();
|
auto lastConfig = serverProtocolConfig.value(config_key::last_config).toString();
|
||||||
QJsonObject clientProtocolConfig = QJsonDocument::fromJson(lastConfig.toUtf8()).object();
|
QJsonObject clientProtocolConfig = QJsonDocument::fromJson(lastConfig.toUtf8()).object();
|
||||||
clientMtu = clientProtocolConfig[config_key::mtu].toString(protocols::awg::defaultMtu);
|
clientMtu = clientProtocolConfig[config_key::mtu].toString(protocols::awg::defaultMtu);
|
||||||
clientJunkPacketCount = clientProtocolConfig.value(config_key::junkPacketCount).toString(protocols::awg::defaultJunkPacketCount);
|
clientJunkPacketCount =
|
||||||
clientJunkPacketMinSize = clientProtocolConfig.value(config_key::junkPacketMinSize).toString(protocols::awg::defaultJunkPacketMinSize);
|
clientProtocolConfig.value(config_key::junkPacketCount).toString(protocols::awg::defaultJunkPacketCount);
|
||||||
clientJunkPacketMaxSize = clientProtocolConfig.value(config_key::junkPacketMaxSize).toString(protocols::awg::defaultJunkPacketMaxSize);
|
clientJunkPacketMinSize =
|
||||||
|
clientProtocolConfig.value(config_key::junkPacketMinSize).toString(protocols::awg::defaultJunkPacketMinSize);
|
||||||
|
clientJunkPacketMaxSize =
|
||||||
|
clientProtocolConfig.value(config_key::junkPacketMaxSize).toString(protocols::awg::defaultJunkPacketMaxSize);
|
||||||
|
|
||||||
subnetAddress = serverProtocolConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress);
|
subnetAddress =
|
||||||
|
serverProtocolConfig.value(config_key::subnet_address).toString(protocols::wireguard::defaultSubnetAddress);
|
||||||
port = serverProtocolConfig.value(config_key::port).toString(protocols::awg::defaultPort);
|
port = serverProtocolConfig.value(config_key::port).toString(protocols::awg::defaultPort);
|
||||||
serverJunkPacketCount = serverProtocolConfig.value(config_key::junkPacketCount).toString(protocols::awg::defaultJunkPacketCount);
|
serverJunkPacketCount =
|
||||||
serverJunkPacketMinSize = serverProtocolConfig.value(config_key::junkPacketMinSize).toString(protocols::awg::defaultJunkPacketMinSize);
|
serverProtocolConfig.value(config_key::junkPacketCount).toString(protocols::awg::defaultJunkPacketCount);
|
||||||
serverJunkPacketMaxSize = serverProtocolConfig.value(config_key::junkPacketMaxSize).toString(protocols::awg::defaultJunkPacketMaxSize);
|
serverJunkPacketMinSize =
|
||||||
serverInitPacketJunkSize = serverProtocolConfig.value(config_key::initPacketJunkSize).toString(protocols::awg::defaultInitPacketJunkSize);
|
serverProtocolConfig.value(config_key::junkPacketMinSize).toString(protocols::awg::defaultJunkPacketMinSize);
|
||||||
serverResponsePacketJunkSize =
|
serverJunkPacketMaxSize =
|
||||||
serverProtocolConfig.value(config_key::responsePacketJunkSize).toString(protocols::awg::defaultResponsePacketJunkSize);
|
serverProtocolConfig.value(config_key::junkPacketMaxSize).toString(protocols::awg::defaultJunkPacketMaxSize);
|
||||||
serverInitPacketMagicHeader =
|
serverInitPacketJunkSize =
|
||||||
serverProtocolConfig.value(config_key::initPacketMagicHeader).toString(protocols::awg::defaultInitPacketMagicHeader);
|
serverProtocolConfig.value(config_key::initPacketJunkSize).toString(protocols::awg::defaultInitPacketJunkSize);
|
||||||
serverResponsePacketMagicHeader =
|
serverResponsePacketJunkSize = serverProtocolConfig.value(config_key::responsePacketJunkSize)
|
||||||
serverProtocolConfig.value(config_key::responsePacketMagicHeader).toString(protocols::awg::defaultResponsePacketMagicHeader);
|
.toString(protocols::awg::defaultResponsePacketJunkSize);
|
||||||
serverUnderloadPacketMagicHeader =
|
serverInitPacketMagicHeader = serverProtocolConfig.value(config_key::initPacketMagicHeader)
|
||||||
serverProtocolConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::awg::defaultUnderloadPacketMagicHeader);
|
.toString(protocols::awg::defaultInitPacketMagicHeader);
|
||||||
serverTransportPacketMagicHeader =
|
serverResponsePacketMagicHeader = serverProtocolConfig.value(config_key::responsePacketMagicHeader)
|
||||||
serverProtocolConfig.value(config_key::transportPacketMagicHeader).toString(protocols::awg::defaultTransportPacketMagicHeader);
|
.toString(protocols::awg::defaultResponsePacketMagicHeader);
|
||||||
|
serverUnderloadPacketMagicHeader = serverProtocolConfig.value(config_key::underloadPacketMagicHeader)
|
||||||
|
.toString(protocols::awg::defaultUnderloadPacketMagicHeader);
|
||||||
|
serverTransportPacketMagicHeader = serverProtocolConfig.value(config_key::transportPacketMagicHeader)
|
||||||
|
.toString(protocols::awg::defaultTransportPacketMagicHeader);
|
||||||
|
serverSpecialJunk[config_key::specialJunk1] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk1).toString(protocols::awg::defaultSpecialJunk1);
|
||||||
|
serverSpecialJunk[config_key::specialJunk2] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk2).toString(protocols::awg::defaultSpecialJunk2);
|
||||||
|
serverSpecialJunk[config_key::specialJunk3] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk3).toString(protocols::awg::defaultSpecialJunk3);
|
||||||
|
serverSpecialJunk[config_key::specialJunk4] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk4).toString(protocols::awg::defaultSpecialJunk4);
|
||||||
|
serverSpecialJunk[config_key::specialJunk5] =
|
||||||
|
serverProtocolConfig.value(config_key::specialJunk5).toString(protocols::awg::defaultSpecialJunk5);
|
||||||
|
serverControlledJunk[config_key::controlledJunk1] =
|
||||||
|
serverProtocolConfig.value(config_key::controlledJunk1).toString(protocols::awg::defaultControlledJunk1);
|
||||||
|
serverControlledJunk[config_key::controlledJunk2] =
|
||||||
|
serverProtocolConfig.value(config_key::controlledJunk2).toString(protocols::awg::defaultControlledJunk2);
|
||||||
|
serverControlledJunk[config_key::controlledJunk3] =
|
||||||
|
serverProtocolConfig.value(config_key::controlledJunk3).toString(protocols::awg::defaultControlledJunk3);
|
||||||
|
serverSpecialHandshakeTimeout = serverProtocolConfig.value(config_key::specialHandshakeTimeout)
|
||||||
|
.toString(protocols::awg::defaultSpecialHandshakeTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AwgConfig::hasEqualServerSettings(const AwgConfig &other) const
|
bool AwgConfig::hasEqualServerSettings(const AwgConfig &other) const
|
||||||
{
|
{
|
||||||
if (subnetAddress != other.subnetAddress || port != other.port || serverJunkPacketCount != other.serverJunkPacketCount
|
if (subnetAddress != other.subnetAddress || port != other.port || serverJunkPacketCount != other.serverJunkPacketCount
|
||||||
|| serverJunkPacketMinSize != other.serverJunkPacketMinSize || serverJunkPacketMaxSize != other.serverJunkPacketMaxSize
|
|| serverJunkPacketMinSize != other.serverJunkPacketMinSize
|
||||||
|| serverInitPacketJunkSize != other.serverInitPacketJunkSize || serverResponsePacketJunkSize != other.serverResponsePacketJunkSize
|
|| serverJunkPacketMaxSize != other.serverJunkPacketMaxSize
|
||||||
|
|| serverInitPacketJunkSize != other.serverInitPacketJunkSize
|
||||||
|
|| serverResponsePacketJunkSize != other.serverResponsePacketJunkSize
|
||||||
|| serverInitPacketMagicHeader != other.serverInitPacketMagicHeader
|
|| serverInitPacketMagicHeader != other.serverInitPacketMagicHeader
|
||||||
|| serverResponsePacketMagicHeader != other.serverResponsePacketMagicHeader
|
|| serverResponsePacketMagicHeader != other.serverResponsePacketMagicHeader
|
||||||
|| serverUnderloadPacketMagicHeader != other.serverUnderloadPacketMagicHeader
|
|| serverUnderloadPacketMagicHeader != other.serverUnderloadPacketMagicHeader
|
||||||
|| serverTransportPacketMagicHeader != other.serverTransportPacketMagicHeader) {
|
|| serverTransportPacketMagicHeader != other.serverTransportPacketMagicHeader
|
||||||
|
|| serverSpecialJunk != other.serverSpecialJunk || serverControlledJunk != other.serverControlledJunk
|
||||||
|
|| serverSpecialHandshakeTimeout != other.serverSpecialHandshakeTimeout) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -236,7 +362,8 @@ bool AwgConfig::hasEqualServerSettings(const AwgConfig &other) const
|
||||||
bool AwgConfig::hasEqualClientSettings(const AwgConfig &other) const
|
bool AwgConfig::hasEqualClientSettings(const AwgConfig &other) const
|
||||||
{
|
{
|
||||||
if (clientMtu != other.clientMtu || clientJunkPacketCount != other.clientJunkPacketCount
|
if (clientMtu != other.clientMtu || clientJunkPacketCount != other.clientJunkPacketCount
|
||||||
|| clientJunkPacketMinSize != other.clientJunkPacketMinSize || clientJunkPacketMaxSize != other.clientJunkPacketMaxSize) {
|
|| clientJunkPacketMinSize != other.clientJunkPacketMinSize
|
||||||
|
|| clientJunkPacketMaxSize != other.clientJunkPacketMaxSize) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,10 @@ struct AwgConfig
|
||||||
QString serverUnderloadPacketMagicHeader;
|
QString serverUnderloadPacketMagicHeader;
|
||||||
QString serverTransportPacketMagicHeader;
|
QString serverTransportPacketMagicHeader;
|
||||||
|
|
||||||
|
QMap<QString, QString> serverSpecialJunk;
|
||||||
|
QMap<QString, QString> serverControlledJunk;
|
||||||
|
QString serverSpecialHandshakeTimeout;
|
||||||
|
|
||||||
bool hasEqualServerSettings(const AwgConfig &other) const;
|
bool hasEqualServerSettings(const AwgConfig &other) const;
|
||||||
bool hasEqualClientSettings(const AwgConfig &other) const;
|
bool hasEqualClientSettings(const AwgConfig &other) const;
|
||||||
|
|
||||||
|
|
@ -60,7 +64,16 @@ public:
|
||||||
ServerInitPacketMagicHeaderRole,
|
ServerInitPacketMagicHeaderRole,
|
||||||
ServerResponsePacketMagicHeaderRole,
|
ServerResponsePacketMagicHeaderRole,
|
||||||
ServerUnderloadPacketMagicHeaderRole,
|
ServerUnderloadPacketMagicHeaderRole,
|
||||||
ServerTransportPacketMagicHeaderRole
|
ServerTransportPacketMagicHeaderRole,
|
||||||
|
ServerSpecialJunk1Role,
|
||||||
|
ServerSpecialJunk2Role,
|
||||||
|
ServerSpecialJunk3Role,
|
||||||
|
ServerSpecialJunk4Role,
|
||||||
|
ServerSpecialJunk5Role,
|
||||||
|
ServerControlledJunk1Role,
|
||||||
|
ServerControlledJunk2Role,
|
||||||
|
ServerControlledJunk3Role,
|
||||||
|
ServerSpecialHandshakeTimeoutRole,
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit AwgConfigModel(QObject *parent = nullptr);
|
explicit AwgConfigModel(QObject *parent = nullptr);
|
||||||
|
|
|
||||||
|
|
@ -256,105 +256,6 @@ PageType {
|
||||||
headerText: "H4 - Transport packet magic header"
|
headerText: "H4 - Transport packet magic header"
|
||||||
textField.text: serverTransportPacketMagicHeader
|
textField.text: serverTransportPacketMagicHeader
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
|
||||||
id: i1JunkPacketTextField
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.topMargin: 16
|
|
||||||
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
headerText: "I1 - First special junk packet"
|
|
||||||
textField.text: serverI1JunkPacket
|
|
||||||
}
|
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
|
||||||
id: i2JunkPacketTextField
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.topMargin: 16
|
|
||||||
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
headerText: "I2 - Second special junk packet"
|
|
||||||
textField.text: serverI2JunkPacket
|
|
||||||
}
|
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
|
||||||
id: i3JunkPacketTextField
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.topMargin: 16
|
|
||||||
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
headerText: "I3 - Third special junk packet"
|
|
||||||
textField.text: serverI3JunkPacket
|
|
||||||
}
|
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
|
||||||
id: i4JunkPacketTextField
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.topMargin: 16
|
|
||||||
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
headerText: "I4 - Fourth special junk packet"
|
|
||||||
textField.text: serverI4JunkPacket
|
|
||||||
}
|
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
|
||||||
id: i5JunkPacketTextField
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.topMargin: 16
|
|
||||||
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
headerText: "I5 - Fifth special junk packet"
|
|
||||||
textField.text: serverI5JunkPacket
|
|
||||||
}
|
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
|
||||||
id: j1JunkPacketTextField
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.topMargin: 16
|
|
||||||
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
headerText: "J1 - First controlled junk packet"
|
|
||||||
textField.text: serverJ1JunkPacket
|
|
||||||
}
|
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
|
||||||
id: j2JunkPacketTextField
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.topMargin: 16
|
|
||||||
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
headerText: "J2 - Second controlled junk packet"
|
|
||||||
textField.text: serverJ2JunkPacket
|
|
||||||
}
|
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
|
||||||
id: j3JunkPacketTextField
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.topMargin: 16
|
|
||||||
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
headerText: "J3 - Third controlled junk packet"
|
|
||||||
textField.text: serverJ3JunkPacket
|
|
||||||
}
|
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
|
||||||
id: iTimeTextField
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.topMargin: 16
|
|
||||||
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
headerText: "Itime - Special handshake timeout"
|
|
||||||
textField.text: serverSepciaHandshaketIntervalTime
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -317,169 +317,137 @@ PageType {
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
TextFieldWithHeaderType {
|
||||||
id: I1JunkPacketTextField
|
id: i1JunkPacketTextField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 16
|
Layout.topMargin: 16
|
||||||
|
|
||||||
headerText: qsTr("I1 - First special junk packet")
|
headerText: qsTr("I1 - First special junk packet")
|
||||||
textField.text: serverI1JunkPacket
|
textField.text: serverSpecialJunk["I1"]
|
||||||
textField.validator: IntValidator { bottom: 0 }
|
|
||||||
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== serverI1JunkPacket) {
|
if (textField.text !== serverI1JunkPacket) {
|
||||||
serverI1JunkPacket = textField.text
|
serverI1JunkPacket = textField.text
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEmptyText: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
TextFieldWithHeaderType {
|
||||||
id: I2JunkPacketTextField
|
id: i2JunkPacketTextField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 16
|
Layout.topMargin: 16
|
||||||
|
|
||||||
headerText: qsTr("I2 - Second special junk packet")
|
headerText: qsTr("I2 - Second special junk packet")
|
||||||
textField.text: serverI2JunkPacket
|
textField.text: serverSpecialJunk["I2"]
|
||||||
textField.validator: IntValidator { bottom: 0 }
|
|
||||||
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== serverI2JunkPacket) {
|
if (textField.text !== serverI2JunkPacket) {
|
||||||
serverI2JunkPacket = textField.text
|
serverI2JunkPacket = textField.text
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEmptyText: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
TextFieldWithHeaderType {
|
||||||
id: I3JunkPacketTextField
|
id: i3JunkPacketTextField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 16
|
Layout.topMargin: 16
|
||||||
|
|
||||||
headerText: qsTr("I3 - Third special junk packet")
|
headerText: qsTr("I3 - Third special junk packet")
|
||||||
textField.text: serverI3JunkPacket
|
textField.text: serverSpecialJunk["I3"]
|
||||||
textField.validator: IntValidator { bottom: 0 }
|
|
||||||
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== serverI3JunkPacket) {
|
if (textField.text !== serverI3JunkPacket) {
|
||||||
serverI3JunkPacket = textField.text
|
serverI3JunkPacket = textField.text
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEmptyText: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
TextFieldWithHeaderType {
|
||||||
id: I4JunkPacketTextField
|
id: i4JunkPacketTextField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 16
|
Layout.topMargin: 16
|
||||||
|
|
||||||
headerText: qsTr("I4 - Fourth special junk packet")
|
headerText: qsTr("I4 - Fourth special junk packet")
|
||||||
textField.text: serverI4JunkPacket
|
textField.text: serverSpecialJunk["I4"]
|
||||||
textField.validator: IntValidator { bottom: 0 }
|
|
||||||
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== serverI4JunkPacket) {
|
if (textField.text !== serverI4JunkPacket) {
|
||||||
serverI4JunkPacket = textField.text
|
serverI4JunkPacket = textField.text
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEmptyText: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
TextFieldWithHeaderType {
|
||||||
id: I5JunkPacketTextField
|
id: i5JunkPacketTextField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 16
|
Layout.topMargin: 16
|
||||||
|
|
||||||
headerText: qsTr("I5 - Fifth special junk packet")
|
headerText: qsTr("I5 - Fifth special junk packet")
|
||||||
textField.text: serverI5JunkPacket
|
textField.text: serverSpecialJunk["I5"]
|
||||||
textField.validator: IntValidator { bottom: 0 }
|
|
||||||
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== serverI5JunkPacket) {
|
if (textField.text !== serverI5JunkPacket) {
|
||||||
serverI5JunkPacket = textField.text
|
serverI5JunkPacket = textField.text
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEmptyText: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
TextFieldWithHeaderType {
|
||||||
id: J1JunkPacketTextField
|
id: j1JunkPacketTextField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 16
|
Layout.topMargin: 16
|
||||||
|
|
||||||
headerText: qsTr("J1 - First controlled junk packet")
|
headerText: qsTr("J1 - First controlled junk packet")
|
||||||
textField.text: serverJ1JunkPacket
|
textField.text: serverControlledJunk["J1"]
|
||||||
textField.validator: IntValidator { bottom: 0 }
|
|
||||||
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== serverJ1JunkPacket) {
|
if (textField.text !== serverJ1JunkPacket) {
|
||||||
serverJ1JunkPacket = textField.text
|
serverJ1JunkPacket = textField.text
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEmptyText: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
TextFieldWithHeaderType {
|
||||||
id: J2JunkPacketTextField
|
id: j2JunkPacketTextField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 16
|
Layout.topMargin: 16
|
||||||
|
|
||||||
headerText: qsTr("J2 - Second controlled junk packet")
|
headerText: qsTr("J2 - Second controlled junk packet")
|
||||||
textField.text: serverJ2JunkPacket
|
textField.text: serverControlledJunk[J2]
|
||||||
textField.validator: IntValidator { bottom: 0 }
|
|
||||||
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== serverJ2JunkPacket) {
|
if (textField.text !== serverJ2JunkPacket) {
|
||||||
serverJ2JunkPacket = textField.text
|
serverJ2JunkPacket = textField.text
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEmptyText: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
TextFieldWithHeaderType {
|
||||||
id: J3JunkPacketTextField
|
id: j3JunkPacketTextField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 16
|
Layout.topMargin: 16
|
||||||
|
|
||||||
headerText: qsTr("J3 - Third controlled junk packet")
|
headerText: qsTr("J3 - Third controlled junk packet")
|
||||||
textField.text: serverJ3JunkPacket
|
textField.text: serverControlledJunk[J3]
|
||||||
textField.validator: IntValidator { bottom: 0 }
|
|
||||||
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== serverJ3JunkPacket) {
|
if (textField.text !== serverJ3JunkPacket) {
|
||||||
serverJ3JunkPacket = textField.text
|
serverJ3JunkPacket = textField.text
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEmptyText: true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextFieldWithHeaderType {
|
TextFieldWithHeaderType {
|
||||||
id: ItimeTextField
|
id: iTimeTextField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 16
|
Layout.topMargin: 16
|
||||||
|
|
||||||
headerText: qsTr("Itime - Special handshake timeout")
|
headerText: qsTr("Itime - Special handshake timeout")
|
||||||
textField.text: serverSepciaHandshaketIntervalTime
|
textField.text: serverSpeciaHandshakeIntervalTime
|
||||||
textField.validator: IntValidator { bottom: 0 }
|
textField.validator: IntValidator { bottom: 0 }
|
||||||
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== serverSepcialHandshakeIntervalTime) {
|
if (textField.text !== serverSepcialHandshakeTimeout) {
|
||||||
serverSepcialHandshakeIntervalTime = textField.text
|
serverSepcialHandshakeTimeout = textField.text
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
checkEmptyText: true
|
|
||||||
|
|
||||||
onActiveFocusChanged: {
|
|
||||||
if(activeFocus) {
|
|
||||||
listview.positionViewAtEnd()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -500,15 +468,15 @@ PageType {
|
||||||
junkPacketMaxSizeTextField.errorText === "" &&
|
junkPacketMaxSizeTextField.errorText === "" &&
|
||||||
junkPacketMinSizeTextField.errorText === "" &&
|
junkPacketMinSizeTextField.errorText === "" &&
|
||||||
junkPacketCountTextField.errorText === "" &&
|
junkPacketCountTextField.errorText === "" &&
|
||||||
I1JunkPacketTextField.errorText === "" &&
|
i1JunkPacketTextField.errorText === "" &&
|
||||||
I2JunkPacketTextField.errorText === "" &&
|
i2JunkPacketTextField.errorText === "" &&
|
||||||
I3JunkPacketTextField.errorText === "" &&
|
i3JunkPacketTextField.errorText === "" &&
|
||||||
I4JunkPacketTextField.errorText === "" &&
|
i4JunkPacketTextField.errorText === "" &&
|
||||||
I5JunkPacketTextField.errorText === "" &&
|
i5JunkPacketTextField.errorText === "" &&
|
||||||
J1JunkPacketTextField.errorText === "" &&
|
j1JunkPacketTextField.errorText === "" &&
|
||||||
J2JunkPacketTextField.errorText === "" &&
|
j2JunkPacketTextField.errorText === "" &&
|
||||||
J3JunkPacketTextField.errorText === "" &&
|
j3JunkPacketTextField.errorText === "" &&
|
||||||
ItimeTextField.errorText === "" &&
|
iTimeTextField.errorText === "" &&
|
||||||
portTextField.errorText === "" &&
|
portTextField.errorText === "" &&
|
||||||
vpnAddressSubnetTextField.errorText === ""
|
vpnAddressSubnetTextField.errorText === ""
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue