From 120edb23f274749ef721a0e41186fd5b4ad95f2d Mon Sep 17 00:00:00 2001 From: "Leroy.H.Y" Date: Thu, 22 Aug 2019 22:25:45 +0800 Subject: [PATCH 1/2] [patch] avoid removing extra outbounds --- src/QvCoreConfigOperations_Convertion.cpp | 20 -------------------- src/w_ConnectionEditWindow.cpp | 1 + 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/src/QvCoreConfigOperations_Convertion.cpp b/src/QvCoreConfigOperations_Convertion.cpp index 35429d67..45787d90 100644 --- a/src/QvCoreConfigOperations_Convertion.cpp +++ b/src/QvCoreConfigOperations_Convertion.cpp @@ -77,30 +77,10 @@ namespace Qv2ray JSON_ROOT_TRY_REMOVE("inbounds") } - // JSON_ROOT_TRY_REMOVE("log") JSON_ROOT_TRY_REMOVE("api") JSON_ROOT_TRY_REMOVE("stats") - JSON_ROOT_TRY_REMOVE("policy") JSON_ROOT_TRY_REMOVE("dns") - JSON_ROOT_TRY_REMOVE("routing") - QJsonArray outbounds; - - // - // Currently, we only support VMess (And ShadowSocks now). So remove all other types of outbounds. - for (int i = root["outbounds"].toArray().count(); i >= 0 ; i--) { - auto isVMess = root["outbounds"].toArray()[i].toObject()["protocol"].toString() == "vmess"; - auto isSS = root["outbounds"].toArray()[i].toObject()["protocol"].toString() == "shadowsocks"; - - if (isVMess || isSS) { - auto conn = root["outbounds"].toArray()[i].toObject(); - conn.insert("tag", OUTBOUND_TAG_PROXY); - outbounds.append(conn); - } - } - - JSON_ROOT_TRY_REMOVE("outbounds") - root.insert("outbounds", outbounds); return root; } diff --git a/src/w_ConnectionEditWindow.cpp b/src/w_ConnectionEditWindow.cpp index 0003c138..2fa790c1 100644 --- a/src/w_ConnectionEditWindow.cpp +++ b/src/w_ConnectionEditWindow.cpp @@ -25,6 +25,7 @@ ConnectionEditWindow::ConnectionEditWindow(QWidget *parent) vmess = VMessServerObject(); vmess.users.push_back(VMessServerObject::UserObject()); stream = StreamSettingsObject(); + OutboundType = "vmess"; ReLoad_GUI_JSON_ModelContent(); GEN_JSON } From b3efdcf7ecb6e644d88982e89a299b41efa3005d Mon Sep 17 00:00:00 2001 From: "Leroy.H.Y" Date: Thu, 22 Aug 2019 23:12:13 +0800 Subject: [PATCH 2/2] [patch] 2nd patch for avoiding add extra items to imported config file #25 --- src/Qv2rayBase.h | 8 ++++ src/QvCoreConfigOperations_Convertion.cpp | 2 + src/QvCoreConfigOperations_Generation.cpp | 52 ++++++++++++++--------- src/w_ConnectionEditWindow.cpp | 10 +++-- src/w_ImportConfig.cpp | 1 + 5 files changed, 48 insertions(+), 25 deletions(-) diff --git a/src/Qv2rayBase.h b/src/Qv2rayBase.h index ca9499b7..292acc9e 100644 --- a/src/Qv2rayBase.h +++ b/src/Qv2rayBase.h @@ -18,6 +18,14 @@ #define QV2RAY_VCORE_ACCESS_LOG_FILENAME "access.log" #define QV2RAY_VCORE_ERROR_LOG_FILENAME "error.log" +// These is for early-2.0 version, final 2.0 will move these content into global config. +#define QV2RAY_CONFIG_TYPE_FILE "File" +#define QV2RAY_CONFIG_TYPE_MANUAL "Manual" +#define QV2RAY_CONFIG_TYPE_CONNECTIONSTRING "ConnectionString" +#define QV2RAY_CONFIG_TYPE_SUBSCRIPTION "Subscription" +#define QV2RAY_CONFIG_TYPE_JSON_KEY "_qv2ray.configSource" + + // GUI TOOLS #define RED(obj) \ diff --git a/src/QvCoreConfigOperations_Convertion.cpp b/src/QvCoreConfigOperations_Convertion.cpp index 45787d90..fa314ea8 100644 --- a/src/QvCoreConfigOperations_Convertion.cpp +++ b/src/QvCoreConfigOperations_Convertion.cpp @@ -66,6 +66,7 @@ namespace Qv2ray outbounds.append(outbound); root.insert("outbounds", outbounds); root.insert("QV2RAY_ALIAS", QString::fromStdString(vmessConf.ps)); + root.insert(QV2RAY_CONFIG_TYPE_JSON_KEY, QV2RAY_CONFIG_TYPE_CONNECTIONSTRING); RROOT } @@ -81,6 +82,7 @@ namespace Qv2ray JSON_ROOT_TRY_REMOVE("api") JSON_ROOT_TRY_REMOVE("stats") JSON_ROOT_TRY_REMOVE("dns") + root.insert(QV2RAY_CONFIG_TYPE_JSON_KEY, QV2RAY_CONFIG_TYPE_FILE); return root; } diff --git a/src/QvCoreConfigOperations_Generation.cpp b/src/QvCoreConfigOperations_Generation.cpp index 626a29cd..213dba8f 100644 --- a/src/QvCoreConfigOperations_Generation.cpp +++ b/src/QvCoreConfigOperations_Generation.cpp @@ -167,8 +167,13 @@ namespace Qv2ray auto dnsObject = GenerateDNS(gConf.withLocalDNS, dnsList); root.insert("dns", dnsObject); // - auto routeObject = GenerateRoutes(gConf.proxyDefault, gConf.proxyCN); - root.insert("routing", routeObject); + // This is for imported config files as there are routing entries already. + // We don't add extra routings. + // We don't use QV2RAY_CONFIG_TYPE_FILE checking scheme because not all connections have this part. + if (!root.contains("routing")) { + auto routeObject = GenerateRoutes(gConf.proxyDefault, gConf.proxyCN); + root.insert("routing", routeObject); + } // // root.insert("stats", QJsonObject()); @@ -176,20 +181,17 @@ namespace Qv2ray // if (!root.contains("inbounds") || root["inbounds"].toArray().count() == 0) { QJsonArray inboundsObjectList; - // - // This is configured as a global option... - auto conf = GetGlobalConfig(); // HTTP InBound - if (conf.inBoundSettings.http_port != 0) { + if (gConf.inBoundSettings.http_port != 0) { QJsonObject httpInBoundObject; - httpInBoundObject.insert("listen", QString::fromStdString(conf.inBoundSettings.listenip)); - httpInBoundObject.insert("port", conf.inBoundSettings.http_port); + httpInBoundObject.insert("listen", QString::fromStdString(gConf.inBoundSettings.listenip)); + httpInBoundObject.insert("port", gConf.inBoundSettings.http_port); httpInBoundObject.insert("protocol", "http"); httpInBoundObject.insert("tag", "http_IN"); - if (conf.inBoundSettings.http_useAuth) { - auto httpInSettings = GenerateHTTPIN(QList() << conf.inBoundSettings.httpAccount); + if (gConf.inBoundSettings.http_useAuth) { + auto httpInSettings = GenerateHTTPIN(QList() << gConf.inBoundSettings.httpAccount); httpInBoundObject.insert("settings", httpInSettings); } @@ -197,13 +199,13 @@ namespace Qv2ray } // SOCKS InBound - if (conf.inBoundSettings.socks_port != 0) { + if (gConf.inBoundSettings.socks_port != 0) { QJsonObject socksInBoundObject; - socksInBoundObject.insert("listen", QString::fromStdString(conf.inBoundSettings.listenip)); - socksInBoundObject.insert("port", conf.inBoundSettings.socks_port); + socksInBoundObject.insert("listen", QString::fromStdString(gConf.inBoundSettings.listenip)); + socksInBoundObject.insert("port", gConf.inBoundSettings.socks_port); socksInBoundObject.insert("protocol", "socks"); socksInBoundObject.insert("tag", "socks_IN"); - auto socksInSettings = GenerateSocksIN(conf.inBoundSettings.socks_useAuth ? "password" : "noauth", QList() << conf.inBoundSettings.socksAccount); + auto socksInSettings = GenerateSocksIN(gConf.inBoundSettings.socks_useAuth ? "password" : "noauth", QList() << gConf.inBoundSettings.socksAccount); socksInBoundObject.insert("settings", socksInSettings); inboundsObjectList.append(socksInBoundObject); } @@ -212,13 +214,21 @@ namespace Qv2ray root.insert("inbounds", inboundsObjectList); } - QJsonArray outbounds = root["outbounds"].toArray(); - // For DIRECT - outbounds.append(GenerateOutboundEntry("freedom", GenerateFreedomOUT("AsIs", ":0", 0), QJsonObject(), QJsonObject(), "0.0.0.0", OUTBOUND_TAG_DIRECT)); - QJsonObject first = outbounds.first().toObject(); - first.insert("mux", GetRootObject(gConf.mux)); - outbounds[0] = first; - root["outbounds"] = outbounds; + // TODO: MultiOutbound Settings + if(root.contains(QV2RAY_CONFIG_TYPE_JSON_KEY) && root[QV2RAY_CONFIG_TYPE_JSON_KEY] == QV2RAY_CONFIG_TYPE_FILE) { + // Do nothing because it's an imported connection. + } + else { + QJsonArray outbounds = root["outbounds"].toArray(); + // It's not imported so we add new stuff. + + // For DIRECT + outbounds.append(GenerateOutboundEntry("freedom", GenerateFreedomOUT("AsIs", ":0", 0), QJsonObject(), QJsonObject(), "0.0.0.0", OUTBOUND_TAG_DIRECT)); + QJsonObject first = outbounds.first().toObject(); + first.insert("mux", GetRootObject(gConf.mux)); + outbounds[0] = first; + root["outbounds"] = outbounds; + } return root; } } diff --git a/src/w_ConnectionEditWindow.cpp b/src/w_ConnectionEditWindow.cpp index 2fa790c1..f2590c13 100644 --- a/src/w_ConnectionEditWindow.cpp +++ b/src/w_ConnectionEditWindow.cpp @@ -143,28 +143,30 @@ void ConnectionEditWindow::ReLoad_GUI_JSON_ModelContent() void ConnectionEditWindow::on_buttonBox_accepted() { - bool new_config = _alias == ""; - auto alias = new_config ? (ui->ipLineEdit->text() + "_" + ui->portLineEdit->text()) : _alias; + bool is_new_config = _alias == ""; + auto alias = is_new_config ? (ui->ipLineEdit->text() + "_" + ui->portLineEdit->text()) : _alias; // auto outbound = GenerateConnectionJson(); QJsonArray outbounds; outbounds.append(outbound); + // We want to replace because it's connection edit window. if (original.contains("outbounds")) { original.remove("outbounds"); } original.insert("outbounds", outbounds); + original.insert(QV2RAY_CONFIG_TYPE_JSON_KEY, QV2RAY_CONFIG_TYPE_MANUAL); SaveConnectionConfig(original, &alias); auto globalConf = GetGlobalConfig(); - if (new_config) { + if (is_new_config) { // New config... globalConf.configs.push_back(alias.toStdString()); } SetGlobalConfig(globalConf); - emit s_reload_config(!new_config); + emit s_reload_config(!is_new_config); } void ConnectionEditWindow::on_ipLineEdit_textEdited(const QString &arg1) diff --git a/src/w_ImportConfig.cpp b/src/w_ImportConfig.cpp index c529b59e..d51e2866 100644 --- a/src/w_ImportConfig.cpp +++ b/src/w_ImportConfig.cpp @@ -59,6 +59,7 @@ void ImportConfigWindow::on_buttonBox_accepted() int result = VerifyVMessProtocolString(vmess); if (result == 0) { + // This result code passes the validation check. //QvMessageBox(this, tr("#VMessCheck"), tr("#AbleToImportConfig")); } else if (result == -1) { QvMessageBox(this, tr("#VMessCheck"), tr("#NotValidVMessProtocolString"));