diff --git a/fmt/Bean2CoreObj_box.cpp b/fmt/Bean2CoreObj_box.cpp index 0bd6dea..319a3d5 100644 --- a/fmt/Bean2CoreObj_box.cpp +++ b/fmt/Bean2CoreObj_box.cpp @@ -34,10 +34,11 @@ namespace NekoRay::fmt { if (!alpn.trimmed().isEmpty()) { tls["alpn"] = QList2QJsonArray(alpn.split(",")); } - if (!utlsFingerprint.isEmpty()) { + auto fp = utlsFingerprint.isEmpty() ? NekoRay::dataStore->utlsFingerprint : utlsFingerprint; + if (!fp.isEmpty()) { tls["utls"] = QJsonObject{ {"enabled", true}, - {"fingerprint", utlsFingerprint}, + {"fingerprint", fp}, }; } outbound->insert("tls", tls); diff --git a/fmt/Bean2CoreObj_ray.cpp b/fmt/Bean2CoreObj_ray.cpp index f5962f6..e03c928 100644 --- a/fmt/Bean2CoreObj_ray.cpp +++ b/fmt/Bean2CoreObj_ray.cpp @@ -47,7 +47,8 @@ namespace NekoRay::fmt { } if (security == "tls") { - bool v5_utls = !utlsFingerprint.isEmpty(); + auto fp = utlsFingerprint.isEmpty() ? NekoRay::dataStore->utlsFingerprint : utlsFingerprint; + bool v5_utls = !fp.isEmpty(); QJsonObject tls; if (allow_insecure || dataStore->skip_cert) tls["allowInsecure"] = true; if (!sni.trimmed().isEmpty()) tls["serverName"] = sni; @@ -65,7 +66,7 @@ namespace NekoRay::fmt { } if (v5_utls) { streamSettings["utlsSettings"] = QJsonObject{ - {"imitate", utlsFingerprint}, + {"imitate", fp}, {"tlsConfig", tls}, }; streamSettings["security"] = "utls"; diff --git a/fmt/Preset.hpp b/fmt/Preset.hpp index 7d1ad4e..ea47c2d 100644 --- a/fmt/Preset.hpp +++ b/fmt/Preset.hpp @@ -16,9 +16,14 @@ namespace Preset { "}"; } // namespace Hysteria + namespace V2Ray { + inline QStringList UtlsFingerPrint = {"", "randomized", "randomizedalpn", "randomizednoalpn", "firefox_auto", "firefox_55", "firefox_56", "firefox_63", "firefox_65", "firefox_99", "firefox_102", "firefox_105", "chrome_auto", "chrome_58", "chrome_62", "chrome_70", "chrome_72", "chrome_83", "chrome_87", "chrome_96", "chrome_100", "chrome_102", "ios_auto", "ios_11_1", "ios_12_1", "ios_13", "ios_14", "android_11_okhttp", "edge_auto", "edge_85", "edge_106", "safari_auto", "safari_16_0", "360_auto", "360_7_5", "360_11_0", "qq_auto", "qq_11_1"}; + } // namespace V2Ray + namespace SingBox { inline QStringList VpnImplementation = {"gvisor", "system"}; inline QStringList DomainStrategy = {"", "ipv4_only", "ipv6_only", "prefer_ipv4", "prefer_ipv6"}; + inline QStringList UtlsFingerPrint = {"", "chrome", "firefox", "edge", "safari", "360", "qq", "ios", "android", "random", "randomized"}; } // namespace SingBox namespace Windows { diff --git a/main/NekoRay_DataStore.hpp b/main/NekoRay_DataStore.hpp index dbad23c..b36b8c0 100644 --- a/main/NekoRay_DataStore.hpp +++ b/main/NekoRay_DataStore.hpp @@ -102,6 +102,7 @@ namespace NekoRay { bool insecure_hint = true; bool skip_cert = false; int enable_js_hook = 0; + QString utlsFingerprint = ""; // Remember int remember_spmode = NekoRay::SystemProxyMode::DISABLE; diff --git a/translations/fa_IR.ts b/translations/fa_IR.ts index c085e66..471f5d2 100644 --- a/translations/fa_IR.ts +++ b/translations/fa_IR.ts @@ -113,7 +113,7 @@ اشاره ناامن - Traffic statistics refresh rate + Statistics refresh rate نرخ تازه سازی آمار ترافیک @@ -225,10 +225,6 @@ Password رمز عبور - - Maybe useful for HiDPI screens. - شاید برای صفحه نمایش های HiDPI مفید باشد. - Skip TLS certificate authentication by default (allowInsecure) رد شدن از احراز هویت گواهی TLS به طور پیش فرض (allowInsecure) diff --git a/translations/zh_CN.ts b/translations/zh_CN.ts index 2f7b6d5..f48efb8 100644 --- a/translations/zh_CN.ts +++ b/translations/zh_CN.ts @@ -108,7 +108,7 @@ 提示不安全的配置 - Traffic statistics refresh rate + Statistics refresh rate 流量统计刷新率 @@ -219,14 +219,14 @@ Password 密码 - - Maybe useful for HiDPI screens. - 可能对 HiDPI 屏幕有用。 - Skip TLS certificate authentication by default (allowInsecure) 默认跳过 TLS 证书验证 (allowInsecure) + + Default uTLS Fingerprint + 默认 uTLS 指纹 + DialogEditGroup diff --git a/ui/dialog_basic_settings.cpp b/ui/dialog_basic_settings.cpp index 21b2421..bc7ebd1 100644 --- a/ui/dialog_basic_settings.cpp +++ b/ui/dialog_basic_settings.cpp @@ -246,9 +246,12 @@ DialogBasicSettings::DialogBasicSettings(QWidget *parent) // Security + ui->utlsFingerprint->addItems(IS_NEKO_BOX ? Preset::SingBox::UtlsFingerPrint : Preset::V2Ray::UtlsFingerPrint); + D_LOAD_BOOL(insecure_hint) D_LOAD_BOOL(skip_cert) ui->enable_js_hook->setCurrentIndex(NekoRay::dataStore->enable_js_hook); + ui->utlsFingerprint->setCurrentText(NekoRay::dataStore->utlsFingerprint); } DialogBasicSettings::~DialogBasicSettings() { @@ -306,6 +309,7 @@ void DialogBasicSettings::accept() { D_SAVE_BOOL(insecure_hint) D_SAVE_BOOL(skip_cert) NekoRay::dataStore->enable_js_hook = ui->enable_js_hook->currentIndex(); + NekoRay::dataStore->utlsFingerprint = ui->utlsFingerprint->currentText(); // 关闭连接统计,停止刷新前清空记录。 if (NekoRay::dataStore->traffic_loop_interval == 0 || NekoRay::dataStore->connection_statistics == false) { diff --git a/ui/dialog_basic_settings.ui b/ui/dialog_basic_settings.ui index f6e516d..26ce548 100644 --- a/ui/dialog_basic_settings.ui +++ b/ui/dialog_basic_settings.ui @@ -48,7 +48,7 @@ - Auth + @@ -276,19 +276,23 @@ - - + + - + + + Max log lines + + + + + 0 0 - - Hide dashboard at startup - @@ -394,7 +398,7 @@ - Traffic statistics refresh rate + Statistics refresh rate @@ -445,23 +449,19 @@ - - + + - - - Max log lines - - - - - + 0 0 + + Hide dashboard at startup + @@ -473,10 +473,10 @@ - Maybe useful for HiDPI screens. + Enable Qt::AA_EnableHighDpiScaling, maybe useful for HiDPI screens. - Qt::AA_EnableHighDpiScaling + HiDPI Screen wrokaround @@ -701,6 +701,32 @@ + + + + + 0 + 0 + + + + + + + Default uTLS Fingerprint + + + + + + + true + + + + + + diff --git a/ui/edit/dialog_edit_profile.cpp b/ui/edit/dialog_edit_profile.cpp index 29f2975..21381b8 100644 --- a/ui/edit/dialog_edit_profile.cpp +++ b/ui/edit/dialog_edit_profile.cpp @@ -10,6 +10,7 @@ #include "ui/edit/edit_custom.h" #include "fmt/includes.h" +#include "fmt/Preset.hpp" #include "qv2ray/v2/ui/widgets/editors/w_JsonEditor.hpp" #include "main/GuiUtils.hpp" @@ -75,9 +76,9 @@ DialogEditProfile::DialogEditProfile(const QString &_type, int profileOrGroupId, if (IS_NEKO_BOX) { ui->header_type->setVisible(false); ui->header_type_l->setVisible(false); - if (!ui->utlsFingerprint->count()) ui->utlsFingerprint->addItems({"", "chrome", "firefox", "edge", "safari", "360", "qq", "ios", "android", "random"}); + if (!ui->utlsFingerprint->count()) ui->utlsFingerprint->addItems(Preset::SingBox::UtlsFingerPrint); } else { - if (!ui->utlsFingerprint->count()) ui->utlsFingerprint->addItems({"", "randomized", "randomizedalpn", "randomizednoalpn", "firefox_auto", "firefox_55", "firefox_56", "firefox_63", "firefox_65", "firefox_99", "firefox_102", "firefox_105", "chrome_auto", "chrome_58", "chrome_62", "chrome_70", "chrome_72", "chrome_83", "chrome_87", "chrome_96", "chrome_100", "chrome_102", "ios_auto", "ios_11_1", "ios_12_1", "ios_13", "ios_14", "android_11_okhttp", "edge_auto", "edge_85", "edge_106", "safari_auto", "safari_16_0", "360_auto", "360_7_5", "360_11_0", "qq_auto", "qq_11_1"}); + if (!ui->utlsFingerprint->count()) ui->utlsFingerprint->addItems(Preset::V2Ray::UtlsFingerPrint); } // 传输设置 是否可见 int networkBoxVisible = 0;