diff --git a/client/settings.cpp b/client/settings.cpp index 6b97ed9e..5694efed 100644 --- a/client/settings.cpp +++ b/client/settings.cpp @@ -171,10 +171,10 @@ void Settings::clearLastConnectionConfig(int serverIndex, DockerContainer contai qDebug() << "Settings::clearLastConnectionConfig for" << serverIndex << container << proto; } -bool Settings::haveAuthData() const +bool Settings::haveAuthData(int serverIndex) const { - ServerCredentials cred = defaultServerCredentials(); - + if (serverIndex < 0) return false; + ServerCredentials cred = serverCredentials(serverIndex); return (!cred.hostName.isEmpty() && !cred.userName.isEmpty() && !cred.password.isEmpty()); } diff --git a/client/settings.h b/client/settings.h index 3a6c0e2c..048b66a5 100644 --- a/client/settings.h +++ b/client/settings.h @@ -70,7 +70,7 @@ public: void clearLastConnectionConfig(int serverIndex, DockerContainer container, Protocol proto = Protocol::Any); - bool haveAuthData() const; + bool haveAuthData(int serverIndex) const; QString nextAvailableServerName() const; // App settings section diff --git a/client/ui/mainwindow.cpp b/client/ui/mainwindow.cpp index b21a6d58..933f79ea 100644 --- a/client/ui/mainwindow.cpp +++ b/client/ui/mainwindow.cpp @@ -88,7 +88,7 @@ MainWindow::MainWindow(QWidget *parent) : // Post initialization goToPage(Page::Start, true, false); - if (m_settings.haveAuthData()) { + if (m_settings.defaultServerIndex() >= 0) { goToPage(Page::Vpn, true, false); } @@ -114,7 +114,7 @@ MainWindow::MainWindow(QWidget *parent) : onConnectionStateChanged(VpnProtocol::ConnectionState::Disconnected); - if (m_settings.isAutoConnect() && m_settings.haveAuthData()) { + if (m_settings.isAutoConnect() && m_settings.defaultServerIndex() >= 0) { QTimer::singleShot(1000, this, [this](){ ui->pushButton_connect->setEnabled(false); onConnect(); @@ -224,6 +224,17 @@ void MainWindow::goToPage(Page page, bool reset, bool slide) pagesStack.push(page); } +void MainWindow::setStartPage(MainWindow::Page page, bool slide) +{ + if (slide) + ui->stackedWidget_main->slideInWidget(getPageWidget(page), SlidingStackedWidget::RIGHT2LEFT); + else + ui->stackedWidget_main->setCurrentWidget(getPageWidget(page)); + + pagesStack.clear(); + pagesStack.push(page); +} + void MainWindow::closePage() { Page prev = pagesStack.pop(); @@ -506,9 +517,16 @@ void MainWindow::onPushButtonNewServerImport(bool) ServerCredentials credentials; credentials.hostName = o.value("h").toString(); + if (credentials.hostName.isEmpty()) credentials.hostName = o.value(config_key::hostName).toString(); + credentials.port = o.value("p").toInt(); + if (credentials.port == 0) credentials.port = o.value(config_key::port).toInt(); + credentials.userName = o.value("u").toString(); + if (credentials.userName.isEmpty()) credentials.userName = o.value(config_key::userName).toString(); + credentials.password = o.value("w").toString(); + if (credentials.password.isEmpty()) credentials.password = o.value(config_key::password).toString(); qDebug() << QString("Added server %3@%1:%2"). arg(credentials.hostName). @@ -517,13 +535,15 @@ void MainWindow::onPushButtonNewServerImport(bool) //qDebug() << QString("Password") << credentials.password; - if (!credentials.isValid()) { - return; + if (credentials.isValid() || o.contains(config_key::containers)) { + m_settings.addServer(o); + setStartPage(Page::Vpn); + } + else { + qDebug() << "Failed to import profile"; + qDebug().noquote() << QJsonDocument(o).toJson(); } - //m_settings.setServerCredentials(credentials); - - goToPage(Page::Vpn); } bool MainWindow::installServer(ServerCredentials credentials, @@ -862,8 +882,12 @@ void MainWindow::setupUiConnections() }); connect(ui->pushButton_servers_list, &QPushButton::clicked, this, [this](){ goToPage(Page::ServersList); }); connect(ui->pushButton_share_connection, &QPushButton::clicked, this, [this](){ + selectedServerIndex = m_settings.defaultServerIndex(); + selectedDockerContainer = m_settings.defaultContainer(selectedServerIndex); + goToPage(Page::ShareConnection); - updateShareCodePage(); + updateSharingPage(selectedServerIndex, m_settings.serverCredentials(selectedServerIndex), selectedDockerContainer); + //updateShareCodePage(); }); @@ -1027,7 +1051,7 @@ void MainWindow::setupProtocolsPageConnections() connect(ui->pushButton_proto_openvpn_cont_openvpn_config, &QPushButton::clicked, this, [this](){ selectedDockerContainer = DockerContainer::OpenVpn; updateOpenVpnPage(m_settings.protocolConfig(selectedServerIndex, selectedDockerContainer, Protocol::OpenVpn), - selectedDockerContainer); + selectedDockerContainer, m_settings.haveAuthData(selectedServerIndex)); goToPage(Page::OpenVpnSettings); }); @@ -1035,13 +1059,13 @@ void MainWindow::setupProtocolsPageConnections() connect(ui->pushButton_proto_ss_openvpn_cont_openvpn_config, &QPushButton::clicked, this, [this](){ selectedDockerContainer = DockerContainer::OpenVpnOverShadowSocks; updateOpenVpnPage(m_settings.protocolConfig(selectedServerIndex, selectedDockerContainer, Protocol::OpenVpn), - selectedDockerContainer); + selectedDockerContainer, m_settings.haveAuthData(selectedServerIndex)); goToPage(Page::OpenVpnSettings); }); connect(ui->pushButton_proto_ss_openvpn_cont_ss_config, &QPushButton::clicked, this, [this](){ selectedDockerContainer = DockerContainer::OpenVpnOverShadowSocks; updateShadowSocksPage(m_settings.protocolConfig(selectedServerIndex, selectedDockerContainer, Protocol::ShadowSocks), - selectedDockerContainer); + selectedDockerContainer, m_settings.haveAuthData(selectedServerIndex)); goToPage(Page::ShadowSocksSettings); }); @@ -1049,19 +1073,19 @@ void MainWindow::setupProtocolsPageConnections() connect(ui->pushButton_proto_cloak_openvpn_cont_openvpn_config, &QPushButton::clicked, this, [this](){ selectedDockerContainer = DockerContainer::OpenVpnOverCloak; updateOpenVpnPage(m_settings.protocolConfig(selectedServerIndex, selectedDockerContainer, Protocol::OpenVpn), - selectedDockerContainer); + selectedDockerContainer, m_settings.haveAuthData(selectedServerIndex)); goToPage(Page::OpenVpnSettings); }); connect(ui->pushButton_proto_cloak_openvpn_cont_ss_config, &QPushButton::clicked, this, [this](){ selectedDockerContainer = DockerContainer::OpenVpnOverCloak; updateShadowSocksPage(m_settings.protocolConfig(selectedServerIndex, selectedDockerContainer, Protocol::ShadowSocks), - selectedDockerContainer); + selectedDockerContainer, m_settings.haveAuthData(selectedServerIndex)); goToPage(Page::ShadowSocksSettings); }); connect(ui->pushButton_proto_cloak_openvpn_cont_cloak_config, &QPushButton::clicked, this, [this](){ selectedDockerContainer = DockerContainer::OpenVpnOverCloak; updateCloakPage(m_settings.protocolConfig(selectedServerIndex, selectedDockerContainer, Protocol::Cloak), - selectedDockerContainer); + selectedDockerContainer, m_settings.haveAuthData(selectedServerIndex)); goToPage(Page::CloakSettings); }); @@ -1283,7 +1307,8 @@ void MainWindow::setupSharePageConnections() serverConfig.insert(config_key::defaultContainer, containerToString(selectedDockerContainer)); - ui->textEdit_share_amnezia_code->setPlainText(QJsonDocument(serverConfig).toJson()); + QByteArray ba = QJsonDocument(serverConfig).toJson().toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); + ui->textEdit_share_amnezia_code->setPlainText(QString("vpn://%1").arg(QString(ba))); ui->pushButton_share_amnezia_generate->setEnabled(true); ui->pushButton_share_amnezia_copy->setEnabled(true); @@ -1510,6 +1535,9 @@ void MainWindow::updateServerPage() ui->label_server_settings_wait_info->hide(); ui->label_server_settings_wait_info->clear(); + ui->pushButton_server_settings_clear->setVisible(m_settings.haveAuthData(selectedServerIndex)); + ui->pushButton_server_settings_clear_client_cache->setVisible(m_settings.haveAuthData(selectedServerIndex)); + QJsonObject server = m_settings.server(selectedServerIndex); QString port = server.value(config_key::port).toString(); ui->label_server_settings_server->setText(QString("%1@%2%3%4") @@ -1546,23 +1574,29 @@ void MainWindow::updateProtocolsPage() auto containers = m_settings.containers(selectedServerIndex); + bool haveAuthData = m_settings.haveAuthData(selectedServerIndex); + DockerContainer defaultContainer = m_settings.defaultContainer(selectedServerIndex); ui->pushButton_proto_cloak_openvpn_cont_default->setChecked(defaultContainer == DockerContainer::OpenVpnOverCloak); ui->pushButton_proto_ss_openvpn_cont_default->setChecked(defaultContainer == DockerContainer::OpenVpnOverShadowSocks); ui->pushButton_proto_openvpn_cont_default->setChecked(defaultContainer == DockerContainer::OpenVpn); - ui->pushButton_proto_cloak_openvpn_cont_default->setVisible(containers.contains(DockerContainer::OpenVpnOverCloak)); - ui->pushButton_proto_ss_openvpn_cont_default->setVisible(containers.contains(DockerContainer::OpenVpnOverShadowSocks)); - ui->pushButton_proto_openvpn_cont_default->setVisible(containers.contains(DockerContainer::OpenVpn)); + ui->pushButton_proto_cloak_openvpn_cont_default->setVisible(haveAuthData && containers.contains(DockerContainer::OpenVpnOverCloak)); + ui->pushButton_proto_ss_openvpn_cont_default->setVisible(haveAuthData && containers.contains(DockerContainer::OpenVpnOverShadowSocks)); + ui->pushButton_proto_openvpn_cont_default->setVisible(haveAuthData && containers.contains(DockerContainer::OpenVpn)); - ui->pushButton_proto_cloak_openvpn_cont_share->setVisible(containers.contains(DockerContainer::OpenVpnOverCloak)); - ui->pushButton_proto_ss_openvpn_cont_share->setVisible(containers.contains(DockerContainer::OpenVpnOverShadowSocks)); - ui->pushButton_proto_openvpn_cont_share->setVisible(containers.contains(DockerContainer::OpenVpn)); + ui->pushButton_proto_cloak_openvpn_cont_share->setVisible(haveAuthData && containers.contains(DockerContainer::OpenVpnOverCloak)); + ui->pushButton_proto_ss_openvpn_cont_share->setVisible(haveAuthData && containers.contains(DockerContainer::OpenVpnOverShadowSocks)); + ui->pushButton_proto_openvpn_cont_share->setVisible(haveAuthData && containers.contains(DockerContainer::OpenVpn)); ui->pushButton_proto_cloak_openvpn_cont_install->setChecked(containers.contains(DockerContainer::OpenVpnOverCloak)); ui->pushButton_proto_ss_openvpn_cont_install->setChecked(containers.contains(DockerContainer::OpenVpnOverShadowSocks)); ui->pushButton_proto_openvpn_cont_install->setChecked(containers.contains(DockerContainer::OpenVpn)); + ui->pushButton_proto_cloak_openvpn_cont_install->setEnabled(haveAuthData); + ui->pushButton_proto_ss_openvpn_cont_install->setEnabled(haveAuthData); + ui->pushButton_proto_openvpn_cont_install->setEnabled(haveAuthData); + ui->frame_openvpn_ss_cloak_settings->setVisible(containers.contains(DockerContainer::OpenVpnOverCloak)); ui->frame_openvpn_ss_settings->setVisible(containers.contains(DockerContainer::OpenVpnOverShadowSocks)); ui->frame_openvpn_settings->setVisible(containers.contains(DockerContainer::OpenVpn)); @@ -1582,8 +1616,12 @@ void MainWindow::updateShareCodePage() //qDebug() << "Share code" << QJsonDocument(o).toJson(); } -void MainWindow::updateOpenVpnPage(const QJsonObject &openvpnConfig, DockerContainer container) +void MainWindow::updateOpenVpnPage(const QJsonObject &openvpnConfig, DockerContainer container, bool haveAuthData) { + ui->widget_proto_openvpn->setEnabled(haveAuthData); + ui->pushButton_proto_openvpn_save->setVisible(haveAuthData); + ui->progressBar_proto_openvpn_reset->setVisible(haveAuthData); + ui->radioButton_proto_openvpn_udp->setEnabled(true); ui->radioButton_proto_openvpn_tcp->setEnabled(true); @@ -1620,8 +1658,12 @@ void MainWindow::updateOpenVpnPage(const QJsonObject &openvpnConfig, DockerConta ui->lineEdit_proto_openvpn_port->setEnabled(container == DockerContainer::OpenVpn); } -void MainWindow::updateShadowSocksPage(const QJsonObject &ssConfig, DockerContainer container) +void MainWindow::updateShadowSocksPage(const QJsonObject &ssConfig, DockerContainer container, bool haveAuthData) { + ui->widget_proto_ss->setEnabled(haveAuthData); + ui->pushButton_proto_shadowsocks_save->setVisible(haveAuthData); + ui->progressBar_proto_shadowsocks_reset->setVisible(haveAuthData); + ui->comboBox_proto_shadowsocks_cipher->setCurrentText(ssConfig.value(config_key::cipher). toString(protocols::shadowsocks::defaultCipher)); @@ -1631,8 +1673,12 @@ void MainWindow::updateShadowSocksPage(const QJsonObject &ssConfig, DockerContai ui->lineEdit_proto_shadowsocks_port->setEnabled(container == DockerContainer::OpenVpnOverShadowSocks); } -void MainWindow::updateCloakPage(const QJsonObject &ckConfig, DockerContainer container) +void MainWindow::updateCloakPage(const QJsonObject &ckConfig, DockerContainer container, bool haveAuthData) { + ui->widget_proto_cloak->setEnabled(haveAuthData); + ui->pushButton_proto_cloak_save->setVisible(haveAuthData); + ui->progressBar_proto_cloak_reset->setVisible(haveAuthData); + ui->comboBox_proto_cloak_cipher->setCurrentText(ckConfig.value(config_key::cipher). toString(protocols::cloak::defaultCipher)); @@ -1713,15 +1759,17 @@ void MainWindow::updateSharingPage(int serverIndex, const ServerCredentials &cre } // Amnezia sharing - QJsonObject exportContainer; - for (Protocol p: protocolsForContainer(container)) { - QJsonObject protocolConfig = containerConfig.value(protoToString(p)).toObject(); - protocolConfig.remove(config_key::last_config); - exportContainer.insert(protoToString(p), protocolConfig); - } - exportContainer.insert(config_key::container, containerToString(container)); +// QJsonObject exportContainer; +// for (Protocol p: protocolsForContainer(container)) { +// QJsonObject protocolConfig = containerConfig.value(protoToString(p)).toObject(); +// protocolConfig.remove(config_key::last_config); +// exportContainer.insert(protoToString(p), protocolConfig); +// } +// exportContainer.insert(config_key::container, containerToString(container)); - ui->textEdit_share_amnezia_code->setPlainText(QJsonDocument(exportContainer).toJson()); +// ui->textEdit_share_amnezia_code->setPlainText(QJsonDocument(exportContainer).toJson()); + + ui->textEdit_share_amnezia_code->setPlainText(tr("")); } void MainWindow::makeSitesListItem(QListWidget *listWidget, const QString &address) diff --git a/client/ui/mainwindow.h b/client/ui/mainwindow.h index b1b97da9..b253d084 100644 --- a/client/ui/mainwindow.h +++ b/client/ui/mainwindow.h @@ -73,6 +73,7 @@ private slots: private: void goToPage(Page page, bool reset = true, bool slide = true); + void setStartPage(Page page, bool slide = true); void closePage(); QWidget *getPageWidget(Page page); @@ -101,9 +102,9 @@ private: void updateServersListPage(); void updateProtocolsPage(); void updateShareCodePage(); - void updateOpenVpnPage(const QJsonObject &openvpnConfig, DockerContainer container); - void updateShadowSocksPage(const QJsonObject &ssConfig, DockerContainer container); - void updateCloakPage(const QJsonObject &ckConfig, DockerContainer container); + void updateOpenVpnPage(const QJsonObject &openvpnConfig, DockerContainer container, bool haveAuthData); + void updateShadowSocksPage(const QJsonObject &ssConfig, DockerContainer container, bool haveAuthData); + void updateCloakPage(const QJsonObject &ckConfig, DockerContainer container, bool haveAuthData); void updateSharingPage(int serverIndex, const ServerCredentials &credentials, DockerContainer container); diff --git a/client/ui/mainwindow.ui b/client/ui/mainwindow.ui index 44033597..bd0becfe 100644 --- a/client/ui/mainwindow.ui +++ b/client/ui/mainwindow.ui @@ -287,7 +287,7 @@ QPushButton:hover { - 11 + 14 @@ -4149,8 +4149,8 @@ QToolBox::tab:hover { 0 0 - 360 - 360 + 100 + 30 @@ -4437,8 +4437,8 @@ background: #282932; 0 0 - 360 - 360 + 100 + 30 @@ -4603,8 +4603,8 @@ background: #282932; 0 0 - 360 - 360 + 100 + 30 @@ -4827,8 +4827,8 @@ color: #15CDCB; 0 0 - 360 - 360 + 100 + 30 @@ -4838,34 +4838,6 @@ color: #15CDCB; - - - - 20 - 30 - 340 - 40 - - - - font-family: Lato; -font-style: normal; -font-weight: bold; -font-size: 20px; -line-height: 25px; -color: #100A44; - - - - OpenVPN Settings - - - Qt::AlignCenter - - - true - - @@ -4898,224 +4870,209 @@ QPushButton:hover { - + - 30 - 95 - 321 - 31 + 0 + 40 + 380 + 600 - - - - - - - - - - true - - - - 30 - 70 - 291 - 21 - - - - VPN Addresses Subnet - - - true - - - - - - 30 - 380 - 151 - 31 - - - - - AES-256-GCM + + + + 10 + 0 + 340 + 30 + - - - - AES-192-GCM + + font-family: Lato; +font-style: normal; +font-weight: bold; +font-size: 20px; +line-height: 25px; +color: #100A44; + - - - AES-128-GCM + OpenVPN Settings + + + Qt::AlignCenter + + + true + + + + + true + + + + 200 + 310 + 151 + 21 + - - - AES-256-CBC + Hash + + + true + + + + + true + + + + 30 + 310 + 151 + 21 + - - - AES-192-CBC + Cipher + + + true + + + + + true + + + + 30 + 110 + 151 + 21 + - - - AES-128-CBC + Network protocol + + + true + + + + + + 30 + 65 + 321 + 31 + + + + - - - ChaCha20-Poly1305 + + + + + + + 30 + 340 + 151 + 31 + + + + + 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 + + + + + + true + + + + 30 + 40 + 291 + 21 + - - - ARIA-256-CBC + VPN Addresses Subnet - - - - CAMELLIA-256-CBC + + true - - - - none + + + + + 30 + 500 + 321 + 40 + - - - - - true - - - - 30 - 350 - 151 - 21 - - - - Cipher - - - true - - - - - - 200 - 380 - 151 - 31 - - - - - SHA512 + + PointingHandCursor - - - - SHA384 - - - - - SHA256 - - - - - SHA3-512 - - - - - SHA3-384 - - - - - SHA3-256 - - - - - whirlpool - - - - - BLAKE2b512 - - - - - BLAKE2s256 - - - - - - true - - - - 200 - 350 - 151 - 21 - - - - Hash - - - true - - - - - - 30 - 440 - 321 - 21 - - - - Block DNS requests outside of VPN - - - false - - - - - - 30 - 530 - 311 - 40 - - - - PointingHandCursor - - - QPushButton { + + QPushButton { color:rgb(212, 212, 212); border-radius: 4px; @@ -5131,107 +5088,194 @@ border-radius: 4px; QPushButton:hover { background: #211966; } - - - Save and restart VPN - - - - - true - - - - 30 - 140 - 151 - 21 - - - - Network protocol - - - true - - - - - - 30 - 170 - 321 - 71 - - - - QFrame{ + + + Save and restart VPN + + + + + + 30 + 140 + 321 + 71 + + + + QFrame{ border: 1px solid lightgray; border-radius: 2px; margin-top: 0px; } - - - QFrame::StyledPanel - - - QFrame::Raised - - + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 40 + 171 + 19 + + + + TCP + + + + + + 10 + 10 + 171 + 19 + + + + UDP + + + + - 10 - 40 - 171 - 19 + 200 + 230 + 151 + 31 + + + + + + + + + + + + + 30 + 280 + 321 + 21 - TCP + Auto-negotiate encryption + + + false - + - 10 - 10 - 171 - 19 + 200 + 340 + 151 + 31 + + + + + SHA512 + + + + + SHA384 + + + + + SHA256 + + + + + SHA3-512 + + + + + SHA3-384 + + + + + SHA3-256 + + + + + whirlpool + + + + + BLAKE2b512 + + + + + BLAKE2s256 + + + + + + true + + + + 30 + 230 + 151 + 31 - UDP + Port + + + true - - - - - 30 - 320 - 321 - 21 - - - - Auto-negotiate encryption - - - false - - - - - - 30 - 530 - 311 - 40 - - - - QProgressBar{ + + + + 30 + 400 + 321 + 21 + + + + Block DNS requests outside of VPN + + + false + + + + + + 30 + 500 + 321 + 40 + + + + QProgressBar{ color:rgb(212, 212, 212); border-radius: 4px; @@ -5251,124 +5295,61 @@ border-radius: 4px 0px 0px 4px; } - - - 24 - - - Qt::AlignCenter - - - true - - - Configuring... - + + + 24 + + + Qt::AlignCenter + + + true + + + Configuring... + + + + + true + + + + 30 + 550 + 321 + 41 + + + + + + + Qt::AlignCenter + + + true + + + progressBar_proto_openvpn_reset + label_38 + label_97 + label_99 + label_100 + lineEdit_proto_openvpn_subnet + comboBox_proto_openvpn_cipher + label_98 + pushButton_proto_openvpn_save + frame_3 + lineEdit_proto_openvpn_port + checkBox_proto_openvpn_auto_encryption + comboBox_proto_openvpn_hash + label_103 + checkBox_proto_openvpn_block_dns + label_proto_openvpn_info - - - true - - - - 40 - 570 - 301 - 41 - - - - - - - Qt::AlignCenter - - - true - - - - - - 200 - 260 - 151 - 31 - - - - - - - - - - - - true - - - - 30 - 260 - 151 - 31 - - - - Port - - - true - - - progressBar_proto_openvpn_reset - label_38 - pushButton_back_from_openvpn_settings - lineEdit_proto_openvpn_subnet - label_98 - comboBox_proto_openvpn_cipher - label_99 - comboBox_proto_openvpn_hash - label_97 - checkBox_proto_openvpn_block_dns - pushButton_proto_openvpn_save - label_100 - frame_3 - checkBox_proto_openvpn_auto_encryption - label_proto_openvpn_info - lineEdit_proto_openvpn_port - label_103 - - - - 20 - 30 - 340 - 40 - - - - font-family: Lato; -font-style: normal; -font-weight: bold; -font-size: 20px; -line-height: 25px; -color: #100A44; - - - - ShadowSocks Settings - - - Qt::AlignCenter - - - true - - @@ -5401,42 +5382,167 @@ QPushButton:hover { - + - 190 - 80 - 151 - 31 + 0 + 40 + 380 + 600 - - - chacha20-poly1305 + + + + 190 + 110 + 151 + 31 + - - - - aes-256-gcm + + - - - aes-128-gcm + - - - - - - 30 - 530 - 311 - 40 - - - - QProgressBar{ + + + + + 20 + 0 + 340 + 30 + + + + font-family: Lato; +font-style: normal; +font-weight: bold; +font-size: 20px; +line-height: 25px; +color: #100A44; + + + + ShadowSocks Settings + + + Qt::AlignCenter + + + true + + + + + true + + + + 30 + 110 + 151 + 31 + + + + Port + + + true + + + + + + 190 + 60 + 151 + 31 + + + + + chacha20-poly1305 + + + + + aes-256-gcm + + + + + aes-128-gcm + + + + + + true + + + + 30 + 60 + 151 + 31 + + + + Cipher + + + true + + + + + + 30 + 500 + 321 + 40 + + + + PointingHandCursor + + + QPushButton { +color:rgb(212, 212, 212); +border-radius: 4px; + +font-family: Lato; +font-style: normal; +font-weight: normal; +font-size: 16px; +line-height: 21px; + +background: #100A44; +border-radius: 4px; +} +QPushButton:hover { +background: #211966; +} + + + Save and restart VPN + + + + + + 30 + 500 + 321 + 40 + + + + QProgressBar{ color:rgb(212, 212, 212); border-radius: 4px; @@ -5456,160 +5562,53 @@ border-radius: 4px 0px 0px 4px; } - - - 24 - - - Qt::AlignCenter - - - true - - - Configuring... - - - - - - 30 - 530 - 311 - 40 - - - - PointingHandCursor - - - QPushButton { -color:rgb(212, 212, 212); -border-radius: 4px; - -font-family: Lato; -font-style: normal; -font-weight: normal; -font-size: 16px; -line-height: 21px; - -background: #100A44; -border-radius: 4px; -} -QPushButton:hover { -background: #211966; -} - - - Save and restart VPN - - - - - true - - - - 30 - 80 - 151 - 31 - - - - Cipher - - - true - - - - - true - - - - 40 - 570 - 301 - 41 - - - - - - - Qt::AlignCenter - - - true - - - - - - 190 - 130 - 151 - 31 - - - - - - - - - - - - true - - - - 30 - 130 - 151 - 31 - - - - Port - - - true - + + + 24 + + + Qt::AlignCenter + + + true + + + Configuring... + + + + + true + + + + 30 + 550 + 321 + 41 + + + + + + + Qt::AlignCenter + + + true + + + progressBar_proto_shadowsocks_reset + lineEdit_proto_shadowsocks_port + label_43 + label_104 + comboBox_proto_shadowsocks_cipher + label_101 + pushButton_proto_shadowsocks_save + label_proto_shadowsocks_info - - - - 20 - 30 - 340 - 40 - - - - font-family: Lato; -font-style: normal; -font-weight: bold; -font-size: 20px; -line-height: 25px; -color: #100A44; - - - - Cloak Settings - - - Qt::AlignCenter - - - true - - @@ -5642,71 +5641,218 @@ QPushButton:hover { - + - 190 - 80 - 151 - 31 + 0 + 40 + 381 + 600 - - - chacha20-poly1305 + + + + 190 + 160 + 151 + 31 + - - - - aes-256-gcm + + - - - aes-192-gcm + + + + + + true + + + + 30 + 160 + 151 + 31 + - - - aes-128-gcm + Port + + + true + + + + + + 20 + 0 + 340 + 30 + + + + font-family: Lato; +font-style: normal; +font-weight: bold; +font-size: 20px; +line-height: 25px; +color: #100A44; + - - - plain + Cloak Settings - - - - - true - - - - 30 - 80 - 151 - 31 - - - - Cipher - - - true - - - - - - 30 - 530 - 311 - 40 - - - - QProgressBar{ + + Qt::AlignCenter + + + true + + + + + + 190 + 110 + 151 + 31 + + + + + + + mail.ru + + + + + true + + + + 30 + 60 + 151 + 31 + + + + Cipher + + + true + + + + + + 30 + 110 + 130 + 31 + + + + + 130 + 0 + + + + + 130 + 16777215 + + + + Fake Web Site + + + + + + 190 + 60 + 151 + 31 + + + + + chacha20-poly1305 + + + + + aes-256-gcm + + + + + aes-192-gcm + + + + + aes-128-gcm + + + + + plain + + + + + + + 30 + 500 + 321 + 40 + + + + PointingHandCursor + + + QPushButton { +color:rgb(212, 212, 212); +border-radius: 4px; + +font-family: Lato; +font-style: normal; +font-weight: normal; +font-size: 16px; +line-height: 21px; + +background: #100A44; +border-radius: 4px; +} +QPushButton:hover { +background: #211966; +} + + + Save and restart VPN + + + + + + 30 + 500 + 321 + 40 + + + + QProgressBar{ color:rgb(212, 212, 212); border-radius: 4px; @@ -5726,151 +5872,52 @@ border-radius: 4px 0px 0px 4px; } - - - 24 - - - Qt::AlignCenter - - - true - - - Configuring... - - - - - true - - - - 40 - 580 - 301 - 41 - - - - - - - Qt::AlignCenter - - - true - - - - - - 30 - 530 - 311 - 40 - - - - PointingHandCursor - - - QPushButton { -color:rgb(212, 212, 212); -border-radius: 4px; - -font-family: Lato; -font-style: normal; -font-weight: normal; -font-size: 16px; -line-height: 21px; - -background: #100A44; -border-radius: 4px; -} -QPushButton:hover { -background: #211966; -} - - - Save and restart VPN - - - - - - 30 - 130 - 130 - 31 - - - - - 130 - 0 - - - - - 130 - 16777215 - - - - Fake Web Site - - - - - - 190 - 180 - 151 - 31 - - - - - - - - - - - - true - - - - 30 - 180 - 151 - 31 - - - - Port - - - true - - - - - - 190 - 130 - 151 - 31 - - - - - - - mail.ru - + + + 24 + + + Qt::AlignCenter + + + true + + + Configuring... + + + + + true + + + + 30 + 550 + 321 + 41 + + + + + + + Qt::AlignCenter + + + true + + + progressBar_proto_cloak_reset + lineEdit_proto_cloak_port + label_105 + label_44 + lineEdit_proto_cloak_site + label_102 + label_47 + comboBox_proto_cloak_cipher + pushButton_proto_cloak_save + label_proto_cloak_info