Merge branch 'dev' of github.com:amnezia-vpn/amnezia-client into bugfix/split-tunneling

This commit is contained in:
vladimir.kuznetsov 2023-10-22 20:00:39 +05:00
commit 59bccb1188
33 changed files with 427 additions and 268 deletions

View file

@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR)
set(PROJECT AmneziaVPN) set(PROJECT AmneziaVPN)
project(${PROJECT} VERSION 4.0.8.3 project(${PROJECT} VERSION 4.0.8.5
DESCRIPTION "AmneziaVPN" DESCRIPTION "AmneziaVPN"
HOMEPAGE_URL "https://amnezia.org/" HOMEPAGE_URL "https://amnezia.org/"
) )

@ -1 +1 @@
Subproject commit 15b0ff395d9d372339c5ea8ea35cb2715b975ea9 Subproject commit ac32d33555bd62f0b0af314b1e5119d6d78a1a4e

View file

@ -286,6 +286,8 @@ void AmneziaApplication::initModels()
m_engine->rootContext()->setContextProperty("ServersModel", m_serversModel.get()); m_engine->rootContext()->setContextProperty("ServersModel", m_serversModel.get());
connect(m_serversModel.get(), &ServersModel::currentlyProcessedServerIndexChanged, m_containersModel.get(), connect(m_serversModel.get(), &ServersModel::currentlyProcessedServerIndexChanged, m_containersModel.get(),
&ContainersModel::setCurrentlyProcessedServerIndex); &ContainersModel::setCurrentlyProcessedServerIndex);
connect(m_serversModel.get(), &ServersModel::defaultServerIndexChanged, m_containersModel.get(),
&ContainersModel::setCurrentlyProcessedServerIndex);
m_languageModel.reset(new LanguageModel(m_settings, this)); m_languageModel.reset(new LanguageModel(m_settings, this));
m_engine->rootContext()->setContextProperty("LanguageModel", m_languageModel.get()); m_engine->rootContext()->setContextProperty("LanguageModel", m_languageModel.get());

View file

@ -45,6 +45,7 @@
android:label="-- %%INSERT_APP_NAME%% --" android:label="-- %%INSERT_APP_NAME%% --"
android:screenOrientation="unspecified" android:screenOrientation="unspecified"
android:launchMode="singleInstance" android:launchMode="singleInstance"
android:windowSoftInputMode="adjustResize"
android:exported="true"> android:exported="true">
<!-- android:theme="@style/splashScreenTheme"--> <!-- android:theme="@style/splashScreenTheme"-->

View file

