bug fixes
This commit is contained in:
parent
1bb2ef9e30
commit
02810ff844
14 changed files with 1149 additions and 256 deletions
|
@ -38,6 +38,7 @@ QString CloakConfigurator::genCloakConfig(const ServerCredentials &credentials,
|
||||||
// transfer params to protocol runner
|
// transfer params to protocol runner
|
||||||
config.insert(config_key::transport_proto, "$OPENVPN_TRANSPORT_PROTO");
|
config.insert(config_key::transport_proto, "$OPENVPN_TRANSPORT_PROTO");
|
||||||
config.insert(config_key::remote, credentials.hostName);
|
config.insert(config_key::remote, credentials.hostName);
|
||||||
|
config.insert(config_key::port, "$CLOAK_SERVER_PORT");
|
||||||
|
|
||||||
QString textCfg = ServerController::replaceVars(QJsonDocument(config).toJson(),
|
QString textCfg = ServerController::replaceVars(QJsonDocument(config).toJson(),
|
||||||
ServerController::genVarsForScript(credentials, container, containerConfig));
|
ServerController::genVarsForScript(credentials, container, containerConfig));
|
||||||
|
|
|
@ -346,12 +346,8 @@ ErrorCode ServerController::setupContainer(const ServerCredentials &credentials,
|
||||||
qDebug().noquote() << QJsonDocument(config).toJson();
|
qDebug().noquote() << QJsonDocument(config).toJson();
|
||||||
ErrorCode e = ErrorCode::NoError;
|
ErrorCode e = ErrorCode::NoError;
|
||||||
|
|
||||||
// e = runScript(sshParams(credentials),
|
e = installDockerWorker(credentials, container);
|
||||||
// replaceVars(amnezia::scriptData(SharedScriptType::install_docker),
|
if (e) return e;
|
||||||
// genVarsForScript(credentials)));
|
|
||||||
|
|
||||||
// if (e) return e;
|
|
||||||
|
|
||||||
|
|
||||||
e = prepareHostWorker(credentials, container, config);
|
e = prepareHostWorker(credentials, container, config);
|
||||||
if (e) return e;
|
if (e) return e;
|
||||||
|
@ -368,21 +364,6 @@ ErrorCode ServerController::setupContainer(const ServerCredentials &credentials,
|
||||||
if (e) return e;
|
if (e) return e;
|
||||||
|
|
||||||
return startupContainerWorker(credentials, container, config);
|
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,
|
ErrorCode ServerController::updateContainer(const ServerCredentials &credentials, DockerContainer container,
|
||||||
|
@ -438,33 +419,6 @@ bool ServerController::isReinstallContainerRequred(DockerContainer container, co
|
||||||
return false;
|
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)
|
ErrorCode ServerController::installDockerWorker(const ServerCredentials &credentials, DockerContainer container)
|
||||||
{
|
{
|
||||||
QString stdOut;
|
QString stdOut;
|
||||||
|
@ -515,9 +469,23 @@ ErrorCode ServerController::buildContainerWorker(const ServerCredentials &creden
|
||||||
|
|
||||||
ErrorCode ServerController::runContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config)
|
ErrorCode ServerController::runContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config)
|
||||||
{
|
{
|
||||||
return runScript(sshParams(credentials),
|
QString stdOut;
|
||||||
|
auto cbReadStdOut = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> proc) {
|
||||||
|
stdOut += data + "\n";
|
||||||
|
};
|
||||||
|
auto cbReadStdErr = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> proc) {
|
||||||
|
stdOut += data + "\n";
|
||||||
|
};
|
||||||
|
|
||||||
|
ErrorCode e = runScript(sshParams(credentials),
|
||||||
replaceVars(amnezia::scriptData(ProtocolScriptType::run_container, container),
|
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)
|
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)));
|
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<QSsh::SshRemoteProcess> proc) {
|
|
||||||
//// stdOut += data + "\n";
|
|
||||||
|
|
||||||
//// if (data.contains("Automatically restart Docker daemon?")) {
|
|
||||||
//// proc->write("yes\n");
|
|
||||||
//// }
|
|
||||||
//// };
|
|
||||||
//// auto cbReadStdErr = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> 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)
|
ServerController::Vars ServerController::genVarsForScript(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config)
|
||||||
{
|
{
|
||||||
const QJsonObject &openvpnConfig = config.value(config_key::openvpn).toObject();
|
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)}});
|
vars.append({{"$DOCKERFILE_FOLDER", "/opt/amnezia/" + amnezia::containerToString(container)}});
|
||||||
|
|
||||||
// Cloak vars
|
// 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) }});
|
vars.append({{"$FAKE_WEB_SITE_ADDRESS", cloakConfig.value(config_key::site).toString(protocols::cloak::defaultRedirSite) }});
|
||||||
|
|
||||||
QString serverIp = Utils::getIPAddress(credentials.hostName);
|
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;
|
//qDebug() << "Replacing" << var.first << var.second;
|
||||||
s.replace(var.first, var.second);
|
s.replace(var.first, var.second);
|
||||||
}
|
}
|
||||||
|
//qDebug().noquote() << script;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,11 +58,6 @@ private:
|
||||||
static QSsh::SshConnection *connectToHost(const QSsh::SshConnectionParameters &sshParams);
|
static QSsh::SshConnection *connectToHost(const QSsh::SshConnectionParameters &sshParams);
|
||||||
|
|
||||||
static ErrorCode installDockerWorker(const ServerCredentials &credentials, DockerContainer container);
|
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 prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject());
|
||||||
static ErrorCode buildContainerWorker(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());
|
static ErrorCode runContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject());
|
||||||
|
|
|
@ -4,6 +4,6 @@
|
||||||
#define APPLICATION_NAME "AmneziaVPN"
|
#define APPLICATION_NAME "AmneziaVPN"
|
||||||
#define SERVICE_NAME "AmneziaVPN-service"
|
#define SERVICE_NAME "AmneziaVPN-service"
|
||||||
#define ORGANIZATION_NAME "AmneziaVPN.ORG"
|
#define ORGANIZATION_NAME "AmneziaVPN.ORG"
|
||||||
#define APP_VERSION "1.6.0.0"
|
#define APP_VERSION "1.6.1.0"
|
||||||
|
|
||||||
#endif // DEFINES_H
|
#endif // DEFINES_H
|
||||||
|
|
|
@ -68,6 +68,11 @@ int main(int argc, char *argv[])
|
||||||
parser.addHelpOption();
|
parser.addHelpOption();
|
||||||
parser.addVersionOption();
|
parser.addVersionOption();
|
||||||
|
|
||||||
|
QCommandLineOption c_autostart {{"a", "autostart"}, "System autostart"};
|
||||||
|
parser.addOption(c_autostart);
|
||||||
|
|
||||||
|
parser.process(app);
|
||||||
|
|
||||||
if (!Debug::init()) {
|
if (!Debug::init()) {
|
||||||
qWarning() << "Initialization of debug subsystem failed";
|
qWarning() << "Initialization of debug subsystem failed";
|
||||||
}
|
}
|
||||||
|
@ -79,7 +84,8 @@ int main(int argc, char *argv[])
|
||||||
app.setQuitOnLastWindowClosed(false);
|
app.setQuitOnLastWindowClosed(false);
|
||||||
|
|
||||||
MainWindow mainWindow;
|
MainWindow mainWindow;
|
||||||
mainWindow.show();
|
if (parser.isSet("a")) mainWindow.showOnStartup();
|
||||||
|
else mainWindow.show();
|
||||||
|
|
||||||
if (app.isPrimary()) {
|
if (app.isPrimary()) {
|
||||||
QObject::connect(&app, &SingleApplication::instanceStarted, &mainWindow, [&](){
|
QObject::connect(&app, &SingleApplication::instanceStarted, &mainWindow, [&](){
|
||||||
|
|
|
@ -3,11 +3,11 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
IDI_ICON1 ICON "../images/app.ico"
|
IDI_ICON1 ICON "../images/app.ico"
|
||||||
|
|
||||||
#define VER_FILEVERSION 1,6,0,0
|
#define VER_FILEVERSION 1,6,1,0
|
||||||
#define VER_FILEVERSION_STR "1.6.0.0\0"
|
#define VER_FILEVERSION_STR "1.6.1.0\0"
|
||||||
|
|
||||||
#define VER_PRODUCTVERSION 1,6,0,0
|
#define VER_PRODUCTVERSION 1,6,1,0
|
||||||
#define VER_PRODUCTVERSION_STR "1.6.0.0\0"
|
#define VER_PRODUCTVERSION_STR "1.6.1.0\0"
|
||||||
|
|
||||||
#define VER_COMPANYNAME_STR "AmneziaVPN"
|
#define VER_COMPANYNAME_STR "AmneziaVPN"
|
||||||
#define VER_FILEDESCRIPTION_STR "AmneziaVPN"
|
#define VER_FILEDESCRIPTION_STR "AmneziaVPN"
|
||||||
|
|
|
@ -38,7 +38,7 @@ ErrorCode OpenVpnOverCloakProtocol::start()
|
||||||
|
|
||||||
QStringList args = QStringList() << "-c" << m_cloakCfgFile.fileName()
|
QStringList args = QStringList() << "-c" << m_cloakCfgFile.fileName()
|
||||||
<< "-s" << m_cloakConfig.value(config_key::remote).toString()
|
<< "-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;
|
<< "-l" << amnezia::protocols::openvpn::defaultPort;
|
||||||
|
|
||||||
if (m_cloakConfig.value(config_key::transport_proto).toString() == protocols::UDP) {
|
if (m_cloakConfig.value(config_key::transport_proto).toString() == protocols::UDP) {
|
||||||
|
|
|
@ -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";\
|
||||||
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
|
if [[ -f "$pm_apt" ]]; then pm=$pm_apt; docker_pkg="docker.io"; else pm=$pm_yum; docker_pkg="docker"; 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 install -y -q curl
|
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 sudo export DEBIAN_FRONTEND=noninteractive; sudo $pm_apt install -y -q docker.io; else sudo $pm_yum install -y -q docker; 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
|
sudo systemctl start docker
|
||||||
|
|
||||||
|
|
|
@ -23,19 +23,6 @@ class Settings : public QObject
|
||||||
public:
|
public:
|
||||||
explicit Settings(QObject* parent = nullptr);
|
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 defaultServerCredentials() const;
|
||||||
ServerCredentials serverCredentials(int index) const;
|
ServerCredentials serverCredentials(int index) const;
|
||||||
//void setServerCredentials(const ServerCredentials &credentials);
|
//void setServerCredentials(const ServerCredentials &credentials);
|
||||||
|
@ -74,9 +61,12 @@ public:
|
||||||
QString nextAvailableServerName() const;
|
QString nextAvailableServerName() const;
|
||||||
|
|
||||||
// App settings section
|
// 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); }
|
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(); }
|
bool customRouting() const { return m_settings.value("Conf/customRouting", false).toBool(); }
|
||||||
void setCustomRouting(bool customRouting) { m_settings.setValue("Conf/customRouting", customRouting); }
|
void setCustomRouting(bool customRouting) { m_settings.setValue("Conf/customRouting", customRouting); }
|
||||||
|
|
||||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
@ -57,6 +57,8 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||||
|
|
||||||
setupTray();
|
setupTray();
|
||||||
setupUiConnections();
|
setupUiConnections();
|
||||||
|
setupAppSettingsConnections();
|
||||||
|
setupNetworkSettingsConnections();
|
||||||
setupProtocolsPageConnections();
|
setupProtocolsPageConnections();
|
||||||
setupNewServerPageConnections();
|
setupNewServerPageConnections();
|
||||||
setupSharePageConnections();
|
setupSharePageConnections();
|
||||||
|
@ -159,6 +161,11 @@ MainWindow::~MainWindow()
|
||||||
qDebug() << "Application closed";
|
qDebug() << "Application closed";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::showOnStartup()
|
||||||
|
{
|
||||||
|
if (! m_settings.isStartMinimized()) show();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::goToPage(Page page, bool reset, bool slide)
|
void MainWindow::goToPage(Page page, bool reset, bool slide)
|
||||||
{
|
{
|
||||||
qDebug() << "goToPage" << page;
|
qDebug() << "goToPage" << page;
|
||||||
|
@ -198,6 +205,9 @@ void MainWindow::goToPage(Page page, bool reset, bool slide)
|
||||||
if (page == Page::AppSettings) {
|
if (page == Page::AppSettings) {
|
||||||
updateAppSettingsPage();
|
updateAppSettingsPage();
|
||||||
}
|
}
|
||||||
|
if (page == Page::NetworkSettings) {
|
||||||
|
updateAppSettingsPage();
|
||||||
|
}
|
||||||
if (page == Page::Sites) {
|
if (page == Page::Sites) {
|
||||||
updateSitesPage();
|
updateSitesPage();
|
||||||
}
|
}
|
||||||
|
@ -303,12 +313,11 @@ void MainWindow::keyPressEvent(QKeyEvent *event)
|
||||||
case Qt::Key_Q:
|
case Qt::Key_Q:
|
||||||
qApp->quit();
|
qApp->quit();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case Qt::Key_C:
|
case Qt::Key_C:
|
||||||
qDebug().noquote() << "Def server" << m_settings.defaultServerIndex() << m_settings.defaultContainerName(m_settings.defaultServerIndex());
|
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.containerConfig(m_settings.defaultServerIndex(), m_settings.defaultContainer(m_settings.defaultServerIndex()))).toJson();
|
||||||
//qDebug().noquote() << QJsonDocument(m_settings.serversArray()).toJson();
|
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case Qt::Key_A:
|
case Qt::Key_A:
|
||||||
goToPage(Page::Start);
|
goToPage(Page::Start);
|
||||||
break;
|
break;
|
||||||
|
@ -334,7 +343,7 @@ void MainWindow::keyPressEvent(QKeyEvent *event)
|
||||||
|
|
||||||
void MainWindow::closeEvent(QCloseEvent *event)
|
void MainWindow::closeEvent(QCloseEvent *event)
|
||||||
{
|
{
|
||||||
if (currentPage() == Page::Start || currentPage() == Page::NewServer) qApp->quit();
|
if (m_settings.serversCount() == 0) qApp->quit();
|
||||||
else {
|
else {
|
||||||
hide();
|
hide();
|
||||||
event->ignore();
|
event->ignore();
|
||||||
|
@ -440,23 +449,23 @@ void MainWindow::onPushButtonNewServerConnect(bool)
|
||||||
void MainWindow::onPushButtonNewServerConnectConfigure(bool)
|
void MainWindow::onPushButtonNewServerConnectConfigure(bool)
|
||||||
{
|
{
|
||||||
QJsonObject cloakConfig {
|
QJsonObject cloakConfig {
|
||||||
{ config_key::port, ui->lineEdit_new_server_cloak_port->text() },
|
|
||||||
{ config_key::container, amnezia::containerToString(DockerContainer::OpenVpnOverCloak) },
|
{ config_key::container, amnezia::containerToString(DockerContainer::OpenVpnOverCloak) },
|
||||||
{ config_key::cloak, QJsonObject {
|
{ config_key::cloak, QJsonObject {
|
||||||
|
{ config_key::port, ui->lineEdit_new_server_cloak_port->text() },
|
||||||
{ config_key::site, ui->lineEdit_new_server_cloak_site->text() }}
|
{ config_key::site, ui->lineEdit_new_server_cloak_site->text() }}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
QJsonObject ssConfig {
|
QJsonObject ssConfig {
|
||||||
{ config_key::port, ui->lineEdit_new_server_ss_port->text() },
|
|
||||||
{ config_key::container, amnezia::containerToString(DockerContainer::OpenVpnOverShadowSocks) },
|
{ config_key::container, amnezia::containerToString(DockerContainer::OpenVpnOverShadowSocks) },
|
||||||
{ config_key::shadowsocks, QJsonObject {
|
{ config_key::shadowsocks, QJsonObject {
|
||||||
|
{ config_key::port, ui->lineEdit_new_server_ss_port->text() },
|
||||||
{ config_key::cipher, ui->comboBox_new_server_ss_cipher->currentText() }}
|
{ config_key::cipher, ui->comboBox_new_server_ss_cipher->currentText() }}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
QJsonObject openVpnConfig {
|
QJsonObject openVpnConfig {
|
||||||
{ config_key::port, ui->lineEdit_new_server_openvpn_port->text() },
|
|
||||||
{ config_key::container, amnezia::containerToString(DockerContainer::OpenVpn) },
|
{ config_key::container, amnezia::containerToString(DockerContainer::OpenVpn) },
|
||||||
{ config_key::openvpn, QJsonObject {
|
{ 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() }}
|
{ 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()) {
|
if (ui->checkBox_new_server_openvpn->isChecked()) {
|
||||||
containerConfigs.append(openVpnConfig);
|
containerConfigs.append(openVpnConfig);
|
||||||
containers.append(DockerContainer::OpenVpnOverShadowSocks);
|
containers.append(DockerContainer::OpenVpn);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (containers.isEmpty()) return;
|
if (containers.isEmpty()) return;
|
||||||
|
@ -485,7 +494,7 @@ void MainWindow::onPushButtonNewServerConnectConfigure(bool)
|
||||||
bool ok = installServer(installCredentials, containers, containerConfigs,
|
bool ok = installServer(installCredentials, containers, containerConfigs,
|
||||||
ui->page_new_server_2,
|
ui->page_new_server_2,
|
||||||
ui->progressBar_new_server_connection,
|
ui->progressBar_new_server_connection,
|
||||||
ui->pushButton_new_server_connect,
|
ui->pushButton_new_server_connect_configure,
|
||||||
ui->label_new_server_wait_info);
|
ui->label_new_server_wait_info);
|
||||||
|
|
||||||
if (ok) {
|
if (ok) {
|
||||||
|
@ -500,6 +509,7 @@ void MainWindow::onPushButtonNewServerConnectConfigure(bool)
|
||||||
server.insert(config_key::defaultContainer, containerToString(containers.first()));
|
server.insert(config_key::defaultContainer, containerToString(containers.first()));
|
||||||
|
|
||||||
m_settings.addServer(server);
|
m_settings.addServer(server);
|
||||||
|
m_settings.setDefaultServer(m_settings.serversCount() - 1);
|
||||||
|
|
||||||
goToPage(Page::Vpn);
|
goToPage(Page::Vpn);
|
||||||
qApp->processEvents();
|
qApp->processEvents();
|
||||||
|
@ -534,6 +544,8 @@ void MainWindow::onPushButtonNewServerImport(bool)
|
||||||
|
|
||||||
if (credentials.isValid() || o.contains(config_key::containers)) {
|
if (credentials.isValid() || o.contains(config_key::containers)) {
|
||||||
m_settings.addServer(o);
|
m_settings.addServer(o);
|
||||||
|
m_settings.setDefaultServer(m_settings.serversCount() - 1);
|
||||||
|
|
||||||
setStartPage(Page::Vpn);
|
setStartPage(Page::Vpn);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -564,7 +576,7 @@ bool MainWindow::installServer(ServerCredentials credentials,
|
||||||
timer.start(1000);
|
timer.start(1000);
|
||||||
|
|
||||||
progress->setTextVisible(true);
|
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());
|
ErrorCode e = ServerController::setupContainer(credentials, containers.at(i), configs.at(i).toObject());
|
||||||
qDebug() << "Setup server finished with code" << e;
|
qDebug() << "Setup server finished with code" << e;
|
||||||
|
@ -604,11 +616,9 @@ bool MainWindow::installServer(ServerCredentials credentials,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
button->show();
|
||||||
|
page->setEnabled(true);
|
||||||
// button->show();
|
info->setText(tr("Amnezia server installed"));
|
||||||
// page->setEnabled(true);
|
|
||||||
// info->setText(tr("Amnezia server installed"));
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -720,6 +730,11 @@ void MainWindow::onPushButtonForgetServer(bool)
|
||||||
m_settings.setDefaultServer(m_settings.defaultServerIndex() - 1);
|
m_settings.setDefaultServer(m_settings.defaultServerIndex() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_settings.serversCount() == 0) {
|
||||||
|
m_settings.setDefaultServer(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
selectedServerIndex = -1;
|
selectedServerIndex = -1;
|
||||||
|
|
||||||
updateServersListPage();
|
updateServersListPage();
|
||||||
|
@ -923,42 +938,6 @@ void MainWindow::setupUiConnections()
|
||||||
m_settings.setCustomRouting(toggled);
|
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->pushButton_servers_add_new, &QPushButton::clicked, this, [this](){ goToPage(Page::Start); });
|
||||||
|
|
||||||
connect(ui->lineEdit_server_settings_description, &QLineEdit::editingFinished, this, [this](){
|
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](){
|
connect(ui->lineEdit_server_settings_description, &QLineEdit::returnPressed, this, [this](){
|
||||||
ui->lineEdit_server_settings_description->clearFocus();
|
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()
|
void MainWindow::setupProtocolsPageConnections()
|
||||||
|
@ -1296,7 +1319,7 @@ void MainWindow::setupSharePageConnections()
|
||||||
qApp->processEvents();
|
qApp->processEvents();
|
||||||
|
|
||||||
ServerCredentials credentials = m_settings.serverCredentials(selectedServerIndex);
|
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));
|
containerConfig.insert(config_key::container, containerToString(selectedDockerContainer));
|
||||||
|
|
||||||
ErrorCode e = ErrorCode::NoError;
|
ErrorCode e = ErrorCode::NoError;
|
||||||
|
@ -1336,17 +1359,23 @@ void MainWindow::setupSharePageConnections()
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(ui->pushButton_share_openvpn_generate, &QPushButton::clicked, this, [this](){
|
connect(ui->pushButton_share_openvpn_generate, &QPushButton::clicked, this, [this](){
|
||||||
ServerCredentials credentials = m_settings.serverCredentials(selectedServerIndex);
|
ui->pushButton_share_openvpn_generate->setEnabled(false);
|
||||||
const QJsonObject &containerConfig = m_settings.containerConfig(selectedServerIndex, selectedDockerContainer);
|
|
||||||
ui->pushButton_share_openvpn_copy->setEnabled(false);
|
ui->pushButton_share_openvpn_copy->setEnabled(false);
|
||||||
ui->pushButton_share_openvpn_save->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;
|
ErrorCode e = ErrorCode::NoError;
|
||||||
QString cfg = OpenVpnConfigurator::genOpenVpnConfig(credentials, selectedDockerContainer, containerConfig, &e);
|
QString cfg = OpenVpnConfigurator::genOpenVpnConfig(credentials, selectedDockerContainer, containerConfig, &e);
|
||||||
|
|
||||||
ui->textEdit_share_openvpn_code->setPlainText(cfg);
|
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_copy->setEnabled(true);
|
||||||
ui->pushButton_share_openvpn_save->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](){
|
connect(ui->pushButton_share_openvpn_save, &QPushButton::clicked, this, [this](){
|
||||||
|
@ -1570,8 +1599,9 @@ void MainWindow::updateVpnPage()
|
||||||
|
|
||||||
void MainWindow::updateAppSettingsPage()
|
void MainWindow::updateAppSettingsPage()
|
||||||
{
|
{
|
||||||
ui->checkBox_autostart->setChecked(Autostart::isAutostart());
|
ui->checkBox_app_settings_autostart->setChecked(Autostart::isAutostart());
|
||||||
ui->checkBox_autoconnect->setChecked(m_settings.isAutoConnect());
|
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_dns1->setText(m_settings.primaryDns());
|
||||||
ui->lineEdit_network_settings_dns2->setText(m_settings.secondaryDns());
|
ui->lineEdit_network_settings_dns2->setText(m_settings.secondaryDns());
|
||||||
|
|
|
@ -45,6 +45,8 @@ public:
|
||||||
OpenVpnSettings, ShadowSocksSettings, CloakSettings};
|
OpenVpnSettings, ShadowSocksSettings, CloakSettings};
|
||||||
Q_ENUM(Page)
|
Q_ENUM(Page)
|
||||||
|
|
||||||
|
void showOnStartup();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onBytesChanged(quint64 receivedBytes, quint64 sentBytes);
|
void onBytesChanged(quint64 receivedBytes, quint64 sentBytes);
|
||||||
void onConnectionStateChanged(VpnProtocol::ConnectionState state);
|
void onConnectionStateChanged(VpnProtocol::ConnectionState state);
|
||||||
|
@ -88,6 +90,8 @@ private:
|
||||||
void setTrayIcon(const QString &iconPath);
|
void setTrayIcon(const QString &iconPath);
|
||||||
|
|
||||||
void setupUiConnections();
|
void setupUiConnections();
|
||||||
|
void setupAppSettingsConnections();
|
||||||
|
void setupNetworkSettingsConnections();
|
||||||
void setupProtocolsPageConnections();
|
void setupProtocolsPageConnections();
|
||||||
void setupNewServerPageConnections();
|
void setupNewServerPageConnections();
|
||||||
void setupServerSettingsPageConnections();
|
void setupServerSettingsPageConnections();
|
||||||
|
|
|
@ -287,7 +287,7 @@ QPushButton:hover {
|
||||||
<string notr="true"/>
|
<string notr="true"/>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>3</number>
|
<number>7</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_start">
|
<widget class="QWidget" name="page_start">
|
||||||
<widget class="QLabel" name="label_25">
|
<widget class="QLabel" name="label_25">
|
||||||
|
@ -2557,9 +2557,9 @@ QPushButton:hover {
|
||||||
<widget class="QLabel" name="label_34">
|
<widget class="QLabel" name="label_34">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>120</x>
|
<x>50</x>
|
||||||
<y>40</y>
|
<y>40</y>
|
||||||
<width>111</width>
|
<width>171</width>
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
@ -2573,16 +2573,16 @@ color: #100A44;
|
||||||
</string>
|
</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Servers</string>
|
<string>Servers list</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QPushButton" name="pushButton_servers_add_new">
|
<widget class="QPushButton" name="pushButton_servers_add_new">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>230</x>
|
<x>240</x>
|
||||||
<y>49</y>
|
<y>49</y>
|
||||||
<width>24</width>
|
<width>24</width>
|
||||||
<height>24</height>
|
<height>24</height>
|
||||||
|
@ -2655,7 +2655,7 @@ QPushButton:hover {
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QCheckBox" name="checkBox_autostart">
|
<widget class="QCheckBox" name="checkBox_app_settings_autostart">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>30</x>
|
<x>30</x>
|
||||||
|
@ -2693,7 +2693,7 @@ color: #100A44;
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QCheckBox" name="checkBox_autoconnect">
|
<widget class="QCheckBox" name="checkBox_app_settings_autoconnect">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>30</x>
|
<x>30</x>
|
||||||
|
@ -2706,11 +2706,11 @@ color: #100A44;
|
||||||
<string>Auto connect</string>
|
<string>Auto connect</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QPushButton" name="pushButton_check_for_updates">
|
<widget class="QPushButton" name="pushButton_app_settings_check_for_updates">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>30</x>
|
<x>30</x>
|
||||||
<y>250</y>
|
<y>280</y>
|
||||||
<width>321</width>
|
<width>321</width>
|
||||||
<height>41</height>
|
<height>41</height>
|
||||||
</rect>
|
</rect>
|
||||||
|
@ -2745,13 +2745,26 @@ background: #211966;
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>30</x>
|
<x>30</x>
|
||||||
<y>210</y>
|
<y>240</y>
|
||||||
<width>281</width>
|
<width>281</width>
|
||||||
<height>21</height>
|
<height>21</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Software version: 1.6.0 (31.03.2021)</string>
|
<string>Software version: 1.6.1 (09.05.2021)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QCheckBox" name="checkBox_app_settings_start_minimized">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>30</x>
|
||||||
|
<y>180</y>
|
||||||
|
<width>211</width>
|
||||||
|
<height>31</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Start minimized</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue