From 02810ff844c0d62e91de2235f9e065336d5bf7fb Mon Sep 17 00:00:00 2001 From: pokamest Date: Tue, 11 May 2021 17:04:04 +0300 Subject: [PATCH] bug fixes --- client/configurators/cloak_configurator.cpp | 1 + client/core/servercontroller.cpp | 122 +- client/core/servercontroller.h | 5 - client/defines.h | 2 +- client/main.cpp | 8 +- client/platform_win/vpnclient.rc | 8 +- client/protocols/openvpnovercloakprotocol.cpp | 2 +- client/server_scripts/install_docker.sh | 11 +- client/settings.h | 18 +- client/translations/amneziavpn_ru.qm | Bin 4190 -> 15835 bytes client/translations/amneziavpn_ru.ts | 1047 ++++++++++++++++- client/ui/mainwindow.cpp | 140 ++- client/ui/mainwindow.h | 4 + client/ui/mainwindow.ui | 37 +- 14 files changed, 1149 insertions(+), 256 deletions(-) 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 1da6f4204ac41b098b4f70013ecf528e45975df0..380d6090821bc87c3bde695469a0e0c6a2493c4b 100644 GIT binary patch literal 15835 zcmd^GeQ;dWb-$9HzE&&AvSlNTke_8^%eJ&yeXJx)vMgyOSw^xgw6a}hfc9zkNxRW% z-+K40Wbu`RDFg;W!bgB+NE2ENnUW#lBb_Ew$TSWEw1#F1q)plY3GGl4zS2NDKq38| zdw1Wy)!tppN!ovk(XRIGz2}^J&bjCO&be3pe-)_v+js8$(sNtuzxPM?J@M0F#)_L5 zV|y4Yc$2ZxV~llvow4pXV}-Xe_6MI~%=L4|F8v~7t+%nFFMkKmzr~aXRv6pV$&|lW z7(0KQDgS;CWAzoRc#~wJvSbHb?$*YetwtlLhu^#Jj{<2`QcpGEu z?k+fVeKF==QZQ{m-s*1@T=uhT8LR3mxOV$?#wx#1@XZ%*Vyspv_=jup+%s12&S^hm zWqk#|u7Uhza|Q2By~mjPUj-kzUj)CRLZ(7T%|(S9AHD+m>?%C!!@Fa)Fmm$Kf z_>Z4H%~-=rMHlTQy&f&4?#H@TN}4`_|7_b_vg5|*NcL(%& zy5!q0{5kw+ptQui5zjkH%TC`5J>F32sDqqs8%j5qzYM=rN(V#FL;j~rz5fLLG{05q z{R!S%zFzvxe)vh%$E81b-vd9rt@P z%Xh;6>dJ0jf$uj@mEHd=zCZt;%l_iEe`RdzWZAC@${E{!LwWQ327LZ@`NHMR__ri?ry42BmVLRl%*wHnC=XFkp_E9J3KIG6RAjgJghd%QX{HV%t z|LxFU{Tq&l2R?*6pRTAkgV4`;6_+^IL#~#J%XfSY`YWnfSsH?$zgh9%%h*pfU#xg& z1HNznsN&&g8ld;PEB^AqBJh2s;)BZ(3pV|t;=iAQes{Mz*WC`ib+$SiHo<@P+~sut zDL${8caE|DgdaTW94q<(-hb>ItAxBenRBAG6n=HeIeiTJ>zQ;0e~fi@|Fv`J?o;r? zLFboevEITLoZsqu9DX+IeD-mSa}|sCt_J7doxytc9ICwdUFfO(%F5aAL%yb0DsL%- zpIvmS@|HsptoNp>;$Oc2`@dav^3_)8?fk0i3LnLOoT+-|Dty2G^{Q8zUxr^iR`te* zkgsyAy6n_r`2K9Kp9kY>`En z&aPx3rdgCXtEw-k#dLMfh^a%15&g=LruxGnJz~n(>^>_SFAFn+X>7q_QDBE64fKerVi&}({@9&38R9+`3*kUdqU7WQw01=}qP4&l>YW!ReS*rN^w0%|;D>M}C5 z%ndU2AOaUaR2xz}O0PA!#H}8hjb{7MZ}6WrsHn5EBa3v#2&JpLXK&sig(Ll2M~--B zE}a@x$7c>rs#8aYCl7kn#+KIB;~n1C){&VJ@kOW0-P$^OxKV8knr5`OwRL%U*|pr^ zGGgNg@LJb7PZTcg@K&>uHf!n$g%L@|m6wEE+55Q;Xd;gEWjx*UW?TjEj8ulK6a znBKA+)1rOqHI9BT#>|2KR>5r62&}05(Y{7(oQT;nr!9uUE4@3tMkH>8wfN3H@jM>7 zQtxedM^7d{FYBTCpxN8ycBcjq;ogW5ThzjRw5X^>cu|YZhaxSe5$)v!lAmV{(=-+{ z9)my`qgleK%#Ny1CloH*<*Gthz?`4;r z{NMWz8ioK+a1=kJUeYz0H?NBo{Nn$ii%n{#k>OrFu69q<%yh8MH8>b~MpTPw^YHRu z3+;+teKBgT^r`=Mo@d)7ZC%0>XJfQg&&?57#n7m)rLDcE#XIcH>oVz)2fT;YGIDSG zT4`eB+Gw_Wy4FaOMxK?Xb7=bDP)jbNzy`ZBb3c*;rG!Cb7`)<>7ns8h1maQlSs7qw z3Jb*b*pePo;|UHu=72(0)I=l{iJMwDtOv4G2!8J>7bu63eg=SNnnAx8NMr!-`#H|> zDhGICQk6sW94U%M3@Dv^?CLS?_@-Ow$7>f5l0Zg;YG_<1=JkQo0Z0$5gH-|ND82X* zl=~Gg(mclrcxGEOo;#G5Roqq3_waE;S87fvr3ih9(pR^h@Z8+jh0bsoV!(S@J;0 zLD-w`3fc?!H=*?7>1z2wi&O2lS^hg~w0uxog4u(xAFzrV)nkjHcsvBuKn{?I>nhn_ ziv-jaBY|BfHlG%!j~V`ubOZi{HO}S?TOCs|V<`kjNxPmA!QKU%ndzgxnb8qq7n6Do zYf>(Rou~>S&)*B}h@C)HMIWAYasBitM=Z~G4n=`nbkht)=Ci>ig2K6ztOdz%$gi1D zkLt@qxk=}5U&4NyiozO7f_%_%*MAH%XV$#y6$C}&% zPj|y>ywG4Tk80$HBwq`juGCW)4(`VQ`SIu#Gq2coe9om zNhnHIp+0iGA!P!AVuT$=4W=Ru^iV2Dg$~QGTZakYsw0PeYD_M@xRy~;N1W5OjV0mvll@%a5qyJaZjryhOZG?><*J`d z6hLKX%!R_z(z#P<;I^g6m*Q&6YQkD@KY1^uQE*EJ?YWq-XmwQL#+7_c^hC%6yHj-Tb=O|Xb*k6~mLVzavX9-k= z!g($!|11J|k&&Md@ zByq0Aabt>OA`XSAKHs>yps&cNw<}w*id06lbVe)1Pa0Es2?L3q;^$gUPf~hXwvrFZ-p{~#c6Goc#UXCt}4nynG=yW zEHx{bD0PHQRu;7dG{tRAtf1`a<9JgVyEh>;Qlb(Cm*q&-e8)&A?$5FRGL!8{B;Kq} zP#NSyZR8Ki^wY1br_2vMQ}Cj2EZU(2yeCOh_-+(x5Mi1&ZacNl=`%~W%`X@+2si^2 zpjKT`m$eA5vrZ&J=6)I1+Eji5FK>P=EG1hWwtgb zncNIWfxl8c)6Xm0eaL^SF}d8BO{1|GQnBIpCt`pj)Y(L}3G<|4Y^ub}5+uV^4nc<6 zg;@i!;g+fbSWwU^5pFu-0G75^6TvDM}M54VG#SLRH7~IshV(C7-nCDWlxPDL@qymGj;DjQ<;yBtdaX8|_ zX@!B~9#RG16TWX_-FVuLcNc!>pNpkevy*u1C$+_BSZ}5sLq`iPKky5lw{^SP+gxpJ zZLS`f6ExY@IRWP#gw_Ns6D#K0r2S;AbUks4>tSSSxF)fZE_Azc9!RxWxHw(A+k8HQ z=)8{YO&ycm$+ijhO*`f4xV}2Zpb_vs~R_!ZS4iw3fur8{XDY`@|Y^nKX0o^{WcvH zYYr|(jhJb3TN(YsqQwJRR2H|9R|06KT1m;Q0*$FkBRt515nj9wW5-ZSPk1{;Chqe2y=Y*C%2t10Tv(w6A6)V=PoZUX)- z&?-#BZ-iy!>a);3g?-wz$j;fMauyC5si-u0rYmFEC}YUv=fvw$XT$l*sJYC^ke*_w z^hB6BXl?k(&KA`ECf}vL47VjzNgzABvg=6+MU6k(X|h8!j~BK00_8#h_C@Iy4JTk= zsW!5N7hz3S2iBw*!%K2kg1?o1bD9;vVLPDCe)t3B3W5c+$7y$o0&5)K0P0wtvK~Sb z8UO^C3q?Y4)bO%(J5fSdoqB6>*;Jm2rOH0V2Gz<_lcYecpVul~VAh8iA<(ItxA{bb z5SKX!Aq!jz&*y$X&(nbC{3*01(CCqL{=`h}OhruxX~)E^C^Drm0Oc-l<*Z zKDnGG=bTGN2m|oUVVge`(+sIE^zhKr#Wg4FeXjUo<5Y~)xCWHb1j$4j!j?Nx)%nmJ z74bFMqOjDo9?1}AxhuRgni~{R@l9CSmS90}bWlI*Os zXpoE&GLIW796+Hcs+6P>b0o~nI$(p3PVQ{^5|J=#N#M{c_;heMW!th&rr z%XtwPKy0A%Cg~9dnAJ;}jlf0s+E80LCzq?|-GseBdzK=A1<7U2BFm?0eL6BhAcn|K zO{3fnI|lJ6?@;%QbWJ%%9A^+B%*3_i)^xrgur~F5Xs6LhL%K%Z=+pJoVMh!O4ag!t z_GaUJgSYW`ndEF;1fXid7N(MYCQ++r?r?j>zs1KZR^H4-?&D#JAKE5&vCJ1#b`WWc zE@gId%M(tt6|XjoQ{xjSy$7dMEfAoLAfvYfMyR-KeHAG)i8)kU7dt1X(Bin-D}N`05iYRsYlTcvvkNg7h^td)jS z$Pve-zqnK(BB`f3ZK+60g<>1jLaj&wsHx)BrhH5Bn^0X4AmWGk#xic!ar4Txzl{^k zlT|FTklX~-+{EOPQ(mW21e>Jzl-z!+LQlP5!37t5@^ua}B7KFea*?fcx3o-?R#n!D zYi%_1-T~O1qdd!Z3bxTsJZ}Z`JByxgzqo)e#FeAuQ6~%~x*pl*3}^*gx>*PDad8`h z)1jB_*d7^TGbfIYGEX}K@Do0>A2ukyps}1~u?*X8_azT7Ra^$6`zpO^o2$#!rZ&0v zy4)UDySu$D8;WO;C<0o~Vgd;-=B**oA`s0&YW!0JsFO+&{7%7IoRABIn!4$AfQK0* zRMZHW9k1;(LBJl-TeNOm88|9O*F{v(XT1|pbaX^2F2!K$x*W0^;&0}0@T$(AdNg%e zj!JmzR$Wq^InFv8k}g3zHdUnY1hs0NwRBqucfl!P;C`4dF&ojPA+0%A_JexSpvNnn zpCr4tmWS05`4o`mx6k}R!-(tBzQg96EYfEnRd#}MP`{Lm4A0Zld%MJvIWt>}j5xu& zh}kif?3B6+nAH%m6%J!|5pjVpb?Yv9-_hkzlO=Hqz0-Irc&M6*Dn2I9D>*e}V_!++ zEPNr`FJeav&q(JczH=7h%;#x-HqVL*9(w*G1j@;xA;$8|} z$qDJ^TuU_9y_^h@Yph9Y8(+EzsO*X*@-I(`;PPtL5X5K&UeIl+yU>`+8k8YjaWsr; zCHcoFF~i6XRT*S9(2zlbA_9rfAB5y5T26nc(Ap}Csu`5aan2YEM-52>J7e5=CoMha zHx6|4yTa%sEIl3yz=_4*bp1YoK{okwxvx=iEE-8A0xsKcdtoDs(E5yf1q7_qw;-J9 zI|ZWWn>BlL*6i$CBkR&s(#LOEl$`eCcgxj_`LQ%PUDkw@`Z_p1p$h{*S=L1KpLG0j z1sF;vZ-;3`H$Zf7Q}-&wsqpH1FV)jjaC4MrU5}E;L-z}@PkDVp(c7-d(xZ`u2r7{* YX>P>YDr*Wp-c|9N+Ct^yX2*vA0f*WE*Z=?k delta 1461 zcmYLJTWB0r82&doo4uu}Nj7O{n&c!gsWD-9b2FRUZg;C`%bFX+)C*O|-O0?9%}ly8 zo14PwL(m7wgNKTs2!)_vky28mh*qkgL|T1N@u6CZ6-AV)C@7X1znKk@<(&U|{{Nfr z{AaH{eVrFZE@tXJ{q?oeSDO!f@Z_2IzfBU+-&mbkMC^?fA}^;izuY47L|o%*Zph`5 zPhyRTK33W`XhOEQQ#ZaOD*MyD_|GO$`8oG1m%bx%e^j>i;}=A}*F8Vg-z4(C?cLZy zzV|)vTQ|Qa3S9Jc6_jcyKl^6pFAX*WQbrMz{(Bk7*)JaPw7R^a;HfXT zRMx^`EJnDYk?o8e&l-xRb4kzeFgJ31K{CxHBbVWG zFw%yu%V|q9bdDS+9T&YQ=eQ|bmZmFaNL;Q8ik_NfVboo7Ju1%ERkztU;b4VK0Pi7K z*#9TmCRIGw-05vRTx=k&ci*#l*Z#0etkw@q_pnxnYS6Vqw@r1obE~5uxJdgrxaxN% zV3Z}jm@+EE3f?bgWqhp(k+$Rv*DQHnNa0%1+BAD`j5UBmdp?S@<6xp3<;fxgGUV)v z*l6n5*ER+MeO?;@ym$Yn_8w;||7d1)z-d!^SPDbds(j) z0^Nd4!_x7Sp;@SJTbwfJW054Djm8ToFvgl3%It~86LV(Vem@DCcaE+)z>2Sl 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