@ -138,7 +138,7 @@ android {
resConfig "en" resConfig "en"
minSdkVersion = 24 minSdkVersion = 24
targetSdkVersion = 34 targetSdkVersion = 34
versionCode 36 // Change to a higher number versionCode 37 // Change to a higher number
versionName "4.0.8" // Change to a higher number versionName "4.0.8" // Change to a higher number
javaCompileOptions.annotationProcessorOptions.arguments = [ javaCompileOptions.annotationProcessorOptions.arguments = [

View file

@ -17,43 +17,31 @@ QString AwgConfigurator::genAwgConfig(const ServerCredentials &credentials,
QString config = WireguardConfigurator::genWireguardConfig(credentials, container, containerConfig, errorCode); QString config = WireguardConfigurator::genWireguardConfig(credentials, container, containerConfig, errorCode);
QJsonObject jsonConfig = QJsonDocument::fromJson(config.toUtf8()).object(); QJsonObject jsonConfig = QJsonDocument::fromJson(config.toUtf8()).object();
QString awgConfig = jsonConfig.value(config_key::config).toString();
ServerController serverController(m_settings); QMap<QString, QString> configMap;
QString serverConfig = serverController.getTextFileFromContainer(container, credentials, protocols::awg::serverConfigPath, errorCode); auto configLines = awgConfig.split("\n");
for (auto &line : configLines) {
QMap<QString, QString> serverConfigMap;
auto serverConfigLines = serverConfig.split("\n");
for (auto &line : serverConfigLines) {
auto trimmedLine = line.trimmed(); auto trimmedLine = line.trimmed();
if (trimmedLine.startsWith("[") && trimmedLine.endsWith("]")) { if (trimmedLine.startsWith("[") && trimmedLine.endsWith("]")) {
continue; continue;
} else { } else {
QStringList parts = trimmedLine.split(" = "); QStringList parts = trimmedLine.split(" = ");
if (parts.count() == 2) { if (parts.count() == 2) {
serverConfigMap.insert(parts[0].trimmed(), parts[1].trimmed()); configMap.insert(parts[0].trimmed(), parts[1].trimmed());
} }
} }
} }
config.replace("$JUNK_PACKET_COUNT", serverConfigMap.value(config_key::junkPacketCount)); jsonConfig[config_key::junkPacketCount] = configMap.value(config_key::junkPacketCount);
config.replace("$JUNK_PACKET_MIN_SIZE", serverConfigMap.value(config_key::junkPacketMinSize)); jsonConfig[config_key::junkPacketMinSize] = configMap.value(config_key::junkPacketMinSize);
config.replace("$JUNK_PACKET_MAX_SIZE", serverConfigMap.value(config_key::junkPacketMaxSize)); jsonConfig[config_key::junkPacketMaxSize] = configMap.value(config_key::junkPacketMaxSize);
config.replace("$INIT_PACKET_JUNK_SIZE", serverConfigMap.value(config_key::initPacketJunkSize)); jsonConfig[config_key::initPacketJunkSize] = configMap.value(config_key::initPacketJunkSize);
config.replace("$RESPONSE_PACKET_JUNK_SIZE", serverConfigMap.value(config_key::responsePacketJunkSize)); jsonConfig[config_key::responsePacketJunkSize] = configMap.value(config_key::responsePacketJunkSize);
config.replace("$INIT_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::initPacketMagicHeader)); jsonConfig[config_key::initPacketMagicHeader] = configMap.value(config_key::initPacketMagicHeader);
config.replace("$RESPONSE_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::responsePacketMagicHeader)); jsonConfig[config_key::responsePacketMagicHeader] = configMap.value(config_key::responsePacketMagicHeader);
config.replace("$UNDERLOAD_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::underloadPacketMagicHeader)); jsonConfig[config_key::underloadPacketMagicHeader] = configMap.value(config_key::underloadPacketMagicHeader);
config.replace("$TRANSPORT_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::transportPacketMagicHeader)); jsonConfig[config_key::transportPacketMagicHeader] = configMap.value(config_key::transportPacketMagicHeader);
jsonConfig[config_key::junkPacketCount] = serverConfigMap.value(config_key::junkPacketCount);
jsonConfig[config_key::junkPacketMinSize] = serverConfigMap.value(config_key::junkPacketMinSize);
jsonConfig[config_key::junkPacketMaxSize] = serverConfigMap.value(config_key::junkPacketMaxSize);
jsonConfig[config_key::initPacketJunkSize] = serverConfigMap.value(config_key::initPacketJunkSize);
jsonConfig[config_key::responsePacketJunkSize] = serverConfigMap.value(config_key::responsePacketJunkSize);
jsonConfig[config_key::initPacketMagicHeader] = serverConfigMap.value(config_key::initPacketMagicHeader);
jsonConfig[config_key::responsePacketMagicHeader] = serverConfigMap.value(config_key::responsePacketMagicHeader);
jsonConfig[config_key::underloadPacketMagicHeader] = serverConfigMap.value(config_key::underloadPacketMagicHeader);
jsonConfig[config_key::transportPacketMagicHeader] = serverConfigMap.value(config_key::transportPacketMagicHeader);
return QJsonDocument(jsonConfig).toJson(); return QJsonDocument(jsonConfig).toJson();
} }

View file

@ -16,11 +16,11 @@ namespace amnezia
Q_NAMESPACE Q_NAMESPACE
enum DockerContainer { enum DockerContainer {
None = 0, None = 0,
OpenVpn,
ShadowSocks,
Cloak,
WireGuard,
Awg, Awg,
WireGuard,
OpenVpn,
Cloak,
ShadowSocks,
Ipsec, Ipsec,
// non-vpn // non-vpn

View file

@ -337,7 +337,7 @@ bool ServerController::isReinstallContainerRequired(DockerContainer container, c
!= newProtoConfig.value(config_key::port).toString(protocols::shadowsocks::defaultPort)) != newProtoConfig.value(config_key::port).toString(protocols::shadowsocks::defaultPort))
return true; return true;
} }
if (container == DockerContainer::Awg) { if (container == DockerContainer::Awg) {
return true; return true;
} }
@ -490,8 +490,7 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential
const QJsonObject &cloakConfig = config.value(ProtocolProps::protoToString(Proto::Cloak)).toObject(); const QJsonObject &cloakConfig = config.value(ProtocolProps::protoToString(Proto::Cloak)).toObject();
const QJsonObject &ssConfig = config.value(ProtocolProps::protoToString(Proto::ShadowSocks)).toObject(); const QJsonObject &ssConfig = config.value(ProtocolProps::protoToString(Proto::ShadowSocks)).toObject();
const QJsonObject &wireguarConfig = config.value(ProtocolProps::protoToString(Proto::WireGuard)).toObject(); const QJsonObject &wireguarConfig = config.value(ProtocolProps::protoToString(Proto::WireGuard)).toObject();
const QJsonObject &amneziaWireguarConfig = const QJsonObject &amneziaWireguarConfig = config.value(ProtocolProps::protoToString(Proto::Awg)).toObject();
config.value(ProtocolProps::protoToString(Proto::Awg)).toObject();
const QJsonObject &sftpConfig = config.value(ProtocolProps::protoToString(Proto::Sftp)).toObject(); const QJsonObject &sftpConfig = config.value(ProtocolProps::protoToString(Proto::Sftp)).toObject();
Vars vars; Vars vars;
@ -591,33 +590,21 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential
// Amnezia wireguard vars // Amnezia wireguard vars
vars.append({ { "$AWG_SERVER_PORT", vars.append({ { "$AWG_SERVER_PORT",
amneziaWireguarConfig.value(config_key::port).toString(protocols::awg::defaultPort) } }); amneziaWireguarConfig.value(config_key::port).toString(protocols::awg::defaultPort) } });
vars.append({ { "$JUNK_PACKET_COUNT",
amneziaWireguarConfig.value(config_key::junkPacketCount) vars.append({ { "$JUNK_PACKET_COUNT", amneziaWireguarConfig.value(config_key::junkPacketCount).toString() } });
.toString(protocols::awg::defaultJunkPacketCount) } }); vars.append({ { "$JUNK_PACKET_MIN_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMinSize).toString() } });
vars.append({ { "$JUNK_PACKET_MIN_SIZE", vars.append({ { "$JUNK_PACKET_MAX_SIZE", amneziaWireguarConfig.value(config_key::junkPacketMaxSize).toString() } });
amneziaWireguarConfig.value(config_key::junkPacketMinSize) vars.append({ { "$INIT_PACKET_JUNK_SIZE", amneziaWireguarConfig.value(config_key::initPacketJunkSize).toString() } });
.toString(protocols::awg::defaultJunkPacketMinSize) } });
vars.append({ { "$JUNK_PACKET_MAX_SIZE",
amneziaWireguarConfig.value(config_key::junkPacketMaxSize)
.toString(protocols::awg::defaultJunkPacketMaxSize) } });
vars.append({ { "$INIT_PACKET_JUNK_SIZE",
amneziaWireguarConfig.value(config_key::initPacketJunkSize)
.toString(protocols::awg::defaultInitPacketJunkSize) } });
vars.append({ { "$RESPONSE_PACKET_JUNK_SIZE", vars.append({ { "$RESPONSE_PACKET_JUNK_SIZE",
amneziaWireguarConfig.value(config_key::responsePacketJunkSize) amneziaWireguarConfig.value(config_key::responsePacketJunkSize).toString() } });
.toString(protocols::awg::defaultResponsePacketJunkSize) } });
vars.append({ { "$INIT_PACKET_MAGIC_HEADER", vars.append({ { "$INIT_PACKET_MAGIC_HEADER",
amneziaWireguarConfig.value(config_key::initPacketMagicHeader) amneziaWireguarConfig.value(config_key::initPacketMagicHeader).toString() } });
.toString(protocols::awg::defaultInitPacketMagicHeader) } });
vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER", vars.append({ { "$RESPONSE_PACKET_MAGIC_HEADER",
amneziaWireguarConfig.value(config_key::responsePacketMagicHeader) amneziaWireguarConfig.value(config_key::responsePacketMagicHeader).toString() } });
.toString(protocols::awg::defaultResponsePacketMagicHeader) } });
vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER", vars.append({ { "$UNDERLOAD_PACKET_MAGIC_HEADER",
amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader) amneziaWireguarConfig.value(config_key::underloadPacketMagicHeader).toString() } });
.toString(protocols::awg::defaultUnderloadPacketMagicHeader) } });
vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER", vars.append({ { "$TRANSPORT_PACKET_MAGIC_HEADER",
amneziaWireguarConfig.value(config_key::transportPacketMagicHeader) amneziaWireguarConfig.value(config_key::transportPacketMagicHeader).toString() } });
.toString(protocols::awg::defaultTransportPacketMagicHeader) } });
QString serverIp = Utils::getIPAddress(credentials.hostName); QString serverIp = Utils::getIPAddress(credentials.hostName);
if (!serverIp.isEmpty()) { if (!serverIp.isEmpty()) {
@ -847,6 +834,34 @@ ErrorCode ServerController::getAlreadyInstalledContainers(const ServerCredential
containerConfig.insert(config_key::port, port); containerConfig.insert(config_key::port, port);
containerConfig.insert(config_key::transport_proto, transportProto); containerConfig.insert(config_key::transport_proto, transportProto);
if (protocol == Proto::Awg) {
QString serverConfig = getTextFileFromContainer(container, credentials, protocols::awg::serverConfigPath, &errorCode);
QMap<QString, QString> serverConfigMap;
auto serverConfigLines = serverConfig.split("\n");
for (auto &line : serverConfigLines) {
auto trimmedLine = line.trimmed();
if (trimmedLine.startsWith("[") && trimmedLine.endsWith("]")) {
continue;
} else {
QStringList parts = trimmedLine.split(" = ");
if (parts.count() == 2) {
serverConfigMap.insert(parts[0].trimmed(), parts[1].trimmed());
}
}
}
containerConfig[config_key::junkPacketCount] = serverConfigMap.value(config_key::junkPacketCount);
containerConfig[config_key::junkPacketMinSize] = serverConfigMap.value(config_key::junkPacketMinSize);
containerConfig[config_key::junkPacketMaxSize] = serverConfigMap.value(config_key::junkPacketMaxSize);
containerConfig[config_key::initPacketJunkSize] = serverConfigMap.value(config_key::initPacketJunkSize);
containerConfig[config_key::responsePacketJunkSize] = serverConfigMap.value(config_key::responsePacketJunkSize);
containerConfig[config_key::initPacketMagicHeader] = serverConfigMap.value(config_key::initPacketMagicHeader);
containerConfig[config_key::responsePacketMagicHeader] = serverConfigMap.value(config_key::responsePacketMagicHeader);
containerConfig[config_key::underloadPacketMagicHeader] = serverConfigMap.value(config_key::underloadPacketMagicHeader);
containerConfig[config_key::transportPacketMagicHeader] = serverConfigMap.value(config_key::transportPacketMagicHeader);
}
config.insert(config_key::container, ContainerProps::containerToString(container)); config.insert(config_key::container, ContainerProps::containerToString(container));
} }
config.insert(ProtocolProps::protoToString(protocol), containerConfig); config.insert(ProtocolProps::protoToString(protocol), containerConfig);

View file

@ -1,5 +1,7 @@
#include "protocols_defs.h" #include "protocols_defs.h"
#include <QRandomGenerator>
using namespace amnezia; using namespace amnezia;
QDebug operator<<(QDebug debug, const amnezia::ProtocolEnumNS::Proto &p) QDebug operator<<(QDebug debug, const amnezia::ProtocolEnumNS::Proto &p)
@ -98,15 +100,28 @@ amnezia::ServiceType ProtocolProps::protocolService(Proto p)
} }
} }
int ProtocolProps::getPortForInstall(Proto p)
{
switch (p) {
case Awg:
case WireGuard:
case ShadowSocks:
case OpenVpn:
return QRandomGenerator::global()->bounded(30000, 50000);
default:
return defaultPort(p);
}
}
int ProtocolProps::defaultPort(Proto p) int ProtocolProps::defaultPort(Proto p)
{ {
switch (p) { switch (p) {
case Proto::Any: return -1; case Proto::Any: return -1;
case Proto::OpenVpn: return 1194; case Proto::OpenVpn: return QString(protocols::openvpn::defaultPort).toInt();
case Proto::Cloak: return 443; case Proto::Cloak: return QString(protocols::cloak::defaultPort).toInt();
case Proto::ShadowSocks: return 6789; case Proto::ShadowSocks: return QString(protocols::shadowsocks::defaultPort).toInt();
case Proto::WireGuard: return 51820; case Proto::WireGuard: return QString(protocols::wireguard::defaultPort).toInt();
case Proto::Awg: return 55424; case Proto::Awg: return QString(protocols::awg::defaultPort).toInt();
case Proto::Ikev2: return -1; case Proto::Ikev2: return -1;
case Proto::L2tp: return -1; case Proto::L2tp: return -1;

View file

@ -228,6 +228,8 @@ namespace amnezia
Q_INVOKABLE static ServiceType protocolService(Proto p); Q_INVOKABLE static ServiceType protocolService(Proto p);
Q_INVOKABLE static int getPortForInstall(Proto p);
Q_INVOKABLE static int defaultPort(Proto p); Q_INVOKABLE static int defaultPort(Proto p);
Q_INVOKABLE static bool defaultPortChangeable(Proto p); Q_INVOKABLE static bool defaultPortChangeable(Proto p);

View file

@ -8,7 +8,7 @@ if ! command -v sudo > /dev/null 2>&1; then $pm update -yq; $pm install -yq sudo
if ! command -v fuser > /dev/null 2>&1; then sudo $pm install -yq psmisc; fi;\ if ! command -v fuser > /dev/null 2>&1; then sudo $pm install -yq psmisc; fi;\
if ! command -v lsof > /dev/null 2>&1; then sudo $pm install -yq lsof; fi;\ if ! command -v lsof > /dev/null 2>&1; then sudo $pm install -yq lsof; fi;\
if ! command -v docker > /dev/null 2>&1; then sudo $pm update -yq; sudo $pm install -yq $docker_pkg;\ if ! command -v docker > /dev/null 2>&1; then sudo $pm update -yq; sudo $pm install -yq $docker_pkg;\
if [ "$dist" = "fedora" ] || [ "$dist" = "debian" ]; then sudo systemctl enable docker && sudo systemctl start docker; fi;\ if [ "$dist" = "fedora" ] || [ "$dist" = "centos" ] || [ "$dist" = "debian" ]; then sudo systemctl enable docker && sudo systemctl start docker; fi;\
fi;\ fi;\
if [ "$dist" = "debian" ]; then \ if [ "$dist" = "debian" ]; then \
docker_service=$(systemctl list-units --full --all | grep docker.service | grep -v inactive | grep -v dead | grep -v failed);\ docker_service=$(systemctl list-units --full --all | grep docker.service | grep -v inactive | grep -v dead | grep -v failed);\

View file

@ -8,7 +8,7 @@
<translation type="vanished">Раздельное туннелирование для &quot;Wireguard&quot; не реализовано,опция отключена</translation> <translation type="vanished">Раздельное туннелирование для &quot;Wireguard&quot; не реализовано,опция отключена</translation>
</message> </message>
<message> <message>
<location filename="../amnezia_application.cpp" line="303"/> <location filename="../amnezia_application.cpp" line="305"/>
<source>Split tunneling for %1 is not implemented, the option was disabled</source> <source>Split tunneling for %1 is not implemented, the option was disabled</source>
<translation>Раздельное туннелирование для %1 не реализовано, опция отключена</translation> <translation>Раздельное туннелирование для %1 не реализовано, опция отключена</translation>
</message> </message>
@ -124,7 +124,7 @@
<message> <message>
<location filename="../ui/qml/Components/HomeContainersListView.qml" line="58"/> <location filename="../ui/qml/Components/HomeContainersListView.qml" line="58"/>
<source>Unable change protocol while there is an active connection</source> <source>Unable change protocol while there is an active connection</source>
<translation type="unfinished"></translation> <translation>Невозможно изменить протокол при активном соединении</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Components/HomeContainersListView.qml" line="69"/> <location filename="../ui/qml/Components/HomeContainersListView.qml" line="69"/>
@ -139,7 +139,7 @@
<context> <context>
<name>ImportController</name> <name>ImportController</name>
<message> <message>
<location filename="../ui/controllers/importController.cpp" line="429"/> <location filename="../ui/controllers/importController.cpp" line="427"/>
<source>Scanned %1 of %2.</source> <source>Scanned %1 of %2.</source>
<translation>Отсканировано %1 из%2.</translation> <translation>Отсканировано %1 из%2.</translation>
</message> </message>
@ -147,58 +147,58 @@
<context> <context>
<name>InstallController</name> <name>InstallController</name>
<message> <message>
<location filename="../ui/controllers/installController.cpp" line="110"/> <location filename="../ui/controllers/installController.cpp" line="143"/>
<location filename="../ui/controllers/installController.cpp" line="161"/> <location filename="../ui/controllers/installController.cpp" line="193"/>
<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="112"/> <location filename="../ui/controllers/installController.cpp" line="145"/>
<location filename="../ui/controllers/installController.cpp" line="163"/> <location filename="../ui/controllers/installController.cpp" line="195"/>
<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="115"/> <location filename="../ui/controllers/installController.cpp" line="148"/>
<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="182"/> <location filename="../ui/controllers/installController.cpp" line="214"/>
<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="266"/> <location filename="../ui/controllers/installController.cpp" line="295"/>
<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="281"/> <location filename="../ui/controllers/installController.cpp" line="310"/>
<source>Server &apos;%1&apos; was removed</source> <source>Server &apos;%1&apos; was removed</source>
<translation>Сервер &apos;%1&apos; был удален</translation> <translation>Сервер &apos;%1&apos; был удален</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/installController.cpp" line="291"/> <location filename="../ui/controllers/installController.cpp" line="320"/>
<source>All containers from server &apos;%1&apos; have been removed</source> <source>All containers from server &apos;%1&apos; have been removed</source>
<translation>Все протоклы и сервисы были удалены с сервера &apos;%1&apos;</translation> <translation>Все протоклы и сервисы были удалены с сервера &apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/installController.cpp" line="308"/> <location filename="../ui/controllers/installController.cpp" line="337"/>
<source>%1 has been removed from the server &apos;%2&apos;</source> <source>%1 has been removed from the server &apos;%2&apos;</source>
<translation>%1 был удален с сервера &apos;%2&apos;</translation> <translation>%1 был удален с сервера &apos;%2&apos;</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/installController.cpp" line="454"/> <location filename="../ui/controllers/installController.cpp" line="483"/>
<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="481"/> <location filename="../ui/controllers/installController.cpp" line="511"/>
<source>Server added successfully</source> <source>Server added successfully</source>
<translation>Сервер успешно добавлен</translation> <translation>Сервер успешно добавлен</translation>
</message> </message>
@ -266,19 +266,19 @@ Already installed containers were found on the server. All installed containers
<context> <context>
<name>PageHome</name> <name>PageHome</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageHome.qml" line="344"/> <location filename="../ui/qml/Pages2/PageHome.qml" line="354"/>
<source>VPN protocol</source> <source>VPN protocol</source>
<translation>VPN протокол</translation> <translation>VPN протокол</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageHome.qml" line="388"/> <location filename="../ui/qml/Pages2/PageHome.qml" line="398"/>
<source>Servers</source> <source>Servers</source>
<translation>Серверы</translation> <translation>Серверы</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageHome.qml" line="480"/> <location filename="../ui/qml/Pages2/PageHome.qml" line="490"/>
<source>Unable change server while there is an active connection</source> <source>Unable change server while there is an active connection</source>
<translation type="unfinished"></translation> <translation>Невозможно изменить сервер при активном соединении</translation>
</message> </message>
</context> </context>
<context> <context>
@ -350,9 +350,13 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="279"/> <location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="279"/>
<source>All users who you shared a connection with will no longer be able to connect to it.</source> <source>All users with whom you shared a connection will no longer be able to connect to it.</source>
<translation>Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.</translation> <translation>Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.</translation>
</message> </message>
<message>
<source>All users who you shared a connection with will no longer be able to connect to it.</source>
<translation type="vanished">Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.</translation>
</message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="280"/> <location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="280"/>
<source>Continue</source> <source>Continue</source>
@ -401,195 +405,199 @@ Already installed containers were found on the server. All installed containers
<context> <context>
<name>PageProtocolOpenVpnSettings</name> <name>PageProtocolOpenVpnSettings</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="76"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="77"/>
<source>OpenVPN settings</source> <source>OpenVPN settings</source>
<translation>Настройки OpenVPN</translation> <translation>Настройки OpenVPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="83"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="84"/>
<source>VPN Addresses Subnet</source> <source>VPN Addresses Subnet</source>
<translation>VPN Адреса Подсеть</translation> <translation>Подсеть для VPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="97"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="98"/>
<source>Network protocol</source> <source>Network protocol</source>
<translation>Сетевой протокол</translation> <translation>Сетевой протокол</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="126"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="127"/>
<source>Port</source> <source>Port</source>
<translation>Порт</translation> <translation>Порт</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="144"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="145"/>
<source>Auto-negotiate encryption</source> <source>Auto-negotiate encryption</source>
<translation>Шифрование с автоматическим согласованием</translation> <translation>Шифрование с автоматическим согласованием</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="161"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="162"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="162"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="163"/>
<source>Hash</source> <source>Hash</source>
<translation>Хэш</translation> <translation>Хэш</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="170"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="171"/>
<source>SHA512</source> <source>SHA512</source>
<translation>SHA512</translation> <translation>SHA512</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="171"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="172"/>
<source>SHA384</source> <source>SHA384</source>
<translation>SHA384</translation> <translation>SHA384</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="172"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="173"/>
<source>SHA256</source> <source>SHA256</source>
<translation>SHA256</translation> <translation>SHA256</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="173"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="174"/>
<source>SHA3-512</source> <source>SHA3-512</source>
<translation>SHA3-512</translation> <translation>SHA3-512</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="174"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="175"/>
<source>SHA3-384</source> <source>SHA3-384</source>
<translation>SHA3-384</translation> <translation>SHA3-384</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="175"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="176"/>
<source>SHA3-256</source> <source>SHA3-256</source>
<translation>SHA3-256</translation> <translation>SHA3-256</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="176"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="177"/>
<source>whirlpool</source> <source>whirlpool</source>
<translation>whirlpool</translation> <translation>whirlpool</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="177"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="178"/>
<source>BLAKE2b512</source> <source>BLAKE2b512</source>
<translation>BLAKE2b512</translation> <translation>BLAKE2b512</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="178"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="179"/>
<source>BLAKE2s256</source> <source>BLAKE2s256</source>
<translation>BLAKE2s256</translation> <translation>BLAKE2s256</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="179"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="180"/>
<source>SHA1</source> <source>SHA1</source>
<translation>SHA1</translation> <translation>SHA1</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="207"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="208"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="208"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="209"/>
<source>Cipher</source> <source>Cipher</source>
<translation>Шифрование</translation> <translation>Шифрование</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="216"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="217"/>
<source>AES-256-GCM</source> <source>AES-256-GCM</source>
<translation>AES-256-GCM</translation> <translation>AES-256-GCM</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="217"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="218"/>
<source>AES-192-GCM</source> <source>AES-192-GCM</source>
<translation>AES-192-GCM</translation> <translation>AES-192-GCM</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="218"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="219"/>
<source>AES-128-GCM</source> <source>AES-128-GCM</source>
<translation>AES-128-GCM</translation> <translation>AES-128-GCM</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="219"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="220"/>
<source>AES-256-CBC</source> <source>AES-256-CBC</source>
<translation>AES-256-CBC</translation> <translation>AES-256-CBC</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="220"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="221"/>
<source>AES-192-CBC</source> <source>AES-192-CBC</source>
<translation>AES-192-CBC</translation> <translation>AES-192-CBC</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="221"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="222"/>
<source>AES-128-CBC</source> <source>AES-128-CBC</source>
<translation>AES-128-CBC</translation> <translation>AES-128-CBC</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="222"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="223"/>
<source>ChaCha20-Poly1305</source> <source>ChaCha20-Poly1305</source>
<translation>ChaCha20-Poly1305</translation> <translation>ChaCha20-Poly1305</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="223"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="224"/>
<source>ARIA-256-CBC</source> <source>ARIA-256-CBC</source>
<translation>ARIA-256-CBC</translation> <translation>ARIA-256-CBC</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="224"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="225"/>
<source>CAMELLIA-256-CBC</source> <source>CAMELLIA-256-CBC</source>
<translation>CAMELLIA-256-CBC</translation> <translation>CAMELLIA-256-CBC</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="225"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="226"/>
<source>none</source> <source>none</source>
<translation>none</translation> <translation>none</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="258"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="261"/>
<source>TLS auth</source> <source>TLS auth</source>
<translation>TLS авторизация</translation> <translation>TLS авторизация</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="273"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="276"/>
<source>Block DNS requests outside of VPN</source> <source>Block DNS requests outside of VPN</source>
<translation>Блокировать DNS запросы за пределами VPN</translation> <translation>Блокировать DNS запросы за пределами VPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="292"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="295"/>
<source>Additional client configuration commands</source> <source>Additional client configuration commands</source>
<translation>Дополнительные команды конфигурации клиента</translation> <translation>Дополнительные команды конфигурации клиента</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="308"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="311"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="340"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="343"/>
<source>Commands:</source> <source>Commands:</source>
<translation>Commands:</translation> <translation>Commands:</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="324"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="327"/>
<source>Additional server configuration commands</source> <source>Additional server configuration commands</source>
<translation>Дополнительные команды конфигурации сервера</translation> <translation>Дополнительные команды конфигурации сервера</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="359"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="364"/>
<source>Remove OpenVPN</source> <source>Remove OpenVPN</source>
<translation>Удалить OpenVPN</translation> <translation>Удалить OpenVPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="362"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="367"/>
<source>Remove OpenVpn from server?</source> <source>Remove OpenVpn from server?</source>
<translation>Удалить OpenVpn с сервера?</translation> <translation>Удалить OpenVpn с сервера?</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="363"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="368"/>
<source>All users who you shared a connection with will no longer be able to connect to it.</source> <source>All users with whom you shared a connection 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/PageProtocolOpenVpnSettings.qml" line="364"/> <source>All users who you shared a connection with will no longer be able to connect to it.</source>
<translation type="vanished">Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="369"/>
<source>Continue</source> <source>Continue</source>
<translation>Продолжить</translation> <translation>Продолжить</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="365"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="370"/>
<source>Cancel</source> <source>Cancel</source>
<translation>Отменить</translation> <translation>Отменить</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="384"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="389"/>
<source>Save and Restart Amnezia</source> <source>Save and Restart Amnezia</source>
<translation>Сохранить и перезагрузить</translation> <translation>Сохранить и перезагрузить</translation>
</message> </message>
@ -612,27 +620,31 @@ Already installed containers were found on the server. All installed containers
<translation>Параметры подключения %1</translation> <translation>Параметры подключения %1</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="172"/> <location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="174"/>
<source>Remove </source> <source>Remove </source>
<translation>Удалить </translation> <translation>Удалить </translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="176"/> <location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="178"/>
<source>Remove %1 from server?</source> <source>Remove %1 from server?</source>
<translation>Удалить %1 с сервера?</translation> <translation>Удалить %1 с сервера?</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="177"/> <location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="179"/>
<source>All users who you shared a connection with will no longer be able to connect to it.</source> <source>All users with whom you shared a connection will no longer be able to connect to it.</source>
<translation type="unfinished">Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.</translation> <translation>Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="178"/> <source>All users who you shared a connection with will no longer be able to connect to it.</source>
<translation type="obsolete">Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="180"/>
<source>Continue</source> <source>Continue</source>
<translation>Продолжить</translation> <translation>Продолжить</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="179"/> <location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="181"/>
<source>Cancel</source> <source>Cancel</source>
<translation>Отменить</translation> <translation>Отменить</translation>
</message> </message>
@ -1136,7 +1148,7 @@ Already installed containers were found on the server. All installed containers
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="41"/> <location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="41"/>
<source>Connection</source> <source>Connection</source>
<translation>Подключение</translation> <translation>Соединение</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="50"/> <location filename="../ui/qml/Pages2/PageSettingsConnection.qml" line="50"/>
@ -1282,7 +1294,7 @@ Already installed containers were found on the server. All installed containers
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="127"/> <location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="127"/>
<source>Save logs to file</source> <source>Save logs to file</source>
<translation>Сохранять логи в файл</translation> <translation>Сохранить логи в файл</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="145"/> <location filename="../ui/qml/Pages2/PageSettingsLogging.qml" line="145"/>
@ -1444,8 +1456,12 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="117"/> <location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="117"/>
<source>All users with whom you shared a connection will no longer be able to connect to it.</source>
<translation>Все пользователи, с которыми вы поделились этим VPN-протоколом, больше не смогут к нему подключаться.</translation>
</message>
<message>
<source>All users who you shared a connection with will no longer be able to connect to it.</source> <source>All users who you shared a connection with will no longer be able to connect to it.</source>
<translation>Все пользователи, которым вы поделились VPN, больше не смогут к нему подключаться.</translation> <translation type="vanished">Все пользователи, которым вы поделились VPN, больше не смогут к нему подключаться.</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="118"/> <location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="118"/>
@ -1698,7 +1714,7 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<context> <context>
<name>PageSetupWizardInstalling</name> <name>PageSetupWizardInstalling</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="57"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="65"/>
<source>The server has already been added to the application</source> <source>The server has already been added to the application</source>
<translation>Сервер уже был добавлен в приложение</translation> <translation>Сервер уже был добавлен в приложение</translation>
</message> </message>
@ -1711,28 +1727,28 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<translation type="vanished">занят установкой других протоколов или сервисов. Установка Amnesia </translation> <translation type="vanished">занят установкой других протоколов или сервисов. Установка Amnesia </translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="62"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="70"/>
<source>Amnezia has detected that your server is currently </source> <source>Amnezia has detected that your server is currently </source>
<translation>Amnezia обнаружила, что ваш сервер в настоящее время </translation> <translation>Amnezia обнаружила, что ваш сервер в настоящее время </translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="63"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="71"/>
<source>busy installing other software. Amnezia installation </source> <source>busy installing other software. Amnezia installation </source>
<translation>занят установкой другого программного обеспечения. Установка Amnezia </translation> <translation>занят установкой другого программного обеспечения. Установка Amnezia </translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="64"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="72"/>
<source>will pause until the server finishes installing other software</source> <source>will pause until the server finishes installing other software</source>
<translation>будет приостановлена до тех пор, пока сервер не завершит установку</translation> <translation>будет приостановлена до тех пор, пока сервер не завершит установку</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="121"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="129"/>
<source>Installing</source> <source>Installing</source>
<translation>Установка</translation> <translation>Установка</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="21"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="21"/>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="67"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="75"/>
<source>Usually it takes no more than 5 minutes</source> <source>Usually it takes no more than 5 minutes</source>
<translation>Обычно это занимает не более 5 минут</translation> <translation>Обычно это занимает не более 5 минут</translation>
</message> </message>
@ -1850,27 +1866,27 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<context> <context>
<name>PageSetupWizardViewConfig</name> <name>PageSetupWizardViewConfig</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="59"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="63"/>
<source>New connection</source> <source>New connection</source>
<translation>Новое соединение</translation> <translation>Новое соединение</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="86"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="90"/>
<source>Do not use connection code from public sources. It could be created to intercept your data.</source> <source>Do not use connection code from public sources. It could be created to intercept your data.</source>
<translation>Не используйте код подключения из публичных источников. Его могли создать, чтобы перехватывать ваши данные.</translation> <translation>Не используйте код подключения из публичных источников. Его могли создать, чтобы перехватывать ваши данные.</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="101"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="105"/>
<source>Collapse content</source> <source>Collapse content</source>
<translation>Свернуть</translation> <translation>Свернуть</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="101"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="105"/>
<source>Show content</source> <source>Show content</source>
<translation>Показать содержимое ключа</translation> <translation>Показать содержимое ключа</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="144"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="148"/>
<source>Connect</source> <source>Connect</source>
<translation>Подключиться</translation> <translation>Подключиться</translation>
</message> </message>
@ -1888,9 +1904,8 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<translation>WireGuard нативный формат</translation> <translation>WireGuard нативный формат</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="121"/>
<source>VPN Access</source> <source>VPN Access</source>
<translation>VPN-Доступ</translation> <translation type="vanished">VPN-Доступ</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="146"/> <location filename="../ui/qml/Pages2/PageShare.qml" line="146"/>
@ -1898,14 +1913,12 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<translation>Соединение</translation> <translation>Соединение</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="174"/>
<source>VPN access without the ability to manage the server</source> <source>VPN access without the ability to manage the server</source>
<translation>Доступ к VPN, без возможности управления сервером</translation> <translation type="vanished">Доступ к VPN, без возможности управления сервером</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="175"/>
<source>Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings.</source> <source>Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings.</source>
<translation>Доступ к управлению сервером. Пользователь, с которым вы делитесь полным доступом к соединению, сможет добавлять и удалять ваши протоколы и службы на сервере, а также изменять настройки.</translation> <translation type="vanished">Доступ к управлению сервером. Пользователь, с которым вы делитесь полным доступом к соединению, сможет добавлять и удалять ваши протоколы и службы на сервере, а также изменять настройки.</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="190"/> <location filename="../ui/qml/Pages2/PageShare.qml" line="190"/>
@ -1948,11 +1961,26 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<source>For the AmneziaVPN app</source> <source>For the AmneziaVPN app</source>
<translation>Для AmneziaVPN</translation> <translation>Для AmneziaVPN</translation>
</message> </message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="121"/>
<source>Share VPN Access</source>
<translation>Поделиться VPN</translation>
</message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="158"/> <location filename="../ui/qml/Pages2/PageShare.qml" line="158"/>
<source>Full access</source> <source>Full access</source>
<translation>Полный доступ</translation> <translation>Полный доступ</translation>
</message> </message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="174"/>
<source>Share VPN access without the ability to manage the server</source>
<translation>Поделиться доступом к VPN, без возможности управления сервером</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="175"/>
<source>Share access to server management. The user with whom you share full access to the server will be able to add and remove any protocols and services to the server, as well as change settings.</source>
<translation>Поделиться доступом к управлению сервером. Пользователь, с которым вы делитесь полным доступом к серверу, сможет добавлять и удалять любые протоколы и службы на сервере, а также изменять настройки.</translation>
</message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="251"/> <location filename="../ui/qml/Pages2/PageShare.qml" line="251"/>
<location filename="../ui/qml/Pages2/PageShare.qml" line="252"/> <location filename="../ui/qml/Pages2/PageShare.qml" line="252"/>
@ -2575,9 +2603,9 @@ OpenVPN обеспечивает безопасное VPN-соединение
Cloak защищает OpenVPN от обнаружения и блокировок. Cloak защищает OpenVPN от обнаружения и блокировок.
Cloak может изменять метаданные пакетов. Он полностью маскирует VPN-трафик под обычный веб-трафик, а также защищает VPN от обнаружения с помощью Active Probing. Это делает ее очень устойчивой к обнаружению Cloak может изменять метаданные пакетов. Он полностью маскирует VPN-трафик под обычный веб-трафик, а также защищает VPN от обнаружения с помощью Active Probing. Это делает его очень устойчивым к обнаружению
Сразу же после получения первого пакета данных Cloak проверяет подлинность входящего соединения. Если аутентификация не проходит, плагин маскирует сервер под поддельный сайт, и ваша VPN становится невидимой для аналитических систем. Сразу же после получения первого пакета данных Cloak проверяет подлинность входящего соединения. Если аутентификация не проходит, плагин маскирует сервер под поддельный сайт, и ваш VPN становится невидимым для аналитических систем.
Если в вашем регионе существует экстремальный уровень цензуры в Интернете, мы советуем вам при первом подключении использовать только OpenVPN через Cloak Если в вашем регионе существует экстремальный уровень цензуры в Интернете, мы советуем вам при первом подключении использовать только OpenVPN через Cloak
@ -2640,7 +2668,7 @@ This means that AmneziaWG keeps the fast performance of the original while addin
<translation>Сервис обмена файлами Sftp - безопасный FTP-сервис</translation> <translation>Сервис обмена файлами Sftp - безопасный FTP-сервис</translation>
</message> </message>
<message> <message>
<location filename="../protocols/protocols_defs.cpp" line="75"/> <location filename="../protocols/protocols_defs.cpp" line="77"/>
<source>Sftp service</source> <source>Sftp service</source>
<translation>Сервис SFTP</translation> <translation>Сервис SFTP</translation>
</message> </message>

View file

@ -8,7 +8,7 @@
<translation type="vanished">WireGuard协议的VPN分离</translation> <translation type="vanished">WireGuard协议的VPN分离</translation>
</message> </message>
<message> <message>
<location filename="../amnezia_application.cpp" line="303"/> <location filename="../amnezia_application.cpp" line="305"/>
<source>Split tunneling for %1 is not implemented, the option was disabled</source> <source>Split tunneling for %1 is not implemented, the option was disabled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -135,7 +135,7 @@
<message> <message>
<location filename="../ui/qml/Components/HomeContainersListView.qml" line="58"/> <location filename="../ui/qml/Components/HomeContainersListView.qml" line="58"/>
<source>Unable change protocol while there is an active connection</source> <source>Unable change protocol while there is an active connection</source>
<translation>Невозможно изменить протокол при наличии активного соединения</translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Components/HomeContainersListView.qml" line="69"/> <location filename="../ui/qml/Components/HomeContainersListView.qml" line="69"/>
@ -150,7 +150,7 @@
<context> <context>
<name>ImportController</name> <name>ImportController</name>
<message> <message>
<location filename="../ui/controllers/importController.cpp" line="429"/> <location filename="../ui/controllers/importController.cpp" line="427"/>
<source>Scanned %1 of %2.</source> <source>Scanned %1 of %2.</source>
<translation> %1 of %2.</translation> <translation> %1 of %2.</translation>
</message> </message>
@ -166,47 +166,47 @@
<translation type="obsolete"> </translation> <translation type="obsolete"> </translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/installController.cpp" line="110"/> <location filename="../ui/controllers/installController.cpp" line="143"/>
<location filename="../ui/controllers/installController.cpp" line="161"/> <location filename="../ui/controllers/installController.cpp" line="193"/>
<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="112"/> <location filename="../ui/controllers/installController.cpp" line="145"/>
<location filename="../ui/controllers/installController.cpp" line="163"/> <location filename="../ui/controllers/installController.cpp" line="195"/>
<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="115"/> <location filename="../ui/controllers/installController.cpp" line="148"/>
<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="182"/> <location filename="../ui/controllers/installController.cpp" line="214"/>
<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="266"/> <location filename="../ui/controllers/installController.cpp" line="295"/>
<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="281"/> <location filename="../ui/controllers/installController.cpp" line="310"/>
<source>Server &apos;%1&apos; was removed</source> <source>Server &apos;%1&apos; was removed</source>
<translation> &apos;%1&apos;</translation> <translation> &apos;%1&apos;</translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/installController.cpp" line="291"/> <location filename="../ui/controllers/installController.cpp" line="320"/>
<source>All containers from server &apos;%1&apos; have been removed</source> <source>All containers from server &apos;%1&apos; have been removed</source>
<translation> &apos;%1&apos; </translation> <translation> &apos;%1&apos; </translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/installController.cpp" line="308"/> <location filename="../ui/controllers/installController.cpp" line="337"/>
<source>%1 has been removed from the server &apos;%2&apos;</source> <source>%1 has been removed from the server &apos;%2&apos;</source>
<translation>%1 &apos;%2&apos; </translation> <translation>%1 &apos;%2&apos; </translation>
</message> </message>
@ -227,12 +227,12 @@ Already installed containers were found on the server. All installed containers
<translation type="obsolete"> </translation> <translation type="obsolete"> </translation>
</message> </message>
<message> <message>
<location filename="../ui/controllers/installController.cpp" line="454"/> <location filename="../ui/controllers/installController.cpp" line="483"/>
<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="481"/> <location filename="../ui/controllers/installController.cpp" line="511"/>
<source>Server added successfully</source> <source>Server added successfully</source>
<translation></translation> <translation></translation>
</message> </message>
@ -300,19 +300,19 @@ Already installed containers were found on the server. All installed containers
<context> <context>
<name>PageHome</name> <name>PageHome</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageHome.qml" line="344"/> <location filename="../ui/qml/Pages2/PageHome.qml" line="354"/>
<source>VPN protocol</source> <source>VPN protocol</source>
<translation>VPN协议</translation> <translation>VPN协议</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageHome.qml" line="388"/> <location filename="../ui/qml/Pages2/PageHome.qml" line="398"/>
<source>Servers</source> <source>Servers</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageHome.qml" line="480"/> <location filename="../ui/qml/Pages2/PageHome.qml" line="490"/>
<source>Unable change server while there is an active connection</source> <source>Unable change server while there is an active connection</source>
<translation>Невозможно изменить сервер при наличии активного соединения</translation> <translation></translation>
</message> </message>
</context> </context>
<context> <context>
@ -384,8 +384,12 @@ Already installed containers were found on the server. All installed containers
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="279"/> <location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="279"/>
<source>All users with whom you shared a connection will no longer be able to connect to it.</source>
<translation></translation>
</message>
<message>
<source>All users who you shared a connection with will no longer be able to connect to it.</source> <source>All users who you shared a connection with will no longer be able to connect to it.</source>
<translation>使</translation> <translation type="vanished">使</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="280"/> <location filename="../ui/qml/Pages2/PageProtocolAwgSettings.qml" line="280"/>
@ -435,199 +439,203 @@ Already installed containers were found on the server. All installed containers
<context> <context>
<name>PageProtocolOpenVpnSettings</name> <name>PageProtocolOpenVpnSettings</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="76"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="77"/>
<source>OpenVPN settings</source> <source>OpenVPN settings</source>
<translation>OpenVPN </translation> <translation>OpenVPN </translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="83"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="84"/>
<source>VPN Addresses Subnet</source> <source>VPN Addresses Subnet</source>
<translation>VPN子网掩码</translation> <translation>VPN子网掩码</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="97"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="98"/>
<source>Network protocol</source> <source>Network protocol</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="126"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="127"/>
<source>Port</source> <source>Port</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="144"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="145"/>
<source>Auto-negotiate encryption</source> <source>Auto-negotiate encryption</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="161"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="162"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="162"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="163"/>
<source>Hash</source> <source>Hash</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="170"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="171"/>
<source>SHA512</source> <source>SHA512</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="171"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="172"/>
<source>SHA384</source> <source>SHA384</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="172"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="173"/>
<source>SHA256</source> <source>SHA256</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="173"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="174"/>
<source>SHA3-512</source> <source>SHA3-512</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="174"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="175"/>
<source>SHA3-384</source> <source>SHA3-384</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="175"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="176"/>
<source>SHA3-256</source> <source>SHA3-256</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="176"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="177"/>
<source>whirlpool</source> <source>whirlpool</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="177"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="178"/>
<source>BLAKE2b512</source> <source>BLAKE2b512</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="178"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="179"/>
<source>BLAKE2s256</source> <source>BLAKE2s256</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="179"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="180"/>
<source>SHA1</source> <source>SHA1</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="207"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="208"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="208"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="209"/>
<source>Cipher</source> <source>Cipher</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="216"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="217"/>
<source>AES-256-GCM</source> <source>AES-256-GCM</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="217"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="218"/>
<source>AES-192-GCM</source> <source>AES-192-GCM</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="218"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="219"/>
<source>AES-128-GCM</source> <source>AES-128-GCM</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="219"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="220"/>
<source>AES-256-CBC</source> <source>AES-256-CBC</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="220"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="221"/>
<source>AES-192-CBC</source> <source>AES-192-CBC</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="221"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="222"/>
<source>AES-128-CBC</source> <source>AES-128-CBC</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="222"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="223"/>
<source>ChaCha20-Poly1305</source> <source>ChaCha20-Poly1305</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="223"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="224"/>
<source>ARIA-256-CBC</source> <source>ARIA-256-CBC</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="224"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="225"/>
<source>CAMELLIA-256-CBC</source> <source>CAMELLIA-256-CBC</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="225"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="226"/>
<source>none</source> <source>none</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="258"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="261"/>
<source>TLS auth</source> <source>TLS auth</source>
<translation>TLS认证</translation> <translation>TLS认证</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="273"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="276"/>
<source>Block DNS requests outside of VPN</source> <source>Block DNS requests outside of VPN</source>
<translation>VPN外的DNS请求</translation> <translation>VPN外的DNS请求</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="292"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="295"/>
<source>Additional client configuration commands</source> <source>Additional client configuration commands</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="308"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="311"/>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="340"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="343"/>
<source>Commands:</source> <source>Commands:</source>
<translation>:</translation> <translation>:</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="324"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="327"/>
<source>Additional server configuration commands</source> <source>Additional server configuration commands</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="359"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="364"/>
<source>Remove OpenVPN</source> <source>Remove OpenVPN</source>
<translation>OpenVPN</translation> <translation>OpenVPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="362"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="367"/>
<source>Remove OpenVpn from server?</source> <source>Remove OpenVpn from server?</source>
<translation>OpenVPN吗?</translation> <translation>OpenVPN吗?</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="363"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="368"/>
<source>All users with whom you shared a connection will no longer be able to connect to it.</source>
<translation></translation>
</message>
<message>
<source>All users who you shared a connection with will no longer be able to connect to it.</source> <source>All users who you shared a connection with will no longer be able to connect to it.</source>
<translation>使</translation> <translation type="vanished">使</translation>
</message> </message>
<message> <message>
<source>All users with whom you shared a connection will no longer be able to connect to it</source> <source>All users with whom you shared a connection will no longer be able to connect to it</source>
<translation type="obsolete"></translation> <translation type="obsolete"></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="364"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="369"/>
<source>Continue</source> <source>Continue</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="365"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="370"/>
<source>Cancel</source> <source>Cancel</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="384"/> <location filename="../ui/qml/Pages2/PageProtocolOpenVpnSettings.qml" line="389"/>
<source>Save and Restart Amnezia</source> <source>Save and Restart Amnezia</source>
<translation>Amnezia</translation> <translation>Amnezia</translation>
</message> </message>
@ -654,19 +662,23 @@ Already installed containers were found on the server. All installed containers
<translation>%1 </translation> <translation>%1 </translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="172"/> <location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="174"/>
<source>Remove </source> <source>Remove </source>
<translation> </translation> <translation> </translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="176"/> <location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="178"/>
<source>Remove %1 from server?</source> <source>Remove %1 from server?</source>
<translation> %1 ?</translation> <translation> %1 ?</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="177"/> <location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="179"/>
<source>All users with whom you shared a connection will no longer be able to connect to it.</source>
<translation></translation>
</message>
<message>
<source>All users who you shared a connection with will no longer be able to connect to it.</source> <source>All users who you shared a connection with will no longer be able to connect to it.</source>
<translation>使</translation> <translation type="vanished">使</translation>
</message> </message>
<message> <message>
<source> from server?</source> <source> from server?</source>
@ -677,12 +689,12 @@ Already installed containers were found on the server. All installed containers
<translation type="obsolete"></translation> <translation type="obsolete"></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="178"/> <location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="180"/>
<source>Continue</source> <source>Continue</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="179"/> <location filename="../ui/qml/Pages2/PageProtocolRaw.qml" line="181"/>
<source>Cancel</source> <source>Cancel</source>
<translation></translation> <translation></translation>
</message> </message>
@ -1525,8 +1537,12 @@ And if you don&apos;t like the app, all the more support it - the donation will
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="117"/> <location filename="../ui/qml/Pages2/PageSettingsServerProtocol.qml" line="117"/>
<source>All users with whom you shared a connection will no longer be able to connect to it.</source>
<translation></translation>
</message>
<message>
<source>All users who you shared a connection with will no longer be able to connect to it.</source> <source>All users who you shared a connection with will no longer be able to connect to it.</source>
<translation>使</translation> <translation type="vanished">使</translation>
</message> </message>
<message> <message>
<source> from server?</source> <source> from server?</source>
@ -1805,22 +1821,22 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<name>PageSetupWizardInstalling</name> <name>PageSetupWizardInstalling</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="21"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="21"/>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="67"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="75"/>
<source>Usually it takes no more than 5 minutes</source> <source>Usually it takes no more than 5 minutes</source>
<translation>5</translation> <translation>5</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="57"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="65"/>
<source>The server has already been added to the application</source> <source>The server has already been added to the application</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="62"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="70"/>
<source>Amnezia has detected that your server is currently </source> <source>Amnezia has detected that your server is currently </source>
<translation>Amnezia </translation> <translation>Amnezia </translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="63"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="71"/>
<source>busy installing other software. Amnezia installation </source> <source>busy installing other software. Amnezia installation </source>
<translation>Amnezia安装</translation> <translation>Amnezia安装</translation>
</message> </message>
@ -1833,12 +1849,12 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<translation type="vanished">Amnezia安装</translation> <translation type="vanished">Amnezia安装</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="64"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="72"/>
<source>will pause until the server finishes installing other software</source> <source>will pause until the server finishes installing other software</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="121"/> <location filename="../ui/qml/Pages2/PageSetupWizardInstalling.qml" line="129"/>
<source>Installing</source> <source>Installing</source>
<translation></translation> <translation></translation>
</message> </message>
@ -1956,27 +1972,27 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<context> <context>
<name>PageSetupWizardViewConfig</name> <name>PageSetupWizardViewConfig</name>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="59"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="63"/>
<source>New connection</source> <source>New connection</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="86"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="90"/>
<source>Do not use connection code from public sources. It could be created to intercept your data.</source> <source>Do not use connection code from public sources. It could be created to intercept your data.</source>
<translation>使</translation> <translation>使</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="101"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="105"/>
<source>Collapse content</source> <source>Collapse content</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="101"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="105"/>
<source>Show content</source> <source>Show content</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="144"/> <location filename="../ui/qml/Pages2/PageSetupWizardViewConfig.qml" line="148"/>
<source>Connect</source> <source>Connect</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2010,8 +2026,22 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="121"/> <location filename="../ui/qml/Pages2/PageShare.qml" line="121"/>
<source>Share VPN Access</source>
<translation> VPN 访</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="174"/>
<source>Share VPN access without the ability to manage the server</source>
<translation> VPN 访</translation>
</message>
<message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="175"/>
<source>Share access to server management. The user with whom you share full access to the server will be able to add and remove any protocols and services to the server, as well as change settings.</source>
<translation>访访</translation>
</message>
<message>
<source>VPN Access</source> <source>VPN Access</source>
<translation>访VPN</translation> <translation type="vanished">访VPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="146"/> <location filename="../ui/qml/Pages2/PageShare.qml" line="146"/>
@ -2024,14 +2054,12 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<translation>访</translation> <translation>访</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="174"/>
<source>VPN access without the ability to manage the server</source> <source>VPN access without the ability to manage the server</source>
<translation>访VPN</translation> <translation type="vanished">访VPN</translation>
</message> </message>
<message> <message>
<location filename="../ui/qml/Pages2/PageShare.qml" line="175"/>
<source>Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings.</source> <source>Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings.</source>
<translation>访VPN外</translation> <translation type="vanished">访VPN外</translation>
</message> </message>
<message> <message>
<source>Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the servers, as well as change settings.</source> <source>Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the servers, as well as change settings.</source>
@ -2339,7 +2367,7 @@ and will not be shared or disclosed to the Amnezia or any third parties</source>
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../protocols/protocols_defs.cpp" line="75"/> <location filename="../protocols/protocols_defs.cpp" line="77"/>
<source>Sftp service</source> <source>Sftp service</source>
<translation>Sftp </translation> <translation>Sftp </translation>
</message> </message>

View file

@ -144,8 +144,6 @@ void ImportController::importConfig()
if (credentials.isValid() || m_config.contains(config_key::containers)) { if (credentials.isValid() || m_config.contains(config_key::containers)) {
m_serversModel->addServer(m_config); m_serversModel->addServer(m_config);
m_serversModel->setDefaultServerIndex(m_serversModel->getServersCount() - 1);
emit importFinished(); emit importFinished();
} else { } else {
qDebug() << "Failed to import profile"; qDebug() << "Failed to import profile";

View file

@ -5,6 +5,7 @@
#include <QEventLoop> #include <QEventLoop>
#include <QJsonObject> #include <QJsonObject>
#include <QStandardPaths> #include <QStandardPaths>
#include <QRandomGenerator>
#include "core/errorstrings.h" #include "core/errorstrings.h"
#include "core/servercontroller.h" #include "core/servercontroller.h"
@ -73,6 +74,38 @@ void InstallController::install(DockerContainer container, int port, TransportPr
containerConfig.insert(config_key::transport_proto, containerConfig.insert(config_key::transport_proto,
ProtocolProps::transportProtoToString(transportProto, protocol)); ProtocolProps::transportProtoToString(transportProto, protocol));
if (container == DockerContainer::Awg) {
QString junkPacketCount = QString::number(QRandomGenerator::global()->bounded(3, 10));
QString junkPacketMinSize = QString::number(50);
QString junkPacketMaxSize = QString::number(1000);
QString initPacketJunkSize = QString::number(QRandomGenerator::global()->bounded(15, 150));
QString responsePacketJunkSize = QString::number(QRandomGenerator::global()->bounded(15, 150));
QSet<QString> headersValue;
while (headersValue.size() != 4) {
auto max = (std::numeric_limits<qint32>::max)();
headersValue.insert(QString::number(QRandomGenerator::global()->bounded(1, max)));
}
auto headersValueList = headersValue.values();
QString initPacketMagicHeader = headersValueList.at(0);
QString responsePacketMagicHeader = headersValueList.at(1);
QString underloadPacketMagicHeader = headersValueList.at(2);
QString transportPacketMagicHeader = headersValueList.at(3);
containerConfig[config_key::junkPacketCount] = junkPacketCount;
containerConfig[config_key::junkPacketMinSize] = junkPacketMinSize;
containerConfig[config_key::junkPacketMaxSize] = junkPacketMaxSize;
containerConfig[config_key::initPacketJunkSize] = initPacketJunkSize;
containerConfig[config_key::responsePacketJunkSize] = responsePacketJunkSize;
containerConfig[config_key::initPacketMagicHeader] = initPacketMagicHeader;
containerConfig[config_key::responsePacketMagicHeader] = responsePacketMagicHeader;
containerConfig[config_key::underloadPacketMagicHeader] = underloadPacketMagicHeader;
containerConfig[config_key::transportPacketMagicHeader] = transportPacketMagicHeader;
}
if (container == DockerContainer::Sftp) { 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(10)); containerConfig.insert(config_key::password, Utils::getRandomString(10));
@ -132,7 +165,6 @@ void InstallController::installServer(DockerContainer container, QJsonObject &co
server.insert(config_key::defaultContainer, ContainerProps::containerToString(container)); server.insert(config_key::defaultContainer, ContainerProps::containerToString(container));
m_serversModel->addServer(server); m_serversModel->addServer(server);
m_serversModel->setDefaultServerIndex(m_serversModel->getServersCount() - 1);
emit installServerFinished(finishMessage); emit installServerFinished(finishMessage);
return; return;
@ -183,9 +215,6 @@ void InstallController::installContainer(DockerContainer container, QJsonObject
"All installed containers have been added to the application"); "All installed containers have been added to the application");
} }
if (ContainerProps::containerService(container) == ServiceType::Vpn) {
m_containersModel->setData(m_containersModel->index(container), true, ContainersModel::Roles::IsDefaultRole);
}
emit installContainerFinished(finishMessage, ContainerProps::containerService(container) == ServiceType::Other); emit installContainerFinished(finishMessage, ContainerProps::containerService(container) == ServiceType::Other);
return; return;
} }
@ -475,8 +504,9 @@ void InstallController::addEmptyServer()
server.insert(config_key::port, m_currentlyInstalledServerCredentials.port); server.insert(config_key::port, m_currentlyInstalledServerCredentials.port);
server.insert(config_key::description, m_settings->nextAvailableServerName()); server.insert(config_key::description, m_settings->nextAvailableServerName());
server.insert(config_key::defaultContainer, ContainerProps::containerToString(DockerContainer::None));
m_serversModel->addServer(server); m_serversModel->addServer(server);
m_serversModel->setDefaultServerIndex(m_serversModel->getServersCount() - 1);
emit installServerFinished(tr("Server added successfully")); emit installServerFinished(tr("Server added successfully"));
} }

View file

@ -41,7 +41,7 @@ bool ContainersModel::setData(const QModelIndex &index, const QVariant &value, i
// return container; // return container;
case IsInstalledRole: case IsInstalledRole:
// return m_settings->containers(m_currentlyProcessedServerIndex).contains(container); // return m_settings->containers(m_currentlyProcessedServerIndex).contains(container);
case IsDefaultRole: { case IsDefaultRole: { //todo remove
m_settings->setDefaultContainer(m_currentlyProcessedServerIndex, container); m_settings->setDefaultContainer(m_currentlyProcessedServerIndex, container);
m_defaultContainerIndex = container; m_defaultContainerIndex = container;
emit defaultContainerChanged(); emit defaultContainerChanged();
@ -117,6 +117,14 @@ QString ContainersModel::getDefaultContainerName()
return ContainerProps::containerHumanNames().value(m_defaultContainerIndex); return ContainerProps::containerHumanNames().value(m_defaultContainerIndex);
} }
void ContainersModel::setDefaultContainer(int index)
{
auto container = static_cast<DockerContainer>(index);
m_settings->setDefaultContainer(m_currentlyProcessedServerIndex, container);
m_defaultContainerIndex = container;
emit defaultContainerChanged();
}
int ContainersModel::getCurrentlyProcessedContainerIndex() int ContainersModel::getCurrentlyProcessedContainerIndex()
{ {
return m_currentlyProcessedContainerIndex; return m_currentlyProcessedContainerIndex;

View file

@ -46,6 +46,7 @@ public:
public slots: public slots:
DockerContainer getDefaultContainer(); DockerContainer getDefaultContainer();
QString getDefaultContainerName(); QString getDefaultContainerName();
void setDefaultContainer(int index);
void setCurrentlyProcessedServerIndex(const int index); void setCurrentlyProcessedServerIndex(const int index);

View file

@ -96,7 +96,7 @@ void ServersModel::setDefaultServerIndex(const int index)
{ {
m_settings->setDefaultServer(index); m_settings->setDefaultServer(index);
m_defaultServerIndex = m_settings->defaultServerIndex(); m_defaultServerIndex = m_settings->defaultServerIndex();
emit defaultServerIndexChanged(); emit defaultServerIndexChanged(m_defaultServerIndex);
} }
const int ServersModel::getDefaultServerIndex() const int ServersModel::getDefaultServerIndex()

View file

@ -64,7 +64,7 @@ protected:
signals: signals:
void currentlyProcessedServerIndexChanged(const int index); void currentlyProcessedServerIndexChanged(const int index);
void defaultServerIndexChanged(); void defaultServerIndexChanged(const int index);
void defaultServerNameChanged(); void defaultServerNameChanged();
private: private:

View file

@ -142,6 +142,7 @@ Button {
PageController.setTriggeredBtConnectButton(true) PageController.setTriggeredBtConnectButton(true)
ServersModel.currentlyProcessedIndex = ServersModel.getDefaultServerIndex() ServersModel.currentlyProcessedIndex = ServersModel.getDefaultServerIndex()
InstallController.setShouldCreateServer(false)
PageController.goToPage(PageEnum.PageSetupWizardEasy) PageController.goToPage(PageEnum.PageSetupWizardEasy)
return return

View file

@ -17,9 +17,11 @@ DrawerType {
property var noButtonFunction property var noButtonFunction
width: parent.width width: parent.width
height: parent.height * 0.5 height: content.implicitHeight + 32
ColumnLayout { ColumnLayout {
id: content
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right

View file

@ -1,6 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import "../Config"
Drawer { Drawer {
id: drawer id: drawer
property bool needCloseButton: true property bool needCloseButton: true
@ -39,6 +41,18 @@ Drawer {
border.color: "#2C2D30" border.color: "#2C2D30"
border.width: 1 border.width: 1
Rectangle {
visible: GC.isMobile()
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 10
width: 20
height: 2
color: "#2C2D30"
}
} }
Overlay.modal: Rectangle { Overlay.modal: Rectangle {

View file

@ -30,17 +30,13 @@ Switch {
property string hoveredIndicatorBackgroundColor: Qt.rgba(1, 1, 1, 0.08) property string hoveredIndicatorBackgroundColor: Qt.rgba(1, 1, 1, 0.08)
property string defaultIndicatorBackgroundColor: "transparent" property string defaultIndicatorBackgroundColor: "transparent"
implicitWidth: content.implicitWidth + switcher.implicitWidth
implicitHeight: content.implicitHeight
hoverEnabled: enabled ? true : false hoverEnabled: enabled ? true : false
indicator: Rectangle { indicator: Rectangle {
id: switcher id: switcher
anchors.left: content.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: 4
implicitWidth: 52 implicitWidth: 52
implicitHeight: 32 implicitHeight: 32
@ -90,11 +86,11 @@ Switch {
contentItem: ColumnLayout { contentItem: ColumnLayout {
id: content id: content
anchors.fill: parent anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: switcher.implicitWidth
ListItemTitleType { ListItemTitleType {
Layout.fillWidth: true Layout.fillWidth: true
rightPadding: indicator.width
text: root.text text: root.text
color: root.enabled ? root.textColor : root.textDisabledColor color: root.enabled ? root.textColor : root.textDisabledColor
@ -104,6 +100,7 @@ Switch {
id: description id: description
Layout.fillWidth: true Layout.fillWidth: true
rightPadding: indicator.width
color: root.enabled ? root.descriptionTextColor : root.descriptionTextDisabledColor color: root.enabled ? root.descriptionTextColor : root.descriptionTextDisabledColor

View file

@ -241,8 +241,18 @@ PageType {
} }
] ]
DividerType {
Layout.topMargin: 10
Layout.fillWidth: false
Layout.preferredWidth: 20
Layout.preferredHeight: 2
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
visible: (buttonContent.collapsedVisibility || buttonContent.expandedVisibility)
}
RowLayout { RowLayout {
Layout.topMargin: 24 Layout.topMargin: 14
Layout.leftMargin: 24 Layout.leftMargin: 24
Layout.rightMargin: 24 Layout.rightMargin: 24
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
@ -305,7 +315,7 @@ PageType {
Header1TextType { Header1TextType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 24 Layout.topMargin: 14
Layout.leftMargin: 16 Layout.leftMargin: 16
Layout.rightMargin: 16 Layout.rightMargin: 16

View file

@ -276,7 +276,7 @@ PageType {
onClicked: { onClicked: {
questionDrawer.headerText = qsTr("Remove AmneziaWG from server?") questionDrawer.headerText = qsTr("Remove AmneziaWG from server?")
questionDrawer.descriptionText = qsTr("All users who you shared a connection with will no longer be able to connect to it.") questionDrawer.descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.")
questionDrawer.yesButtonText = qsTr("Continue") questionDrawer.yesButtonText = qsTr("Continue")
questionDrawer.noButtonText = qsTr("Cancel") questionDrawer.noButtonText = qsTr("Cancel")

View file

@ -5,6 +5,7 @@ import QtQuick.Layouts
import SortFilterProxyModel 0.2 import SortFilterProxyModel 0.2
import PageEnum 1.0 import PageEnum 1.0
import ContainerEnum 1.0
import "./" import "./"
import "../Controls2" import "../Controls2"
@ -252,6 +253,8 @@ PageType {
ColumnLayout { ColumnLayout {
id: checkboxLayout id: checkboxLayout
anchors.fill: parent
CheckBoxType { CheckBoxType {
Layout.fillWidth: true Layout.fillWidth: true
@ -351,6 +354,8 @@ PageType {
Layout.leftMargin: -8 Layout.leftMargin: -8
implicitHeight: 32 implicitHeight: 32
visible: ContainersModel.getCurrentlyProcessedContainerIndex() === ContainerEnum.OpenVpn
defaultColor: "transparent" defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08) hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12) pressedColor: Qt.rgba(1, 1, 1, 0.12)
@ -360,7 +365,7 @@ PageType {
onClicked: { onClicked: {
questionDrawer.headerText = qsTr("Remove OpenVpn from server?") questionDrawer.headerText = qsTr("Remove OpenVpn from server?")
questionDrawer.descriptionText = qsTr("All users who you shared a connection with will no longer be able to connect to it.") questionDrawer.descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.")
questionDrawer.yesButtonText = qsTr("Continue") questionDrawer.yesButtonText = qsTr("Continue")
questionDrawer.noButtonText = qsTr("Cancel") questionDrawer.noButtonText = qsTr("Cancel")

View file

@ -169,12 +169,14 @@ PageType {
width: parent.width width: parent.width
visible: ServersModel.isCurrentlyProcessedServerHasWriteAccess()
text: qsTr("Remove ") + ContainersModel.getCurrentlyProcessedContainerName() text: qsTr("Remove ") + ContainersModel.getCurrentlyProcessedContainerName()
textColor: "#EB5757" textColor: "#EB5757"
clickedFunction: function() { clickedFunction: function() {
questionDrawer.headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName()) questionDrawer.headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName())
questionDrawer.descriptionText = qsTr("All users who you shared a connection with will no longer be able to connect to it.") questionDrawer.descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.")
questionDrawer.yesButtonText = qsTr("Continue") questionDrawer.yesButtonText = qsTr("Continue")
questionDrawer.noButtonText = qsTr("Cancel") questionDrawer.noButtonText = qsTr("Cancel")

View file

@ -114,7 +114,7 @@ PageType {
clickedFunction: function() { clickedFunction: function() {
questionDrawer.headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName()) questionDrawer.headerText = qsTr("Remove %1 from server?").arg(ContainersModel.getCurrentlyProcessedContainerName())
questionDrawer.descriptionText = qsTr("All users who you shared a connection with will no longer be able to connect to it.") questionDrawer.descriptionText = qsTr("All users with whom you shared a connection will no longer be able to connect to it.")
questionDrawer.yesButtonText = qsTr("Continue") questionDrawer.yesButtonText = qsTr("Continue")
questionDrawer.noButtonText = qsTr("Cancel") questionDrawer.noButtonText = qsTr("Cancel")

View file

@ -24,6 +24,10 @@ PageType {
target: InstallController target: InstallController
function onInstallContainerFinished(finishedMessage, isServiceInstall) { function onInstallContainerFinished(finishedMessage, isServiceInstall) {
if (!ConnectionController.isConnected && !isServiceInstall) {
ContainersModel.setDefaultContainer(ContainersModel.getCurrentlyProcessedContainerIndex())
}
PageController.goToStartPage() PageController.goToStartPage()
if (stackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageHome)) { if (stackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageHome)) {
PageController.restorePageHomeState(true) PageController.restorePageHomeState(true)
@ -41,6 +45,10 @@ PageType {
} }
function onInstallServerFinished(finishedMessage) { function onInstallServerFinished(finishedMessage) {
if (!ConnectionController.isConnected) {
ServersModel.setDefaultServerIndex(ServersModel.getServersCount() - 1);
}
PageController.goToStartPage() PageController.goToStartPage()
if (stackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageSetupWizardStart)) { if (stackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageSetupWizardStart)) {
PageController.replaceStartPage() PageController.replaceStartPage()

View file

@ -224,7 +224,7 @@ PageType {
if (ProtocolProps.defaultPort(defaultContainerProto) < 0) { if (ProtocolProps.defaultPort(defaultContainerProto) < 0) {
port.visible = false port.visible = false
} else { } else {
port.textFieldText = ProtocolProps.defaultPort(defaultContainerProto) port.textFieldText = ProtocolProps.getPortForInstall(defaultContainerProto)
} }
transportProtoSelector.currentIndex = ProtocolProps.defaultTransportProto(defaultContainerProto) transportProtoSelector.currentIndex = ProtocolProps.defaultTransportProto(defaultContainerProto)

View file

@ -134,7 +134,7 @@ PageType {
text: qsTr("I have nothing") text: qsTr("I have nothing")
onClicked: Qt.openUrlExternally("https://ru-docs.amnezia.org/guides/hosting-instructions") onClicked: Qt.openUrlExternally("https://amnezia.org/instructions/0_starter-guide")
} }
} }

View file

@ -24,6 +24,10 @@ PageType {
} }
function onImportFinished() { function onImportFinished() {
if (ConnectionController.isConnected) {
ServersModel.setDefaultServerIndex(ServersModel.getServersCount() - 1);
}
PageController.goToStartPage() PageController.goToStartPage()
if (stackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageSetupWizardStart)) { if (stackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageSetupWizardStart)) {
PageController.replaceStartPage() PageController.replaceStartPage()

View file

@ -118,7 +118,7 @@ PageType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 24 Layout.topMargin: 24
headerText: qsTr("VPN Access") headerText: qsTr("Share VPN Access")
} }
Rectangle { Rectangle {
@ -171,8 +171,8 @@ PageType {
Layout.topMargin: 24 Layout.topMargin: 24
Layout.bottomMargin: 24 Layout.bottomMargin: 24
text: accessTypeSelector.currentIndex === 0 ? qsTr("VPN access without the ability to manage the server") : text: accessTypeSelector.currentIndex === 0 ? qsTr("Share VPN access without the ability to manage the server") :
qsTr("Access to server management. The user with whom you share full access to the connection will be able to add and remove your protocols and services to the server, as well as change settings.") qsTr("Share access to server management. The user with whom you share full access to the server will be able to add and remove any protocols and services to the server, as well as change settings.")
color: "#878B91" color: "#878B91"
} }