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;