From 5c95d5a8b8f99d8ffbd3adb5a76b29f0fa40a002 Mon Sep 17 00:00:00 2001 From: Qv2ray-Bot <59914293+Qv2ray-Bot@users.noreply.github.com> Date: Sun, 2 Feb 2020 16:39:49 +0800 Subject: [PATCH] add: make stream settings standalone and added tlsSettings --- Build.Counter | 2 +- Qv2ray.pro | 19 +- src/base/models/CoreObjectModels.hpp | 3 + src/ui/editors/w_OutboundEditor.cpp | 299 +- src/ui/editors/w_OutboundEditor.hpp | 70 +- src/ui/editors/w_OutboundEditor.ui | 1273 ++---- src/ui/w_MainWindow.cpp | 8 +- src/ui/widgets/StreamSettingsWidget.cpp | 264 ++ src/ui/widgets/StreamSettingsWidget.hpp | 80 + src/ui/widgets/StreamSettingsWidget.ui | 739 ++++ translations/en_US.ts | 5237 ++++++++++++----------- 11 files changed, 4141 insertions(+), 3853 deletions(-) create mode 100644 src/ui/widgets/StreamSettingsWidget.cpp create mode 100644 src/ui/widgets/StreamSettingsWidget.hpp create mode 100644 src/ui/widgets/StreamSettingsWidget.ui diff --git a/Build.Counter b/Build.Counter index 971f02ac..4b1f14ae 100644 --- a/Build.Counter +++ b/Build.Counter @@ -1 +1 @@ -3513 +3560 diff --git a/Qv2ray.pro b/Qv2ray.pro index 989a8c9c..a5d904b0 100644 --- a/Qv2ray.pro +++ b/Qv2ray.pro @@ -13,7 +13,7 @@ TEMPLATE = app _BUILD_NUMBER=$$cat(Build.Counter) VERSION = 2.0.1.$$_BUILD_NUMBER -no_increase_build_number { +no_increase_build_number | qmake_lupdate { message("Build.Counter will not be increased") } else { _BUILD_NUMBER = $$num_add($$_BUILD_NUMBER, 1) @@ -144,11 +144,14 @@ Qv2rayAddSource(ui, _, w_MainWindow_extra, cpp) Qv2rayAddSource(ui, _, w_PreferencesWindow, cpp, hpp, ui) Qv2rayAddSource(ui, _, w_ScreenShot_Core, cpp, hpp, ui) Qv2rayAddSource(ui, _, w_SubscriptionManager, cpp, hpp, ui) +Qv2rayAddSource(ui, widgets, StreamSettingsWidget, cpp, hpp, ui) SOURCES += $$PWD/src/main.cpp +HEADERS += +FORMS += + INCLUDEPATH += $$PWD/src -RESOURCES += \ - resources.qrc +RESOURCES += resources.qrc # Fine...... message(" ") @@ -294,6 +297,7 @@ HEADERS += \ $$PWD/3rdparty/qhttpserver/src/qhttpserver.h \ $$PWD/3rdparty/qhttpserver/src/qhttpserverapi.h \ $$PWD/3rdparty/qhttpserver/src/qhttpserverfwd.h + SOURCES += \ $$PWD/3rdparty/qhttpserver/src/qhttpconnection.cpp \ $$PWD/3rdparty/qhttpserver/src/qhttprequest.cpp \ @@ -359,6 +363,15 @@ with_metainfo { DEFINES += WITH_FLATHUB_CONFIG_PATH } +qmake_lupdate { + message(" ") + message("Running lupdate...") + message(" ") + lupdate_output = $$system(lupdate $$SOURCES $$HEADERS $$FORMS -ts $$PWD/$$TRANSLATIONS -no-ui-lines) + message($$lupdate_output) + message("lupdate finished.") +} + message(" ") message("This Qv2ray build contains: ") message(" --> $${size(SOURCES)} source files") diff --git a/src/base/models/CoreObjectModels.hpp b/src/base/models/CoreObjectModels.hpp index af9ddf02..c8294b9b 100644 --- a/src/base/models/CoreObjectModels.hpp +++ b/src/base/models/CoreObjectModels.hpp @@ -1,4 +1,7 @@ #pragma once +#include +#include +#include #include "3rdparty/x2struct/x2struct.hpp" namespace Qv2ray::base::objects diff --git a/src/ui/editors/w_OutboundEditor.cpp b/src/ui/editors/w_OutboundEditor.cpp index d173f346..634c5892 100644 --- a/src/ui/editors/w_OutboundEditor.cpp +++ b/src/ui/editors/w_OutboundEditor.cpp @@ -13,18 +13,24 @@ OutboundEditor::OutboundEditor(QWidget *parent) : QDialog(parent), Tag(""), Mux(), - stream(), vmess(), shadowsocks() { REGISTER_WINDOW setupUi(this); + // + ssWidget = new StreamSettingsWidget(this); + transportFrame->addWidget(ssWidget); + // shadowsocks = ShadowSocksServerObject(); socks = SocksServerObject(); - socks.users.push_back(SocksServerObject::UserObject()); vmess = VMessServerObject(); + socks.users.push_back(SocksServerObject::UserObject()); vmess.users.push_back(VMessServerObject::UserObject()); - stream = StreamSettingsObject(); + // + auto stream = StreamSettingsObject(); + ssWidget->SetStreamObject(stream); + // OutboundType = "vmess"; Tag = OUTBOUND_TAG_PROXY; useFProxy = false; @@ -40,10 +46,10 @@ OutboundEditor::OutboundEditor(OUTBOUND outboundEntry, QWidget *parent) : Outbou OutboundType = outboundEntry["protocol"].toString(); Mux = outboundEntry["mux"].toObject(); useFProxy = outboundEntry[QV2RAY_USE_FPROXY_KEY].toBool(false); + ssWidget->SetStreamObject(StructFromJsonString(JsonToString(outboundEntry["streamSettings"].toObject()))); if (OutboundType == "vmess") { vmess = StructFromJsonString(JsonToString(outboundEntry["settings"].toObject()["vnext"].toArray().first().toObject())); - stream = StructFromJsonString(JsonToString(outboundEntry["streamSettings"].toObject())); shadowsocks.port = vmess.port; shadowsocks.address = vmess.address; socks.address = vmess.address; @@ -87,6 +93,33 @@ QString OutboundEditor::GetFriendlyName() return name; } +OUTBOUND OutboundEditor::GenerateConnectionJson() +{ + OUTBOUNDSETTING settings; + auto streaming = JsonFromString(StructToJsonString(ssWidget->GetStreamSettings())); + + if (OutboundType == "vmess") { + // VMess is only a ServerObject, and we need an array { "vnext": [] } + QJsonArray vnext; + vnext.append(GetRootObject(vmess)); + settings.insert("vnext", vnext); + } else if (OutboundType == "shadowsocks") { + streaming = QJsonObject(); + QJsonArray servers; + servers.append(GetRootObject(shadowsocks)); + settings["servers"] = servers; + } else if (OutboundType == "socks") { + streaming = QJsonObject(); + QJsonArray servers; + servers.append(GetRootObject(socks)); + settings["servers"] = servers; + } + + auto root = GenerateOutboundEntry(OutboundType, settings, streaming, Mux, "0.0.0.0", Tag); + root[QV2RAY_USE_FPROXY_KEY] = useFProxy; + return root; +} + void OutboundEditor::ReloadGUI() { if (OutboundType == "vmess") { @@ -96,49 +129,6 @@ void OutboundEditor::ReloadGUI() idLineEdit->setText(vmess.users.front().id); alterLineEdit->setValue(vmess.users.front().alterId); securityCombo->setCurrentText(vmess.users.front().security); - tranportCombo->setCurrentText(stream.network); - tlsCB->setChecked(stream.security == "tls"); - // TCP - tcpHeaderTypeCB->setCurrentText(stream.tcpSettings.header.type); - tcpRequestTxt->setPlainText(StructToJsonString(stream.tcpSettings.header.request)); - tcpRespTxt->setPlainText(StructToJsonString(stream.tcpSettings.header.response)); - // HTTP - QString allHosts; - - for (auto host : stream.httpSettings.host) { - allHosts = allHosts + host + "\r\n"; - } - - httpHostTxt->setPlainText(allHosts); - httpPathTxt->setText(stream.httpSettings.path); - // WS - wsPathTxt->setText(stream.wsSettings.path); - QString wsHeaders; - - for (auto item = stream.wsSettings.headers.begin(); item != stream.wsSettings.headers.end(); item++) { - wsHeaders += item.key() + "|" + item.value() + NEWLINE; - } - - wsHeadersTxt->setPlainText(wsHeaders); - // mKCP - kcpMTU->setValue(stream.kcpSettings.mtu); - kcpTTI->setValue(stream.kcpSettings.tti); - kcpHeaderType->setCurrentText(stream.kcpSettings.header.type); - kcpCongestionCB->setChecked(stream.kcpSettings.congestion); - kcpReadBufferSB->setValue(stream.kcpSettings.readBufferSize); - kcpUploadCapacSB->setValue(stream.kcpSettings.uplinkCapacity); - kcpDownCapacitySB->setValue(stream.kcpSettings.downlinkCapacity); - kcpWriteBufferSB->setValue(stream.kcpSettings.writeBufferSize); - // DS - dsPathTxt->setText(stream.dsSettings.path); - // QUIC - quicKeyTxt->setText(stream.quicSettings.key); - quicSecurityCB->setCurrentText(stream.quicSettings.security); - quicHeaderTypeCB->setCurrentText(stream.quicSettings.header.type); - // SOCKOPT - tProxyCB->setCurrentText(stream.sockopt.tproxy); - tcpFastOpenCB->setChecked(stream.sockopt.tcpFastOpen); - soMarkSpinBox->setValue(stream.sockopt.mark); } else if (OutboundType == "shadowsocks") { outBoundTypeCombo->setCurrentIndex(1); // ShadowSocks Configs @@ -201,181 +191,33 @@ void OutboundEditor::on_securityCombo_currentIndexChanged(const QString &arg1) vmess.users.front().security = arg1; } -void OutboundEditor::on_tranportCombo_currentIndexChanged(const QString &arg1) +void OutboundEditor::on_tagTxt_textEdited(const QString &arg1) { - stream.network = arg1; + Tag = arg1; } -void OutboundEditor::on_httpPathTxt_textEdited(const QString &arg1) +void OutboundEditor::on_muxEnabledCB_stateChanged(int arg1) { - stream.httpSettings.path = arg1; + Mux["enabled"] = arg1 == Qt::Checked; } -void OutboundEditor::on_httpHostTxt_textChanged() +void OutboundEditor::on_muxConcurrencyTxt_valueChanged(int arg1) { - try { - QStringList hosts = httpHostTxt->toPlainText().replace("\r", "").split("\n"); - stream.httpSettings.host.clear(); - - for (auto host : hosts) { - if (!host.trimmed().isEmpty()) { - stream.httpSettings.host.push_back(host.trimmed()); - } - } - - BLACK(httpHostTxt) - } catch (...) { - RED(httpHostTxt) - } + Mux["concurrency"] = arg1; } -void OutboundEditor::on_wsHeadersTxt_textChanged() +void OutboundEditor::on_alterLineEdit_valueChanged(int arg1) { - try { - QStringList headers = SplitLines(wsHeadersTxt->toPlainText()); - stream.wsSettings.headers.clear(); + if (vmess.users.empty()) vmess.users.push_back(VMessServerObject::UserObject()); - for (auto header : headers) { - if (header.isEmpty()) continue; - - auto index = header.indexOf("|"); - - if (index < 0) throw "fast fail to set RED color"; - - auto key = header.left(index); - auto value = header.right(header.length() - index - 1); - stream.wsSettings.headers[key] = value; - } - - BLACK(wsHeadersTxt) - } catch (...) { - RED(wsHeadersTxt) - } + vmess.users.front().alterId = arg1; } - -void OutboundEditor::on_tcpRequestDefBtn_clicked() +void OutboundEditor::on_useFPCB_stateChanged(int arg1) { - tcpRequestTxt->clear(); - tcpRequestTxt->insertPlainText("{\"version\":\"1.1\",\"method\":\"GET\",\"path\":[\"/\"],\"headers\":" - "{\"Host\":[\"www.baidu.com\",\"www.bing.com\"],\"User-Agent\":" - "[\"Mozilla/5.0 (Windows NT 10.0; WOW64) " - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\"," - "\"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) " - "AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 " - "Safari/601.1.46\"],\"Accept-Encoding\":[\"gzip, deflate\"]," - "\"Connection\":[\"keep-alive\"],\"Pragma\":\"no-cache\"}}"); + useFProxy = arg1 == Qt::Checked; } -void OutboundEditor::on_tcpRespDefBtn_clicked() -{ - tcpRespTxt->clear(); - tcpRespTxt->insertPlainText("{\"version\":\"1.1\",\"status\":\"200\",\"reason\":\"OK\",\"headers\":{\"Content-Type\":[\"application/octet-stream\",\"video/mpeg\"],\"Transfer-Encoding\":[\"chunked\"],\"Connection\":[\"keep-alive\"],\"Pragma\":\"no-cache\"}}"); -} - -OUTBOUND OutboundEditor::GenerateConnectionJson() -{ - OUTBOUNDSETTING settings; - auto streaming = JsonFromString(StructToJsonString(stream)); - - if (OutboundType == "vmess") { - // VMess is only a ServerObject, and we need an array { "vnext": [] } - QJsonArray vnext; - vnext.append(GetRootObject(vmess)); - settings.insert("vnext", vnext); - } else if (OutboundType == "shadowsocks") { - streaming = QJsonObject(); - QJsonArray servers; - servers.append(GetRootObject(shadowsocks)); - settings["servers"] = servers; - } else if (OutboundType == "socks") { - streaming = QJsonObject(); - QJsonArray servers; - servers.append(GetRootObject(socks)); - settings["servers"] = servers; - } - - auto root = GenerateOutboundEntry(OutboundType, settings, streaming, Mux, "0.0.0.0", Tag); - root[QV2RAY_USE_FPROXY_KEY] = useFProxy; - return root; -} - -void OutboundEditor::on_tlsCB_stateChanged(int arg1) -{ - stream.security = arg1 == Qt::Checked ? "tls" : "none"; -} -void OutboundEditor::on_soMarkSpinBox_valueChanged(int arg1) -{ - stream.sockopt.mark = arg1; -} -void OutboundEditor::on_tcpFastOpenCB_stateChanged(int arg1) -{ - stream.sockopt.tcpFastOpen = arg1 == Qt::Checked; -} -void OutboundEditor::on_tProxyCB_currentIndexChanged(const QString &arg1) -{ - stream.sockopt.tproxy = arg1; -} -void OutboundEditor::on_quicSecurityCB_currentTextChanged(const QString &arg1) -{ - stream.quicSettings.security = arg1; -} -void OutboundEditor::on_quicKeyTxt_textEdited(const QString &arg1) -{ - stream.quicSettings.key = arg1; -} -void OutboundEditor::on_quicHeaderTypeCB_currentIndexChanged(const QString &arg1) -{ - stream.quicSettings.header.type = arg1; -} -void OutboundEditor::on_tcpHeaderTypeCB_currentIndexChanged(const QString &arg1) -{ - stream.tcpSettings.header.type = arg1; -} -void OutboundEditor::on_wsPathTxt_textEdited(const QString &arg1) -{ - stream.wsSettings.path = arg1; -} -void OutboundEditor::on_kcpMTU_valueChanged(int arg1) -{ - stream.kcpSettings.mtu = arg1; -} -void OutboundEditor::on_kcpTTI_valueChanged(int arg1) -{ - stream.kcpSettings.tti = arg1; -} -void OutboundEditor::on_kcpUploadCapacSB_valueChanged(int arg1) -{ - stream.kcpSettings.uplinkCapacity = arg1; -} -void OutboundEditor::on_kcpCongestionCB_stateChanged(int arg1) -{ - stream.kcpSettings.congestion = arg1 == Qt::Checked; -} -void OutboundEditor::on_kcpDownCapacitySB_valueChanged(int arg1) -{ - stream.kcpSettings.downlinkCapacity = arg1; -} -void OutboundEditor::on_kcpReadBufferSB_valueChanged(int arg1) -{ - stream.kcpSettings.readBufferSize = arg1; -} -void OutboundEditor::on_kcpWriteBufferSB_valueChanged(int arg1) -{ - stream.kcpSettings.writeBufferSize = arg1; -} -void OutboundEditor::on_kcpHeaderType_currentTextChanged(const QString &arg1) -{ - stream.kcpSettings.header.type = arg1; -} -void OutboundEditor::on_tranportCombo_currentIndexChanged(int index) -{ - v2rayStackView->setCurrentIndex(index); -} -void OutboundEditor::on_dsPathTxt_textEdited(const QString &arg1) -{ - stream.dsSettings.path = arg1; -} void OutboundEditor::on_outBoundTypeCombo_currentIndexChanged(int index) { outboundTypeStackView->setCurrentIndex(index); @@ -416,48 +258,3 @@ void OutboundEditor::on_socks_PasswordTxt_textEdited(const QString &arg1) { socks.users.front().pass = arg1; } - -void OutboundEditor::on_tcpRequestEditBtn_clicked() -{ - JsonEditor w(JsonFromString(tcpRequestTxt->toPlainText()), this); - auto rString = JsonToString(w.OpenEditor()); - tcpRequestTxt->setPlainText(rString); - auto tcpReqObject = StructFromJsonString(rString); - stream.tcpSettings.header.request = tcpReqObject; -} - -void OutboundEditor::on_tcpResponseEditBtn_clicked() -{ - JsonEditor w(JsonFromString(tcpRespTxt->toPlainText()), this); - auto rString = JsonToString(w.OpenEditor()); - tcpRespTxt->setPlainText(rString); - auto tcpRspObject = StructFromJsonString(rString); - stream.tcpSettings.header.response = tcpRspObject; -} - -void OutboundEditor::on_tagTxt_textEdited(const QString &arg1) -{ - Tag = arg1; -} - -void OutboundEditor::on_muxEnabledCB_stateChanged(int arg1) -{ - Mux["enabled"] = arg1 == Qt::Checked; -} - -void OutboundEditor::on_muxConcurrencyTxt_valueChanged(int arg1) -{ - Mux["concurrency"] = arg1; -} - -void OutboundEditor::on_alterLineEdit_valueChanged(int arg1) -{ - if (vmess.users.empty()) vmess.users.push_back(VMessServerObject::UserObject()); - - vmess.users.front().alterId = arg1; -} - -void OutboundEditor::on_useFPCB_stateChanged(int arg1) -{ - useFProxy = arg1 == Qt::Checked; -} diff --git a/src/ui/editors/w_OutboundEditor.hpp b/src/ui/editors/w_OutboundEditor.hpp index 97640134..de093df5 100644 --- a/src/ui/editors/w_OutboundEditor.hpp +++ b/src/ui/editors/w_OutboundEditor.hpp @@ -3,6 +3,7 @@ #include #include "base/Qv2rayBase.hpp" #include "ui_w_OutboundEditor.h" +#include "ui/widgets/StreamSettingsWidget.hpp" class OutboundEditor : public QDialog, private Ui::OutboundEditor { @@ -24,57 +25,15 @@ class OutboundEditor : public QDialog, private Ui::OutboundEditor void on_idLineEdit_textEdited(const QString &arg1); - void on_securityCombo_currentIndexChanged(const QString &arg1); + void on_tagTxt_textEdited(const QString &arg1); - void on_tranportCombo_currentIndexChanged(const QString &arg1); + void on_muxEnabledCB_stateChanged(int arg1); - void on_httpPathTxt_textEdited(const QString &arg1); + void on_muxConcurrencyTxt_valueChanged(int arg1); - void on_httpHostTxt_textChanged(); + void on_alterLineEdit_valueChanged(int arg1); - void on_wsHeadersTxt_textChanged(); - - void on_tcpRequestDefBtn_clicked(); - - void on_tcpRespDefBtn_clicked(); - - void on_tlsCB_stateChanged(int arg1); - - void on_soMarkSpinBox_valueChanged(int arg1); - - void on_tcpFastOpenCB_stateChanged(int arg1); - - void on_tProxyCB_currentIndexChanged(const QString &arg1); - - void on_quicSecurityCB_currentTextChanged(const QString &arg1); - - void on_quicKeyTxt_textEdited(const QString &arg1); - - void on_quicHeaderTypeCB_currentIndexChanged(const QString &arg1); - - void on_tcpHeaderTypeCB_currentIndexChanged(const QString &arg1); - - void on_wsPathTxt_textEdited(const QString &arg1); - - void on_kcpMTU_valueChanged(int arg1); - - void on_kcpTTI_valueChanged(int arg1); - - void on_kcpUploadCapacSB_valueChanged(int arg1); - - void on_kcpCongestionCB_stateChanged(int arg1); - - void on_kcpDownCapacitySB_valueChanged(int arg1); - - void on_kcpReadBufferSB_valueChanged(int arg1); - - void on_kcpWriteBufferSB_valueChanged(int arg1); - - void on_kcpHeaderType_currentTextChanged(const QString &arg1); - - void on_tranportCombo_currentIndexChanged(int index); - - void on_dsPathTxt_textEdited(const QString &arg1); + void on_useFPCB_stateChanged(int arg1); void on_outBoundTypeCombo_currentIndexChanged(int index); @@ -92,19 +51,7 @@ class OutboundEditor : public QDialog, private Ui::OutboundEditor void on_socks_PasswordTxt_textEdited(const QString &arg1); - void on_tcpRequestEditBtn_clicked(); - - void on_tcpResponseEditBtn_clicked(); - - void on_tagTxt_textEdited(const QString &arg1); - - void on_muxEnabledCB_stateChanged(int arg1); - - void on_muxConcurrencyTxt_valueChanged(int arg1); - - void on_alterLineEdit_valueChanged(int arg1); - - void on_useFPCB_stateChanged(int arg1); + void on_securityCombo_currentIndexChanged(const QString &arg1); private: QString Tag; @@ -117,9 +64,10 @@ class OutboundEditor : public QDialog, private Ui::OutboundEditor // // Connection Configs QString OutboundType; - StreamSettingsObject stream; + // VMessServerObject vmess; ShadowSocksServerObject shadowsocks; SocksServerObject socks; // + StreamSettingsWidget *ssWidget; }; diff --git a/src/ui/editors/w_OutboundEditor.ui b/src/ui/editors/w_OutboundEditor.ui index c5ea89b2..40f84ac3 100644 --- a/src/ui/editors/w_OutboundEditor.ui +++ b/src/ui/editors/w_OutboundEditor.ui @@ -23,47 +23,33 @@ - EditConnectionSettings + Edit Connection Settings true - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - + + Outbound Settings - - - - - 0 - 0 - - - - 0 - - - - - + + + + + + + 0 + 0 + + + + 0 + + + @@ -138,942 +124,333 @@ - - + + + + + + - Use TLS + Email + + + + + + + Password + + + + + + + Encryption Method + + + + + + + + 0 + 0 + + + + + aes-256-cfb + + + + + aes-128-cfb + + + + + aes-256-gcm + + + + + aes-128-gcm + + + + + chacha20-ietf + + + + + chacha20 + + + + + chacha20-poly1305 + + + + + chacha20-ietf-poly1305 + + + + + + + + Level - + + + + + + OTA + + + + + Enabled - - - - Transport + + + + my.name@domain.com - - - - - tcp - - - - - http - - - - - ws - - - - - kcp - - - - - domainsocket - - - - - quic - - + + + + p@ssw0rd + - - - - - Transport Settings - - - - - - - 0 - 0 - - - - 0 - - - - - - - Default - - - - - - - - 0 - 0 - - - - QPlainTextEdit::NoWrap - - - true - - - - - - false - - - - - - - Request - - - - - - - Edit in Json Editor - - - - - - - - - Type - - - - - - - - none - - - - - http - - - - - - - - - - Edit in Json Editor - - - - - - - Response - - - - - - - - 0 - 0 - - - - QPlainTextEdit::NoWrap - - - true - - - - - - - - - - Default - - - - - - - - - - - Path - - - - - - - / - - - - - - - Host - - - - - - - myhost.mydomain.com - - - - - - - - - - - - - Path - - - - - - - - - - /wsPath - - - - - - - - - Key|Value - - - - - - - Headers - - - - - - - - - - - MTU - - - - - - - - 0 - 0 - - - - 576 - - - 1460 - - - 1350 - - - - - - - TTI (ms) - - - - - - - - 0 - 0 - - - - 10 - - - 100 - - - 50 - - - - - - - Uplink Capacity (MB/s) - - - - - - - - 0 - 0 - - - - 4096 - - - 5 - - - - - - - Congestion - - - - - - - Enabled - - - - - - - Downlink Capacity (MB/s) - - - - - - - - 0 - 0 - - - - 4096 - - - 20 - - - - - - - Read Buffer Size (MB) - - - - - - - - 0 - 0 - - - - 1024 - - - 2 - - - - - - - Write Buffer Size (MB) - - - - - - - - 0 - 0 - - - - 1024 - - - 2 - - - - - - - Type - - - - - - - - 0 - 0 - - - - - none - - - - - srtp - - - - - utp - - - - - wechat-video - - - - - dtls - - - - - wireguard - - - - - - - - - - - - - - Path - - - - - - - - - - /dsPath - - - - - - - - - - - - - Security - - - - - - - - 0 - 0 - - - - - none - - - - - aes-128-gcm - - - - - chacha20-poly1305 - - - - - - - - Key - - - - - - - - - - keys - - - - - - - Headers - - - - - - - - 0 - 0 - - - - - none - - - - - srtp - - - - - utp - - - - - wechat-video - - - - - dtls - - - - - wireguard - - - - - - - - - - - - Mark - - - - - - - - - - TCP Fast Open - - - - - - - Enabled - - - - - - - TProxy - - - - - - - - redirect - - - - - tproxy - - - - - off - - - - - - - - - - - - - - - - - - - Email - - - - - - - Password - - - - - - - Encryption Method - - - - - - - - 0 - 0 - - - - - aes-256-cfb - + + + + + + + Username + + - - - aes-128-cfb - + + + + Username + + - - - aes-256-gcm - + + + + Password + + - - - aes-128-gcm - + + + + p@ssw0rd + + - - - chacha20-ietf - + + + + Qt::Vertical + + + + 20 + 40 + + + - - - chacha20 - - - - - chacha20-poly1305 - - - - - chacha20-ietf-poly1305 - - - - - - - - Level - - - - - - - - - - OTA - - - - - - - Enabled - - - - - - - my.name@domain.com - - - - - - - p@ssw0rd - - - - - - - - - - - Username - - - - - - - Password - - - - - - - p@ssw0rd - - - - - - - Username - - - - - - + + + + + - - + + - Misc Settings + Stream Settings - + - - - Use Mux - - - - - - - Enabled - - - - - - - Mux Concurrency - - - - - - - 1 - - - 1024 - - - 8 - - - - - - - Enabled - - - - - - - Use Forward Proxy - - + - - - - - - Tag - - - - - - - Tag of this outbound setting - - - - - - - Host - - - - - - - Hostname or IP/IPv6 Address - - - - - - - Port - - - - - - - 5 - - - Port - - - - - - - Type - - - - - - - - 0 - 0 - - - - - VMess - + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + Tag + + - - - ShadowSocks - + + + + Tag of this outbound setting + + - - - Socks - + + + + Host + + + + + + Hostname or IP/IPv6 Address + + + + + + + Port + + + + + + + 5 + + + Port + + + + + + + Type + + + + + + + + 0 + 0 + + + + + VMess + + + + + ShadowSocks + + + + + Socks + + + + + + + + + + Misc Settings + + + + + + Use Mux + + + + + + + Enabled + + + + + + + Mux Concurrency + + + + + + + 1 + + + 1024 + + + 8 + + + + + + + Enabled + + + + + + + Use Forward Proxy + + + + @@ -1091,41 +468,11 @@ idLineEdit alterLineEdit securityCombo - tlsCB - tranportCombo - tcpHeaderTypeCB - tcpRequestTxt - tcpRequestEditBtn - tcpRequestDefBtn - tcpRespTxt - tcpResponseEditBtn - tcpRespDefBtn - httpPathTxt - httpHostTxt - wsPathTxt - wsHeadersTxt - kcpMTU - kcpTTI - kcpUploadCapacSB - kcpCongestionCB - kcpDownCapacitySB - kcpReadBufferSB - kcpWriteBufferSB - kcpHeaderType - dsPathTxt - quicSecurityCB - quicKeyTxt - quicHeaderTypeCB - soMarkSpinBox - tcpFastOpenCB - tProxyCB ss_emailTxt ss_passwordTxt ss_encryptionMethod ss_levelSpin ss_otaCheckBox - socks_UserNameTxt - socks_PasswordTxt diff --git a/src/ui/w_MainWindow.cpp b/src/ui/w_MainWindow.cpp index 765fe094..b1de3fa6 100644 --- a/src/ui/w_MainWindow.cpp +++ b/src/ui/w_MainWindow.cpp @@ -174,12 +174,8 @@ MainWindow::MainWindow(QWidget *parent): connect(action_Tray_Stop, &QAction::triggered, this, &MainWindow::on_stopButton_clicked); connect(action_Tray_Reconnect, &QAction::triggered, this, &MainWindow::on_reconnectButton_clicked); connect(action_Tray_Quit, &QAction::triggered, this, &MainWindow::quit); - connect(action_Tray_SetSystemProxy, &QAction::triggered, [this]() { - this->MWSetSystemProxy(); - }); - connect(action_Tray_ClearSystemProxy, &QAction::triggered, [this]() { - this->MWClearSystemProxy(true); - }); + connect(action_Tray_SetSystemProxy, &QAction::triggered, this, &MainWindow::MWSetSystemProxy); + connect(action_Tray_ClearSystemProxy, &QAction::triggered, this, &MainWindow::MWClearSystemProxy); connect(hTray, &QSystemTrayIcon::activated, this, &MainWindow::on_activatedTray); // // Actions for right click the connection list diff --git a/src/ui/widgets/StreamSettingsWidget.cpp b/src/ui/widgets/StreamSettingsWidget.cpp new file mode 100644 index 00000000..cc0b256d --- /dev/null +++ b/src/ui/widgets/StreamSettingsWidget.cpp @@ -0,0 +1,264 @@ +#include "StreamSettingsWidget.hpp" +#include "common/QvHelpers.hpp" +#include "ui/editors/w_JsonEditor.hpp" + +StreamSettingsWidget::StreamSettingsWidget(QWidget *parent) : + QWidget(parent) +{ + setupUi(this); +} + +StreamSettingsObject StreamSettingsWidget::GetStreamSettings() +{ + return stream; +} + +void StreamSettingsWidget::SetStreamObject(StreamSettingsObject sso) +{ + stream = sso; + // + transportCombo->setCurrentText(stream.network); + tlsCB->setChecked(stream.security == "tls"); + // TCP + tcpHeaderTypeCB->setCurrentText(stream.tcpSettings.header.type); + tcpRequestTxt->setPlainText(StructToJsonString(stream.tcpSettings.header.request)); + tcpRespTxt->setPlainText(StructToJsonString(stream.tcpSettings.header.response)); + // HTTP + QString allHosts; + + for (auto host : stream.httpSettings.host) { + allHosts = allHosts + host + "\r\n"; + } + + httpHostTxt->setPlainText(allHosts); + httpPathTxt->setText(stream.httpSettings.path); + // WS + wsPathTxt->setText(stream.wsSettings.path); + QString wsHeaders; + + for (auto item = stream.wsSettings.headers.begin(); item != stream.wsSettings.headers.end(); item++) { + wsHeaders += item.key() + "|" + item.value() + NEWLINE; + } + + wsHeadersTxt->setPlainText(wsHeaders); + // mKCP + kcpMTU->setValue(stream.kcpSettings.mtu); + kcpTTI->setValue(stream.kcpSettings.tti); + kcpHeaderType->setCurrentText(stream.kcpSettings.header.type); + kcpCongestionCB->setChecked(stream.kcpSettings.congestion); + kcpReadBufferSB->setValue(stream.kcpSettings.readBufferSize); + kcpUploadCapacSB->setValue(stream.kcpSettings.uplinkCapacity); + kcpDownCapacitySB->setValue(stream.kcpSettings.downlinkCapacity); + kcpWriteBufferSB->setValue(stream.kcpSettings.writeBufferSize); + // DS + dsPathTxt->setText(stream.dsSettings.path); + // QUIC + quicKeyTxt->setText(stream.quicSettings.key); + quicSecurityCB->setCurrentText(stream.quicSettings.security); + quicHeaderTypeCB->setCurrentText(stream.quicSettings.header.type); + // SOCKOPT + tProxyCB->setCurrentText(stream.sockopt.tproxy); + tcpFastOpenCB->setChecked(stream.sockopt.tcpFastOpen); + soMarkSpinBox->setValue(stream.sockopt.mark); +} + + +void StreamSettingsWidget::on_transportCombo_currentIndexChanged(int index) +{ + v2rayStackView->setCurrentIndex(index); +} + +void StreamSettingsWidget::on_httpPathTxt_textEdited(const QString &arg1) +{ + stream.httpSettings.path = arg1; +} + +void StreamSettingsWidget::on_httpHostTxt_textChanged() +{ + try { + QStringList hosts = httpHostTxt->toPlainText().replace("\r", "").split("\n"); + stream.httpSettings.host.clear(); + + for (auto host : hosts) { + if (!host.trimmed().isEmpty()) { + stream.httpSettings.host.push_back(host.trimmed()); + } + } + + BLACK(httpHostTxt) + } catch (...) { + RED(httpHostTxt) + } +} + +void StreamSettingsWidget::on_wsHeadersTxt_textChanged() +{ + try { + QStringList headers = SplitLines(wsHeadersTxt->toPlainText()); + stream.wsSettings.headers.clear(); + + for (auto header : headers) { + if (header.isEmpty()) continue; + + auto index = header.indexOf("|"); + + if (index < 0) throw "fast fail to set RED color"; + + auto key = header.left(index); + auto value = header.right(header.length() - index - 1); + stream.wsSettings.headers[key] = value; + } + + BLACK(wsHeadersTxt) + } catch (...) { + RED(wsHeadersTxt) + } +} + + +void StreamSettingsWidget::on_tcpRequestDefBtn_clicked() +{ + tcpRequestTxt->clear(); + tcpRequestTxt->setPlainText("{\"version\":\"1.1\",\"method\":\"GET\",\"path\":[\"/\"],\"headers\":" + "{\"Host\":[\"www.baidu.com\",\"www.bing.com\"],\"User-Agent\":" + "[\"Mozilla/5.0 (Windows NT 10.0; WOW64) " + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\"," + "\"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) " + "AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 " + "Safari/601.1.46\"],\"Accept-Encoding\":[\"gzip, deflate\"]," + "\"Connection\":[\"keep-alive\"],\"Pragma\":\"no-cache\"}}"); +} + +void StreamSettingsWidget::on_tcpRespDefBtn_clicked() +{ + tcpRespTxt->clear(); + tcpRespTxt->setPlainText("{\"version\":\"1.1\",\"status\":\"200\",\"reason\":\"OK\",\"headers\":{\"Content-Type\":[\"application/octet-stream\",\"video/mpeg\"],\"Transfer-Encoding\":[\"chunked\"],\"Connection\":[\"keep-alive\"],\"Pragma\":\"no-cache\"}}"); +} + +void StreamSettingsWidget::on_tlsCB_stateChanged(int arg1) +{ + stream.security = arg1 == Qt::Checked ? "tls" : "none"; +} + +void StreamSettingsWidget::on_soMarkSpinBox_valueChanged(int arg1) +{ + stream.sockopt.mark = arg1; +} + +void StreamSettingsWidget::on_tcpFastOpenCB_stateChanged(int arg1) +{ + stream.sockopt.tcpFastOpen = arg1 == Qt::Checked; +} + +void StreamSettingsWidget::on_tProxyCB_currentIndexChanged(const QString &arg1) +{ + stream.sockopt.tproxy = arg1; +} + +void StreamSettingsWidget::on_quicSecurityCB_currentTextChanged(const QString &arg1) +{ + stream.quicSettings.security = arg1; +} + +void StreamSettingsWidget::on_quicKeyTxt_textEdited(const QString &arg1) +{ + stream.quicSettings.key = arg1; +} + +void StreamSettingsWidget::on_quicHeaderTypeCB_currentIndexChanged(const QString &arg1) +{ + stream.quicSettings.header.type = arg1; +} + +void StreamSettingsWidget::on_tcpHeaderTypeCB_currentIndexChanged(const QString &arg1) +{ + stream.tcpSettings.header.type = arg1; +} + +void StreamSettingsWidget::on_wsPathTxt_textEdited(const QString &arg1) +{ + stream.wsSettings.path = arg1; +} + +void StreamSettingsWidget::on_kcpMTU_valueChanged(int arg1) +{ + stream.kcpSettings.mtu = arg1; +} + +void StreamSettingsWidget::on_kcpTTI_valueChanged(int arg1) +{ + stream.kcpSettings.tti = arg1; +} + +void StreamSettingsWidget::on_kcpUploadCapacSB_valueChanged(int arg1) +{ + stream.kcpSettings.uplinkCapacity = arg1; +} + +void StreamSettingsWidget::on_kcpCongestionCB_stateChanged(int arg1) +{ + stream.kcpSettings.congestion = arg1 == Qt::Checked; +} + +void StreamSettingsWidget::on_kcpDownCapacitySB_valueChanged(int arg1) +{ + stream.kcpSettings.downlinkCapacity = arg1; +} + +void StreamSettingsWidget::on_kcpReadBufferSB_valueChanged(int arg1) +{ + stream.kcpSettings.readBufferSize = arg1; +} + +void StreamSettingsWidget::on_kcpWriteBufferSB_valueChanged(int arg1) +{ + stream.kcpSettings.writeBufferSize = arg1; +} + +void StreamSettingsWidget::on_kcpHeaderType_currentTextChanged(const QString &arg1) +{ + stream.kcpSettings.header.type = arg1; +} + +void StreamSettingsWidget::on_dsPathTxt_textEdited(const QString &arg1) +{ + stream.dsSettings.path = arg1; +} + +void StreamSettingsWidget::on_tcpRequestEditBtn_clicked() +{ + JsonEditor w(JsonFromString(tcpRequestTxt->toPlainText()), this); + auto rString = JsonToString(w.OpenEditor()); + tcpRequestTxt->setPlainText(rString); + auto tcpReqObject = StructFromJsonString(rString); + stream.tcpSettings.header.request = tcpReqObject; +} + +void StreamSettingsWidget::on_tcpResponseEditBtn_clicked() +{ + JsonEditor w(JsonFromString(tcpRespTxt->toPlainText()), this); + auto rString = JsonToString(w.OpenEditor()); + tcpRespTxt->setPlainText(rString); + auto tcpRspObject = StructFromJsonString(rString); + stream.tcpSettings.header.response = tcpRspObject; +} + +void StreamSettingsWidget::on_transportCombo_currentIndexChanged(const QString &arg1) +{ + stream.network = arg1; +} + +void StreamSettingsWidget::on_serverNameTxt_textEdited(const QString &arg1) +{ + stream.tlsSettings.serverName = arg1; +} + +void StreamSettingsWidget::on_allowInsecureCB_stateChanged(int arg1) +{ + stream.tlsSettings.allowInsecure = arg1 == Qt::Checked; +} + +void StreamSettingsWidget::on_alpnTxt_textChanged() +{ + stream.tlsSettings.alpn = SplitLines(alpnTxt->toPlainText()); +} diff --git a/src/ui/widgets/StreamSettingsWidget.hpp b/src/ui/widgets/StreamSettingsWidget.hpp new file mode 100644 index 00000000..ddca1458 --- /dev/null +++ b/src/ui/widgets/StreamSettingsWidget.hpp @@ -0,0 +1,80 @@ +#pragma once + +#include "QWidget" +#include "base/Qv2rayBase.hpp" +#include "ui_StreamSettingsWidget.h" + +class StreamSettingsWidget : public QWidget, private Ui::StreamSettingsWidget +{ + Q_OBJECT + + public: + explicit StreamSettingsWidget(QWidget *parent = nullptr); + void SetStreamObject(StreamSettingsObject sso); + StreamSettingsObject GetStreamSettings(); + + private slots: + void on_httpPathTxt_textEdited(const QString &arg1); + + void on_httpHostTxt_textChanged(); + + void on_wsHeadersTxt_textChanged(); + + void on_tcpRequestDefBtn_clicked(); + + void on_tcpRespDefBtn_clicked(); + + void on_tlsCB_stateChanged(int arg1); + + void on_soMarkSpinBox_valueChanged(int arg1); + + void on_tcpFastOpenCB_stateChanged(int arg1); + + void on_tProxyCB_currentIndexChanged(const QString &arg1); + + void on_quicSecurityCB_currentTextChanged(const QString &arg1); + + void on_quicKeyTxt_textEdited(const QString &arg1); + + void on_quicHeaderTypeCB_currentIndexChanged(const QString &arg1); + + void on_tcpHeaderTypeCB_currentIndexChanged(const QString &arg1); + + void on_wsPathTxt_textEdited(const QString &arg1); + + void on_kcpMTU_valueChanged(int arg1); + + void on_kcpTTI_valueChanged(int arg1); + + void on_kcpUploadCapacSB_valueChanged(int arg1); + + void on_kcpCongestionCB_stateChanged(int arg1); + + void on_kcpDownCapacitySB_valueChanged(int arg1); + + void on_kcpReadBufferSB_valueChanged(int arg1); + + void on_kcpWriteBufferSB_valueChanged(int arg1); + + void on_kcpHeaderType_currentTextChanged(const QString &arg1); + + void on_dsPathTxt_textEdited(const QString &arg1); + + void on_tcpRequestEditBtn_clicked(); + + void on_tcpResponseEditBtn_clicked(); + + void on_transportCombo_currentIndexChanged(int index); + + void on_transportCombo_currentIndexChanged(const QString &arg1); + + void on_serverNameTxt_textEdited(const QString &arg1); + + void on_allowInsecureCB_stateChanged(int arg1); + + void on_alpnTxt_textChanged(); + + private: + StreamSettingsObject stream; +}; + diff --git a/src/ui/widgets/StreamSettingsWidget.ui b/src/ui/widgets/StreamSettingsWidget.ui new file mode 100644 index 00000000..4b35d81e --- /dev/null +++ b/src/ui/widgets/StreamSettingsWidget.ui @@ -0,0 +1,739 @@ + + + StreamSettingsWidget + + + + 0 + 0 + 804 + 387 + + + + Stream Settings Widget + + + + + + General Stream Settings + + + + + + Transport Protocol + + + + + + + + tcp + + + + + http + + + + + ws + + + + + kcp + + + + + domainsocket + + + + + quic + + + + + + + + TLS + + + + + + + Enabled + + + + + + + + + + Protocol Settings + + + + + + + 0 + 0 + + + + 0 + + + + + + + Default + + + + + + + Edit in Json Editor + + + + + + + Request + + + + + + + + + Type + + + + + + + + none + + + + + http + + + + + + + + + + Default + + + + + + + Edit in Json Editor + + + + + + + + 0 + 0 + + + + QPlainTextEdit::NoWrap + + + true + + + + + + + + + + Response + + + + + + + + 0 + 0 + + + + QPlainTextEdit::NoWrap + + + true + + + + + + false + + + + + + + + + + + Path + + + + + + + / + + + + + + + Host + + + + + + + myhost.mydomain.com + + + + + + + + + + + + + Path + + + + + + + + + + /wsPath + + + + + + + + + Key|Value + + + + + + + Headers + + + + + + + + + + + MTU + + + + + + + + 0 + 0 + + + + 576 + + + 1460 + + + 1350 + + + + + + + TTI (ms) + + + + + + + + 0 + 0 + + + + 10 + + + 100 + + + 50 + + + + + + + Uplink Capacity (MB/s) + + + + + + + + 0 + 0 + + + + 4096 + + + 5 + + + + + + + Congestion + + + + + + + Enabled + + + + + + + Downlink Capacity (MB/s) + + + + + + + + 0 + 0 + + + + 4096 + + + 20 + + + + + + + Read Buffer Size (MB) + + + + + + + + 0 + 0 + + + + 1024 + + + 2 + + + + + + + Write Buffer Size (MB) + + + + + + + + 0 + 0 + + + + 1024 + + + 2 + + + + + + + Type + + + + + + + + 0 + 0 + + + + + none + + + + + srtp + + + + + utp + + + + + wechat-video + + + + + dtls + + + + + wireguard + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Path + + + + + + + + + + /dsPath + + + + + + + + + + + Security + + + + + + + + none + + + + + aes-128-gcm + + + + + chacha20-poly1305 + + + + + + + + Key + + + + + + + + + + keys + + + + + + + Headers + + + + + + + + none + + + + + srtp + + + + + utp + + + + + wechat-video + + + + + dtls + + + + + wireguard + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + 0 + + + + TLS Settings + + + + + + Server + + + + + + + + + + Insecure + + + + + + + Enabled + + + + + + + ALPN + + + + + + + + + + + SOCK Options + + + + + + Mark + + + + + + + + + + TCP Fast Open + + + + + + + Enabled + + + + + + + TProxy Mode + + + + + + + + off + + + + + redirect + + + + + tproxy + + + + + + + + + + + + + diff --git a/translations/en_US.ts b/translations/en_US.ts index 82dcd4bc..d047a9a2 100644 --- a/translations/en_US.ts +++ b/translations/en_US.ts @@ -4,28 +4,23 @@ ConfigExporter - - Empty - - - - + Save Image - - + + Share Connection - + Image has been copied to the clipboard. - + VMess string has been copied to the clipboard. @@ -33,2432 +28,43 @@ ExportConfigWindow - + Export Config - + Share Options - - VMess Connection String + + Connection String - + + Copy Link + + + + Save Image - + Copy Image - - Copy VMess - - - - + OK - ImportConfigWindow - - - Import file - - - - - Name/Prefix - - - - - Import Source - - - - - Existing File - - - - - secs - - - - - Hide Qv2ray - - - - - Subscription Link - - - - - Import - - - - - Path - - - - - - Select - - - - - Inbound - - - - - Keep imported inbound settings - - - - - Edit Config - - - - - Open in JSON Editor - - - - - VMess / QRCode - - - - - VMess Connection String - - - - - From QRCode File - - - - - From Screenshot - - - - - Go - - - - - After - - - - - Place your vmess:// here, one line for each. - - - - - Error List - - - - - VMess - - - - - Subscriptions / Manually Input - - - - - Manually Input Connections - - - - - Route Editor - - - - - Open Route Editor - - - - - Subscription Manager - - - - - Open Subscription Manager - - - - - Connection Editor - - - - - Open Connection Editor - - - - - Cancel - - - - - Select file to import - - - - - Capture QRCode - - - - - Cannot find a valid QRCode from this region. - - - - - Import config file - - - - - Failed to check the validity of the config file. - - - - - Select an image to import - - - - - QRCode scanning failed - - - - - Cannot find any QRCode from the image. - - - - - - - Edit file as JSON - - - - - Provided file not found: - - - - - The file you selected has json syntax error. Continue editing may make you lose data. Would you like to continue? - - - - - Failed to save file, please check if you have proper permissions - - - - - InboundEditor - - - Inbound Editor - - - - - Tag - - - - - Tag of this inbound entry - - - - - Listening - - - - - Hostname or IP Address - - - - - : - - - - - Port: 1080|80-85 - - - - - Protocol - - - - - Allocation Settings - - - - - Strategy - - - - - always - - - - - random - - - - - Refresh - - - - - Concurrency - - - - - Sniffing Settings - - - - - Destination Override - - - - - - - - - Enabled - - - - - HTTP Inbound Settings - - - - - - Timeout - - - - - Allow Transparent - - - - - - - - User Level - - - - - - - - - - - - - Password - - - - - - + - - - - - - Add - - - - - - Username - - - - - - Accounts - - - - - SOCKS Inbound Settings - - - - - Auth - - - - - Enable UDP - - - - - Local UDP IP - - - - - 127.0.0.1 - - - - - Dokodemo-Door Inbound Settings - - - - - IP Address - - - - - Not necessary when setting "Follow Redirect" - - - - - Port - - - - - Network - - - - - TCP - - - - - UDP - - - - - Follow Redirect - - - - - If you want to use tProxy, please go to Preference Window to enable this feature. - - - - - MTProto Inbound Settings - - - - - EMail Address - - - - - Secret - - - - - SECRET - - - - - Inbound type not supported - - - - - The inbound type is not supported by Qv2ray (yet). Please use JsonEditor to change the settings - - - - - Inbound: - - - - - - Removing a user - - - - - - You haven't selected a user yet. - - - - - - Add a user - - - - - - This user exists already. - - - - - JsonEditor - - - Dialog - - - - - OK - - - - - Json Structure Preview - - - - - Format JSON - - - - - Json Editor - - - - - - Json Contains Syntax Errors - - - - - Original Json may contain syntax errors. Json tree is disabled. - - - - - You must correct these errors before continue. - - - - - Syntax Errors - - - - - Please fix the JSON errors before continue - - - - - MainWindow - - - Qv2ray - - - - - - Connect - - - - - - Disconnect - - - - - - Reconnect - - - - - Clear Log - - - - - Subscriptions - - - - - Stopped - - - - - Host List - - - - - Import connection - - - - - Duplicate connection - - - - - Delete a connection - - - - - Edit connection - - - - - Config Details - - - - - Config Type - - - - - Protocol - - - - - Address - - - - - Port Number - - - - - Latency - - - - - Operations - - - - - Edit connection as JSON - - - - - Log (click to switch log source) - - - - - Add - - - - - - Preferences - - - - - Duplicate - - - - - Delete - - - - - Edit - - - - - Edit JSON - - - - - Ping Test - - - - - Share - - - - - Speed Graph - - - - - Speed - - - - - 0.00 B/s -0.00 B/s - - - - - Data - - - - - 0.00 B -0.00 B - - - - - #ManuallyCreateConnection - - - - - #ImportConnection - - - - - #Exit - - - - - #Preferences - - - - - #Start - - - - - #Stop - - - - - #Restart - - - - - - Hide - - - - - Quit - - - - - Rename - - - - - Connect to this - - - - - Edit as Complex Config - - - - - Edit as Json - - - - - Share as QRCode/VMess URL - - - - - Subscription: - - - - - - - Show - - - - - Autostarting a config - - - - - Could not find a specified config named: - - - - - - No connection selected! - - - - - - Please select a config from the list. - - - - - Update - - - - - Found a new version: - - - - - Download Link: - - - - - - - - Connected: - - - - - - Configuring PAC - - - - - Could not start PAC server as it is configured to use SOCKS, but it is not enabled - - - - - Could not start PAC server as it is configured to use HTTP, but it is not enabled - - - - - PAC Processing Failed - - - - - Please reset the settings in Preference Window - - - - - System proxy cleared. - - - - - HTTP or SOCKS inbound is not properly configured for PAC - - - - - Qv2ray will continue, but will not set system proxy. - - - - - Cannot set system proxy - - - - - HTTP inbound is not enabled - - - - - System proxy settings applied. - - - - - Cannot set proxy for complex config. - - - - - Update Subscriptions - - - - - There are subscriptions need to be updated, please go to subscriptions window to update them. - - - - - These subscriptions are out-of-date: - - - - - Disconnected - - - - - Complex - - - - - Simple - - - - - No data - - - - - ms - - - - - - - - - - N/A - - - - - - - Rename a Connection - - - - - V2ray vcore terminated. - - - - - V2ray vcore terminated unexpectedly. - - - - - To solve the problem, read the V2ray log in the log text browser. - - - - - Enable System Proxy - - - - - Disable System Proxy - - - - - System Proxy - - - - - Upload - - - - - Download - - - - - Ping - - - - - Ping All - - - - - - Subscription - - - - - Already connected to: - - - - - Disconnected from: - - - - - Qv2ray is not connected - - - - - The name cannot be empty - - - - - The name has been used already, Please choose another. - - - - - The name you suggested is not valid, please try another. - - - - - Removing Connection(s) - - - - - Are you sure to remove selected connection(s)? - - - - - - Removing this Connection - - - - - - Failed to delete connection file, please delete manually. - - - - - Removing a subscription config - - - - - Do you want to remove the config loaded from a subscription? - - - - - - - No Config Selected - - - - - - - Please Select a Config - - - - - You are about to run latency test on all servers, do you want to continue? - - - - - Testing... - - - - - - Latency Test - - - - - Failed to test latency for this connection. - - - - - Share Connection - - - - - There're no support of sharing configs other than vmess - - - - - OutboundEditor - - - EditConnectionSettings - - - - - Tag - - - - - Tag of this outbound setting - - - - - - Host - - - - - Hostname or IP/IPv6 Address - - - - - - Port - - - - - - - Type - - - - - Socks - - - - - Use Mux - - - - - - - - - - Enabled - - - - - Misc Settings - - - - - Mux Concurrency - - - - - Use Forward Proxy - - - - - Outbound Settings - - - - - UUID - - - - - Alter ID - - - - - - Security - - - - - Use TLS - - - - - Transport - - - - - Transport Settings - - - - - - Default - - - - - Request - - - - - - Edit in Json Editor - - - - - Response - - - - - - - Path - - - - - /wsPath - - - - - - Headers - - - - - MTU - - - - - TTI (ms) - - - - - Uplink Capacity (MB/s) - - - - - Congestion - - - - - Downlink Capacity (MB/s) - - - - - Read Buffer Size (MB) - - - - - Write Buffer Size (MB) - - - - - Key - - - - - keys - - - - - Mark - - - - - TCP Fast Open - - - - - TProxy - - - - - Email - - - - - - Password - - - - - Encryption Method - - - - - Level - - - - - OTA - - - - - Username - - - - - PreferencesWindow - - - - - - - Preferences - - - - - UI Theme - - - - - - - - - - - - - - - - Enabled - - - - - Darkmode UI Icons - - - - - Darkmode Tray Icon - - - - - Language - - - - - zh-CN - - - - - en-US - - - - - Log Level - - - - - none - - - - - debug - - - - - info - - - - - warning - - - - - error - - - - - Config - - - - - Subscription - - - - - Transparent Proxy - - - - - - Select - - - - - Auto Connect - - - - - Remove - - - - - Inbound Settings - - - - - Listening Address - - - - - - HTTP - - - - - SOCKS - - - - - - Set System Proxy - - - - - SOCKS Settings - - - - - - - - Port - - - - - UDP Support - - - - - Launch at Login - - - - - Install - - - - - API Subsystem - - - - - - - Authentication - - - - - - - Username - - - - - - - Password - - - - - HTTP Settings - - - - - PAC Settings - - - - - The system proxy will be configured to use the PAC instead of HTTP and SOCKS. - - - - - Local IP for PAC - - - - - 127.0.0.1 - - - - - Use Proxy - - - - - Import GFWList - - - - - Mirror: Gitlab - - - - - Github - - - - - Mirror: Pagure - - - - - Mirror: Repo.or.cz - - - - - Mirror: Bitbucket - - - - - Mirror: TuxFamily - - - - - GFWList File - - - - - Download with System Proxy - - - - - Go - - - - - Edit PAC - - - - - Open PAC Folder - - - - - PAC Access Path - - - - - Connection Settings - - - - - General Connection Settings - - - - - Enable Proxy - - - - - Bypass Chinese Mainland - - - - - API Port - - - - - Use Local DNS - - - - - Custom DNS List - - - - - Forward Proxy - - - - - Only simple config is supported. - - - - - <!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:'Titillium Web'; font-size:10pt; 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-family:'WenQuanYi Micro Hei';"><br /></p></body></html> - - - - - Type - - - - - Socks - - - - - Host Address - - - - - Network Toolbar Settings - - - - - Apply Network Speed Bar UI Settings - - - - - Items - - - - - General Settings - - - - - UI Settings - - - - - Maximum log lines - - - - - lines - - - - - V2ray Settings - - - - - Core Executable Path - - - - - V2ray Assets Directory - - - - - Check V2ray Core Settings - - - - - UDP Local IP - - - - - - - - - - - - - + - - - - - Page Y Offset - - - - - Pages - - - - - Lines - - - - - This feature is not stable and no documentation is provided, please use it at your own risk! - - - - - Text Style - - - - - Font - - - - - - Bold - - - - - - Italic - - - - - Size - - - - - Color - - - - - A: - - - - - R: - - - - - G: - - - - - B: - - - - - ... - - - - - Style - - - - - Content - - - - - Content Type - - - - - Text/Tag - - - - - You can config how the network speed toolbar looks like in this panel - - - - - About - - - - - Qv2ray - - - - - Version: - - - - - Official Repo: - - - - - License: - - - - - Built Time: - - - - - Ignore Next Version - - - - - Cancel - - - - - About Qt - - - - - Use Darkmode Theme - - - - - Page - - - - - Item(s) - - - - - - Enable tProxy Support - - - - - to this path: - - - - - Qv2ray Network Toolbar is disabled and still under test. Add --withNetworkToolbar to enable. - - - - - Duplicated port numbers detected, please check the port number settings. - - - - - Open V2ray assets folder - - - - - Open V2ray core file - - - - - This will append capabilities to the V2ray executable. - - - - - Qv2ray will copy your V2ray core to this path: - - - - - If anything goes wrong after enabling this, please check issue #57 or the link below: - - - - - Qv2ray cannot copy one or both V2ray files from: - - - - - - Failed to setcap onto V2ray executable. You may need to run `setcap` manually. - - - - - tProxy is not supported on macOS and Windows - - - - - Apply network toolbar settings - - - - - All other modified settings will be applied as well after this object. - - - - - Do you want to continue? - - - - - Dark Mode - - - - - Please restart Qv2ray to fully apply this feature. - - - - - Select GFWList in base64 - - - - - Download GFWList - - - - - Successfully downloaded GFWList. - - - - - - Start with boot - - - - - - Failed to set auto start option. - - - - - - V2ray Core Settings - - - - - V2ray path configuration check passed. - - - - - Current version of V2ray is: - - - - - QObject - - - VMess string should start with 'vmess://' - - - - - VMess string should be a valid base64 string - - - - - JSON should not be empty - - - - - Warning - - - - - Qv2ray cannot load the config file from here: - - - - - Cannot Start Qv2ray - - - - - Cannot find a place to store config files. - - - - - Qv2ray has searched these paths below: - - - - - - - Qv2ray will now exit. - - - - - Failed to initialise Qv2ray - - - - - Failed to determine the location of config file. - - - - - Please report if you think it's a bug. - - - - - You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so. - - - - - --> USE IT AT YOUR OWN RISK! - - - - - Cannot load languages - - - - - Qv2ray will continue running, but you cannot change the UI language. - - - - - Qv2ray Cannot Continue - - - - - You are running a lower version of Qv2ray compared to the current config file. - - - - - Please check if there's an issue explaining about it. - - - - - Or submit a new issue if you think this is an error. - - - - - Dependency Missing - - - - - This could be caused by a missing of `openssl` package in your system. - - - - - If you are using an AppImage from Github Action, please report a bug. - - - - - Cannot find openssl libs - - - - - Technical Details - - - - - Connected - - - - - Disconnected - - - - - Custom Text - - - - - Current Time - - - - - Current Date - - - - - Current Qv2ray Version - - - - - Current Connection Name - - - - - Current Connection Status - - - - - Total Upload Speed - - - - - Total Download Speed - - - - - Upload Speed for Specific Tag - - - - - Download Speed for Specific Tag - - - - - Total Uploaded Data - - - - - Total Downloaded Data - - - - - Uploaded Data for Specific Tag - - - - - Downloaded Data for Specific Tag - - - - - - Editing a subscription config - - - - - You are trying to edit a config loaded from subscription. - - - - - All changes will be overwritten when the subscriptions are updated next time. - - - - - Are you still going to do so? - - - - - You should not modity this property of a config from a subscription - - - - - - - N/A - - - - - Qv2ray - A cross-platform Qt frontend for V2ray. - - - - - Disable gRPC API subsystems. - - - - - Explicitly run Qv2ray as root. - - - - - Enable Debug Output - - - - - Enable Qv2ray network toolbar plugin - - - - - QtNodes::FlowScene + FlowScene @@ -2473,509 +79,2772 @@ p, li { white-space: pre-wrap; } - Qv2ray::Components::PACServer + ImportConfigWindow - - PAC Handler + + Import file - - Failed to listen PAC request on this port, please verify the permissions + + Name/Prefix + + + + + Import Source + + + + + Existing File + + + + + secs + + + + + Hide Qv2ray + + + + + Share Link + + + + + Subscription Link + + + + + Import + + + + + Path + + + + + Select + + + + + Inbound + + + + + Keep imported inbound settings + + + + + Edit Config + + + + + Open in JSON Editor + + + + + VMess / QRCode + + + + + VMess Connection String + + + + + From QRCode File + + + + + From Screenshot + + + + + Go + + + + + After + + + + + Place your vmess:// here, one line for each. + + + + + Error List + + + + + Subscriptions / Manually Input + + + + + Manually Input Connections + + + + + Route Editor + + + + + Open Route Editor + + + + + Subscription Manager + + + + + Open Subscription Manager + + + + + Connection Editor + + + + + Open Connection Editor + + + + + Cancel + + + + + Select file to import + + + + + Capture QRCode + + + + + Cannot find a valid QRCode from this region. + + + + + Import config file + + + + + Failed to check the validity of the config file. + + + + + Select an image to import + + + + + QRCode scanning failed + + + + + Cannot find any QRCode from the image. + + + + + + + Edit file as JSON + + + + + Provided file not found: + + + + + The file you selected has json syntax error. Continue editing may make you lose data. Would you like to continue? + + + + + Failed to save file, please check if you have proper permissions - Qv2ray::QvKernelInterations::V2rayKernelInstance + InboundEditor - + + Inbound Editor + + + + + Tag + + + + + Tag of this inbound entry + + + + + Listening + + + + + Hostname or IP Address + + + + + : + + + + + Port: 1080|80-85 + + + + + Protocol + + + + + Allocation Settings + + + + + Strategy + + + + + always + + + + + random + + + + + Refresh + + + + + Concurrency + + + + + Sniffing Settings + + + + + Destination Override + + + + + Enabled + + + + + HTTP Inbound Settings + + + + + Timeout + + + + + Allow Transparent + + + + + User Level + + + + + - + + + + + Password + + + + + + + + + + + Add + + + + + Username + + + + + Accounts + + + + + SOCKS Inbound Settings + + + + + Auth + + + + + Enable UDP + + + + + Local UDP IP + + + + + 127.0.0.1 + + + + + Dokodemo-Door Inbound Settings + + + + + IP Address + + + + + Not necessary when setting "Follow Redirect" + + + + + Port + + + + + Network + + + + + TCP + + + + + UDP + + + + + Follow Redirect + + + + + If you want to use tProxy, please go to Preference Window to enable this feature. + + + + + MTProto Inbound Settings + + + + + EMail Address + + + + + Secret + + + + + SECRET + + + + + Inbound type not supported + + + + + The inbound type is not supported by Qv2ray (yet). Please use JsonEditor to change the settings + + + + + Inbound: + + + + + + Removing a user + + + + + + You haven't selected a user yet. + + + + + + Add a user + + + + + + This user exists already. + + + + + JsonEditor + + + Dialog + + + + + OK + + + + + Json Structure Preview + + + + + Format JSON + + + + + Json Editor + + + + + + Json Contains Syntax Errors + + + + + Original Json may contain syntax errors. Json tree is disabled. + + + + + You must correct these errors before continue. + + + + + Syntax Errors + + + + + Please fix the JSON errors before continue + + + + + MainWindow + + + Qv2ray + + + + + + Connect + + + + + + Disconnect + + + + + + Reconnect + + + + + Clear Log + + + + + Subscriptions + + + + + Stopped + + + + + Host List + + + + + Import connection + + + + + Duplicate connection + + + + + Delete a connection + + + + + Edit connection + + + + + Config Details + + + + + Config Type + + + + + Protocol + + + + + Address + + + + + Port Number + + + + + Latency + + + + + Operations + + + + + Edit connection as JSON + + + + + Log (click to switch log source) + + + + + Add + + + + + + Preferences + + + + + Duplicate + + + + + Delete + + + + + Edit + + + + + Edit JSON + + + + + Ping Test + + + + + Share + + + + + Speed Graph + + + + + Speed + + + + + 0.00 B/s +0.00 B/s + + + + + Data + + + + + 0.00 B +0.00 B + + + + + #ManuallyCreateConnection + + + + + #ImportConnection + + + + + #Exit + + + + + #Preferences + + + + + #Start + + + + + #Stop + + + + + #Restart + + + + + + Hide + + + + + Quit + + + + + Rename + + + + + Connect to this + + + + + Edit as Complex Config + + + + + Edit as Json + + + + + Share as QRCode/VMess URL + + + + + Subscription: + + + + + + + Show + + + + + Autostarting a config + + + + + Could not find a specified config named: + + + + + + No connection selected! + + + + + + Please select a config from the list. + + + + + Update + + + + + Found a new version: + + + + + Download Link: + + + + + + + + Connected: + + + + + + Configuring PAC + + + + + Could not start PAC server as it is configured to use SOCKS, but it is not enabled + + + + + Could not start PAC server as it is configured to use HTTP, but it is not enabled + + + + + PAC Processing Failed + + + + + Please reset the settings in Preference Window + + + + + System proxy cleared. + + + + + HTTP or SOCKS inbound is not properly configured for PAC + + + + + Qv2ray will continue, but will not set system proxy. + + + + + Cannot set system proxy + + + + + HTTP inbound is not enabled + + + + + System proxy settings applied. + + + + + Cannot set proxy for complex config. + + + + + Update Subscriptions + + + + + There are subscriptions need to be updated, please go to subscriptions window to update them. + + + + + These subscriptions are out-of-date: + + + + + Disconnected + + + + + Complex + + + + + Simple + + + + + No data + + + + + ms + + + + + There're no support of sharing configs other than vmess and shadowsocks + + + + + + + + + + N/A + + + + + + + Rename a Connection + + + + + V2ray vcore terminated. + + + + + V2ray vcore terminated unexpectedly. + + + + + To solve the problem, read the V2ray log in the log text browser. + + + + + Enable System Proxy + + + + + Disable System Proxy + + + + + System Proxy + + + + + Ping + + + + + Ping All + + + + + + Subscription + + + + + Already connected to: + + + + + Disconnected from: + + + + + The name cannot be empty + + + + + The name has been used already, Please choose another. + + + + + The name you suggested is not valid, please try another. + + + + + Removing Connection(s) + + + + + Are you sure to remove selected connection(s)? + + + + + + Removing this Connection + + + + + + Failed to delete connection file, please delete manually. + + + + + Removing a subscription config + + + + + Do you want to remove the config loaded from a subscription? + + + + + + + No Config Selected + + + + + + + Please Select a Config + + + + + You are about to run latency test on all servers, do you want to continue? + + + + + Testing... + + + + + + Latency Test + + + + + Failed to test latency for this connection. + + + + + Share Connection + + + + + OutboundEditor + + + Tag + + + + + Tag of this outbound setting + + + + + Host + + + + + Hostname or IP/IPv6 Address + + + + + Port + + + + + Type + + + + + Socks + + + + + Use Mux + + + + + Enabled + + + + + Edit Connection Settings + + + + + Stream Settings + + + + + Misc Settings + + + + + Mux Concurrency + + + + + Use Forward Proxy + + + + + Outbound Settings + + + + + UUID + + + + + Alter ID + + + + + Security + + + + + Email + + + + + Password + + + + + Encryption Method + + + + + chacha20-ietf-poly1305 + + + + + Level + + + + + OTA + + + + + Username + + + + + PreferencesWindow + + + + + + + Preferences + + + + + UI Theme + + + + + Enabled + + + + + Darkmode UI Icons + + + + + Darkmode Tray Icon + + + + + Language + + + + + zh-CN + + + + + en-US + + + + + Log Level + + + + + none + + + + + debug + + + + + info + + + + + warning + + + + + error + + + + + Config + + + + + Subscription + + + + + Transparent Proxy + + + + + Select + + + + + Auto Connect + + + + + Remove + + + + + Inbound Settings + + + + + Listening Address + + + + + HTTP + + + + + SOCKS + + + + + Set System Proxy + + + + + SOCKS Settings + + + + + Port + + + + + UDP Support + + + + + Launch at Login + + + + + Install + + + + + API Subsystem + + + + + Authentication + + + + + Username + + + + + Password + + + + + HTTP Settings + + + + + PAC Settings + + + + + The system proxy will be configured to use the PAC instead of HTTP and SOCKS. + + + + + Local IP for PAC + + + + + 127.0.0.1 + + + + + Use Proxy + + + + + Import GFWList + + + + + Mirror: Gitlab + + + + + Github + + + + + Mirror: Pagure + + + + + Mirror: Repo.or.cz + + + + + Mirror: Bitbucket + + + + + Mirror: TuxFamily + + + + + GFWList File + + + + + Download with System Proxy + + + + + Go + + + + + Edit PAC + + + + + Open PAC Folder + + + + + PAC Access Path + + + + + Connection Settings + + + + + General Connection Settings + + + + + Enable Proxy + + + + + Bypass Chinese Mainland + + + + + API Port + + + + + Use Local DNS + + + + + Custom DNS List + + + + + Forward Proxy + + + + + Only simple config is supported. + + + + + Build Info + + + + + Extra Build Info + + + + + <!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:'Titillium Web'; font-size:10pt; 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-family:'WenQuanYi Micro Hei';"><br /></p></body></html> + + + + + Type + + + + + Socks + + + + + Host Address + + + + + Network Toolbar Settings + + + + + Apply Network Speed Bar UI Settings + + + + + Items + + + + + General Settings + + + + + UI Settings + + + + + Maximum log lines + + + + + lines + + + + + V2ray Settings + + + + + Core Executable Path + + + + + V2ray Assets Directory + + + + + Check V2ray Core Settings + + + + + UDP Local IP + + + + + - + + + + + + + + + + + Page Y Offset + + + + + Pages + + + + + Lines + + + + + This feature is not stable and no documentation is provided, please use it at your own risk! + + + + + Text Style + + + + + Font + + + + + + Bold + + + + + + Italic + + + + + Size + + + + + Color + + + + + A: + + + + + R: + + + + + G: + + + + + B: + + + + + ... + + + + + Style + + + + + Content + + + + + Content Type + + + + + Text/Tag + + + + + You can config how the network speed toolbar looks like in this panel + + + + + About + + + + + Qv2ray + + + + + Version: + + + + + Official Repo: + + + + + License: + + + + + Built Time: + + + + + Ignore Next Version + + + + + Cancel + + + + + About Qt + + + + + Use Darkmode Theme + + + + + Page + + + + + Item(s) + + + + + + Enable tProxy Support + + + + + to this path: + + + + + Qv2ray Network Toolbar is disabled and still under test. Add --withToolbarPlugin to enable. + + + + + Duplicated port numbers detected, please check the port number settings. + + + + + Open V2ray assets folder + + + + + Open V2ray core file + + + + + This will append capabilities to the V2ray executable. + + + + + Qv2ray will copy your V2ray core to this path: + + + + + If anything goes wrong after enabling this, please check issue #57 or the link below: + + + + + Qv2ray cannot copy one or both V2ray files from: + + + + + + Failed to setcap onto V2ray executable. You may need to run `setcap` manually. + + + + + tProxy is not supported on macOS and Windows + + + + + Apply network toolbar settings + + + + + All other modified settings will be applied as well after this object. + + + + + Do you want to continue? + + + + + Dark Mode + + + + + Please restart Qv2ray to fully apply this feature. + + + + + Select GFWList in base64 + + + + + Download GFWList + + + + + Successfully downloaded GFWList. + + + + + + Start with boot + + + + + + Failed to set auto start option. + + + + + + V2ray Core Settings + + + + + V2ray path configuration check passed. + + + + + Current version of V2ray is: + + + + + QObject + + + Unsupported share link format. + + + + + SS URI is too short + + + + + + Can't find the colon separator between method and password + + + + + Can't find the at separator between password and hostname + + + + + Can't find the colon separator between hostname and port + + + + + VMess string should start with 'vmess://' + + + + + VMess string should be a valid base64 string + + + + + JSON should not be empty + + + + + Warning + + + + + Qv2ray cannot load the config file from here: + + + + + Cannot Start Qv2ray + + + + + Cannot find a place to store config files. + + + + + Qv2ray has searched these paths below: + + + + + + + Qv2ray will now exit. + + + + + Failed to initialise Qv2ray + + + + + Failed to determine the location of config file. + + + + + Please report if you think it's a bug. + + + + + You cannot run Qv2ray as root, please use --I-just-wanna-run-with-root if you REALLY want to do so. + + + + + --> USE IT AT YOUR OWN RISK! + + + + + Cannot load languages + + + + + Qv2ray will continue running, but you cannot change the UI language. + + + + + Qv2ray Cannot Continue + + + + + You are running a lower version of Qv2ray compared to the current config file. + + + + + Please check if there's an issue explaining about it. + + + + + Or submit a new issue if you think this is an error. + + + + + Dependency Missing + + + + + This could be caused by a missing of `openssl` package in your system. + + + + + If you are using an AppImage from Github Action, please report a bug. + + + + + Cannot find openssl libs + + + + + Technical Details + + + + + Connected + + + + + Disconnected + + + + + Custom Text + + + + + Current Time + + + + + Current Date + + + + + Current Qv2ray Version + + + + + Current Connection Name + + + + + Current Connection Status + + + + + Total Upload Speed + + + + + Total Download Speed + + + + + Upload Speed for Specific Tag + + + + + Download Speed for Specific Tag + + + + + Total Uploaded Data + + + + + Total Downloaded Data + + + + + Uploaded Data for Specific Tag + + + + + Downloaded Data for Specific Tag + + + + + + Editing a subscription config + + + + + You are trying to edit a config loaded from subscription. + + + + + All changes will be overwritten when the subscriptions are updated next time. + + + + + Are you still going to do so? + + + + + You should not modity this property of a config from a subscription + + + + + + + N/A + + + + + Qv2ray - A cross-platform Qt frontend for V2ray. + + + + + Disable gRPC API subsystems. + + + + + Explicitly run Qv2ray as root. + + + + + Enable Debug Output + + + + + Enable Qv2ray network toolbar plugin + + + + + Qv2ray::components::pac::PACServer + + + PAC Handler + + + + + Failed to listen PAC request on this port, please verify the permissions + + + + + Qv2ray::core::kernel::V2rayKernelInstance + + V2ray core executable not found. - + V2ray core file cannot be opened, please ensure there's a file instead of a folder. - + V2ray assets path is not valid. - + No geoip.dat in assets path. - + No geosite.dat in assets path. - + V2ray core failed with an exit code: - + V2ray core returns empty string. - - Cannot start V2ray - - - - + Configuration Error - + + Cannot start V2ray + + + + V2ray core settings is incorrect. - + The error is: + + + QvInboundNodeModel - - Failed to get statistics data, please check if V2ray is running properly + + Missing or incorrect inputs + + + QvOutboundNodeModel - - API Call Failed + + Missing or incorrect inputs + + + + + QvRuleNodeDataModel + + + Missing or incorrect inputs RouteEditor - - - + + Route Editor - + Route Detail Settings - + Source IP Matches - + Status - + Add default inbound from global config - - + Port - + Tag - - + Add outbound - + Delete outbound - + Edit outbound - + Add Freedom outbound - + Add blackhole outbound - + Routes - + Enabled - + Outbound - + Add new route - + Use Balancers - - + ... - + Target IP List - + Target Domain List - + Network - + TCP - + UDP - + Both - - + Protocol - + Inbound - + Add Inbound - + Add From Global Settings - + Add Outbound - + Add Black Hole - + Add Direct - + Selected Inbound/Outbound Info - + Host - + A rule with no inbound connected means there's no inbound restriction. - + Edit Selection - + Add Route - + Delete Selection - + General Settings - + GroupBox - + Domain Strategy - + Default Outbound - + Rule Order Settings - + Drag and drop to re-order the rules. - + Rule Settings - + Rule Status - + Rule Tag - + HTTP - + TLS - + BitTorrent - + e.g. 80, 443, 8000-8080 - + Balancers - + Users List - - - + + + OK - + Cannot Edit - + This outbound entry is not supported by the GUI editor. - - + + We will launch Json Editor instead. - + Show rule details - + A rule cannot be found: - - - + + + Protocol list changed: - + Balancer is empty, not processing. - + Default rule - + rule - + No Inbound - + No inbound item found: - - - + + + The new tag has been used, we appended a postfix. - + To make this rule ready to use, you need to connect it to an outbound node. - + Remove Items - - + + Please select a node from the graph to continue. - + Error - + Qv2ray entered an unknown state. - + Edit Inbound/Outbound - - + + Edit Inbound - - + + No inbound tag found: - - + + Opening JSON editor - + Unsupported Outbound Type - + Opening default outbound editor. - + Added DIRECT outbound - + Currently, this type of outbound is not supported by the editor. - + Opening default inbound editor - + Removed a balancer entry. - - - + + + Rename tags @@ -2983,151 +2852,383 @@ p, li { white-space: pre-wrap; } ScreenShot - + ScreenShot - + Size - + FG - + Screen Shot + + SpeedPlotView + + + Total Upload + + + + + Total Download + + + + + StreamSettingsWidget + + + Stream Settings Widget + + + + + General Stream Settings + + + + + Transport Protocol + + + + + TLS + + + + + Enabled + + + + + TLS Settings + + + + + Server + + + + + Insecure + + + + + ALPN + + + + + SOCK Options + + + + + Mark + + + + + TCP Fast Open + + + + + TProxy Mode + + + + + Protocol Settings + + + + + Default + + + + + Edit in Json Editor + + + + + Request + + + + + Type + + + + + Response + + + + + Path + + + + + Host + + + + + /wsPath + + + + + Headers + + + + + MTU + + + + + TTI (ms) + + + + + Uplink Capacity (MB/s) + + + + + Congestion + + + + + Downlink Capacity (MB/s) + + + + + Read Buffer Size (MB) + + + + + Write Buffer Size (MB) + + + + + Security + + + + + Key + + + + + keys + + + SubscribeEditor - - - - + + + + Renaming a subscription - + The subscription name is invalid, please try another. - + New name of this subscription has been used already, please suggest another one - + Failed to rename a subscription, this is an unknown error. - + Successfully renamed a subscription - + Update Subscription - + Would you like to reload this subscription from the Url? - + Updating subscriptions - + Failed to process the result from the upstream, please check your Url. + + misc + + + B + bytes + + + + + KiB + kibibytes (1024 bytes) + + + + + MiB + mebibytes (1024 kibibytes) + + + + + GiB + gibibytes (1024 mibibytes) + + + + + TiB + tebibytes (1024 gibibytes) + + + + + PiB + pebibytes (1024 tebibytes) + + + + + EiB + exbibytes (1024 pebibytes) + + + + + /s + per second + + + w_SubscribeEditor - + SubscribeEditor - + Subscription List - + A - + Add Subscription - + Remove Subscription - + D - + Subscription Details - + Subscription Name - + Subscription Address - + Update Interval - + Days - + Last Updated - + Connection List - + Update Subscription With System Proxy - + Update Subscription Data