diff --git a/client/configurators/cloak_configurator.cpp b/client/configurators/cloak_configurator.cpp index 8f31be26..aa76ee0a 100644 --- a/client/configurators/cloak_configurator.cpp +++ b/client/configurators/cloak_configurator.cpp @@ -38,6 +38,7 @@ QString CloakConfigurator::genCloakConfig(const ServerCredentials &credentials, // transfer params to protocol runner config.insert(config_key::transport_proto, "$OPENVPN_TRANSPORT_PROTO"); config.insert(config_key::remote, credentials.hostName); + config.insert(config_key::port, "$CLOAK_SERVER_PORT"); QString textCfg = ServerController::replaceVars(QJsonDocument(config).toJson(), ServerController::genVarsForScript(credentials, container, containerConfig)); diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 052cd157..263f74dc 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -346,12 +346,8 @@ ErrorCode ServerController::setupContainer(const ServerCredentials &credentials, qDebug().noquote() << QJsonDocument(config).toJson(); ErrorCode e = ErrorCode::NoError; -// e = runScript(sshParams(credentials), -// replaceVars(amnezia::scriptData(SharedScriptType::install_docker), -// genVarsForScript(credentials))); - -// if (e) return e; - + e = installDockerWorker(credentials, container); + if (e) return e; e = prepareHostWorker(credentials, container, config); if (e) return e; @@ -368,21 +364,6 @@ ErrorCode ServerController::setupContainer(const ServerCredentials &credentials, if (e) return e; return startupContainerWorker(credentials, container, config); - - - - -// if (container == DockerContainer::OpenVpn) { -// return setupOpenVpnServer(credentials, config); -// } -// else if (container == DockerContainer::OpenVpnOverShadowSocks) { -// return setupShadowSocksServer(credentials, config); -// } -// else if (container == DockerContainer::OpenVpnOverCloak) { -// return setupOpenVpnOverCloakServer(credentials, config); -// } - -// return ErrorCode::NoError; } ErrorCode ServerController::updateContainer(const ServerCredentials &credentials, DockerContainer container, @@ -438,33 +419,6 @@ bool ServerController::isReinstallContainerRequred(DockerContainer container, co return false; } -//ErrorCode ServerController::setupOpenVpnServer(const ServerCredentials &credentials, const QJsonObject &config) -//{ -// return ErrorCode::NotImplementedError; -//} - -//ErrorCode ServerController::setupOpenVpnOverCloakServer(const ServerCredentials &credentials, const QJsonObject &config) -//{ -// ErrorCode e = ErrorCode::NoError; -// DockerContainer container = DockerContainer::OpenVpnOverCloak; - -// e = prepareHostWorker(credentials, container, config); -// if (e) return e; - -// removeContainer(credentials, container); - -// e = buildContainerWorker(credentials, container, config); -// if (e) return e; - -// e = runContainerWorker(credentials, container, config); -// if (e) return e; - -// e = configureContainerWorker(credentials, container, config); -// if (e) return e; - -// return startupContainerWorker(credentials, container, config); -//} - ErrorCode ServerController::installDockerWorker(const ServerCredentials &credentials, DockerContainer container) { QString stdOut; @@ -515,9 +469,23 @@ ErrorCode ServerController::buildContainerWorker(const ServerCredentials &creden ErrorCode ServerController::runContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config) { - return runScript(sshParams(credentials), + QString stdOut; + auto cbReadStdOut = [&](const QString &data, QSharedPointer proc) { + stdOut += data + "\n"; + }; + auto cbReadStdErr = [&](const QString &data, QSharedPointer proc) { + stdOut += data + "\n"; + }; + + ErrorCode e = runScript(sshParams(credentials), replaceVars(amnezia::scriptData(ProtocolScriptType::run_container, container), - genVarsForScript(credentials, container, config))); + genVarsForScript(credentials, container, config)), + cbReadStdOut, cbReadStdErr); + + if (stdOut.contains("address already in use")) return ErrorCode::ServerPortAlreadyAllocatedError; + if (stdOut.contains("is already in use by container")) return ErrorCode::ServerPortAlreadyAllocatedError; + + return e; } ErrorCode ServerController::configureContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config) @@ -540,57 +508,6 @@ ErrorCode ServerController::startupContainerWorker(const ServerCredentials &cred genVarsForScript(credentials, container, config))); } -//ErrorCode ServerController::setupShadowSocksServer(const ServerCredentials &credentials, const QJsonObject &config) -//{ -// return ErrorCode::NotImplementedError; -//// // Setup openvpn part -//// QString scriptData; -//// QString scriptFileName = ":/server_scripts/setup_shadowsocks_server.sh"; -//// QFile file(scriptFileName); -//// if (! file.open(QIODevice::ReadOnly)) return ErrorCode::InternalError; - -//// scriptData = file.readAll(); -//// if (scriptData.isEmpty()) return ErrorCode::InternalError; - -//// QString stdOut; -//// auto cbReadStdOut = [&](const QString &data, QSharedPointer proc) { -//// stdOut += data + "\n"; - -//// if (data.contains("Automatically restart Docker daemon?")) { -//// proc->write("yes\n"); -//// } -//// }; -//// auto cbReadStdErr = [&](const QString &data, QSharedPointer proc) { -//// stdOut += data + "\n"; -//// }; - -//// ErrorCode e = runScript(genVarsForScript(credentials, DockerContainer::ShadowSocks), sshParams(credentials), scriptData, cbReadStdOut, cbReadStdErr); -//// if (e) return e; - -//// // Create ss config -//// QJsonObject ssConfig; -//// ssConfig.insert("server", "0.0.0.0"); -//// ssConfig.insert("server_port", amnezia::protocols::shadowsocks::ssRemotePort()); -//// ssConfig.insert("local_port", amnezia::protocols::shadowsocks::ssContainerPort()); -//// ssConfig.insert("password", QString(QCryptographicHash::hash(credentials.password.toUtf8(), QCryptographicHash::Sha256).toHex())); -//// ssConfig.insert("timeout", 60); -//// ssConfig.insert("method", amnezia::protocols::shadowsocks::ssEncryption()); -//// QString configData = QJsonDocument(ssConfig).toJson(); -//// QString sSConfigPath = "/opt/amneziavpn_data/ssConfig.json"; - -//// configData.replace("\"", "\\\""); -//// //qDebug().noquote() << configData; - -//// uploadTextFileToContainer(DockerContainer::ShadowSocks, credentials, configData, sSConfigPath); - -//// // Start ss -//// QString script = QString("sudo docker exec -d %1 sh -c \"ss-server -c %2\""). -//// arg(amnezia::containerToString(DockerContainer::ShadowSocks)).arg(sSConfigPath); - -//// e = runScript(genVarsForScript(credentials, DockerContainer::ShadowSocks), sshParams(credentials), script); -// // return e; -//} - ServerController::Vars ServerController::genVarsForScript(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config) { const QJsonObject &openvpnConfig = config.value(config_key::openvpn).toObject(); @@ -624,7 +541,7 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential vars.append({{"$DOCKERFILE_FOLDER", "/opt/amnezia/" + amnezia::containerToString(container)}}); // Cloak vars - vars.append({{"$CLOAK_SERVER_PORT", config.value(config_key::port).toString(protocols::cloak::defaultPort) }}); + vars.append({{"$CLOAK_SERVER_PORT", cloakConfig.value(config_key::port).toString(protocols::cloak::defaultPort) }}); vars.append({{"$FAKE_WEB_SITE_ADDRESS", cloakConfig.value(config_key::site).toString(protocols::cloak::defaultRedirSite) }}); QString serverIp = Utils::getIPAddress(credentials.hostName); @@ -730,5 +647,6 @@ QString ServerController::replaceVars(const QString &script, const Vars &vars) //qDebug() << "Replacing" << var.first << var.second; s.replace(var.first, var.second); } + //qDebug().noquote() << script; return s; } diff --git a/client/core/servercontroller.h b/client/core/servercontroller.h index 9247f035..7ea9244f 100644 --- a/client/core/servercontroller.h +++ b/client/core/servercontroller.h @@ -58,11 +58,6 @@ private: static QSsh::SshConnection *connectToHost(const QSsh::SshConnectionParameters &sshParams); static ErrorCode installDockerWorker(const ServerCredentials &credentials, DockerContainer container); - - //static ErrorCode setupOpenVpnServer(const ServerCredentials &credentials, const QJsonObject &config = QJsonObject()); - //static ErrorCode setupOpenVpnOverCloakServer(const ServerCredentials &credentials, const QJsonObject &config = QJsonObject()); - // static ErrorCode setupShadowSocksServer(const ServerCredentials &credentials, const QJsonObject &config = QJsonObject()); - static ErrorCode prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject()); static ErrorCode buildContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject()); static ErrorCode runContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject()); diff --git a/client/defines.h b/client/defines.h index e106f003..f09ed0fb 100644 --- a/client/defines.h +++ b/client/defines.h @@ -4,6 +4,6 @@ #define APPLICATION_NAME "AmneziaVPN" #define SERVICE_NAME "AmneziaVPN-service" #define ORGANIZATION_NAME "AmneziaVPN.ORG" -#define APP_VERSION "1.6.0.0" +#define APP_VERSION "1.6.1.0" #endif // DEFINES_H diff --git a/client/main.cpp b/client/main.cpp index ec713e9e..4b1a2bc2 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -68,6 +68,11 @@ int main(int argc, char *argv[]) parser.addHelpOption(); parser.addVersionOption(); + QCommandLineOption c_autostart {{"a", "autostart"}, "System autostart"}; + parser.addOption(c_autostart); + + parser.process(app); + if (!Debug::init()) { qWarning() << "Initialization of debug subsystem failed"; } @@ -79,7 +84,8 @@ int main(int argc, char *argv[]) app.setQuitOnLastWindowClosed(false); MainWindow mainWindow; - mainWindow.show(); + if (parser.isSet("a")) mainWindow.showOnStartup(); + else mainWindow.show(); if (app.isPrimary()) { QObject::connect(&app, &SingleApplication::instanceStarted, &mainWindow, [&](){ diff --git a/client/platform_win/vpnclient.rc b/client/platform_win/vpnclient.rc index 4fe68ed7..74d3bf39 100644 --- a/client/platform_win/vpnclient.rc +++ b/client/platform_win/vpnclient.rc @@ -3,11 +3,11 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US IDI_ICON1 ICON "../images/app.ico" -#define VER_FILEVERSION 1,6,0,0 -#define VER_FILEVERSION_STR "1.6.0.0\0" +#define VER_FILEVERSION 1,6,1,0 +#define VER_FILEVERSION_STR "1.6.1.0\0" -#define VER_PRODUCTVERSION 1,6,0,0 -#define VER_PRODUCTVERSION_STR "1.6.0.0\0" +#define VER_PRODUCTVERSION 1,6,1,0 +#define VER_PRODUCTVERSION_STR "1.6.1.0\0" #define VER_COMPANYNAME_STR "AmneziaVPN" #define VER_FILEDESCRIPTION_STR "AmneziaVPN" diff --git a/client/protocols/openvpnovercloakprotocol.cpp b/client/protocols/openvpnovercloakprotocol.cpp index 14f57377..2eb295c7 100644 --- a/client/protocols/openvpnovercloakprotocol.cpp +++ b/client/protocols/openvpnovercloakprotocol.cpp @@ -38,7 +38,7 @@ ErrorCode OpenVpnOverCloakProtocol::start() QStringList args = QStringList() << "-c" << m_cloakCfgFile.fileName() << "-s" << m_cloakConfig.value(config_key::remote).toString() - << "-p" << amnezia::protocols::cloak::defaultPort + << "-p" << m_cloakConfig.value(config_key::port).toString(amnezia::protocols::cloak::defaultPort) << "-l" << amnezia::protocols::openvpn::defaultPort; if (m_cloakConfig.value(config_key::transport_proto).toString() == protocols::UDP) { diff --git a/client/server_scripts/install_docker.sh b/client/server_scripts/install_docker.sh index 62c20cc5..1e4043bf 100644 --- a/client/server_scripts/install_docker.sh +++ b/client/server_scripts/install_docker.sh @@ -1,6 +1,7 @@ -pm_apt="/usr/bin/apt-get"; pm_yum="/usr/bin/yum"; if [[ -f "$pm_apt" ]]; then pm=$pm_apt; else pm=$pm_yum; fi; if [[ ! -f "/usr/bin/sudo" ]]; then $pm update -y -q; $pm install -y -q sudo; fi -pm_apt="/usr/bin/apt-get"; pm_yum="/usr/bin/yum"; if [[ -f "$pm_apt" ]]; then pm=$pm_apt; else pm=$pm_yum; fi; sudo $pm update -y -q -pm_apt="/usr/bin/apt-get"; pm_yum="/usr/bin/yum"; if [[ -f "$pm_apt" ]]; then pm=$pm_apt; else pm=$pm_yum; fi; sudo $pm install -y -q curl -pm_apt="/usr/bin/apt-get"; pm_yum="/usr/bin/yum"; if [[ -f "$pm_apt" ]]; then sudo export DEBIAN_FRONTEND=noninteractive; sudo $pm_apt install -y -q docker.io; else sudo $pm_yum install -y -q docker; fi +pm_apt="/usr/bin/apt-get"; pm_yum="/usr/bin/yum";\ +if [[ -f "$pm_apt" ]]; then pm=$pm_apt; docker_pkg="docker.io"; else pm=$pm_yum; docker_pkg="docker"; fi;\ +if [[ ! -f "/usr/bin/sudo" ]]; then $pm update -y -q; $pm install -y -q sudo; fi;\ +docker_service=$(systemctl list-units --full -all | grep docker.service);\ +if [[ -f "$pm_apt" ]]; then export DEBIAN_FRONTEND=noninteractive; fi;\ +if [[ -z "$docker_service" ]]; then sudo $pm update -y -q; sudo $pm install -y -q curl $docker_pkg; fi;\ sudo systemctl start docker - diff --git a/client/settings.h b/client/settings.h index 7dfab8d3..cf3ab266 100644 --- a/client/settings.h +++ b/client/settings.h @@ -23,19 +23,6 @@ class Settings : public QObject public: explicit Settings(QObject* parent = nullptr); - -// QString userName() const { return m_settings.value("Server/userName", QString()).toString(); } -// void setUserName(const QString& login) { m_settings.setValue("Server/userName", login); } - -// QString password() const { return m_settings.value("Server/password", QString()).toString(); } -// void setPassword(const QString& password) { m_settings.setValue("Server/password", password); } - -// QString serverName() const { return m_settings.value("Server/serverName", QString()).toString(); } -// void setServerName(const QString& serverName) { m_settings.setValue("Server/serverName", serverName); } - -// int serverPort() const { return m_settings.value("Server/serverPort", 22).toInt(); } -// void setServerPort(int serverPort = 22) { m_settings.setValue("Server/serverPort", serverPort); } - ServerCredentials defaultServerCredentials() const; ServerCredentials serverCredentials(int index) const; //void setServerCredentials(const ServerCredentials &credentials); @@ -74,9 +61,12 @@ public: QString nextAvailableServerName() const; // App settings section - bool isAutoConnect() const { return m_settings.value("Conf/autoConnect", QString()).toBool(); } + bool isAutoConnect() const { return m_settings.value("Conf/autoConnect", false).toBool(); } void setAutoConnect(bool enabled) { m_settings.setValue("Conf/autoConnect", enabled); } + bool isStartMinimized() const { return m_settings.value("Conf/startMinimized", false).toBool(); } + void setStartMinimized(bool enabled) { m_settings.setValue("Conf/startMinimized", enabled); } + bool customRouting() const { return m_settings.value("Conf/customRouting", false).toBool(); } void setCustomRouting(bool customRouting) { m_settings.setValue("Conf/customRouting", customRouting); } diff --git a/client/translations/amneziavpn_ru.qm b/client/translations/amneziavpn_ru.qm index 1da6f420..380d6090 100644 Binary files a/client/translations/amneziavpn_ru.qm and b/client/translations/amneziavpn_ru.qm differ diff --git a/client/translations/amneziavpn_ru.ts b/client/translations/amneziavpn_ru.ts index 1715193a..5031f289 100644 --- a/client/translations/amneziavpn_ru.ts +++ b/client/translations/amneziavpn_ru.ts @@ -4,173 +4,1018 @@ MainWindow - + Connect to the already created VPN server Подключиться к уже созданному серверу VPN - + Connection code Код для подключения - - + Connecting... Подключение... - - + + + + + Connect Подключиться - + + Set up your own server Настроить собственный сервер - Connect your server to use VPN - Подключите ваш сервер, чтобы использовать VPN + Подключите ваш сервер, чтобы использовать VPN - + Server IP address IP адрес сервера - + Login to connect via SSH Логин для подключения по SSH - + + + Password Пароль - + Where to get connection data → - Where to get connection data → + Где взять логин для подключения → - - + + vpn://... + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Lato'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16px;"><br /></p></body></html> + + + + + + + + Please wait, configuring process may take up to 5 minutes + Пожалуйста подождите, настройка может занять до 5 минут + + + + Setup your server to use VPN + Настроить ваш сервер для VPN + + + + root + + + + + + Connect using SSH key + Использовать SSH ключ + + + + Select VPN protocols to install + Выберите VPN протоколы для установки + + + + OpenVPN and ShadowSocks + with masking using Cloak plugin + OpenVPN и ShadowSocks + с маскировкой плагином Cloak + + + + Port (TCP) + Порт (TCP) + + + + 443 + + + + + + Fake Web Site + Сайт маскировки + + + + + mail.ru + + + + + ShadowSocks + + + + + Port(TCP) + Порт (TCP) + + + + 6789 + + + + + Encryption + Шифрование + + + + chacha20-ietf-poly1305 + + + + + xchacha20-ietf-poly1305 + + + + + + + aes-256-gcm + + + + + + aes-192-gcm + + + + + + + aes-128-gcm + + + + + OpenVPN + + + + + + + + Port + Порт + + + + Protocol + Протокол + + + + + UDP + + + + + + TCP + + + + + + + + + Configuring... + Настройка... + + + + Setup server + Установить сервер + + + + 0 Mbps 0 Мбит/сек - Add site - Добавить сайт + Добавить сайт - + Connected Подключено - + How to use VPN Как использовать VPN - + For all connections Для всех соединений - + For selected sites Для выбранных сайтов - + + Error text + + + + List of the most popular prohibited sites Список самых популярных запрещенных сайтов - For example, rutor.org or 17.21.111.8 - Например, rutor.org или 17.21.111.8 + Например, rutor.org или 17.21.111.8 - Anyone who logs in with this code will have the same rights to use the VPN as you. To create a new code, change your login and / or password for connection in your server settings. - Тот, кто зайдёт с этим кодом, будет иметь те же права на использование VPN, что и вы. Чтобы создать новый код смените логин и/или пароль для подлючения в настройках вашего сервера. + Тот, кто зайдёт с этим кодом, будет иметь те же права на использование VPN, что и вы. Чтобы создать новый код смените логин и/или пароль для подлючения в настройках вашего сервера. - These sites will open via VPN - These sites will open via VPN + These sites will open via VPN - Delete selected item - Удалить выбранный элемент + Удалить выбранный элемент - Hostname or IP address - Имя хоста или IP адрес + Имя хоста или IP адрес - + + + - + + Software version: 1.6.1 (09.05.2021) + + + + Server settings Настройки сервера - + Share connection Поделиться подключением - + + + Add site + + Добавить сайт + + + + These sites will be opened using VPN + Эти сайты будут открываться через VPN + + + + For example, yousite.com or 17.21.111.8 + Например, yousite.com или 17.21.111.8 + + + + Web site or hostname or IP address + Web-сайт, имя хоста или IP-адрес + + + + + Reinstall server, clear server + Переустановить сервер, очистить сервер + + + + Server management + Управление сервером + + + + + Exit + Выход из приложения + + + + Auto start, Auto connect + Авто-запуск, авто-соединение + + + + App settings + Настройки приложения + + + + Dns, Kill Switch + + + + + Network settings + Настройки сети + + + + Servers + Список серверов + + + + Servers list + Список серверов + + + + Auto start + Авто старт + + + + Application Settings + Настройки приложения + + + + Auto connect + Авто соединение + + + + Check for updates + Проверить обновления + + + + DNS Servers + DNS сервера + + + + + Reset to default value + Сбросить по умолчанию + + + + Primary DNS server + Первичный DSN сервер + + + + Secondray DNS server + Вторичный DNS сервер + + + + + Clear client cached profile + Удалить закешировнный профиль + + + + + Clear server from Amnezia software + Очистить сервер от Amnezia + + + + Forget this server + Забыть этот сервер + + + + root@yourserver.org + + + + + VPN protocols + VPN протоколы + + + + VPN Protocol: + VPN протокол: + + + + Protocols + Протоколы + + + + Cloak container + Cloak контейнер + + + + + + OpenVPN settings + Настройки OpenVPN + + + + + ShadowSocks settings + Настройки ShadowSocks + + + + Cloak settings + Настройки Cloak + + + + ShadowSocks container + ShadowSocks контейнер + + + + OpenVPN container + OpenVPN контейнер + + + + Full access + Полный доступ + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Consolas'; font-size:20px; font-weight:600; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt;">vpn:\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span></p></body></html> + + + + + Anyone who logs in with this code will have the same permissions to use VPN and your server as you. +This code includes your server credentials! +Provide this code only to TRUSTED users. + Любой, кто получит этот код, получит полный доступ к серверу и использованию VPN. Этот код содержит пароль от сервера. +Предоставляйте этот код только доверенным пользователям. + + + + Share for Amnezia client + Расшарить для Amnezia + + + + Anyone who logs in with this code will be able to connect to this VPN server. +This code does not include server credentials. + Любой, кто получит этот код, получит возможность подключаться к этому VPN серверу +Этот код не содержи пароль от сервера. + + + + + + Generate config + Сгенерировать конфиг + + + + + Share for OpenVPN client + Расшарить для OpenVPN + + + + Save file + Сохранить файл + + + + + Share for ShadowSocks client + Расшарить для ShadowSocks + + + + + Server: + Сервер: + + + + + Encryption: + Шифрование: + + + + + Port: + Порт: + + + + Password: + Пароль: + + + Connection string Строка подключения - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Consolas'; font-size:22px; font-weight:600; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt;">vpn:\\aosdiufhafafsuhgqejghuserhglaidhgauhgalgadg</span></p></body></html> + + Share for Cloak client + Расшарить для Cloak + + + + OpenVPN Settings + Настройки OpenVPN + + + + Hash + Хеш + + + + + + Cipher + Шифр + + + + Network protocol + Сетевой протокол + + + + AES-256-GCM - + + AES-192-GCM + + + + + AES-128-GCM + + + + + AES-256-CBC + + + + + AES-192-CBC + + + + + AES-128-CBC + + + + + ChaCha20-Poly1305 + + + + + ARIA-256-CBC + + + + + CAMELLIA-256-CBC + + + + + none + + + + + VPN Addresses Subnet + Подсеть для VPN + + + + + + Save and restart VPN + Сохранить и перезапустить VPN + + + + Auto-negotiate encryption + Авто-согласование шифрования + + + + SHA512 + + + + + SHA384 + + + + + SHA256 + + + + + SHA3-512 + + + + + SHA3-384 + + + + + SHA3-256 + + + + + whirlpool + + + + + BLAKE2b512 + + + + + BLAKE2s256 + + + + + Block DNS requests outside of VPN + Блокировать запросы DNS мимо VPN + + + + ShadowSocks Settings + Настройки ShadowSocks + + + + + chacha20-poly1305 + + + + + Cloak Settings + Настройки Cloak + + + + plain + + + + + + + + + + + Copy Копировать - + Cannot open logs folder! Невозможно открыть папку с логами! - + + Please fill in all fields Пожалуйста, заполните все поля + + + It's public key. Private key required + Это публичный ключ. Требуется приватный + + + + of + из + + + + + + Error occurred while configuring server. + Ошибка во время настройки сервера + + + + Operation finished + Операция завершена + + + + Uninstalling Amnezia software... + Удаление Amnezia... + + + + See logs for details. + Смотрите логи для подробных деталей + + + + Amnezia server successfully uninstalled + Amnezia сервер удален + + + + Show + Показать окно + + + + + Disconnect + Отключиться + + + + Visit Website + Посетить сайт + + + + Quit + Выход + + + + Do you really want to quit? + Вы действительно хотите выйти? + + + + Import connection + Импортировать соединение + + + + Private key + Приватный ключ + + + + Connect using SSH password + Соединиться с паролем SSH + + + + Cache cleared + Кеш очищен + + + + + + + Copied + Скопировано + + + + Generating... + Генерация... + + + + Error while generating connection profile + Ошибка во время генерации профиля + + + + Save OpenVPN config + Сохранить OpenVPN конфиг + + + + VPN Protocols is not installed. + Please install VPN container at first + VPN протоколы ещё не установлены. Установите VPN контейнеры + + + + VPN Protocol not choosen + VPN протокол не выбран + + + + Protocol: + Протокол: + + + + Press Generate config + Нажмите Сгенерировать конфиг + QObject - AmneziaVPN is already running. - Приложение AmneziaVPN уже запущено. + Приложение AmneziaVPN уже запущено. - - Notification + + No error + + + + + Unknown Error + + + + + Function not implemented + + + + + Server check failed + + + + + Server port already used. Check for another software + + + + + Ssh connection error + + + + + Ssh connection timeout + + + + + Ssh protocol error + + + + + Ssh server ket check failed + + + + + Ssh key file error + + + + + Ssh authentication error + + + + + Ssh session closed + + + + + Ssh internal error + + + + + Failed to create remote process on server + + + + + Failed to start remote process on server + + + + + Remote process on server crashed + + + + + Failed to save config to disk + + + + + OpenVPN config missing + + + + + OpenVPN management server error + + + + + EasyRSA runtime error + + + + + OpenVPN executable missing + + + + + EasyRsa executable missing + + + + + Amnezia helper service error + + + + + Can't connect: another VPN connection is active + + + + + Internal error @@ -405,11 +1250,6 @@ p, li { white-space: pre-wrap; } No private key file given. - - - Private key file error: %1 - - QSsh::Internal::SshRemoteProcessPrivate @@ -589,6 +1429,58 @@ p, li { white-space: pre-wrap; } + + ServerWidget + + + Form + + + + + Description + + + + + Address + + + + + Set as default + + + + + Share connection + Поделиться подключением + + + + Connection + + + + + Server settings + Настройки сервера + + + + Settings + + + Server #1 + + + + + + Server + + + SshConnection @@ -630,9 +1522,52 @@ with a password, which you can enter below. VpnConnection - + Mbps + + VpnProtocol + + + Unknown + Неизвестно + + + + Disconnected + Отключено + + + + Preparing + Подготовка + + + + Connecting... + Подключение... + + + + Connected + Подключено + + + + Disconnecting... + Отключение... + + + + Reconnecting... + Переподключение... + + + + Error + Ошибка + + diff --git a/client/ui/mainwindow.cpp b/client/ui/mainwindow.cpp index 83bdfaf3..cf97e5a7 100644 --- a/client/ui/mainwindow.cpp +++ b/client/ui/mainwindow.cpp @@ -57,6 +57,8 @@ MainWindow::MainWindow(QWidget *parent) : setupTray(); setupUiConnections(); + setupAppSettingsConnections(); + setupNetworkSettingsConnections(); setupProtocolsPageConnections(); setupNewServerPageConnections(); setupSharePageConnections(); @@ -159,6 +161,11 @@ MainWindow::~MainWindow() qDebug() << "Application closed"; } +void MainWindow::showOnStartup() +{ + if (! m_settings.isStartMinimized()) show(); +} + void MainWindow::goToPage(Page page, bool reset, bool slide) { qDebug() << "goToPage" << page; @@ -198,6 +205,9 @@ void MainWindow::goToPage(Page page, bool reset, bool slide) if (page == Page::AppSettings) { updateAppSettingsPage(); } + if (page == Page::NetworkSettings) { + updateAppSettingsPage(); + } if (page == Page::Sites) { updateSitesPage(); } @@ -303,12 +313,11 @@ void MainWindow::keyPressEvent(QKeyEvent *event) case Qt::Key_Q: qApp->quit(); break; +#endif case Qt::Key_C: qDebug().noquote() << "Def server" << m_settings.defaultServerIndex() << m_settings.defaultContainerName(m_settings.defaultServerIndex()); qDebug().noquote() << QJsonDocument(m_settings.containerConfig(m_settings.defaultServerIndex(), m_settings.defaultContainer(m_settings.defaultServerIndex()))).toJson(); - //qDebug().noquote() << QJsonDocument(m_settings.serversArray()).toJson(); break; -#endif case Qt::Key_A: goToPage(Page::Start); break; @@ -334,7 +343,7 @@ void MainWindow::keyPressEvent(QKeyEvent *event) void MainWindow::closeEvent(QCloseEvent *event) { - if (currentPage() == Page::Start || currentPage() == Page::NewServer) qApp->quit(); + if (m_settings.serversCount() == 0) qApp->quit(); else { hide(); event->ignore(); @@ -440,23 +449,23 @@ void MainWindow::onPushButtonNewServerConnect(bool) void MainWindow::onPushButtonNewServerConnectConfigure(bool) { QJsonObject cloakConfig { - { config_key::port, ui->lineEdit_new_server_cloak_port->text() }, { config_key::container, amnezia::containerToString(DockerContainer::OpenVpnOverCloak) }, { config_key::cloak, QJsonObject { + { config_key::port, ui->lineEdit_new_server_cloak_port->text() }, { config_key::site, ui->lineEdit_new_server_cloak_site->text() }} } }; QJsonObject ssConfig { - { config_key::port, ui->lineEdit_new_server_ss_port->text() }, { config_key::container, amnezia::containerToString(DockerContainer::OpenVpnOverShadowSocks) }, { config_key::shadowsocks, QJsonObject { + { config_key::port, ui->lineEdit_new_server_ss_port->text() }, { config_key::cipher, ui->comboBox_new_server_ss_cipher->currentText() }} } }; QJsonObject openVpnConfig { - { config_key::port, ui->lineEdit_new_server_openvpn_port->text() }, { config_key::container, amnezia::containerToString(DockerContainer::OpenVpn) }, { config_key::openvpn, QJsonObject { + { config_key::port, ui->lineEdit_new_server_openvpn_port->text() }, { config_key::transport_proto, ui->comboBox_new_server_openvpn_proto->currentText() }} } }; @@ -476,7 +485,7 @@ void MainWindow::onPushButtonNewServerConnectConfigure(bool) if (ui->checkBox_new_server_openvpn->isChecked()) { containerConfigs.append(openVpnConfig); - containers.append(DockerContainer::OpenVpnOverShadowSocks); + containers.append(DockerContainer::OpenVpn); } if (containers.isEmpty()) return; @@ -485,7 +494,7 @@ void MainWindow::onPushButtonNewServerConnectConfigure(bool) bool ok = installServer(installCredentials, containers, containerConfigs, ui->page_new_server_2, ui->progressBar_new_server_connection, - ui->pushButton_new_server_connect, + ui->pushButton_new_server_connect_configure, ui->label_new_server_wait_info); if (ok) { @@ -500,6 +509,7 @@ void MainWindow::onPushButtonNewServerConnectConfigure(bool) server.insert(config_key::defaultContainer, containerToString(containers.first())); m_settings.addServer(server); + m_settings.setDefaultServer(m_settings.serversCount() - 1); goToPage(Page::Vpn); qApp->processEvents(); @@ -534,6 +544,8 @@ void MainWindow::onPushButtonNewServerImport(bool) if (credentials.isValid() || o.contains(config_key::containers)) { m_settings.addServer(o); + m_settings.setDefaultServer(m_settings.serversCount() - 1); + setStartPage(Page::Vpn); } else { @@ -564,7 +576,7 @@ bool MainWindow::installServer(ServerCredentials credentials, timer.start(1000); progress->setTextVisible(true); - progress->setFormat(QString("%1%2%3").arg(i+1).arg(tr("of")).arg(containers.size())); + progress->setFormat(QString("Installing %1 %2 %3").arg(i+1).arg(tr("of")).arg(containers.size())); ErrorCode e = ServerController::setupContainer(credentials, containers.at(i), configs.at(i).toObject()); qDebug() << "Setup server finished with code" << e; @@ -604,11 +616,9 @@ bool MainWindow::installServer(ServerCredentials credentials, } - - -// button->show(); -// page->setEnabled(true); -// info->setText(tr("Amnezia server installed")); + button->show(); + page->setEnabled(true); + info->setText(tr("Amnezia server installed")); return true; } @@ -720,6 +730,11 @@ void MainWindow::onPushButtonForgetServer(bool) m_settings.setDefaultServer(m_settings.defaultServerIndex() - 1); } + if (m_settings.serversCount() == 0) { + m_settings.setDefaultServer(-1); + } + + selectedServerIndex = -1; updateServersListPage(); @@ -923,42 +938,6 @@ void MainWindow::setupUiConnections() m_settings.setCustomRouting(toggled); }); - connect(ui->checkBox_autostart, &QCheckBox::stateChanged, this, [this](int state){ - if (state == Qt::Unchecked) { - ui->checkBox_autoconnect->setChecked(false); - } - Autostart::setAutostart(state == Qt::Checked); - }); - - connect(ui->checkBox_autoconnect, &QCheckBox::stateChanged, this, [this](int state){ - m_settings.setAutoConnect(state == Qt::Checked); - }); - - connect(ui->pushButton_network_settings_resetdns1, &QPushButton::clicked, this, [this](){ - m_settings.setPrimaryDns(m_settings.cloudFlareNs1); - updateAppSettingsPage(); - }); - connect(ui->pushButton_network_settings_resetdns2, &QPushButton::clicked, this, [this](){ - m_settings.setSecondaryDns(m_settings.cloudFlareNs2); - updateAppSettingsPage(); - }); - - connect(ui->lineEdit_network_settings_dns1, &QLineEdit::textEdited, this, [this](const QString &newText){ - if (m_ipAddressValidator.regExp().exactMatch(newText)) { - m_settings.setPrimaryDns(newText); - } - }); - connect(ui->lineEdit_network_settings_dns2, &QLineEdit::textEdited, this, [this](const QString &newText){ - if (m_ipAddressValidator.regExp().exactMatch(newText)) { - m_settings.setSecondaryDns(newText); - } - }); - - - connect(ui->pushButton_check_for_updates, &QPushButton::clicked, this, [this](){ - QDesktopServices::openUrl(QUrl("https://github.com/amnezia-vpn/desktop-client/releases")); - }); - connect(ui->pushButton_servers_add_new, &QPushButton::clicked, this, [this](){ goToPage(Page::Start); }); connect(ui->lineEdit_server_settings_description, &QLineEdit::editingFinished, this, [this](){ @@ -972,8 +951,52 @@ void MainWindow::setupUiConnections() connect(ui->lineEdit_server_settings_description, &QLineEdit::returnPressed, this, [this](){ ui->lineEdit_server_settings_description->clearFocus(); }); +} +void MainWindow::setupAppSettingsConnections() +{ + connect(ui->checkBox_app_settings_autostart, &QCheckBox::stateChanged, this, [this](int state){ + if (state == Qt::Unchecked) { + ui->checkBox_app_settings_autoconnect->setChecked(false); + } + Autostart::setAutostart(state == Qt::Checked); + }); + connect(ui->checkBox_app_settings_autoconnect, &QCheckBox::stateChanged, this, [this](int state){ + m_settings.setAutoConnect(state == Qt::Checked); + }); + + connect(ui->checkBox_app_settings_start_minimized, &QCheckBox::stateChanged, this, [this](int state){ + m_settings.setStartMinimized(state == Qt::Checked); + }); + + connect(ui->pushButton_app_settings_check_for_updates, &QPushButton::clicked, this, [this](){ + QDesktopServices::openUrl(QUrl("https://github.com/amnezia-vpn/desktop-client/releases/latest")); + }); +} + +void MainWindow::setupNetworkSettingsConnections() +{ + connect(ui->lineEdit_network_settings_dns1, &QLineEdit::textEdited, this, [this](const QString &newText){ + if (m_ipAddressValidator.regExp().exactMatch(newText)) { + m_settings.setPrimaryDns(newText); + } + }); + connect(ui->lineEdit_network_settings_dns2, &QLineEdit::textEdited, this, [this](const QString &newText){ + if (m_ipAddressValidator.regExp().exactMatch(newText)) { + m_settings.setSecondaryDns(newText); + } + }); + + connect(ui->pushButton_network_settings_resetdns1, &QPushButton::clicked, this, [this](){ + m_settings.setPrimaryDns(m_settings.cloudFlareNs1); + updateAppSettingsPage(); + }); + + connect(ui->pushButton_network_settings_resetdns2, &QPushButton::clicked, this, [this](){ + m_settings.setSecondaryDns(m_settings.cloudFlareNs2); + updateAppSettingsPage(); + }); } void MainWindow::setupProtocolsPageConnections() @@ -1296,7 +1319,7 @@ void MainWindow::setupSharePageConnections() qApp->processEvents(); ServerCredentials credentials = m_settings.serverCredentials(selectedServerIndex); - QJsonObject containerConfig; // = m_settings.containerConfig(selectedServerIndex, selectedDockerContainer); + QJsonObject containerConfig = m_settings.containerConfig(selectedServerIndex, selectedDockerContainer); containerConfig.insert(config_key::container, containerToString(selectedDockerContainer)); ErrorCode e = ErrorCode::NoError; @@ -1336,17 +1359,23 @@ void MainWindow::setupSharePageConnections() }); connect(ui->pushButton_share_openvpn_generate, &QPushButton::clicked, this, [this](){ - ServerCredentials credentials = m_settings.serverCredentials(selectedServerIndex); - const QJsonObject &containerConfig = m_settings.containerConfig(selectedServerIndex, selectedDockerContainer); + ui->pushButton_share_openvpn_generate->setEnabled(false); ui->pushButton_share_openvpn_copy->setEnabled(false); ui->pushButton_share_openvpn_save->setEnabled(false); + ui->pushButton_share_openvpn_generate->setText(tr("Generating...")); + + ServerCredentials credentials = m_settings.serverCredentials(selectedServerIndex); + const QJsonObject &containerConfig = m_settings.containerConfig(selectedServerIndex, selectedDockerContainer); ErrorCode e = ErrorCode::NoError; QString cfg = OpenVpnConfigurator::genOpenVpnConfig(credentials, selectedDockerContainer, containerConfig, &e); ui->textEdit_share_openvpn_code->setPlainText(cfg); + + ui->pushButton_share_openvpn_generate->setEnabled(true); ui->pushButton_share_openvpn_copy->setEnabled(true); ui->pushButton_share_openvpn_save->setEnabled(true); + ui->pushButton_share_openvpn_generate->setText(tr("Generate config")); }); connect(ui->pushButton_share_openvpn_save, &QPushButton::clicked, this, [this](){ @@ -1570,8 +1599,9 @@ void MainWindow::updateVpnPage() void MainWindow::updateAppSettingsPage() { - ui->checkBox_autostart->setChecked(Autostart::isAutostart()); - ui->checkBox_autoconnect->setChecked(m_settings.isAutoConnect()); + ui->checkBox_app_settings_autostart->setChecked(Autostart::isAutostart()); + ui->checkBox_app_settings_autoconnect->setChecked(m_settings.isAutoConnect()); + ui->checkBox_app_settings_start_minimized->setChecked(m_settings.isStartMinimized()); ui->lineEdit_network_settings_dns1->setText(m_settings.primaryDns()); ui->lineEdit_network_settings_dns2->setText(m_settings.secondaryDns()); diff --git a/client/ui/mainwindow.h b/client/ui/mainwindow.h index f6437d13..7b32aa9a 100644 --- a/client/ui/mainwindow.h +++ b/client/ui/mainwindow.h @@ -45,6 +45,8 @@ public: OpenVpnSettings, ShadowSocksSettings, CloakSettings}; Q_ENUM(Page) + void showOnStartup(); + private slots: void onBytesChanged(quint64 receivedBytes, quint64 sentBytes); void onConnectionStateChanged(VpnProtocol::ConnectionState state); @@ -88,6 +90,8 @@ private: void setTrayIcon(const QString &iconPath); void setupUiConnections(); + void setupAppSettingsConnections(); + void setupNetworkSettingsConnections(); void setupProtocolsPageConnections(); void setupNewServerPageConnections(); void setupServerSettingsPageConnections(); diff --git a/client/ui/mainwindow.ui b/client/ui/mainwindow.ui index 5c63b051..c8d3a4f4 100644 --- a/client/ui/mainwindow.ui +++ b/client/ui/mainwindow.ui @@ -287,7 +287,7 @@ QPushButton:hover { - 3 + 7 @@ -2557,9 +2557,9 @@ QPushButton:hover { - 120 + 50 40 - 111 + 171 40 @@ -2573,16 +2573,16 @@ color: #100A44; - Servers + Servers list - Qt::AlignCenter + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - 230 + 240 49 24 24 @@ -2655,7 +2655,7 @@ QPushButton:hover { - + 30 @@ -2693,7 +2693,7 @@ color: #100A44; Qt::AlignCenter - + 30 @@ -2706,11 +2706,11 @@ color: #100A44; Auto connect - + 30 - 250 + 280 321 41 @@ -2745,13 +2745,26 @@ background: #211966; 30 - 210 + 240 281 21 - Software version: 1.6.0 (31.03.2021) + Software version: 1.6.1 (09.05.2021) + + + + + + 30 + 180 + 211 + 31 + + + + Start minimized