feat: global utls fingerprint

This commit is contained in:
arm64v8a
2023-04-03 11:20:47 +09:00
parent 158903e43c
commit da3a46869e
9 changed files with 71 additions and 36 deletions

View File

@@ -34,10 +34,11 @@ namespace NekoRay::fmt {
if (!alpn.trimmed().isEmpty()) { if (!alpn.trimmed().isEmpty()) {
tls["alpn"] = QList2QJsonArray(alpn.split(",")); tls["alpn"] = QList2QJsonArray(alpn.split(","));
} }
if (!utlsFingerprint.isEmpty()) { auto fp = utlsFingerprint.isEmpty() ? NekoRay::dataStore->utlsFingerprint : utlsFingerprint;
if (!fp.isEmpty()) {
tls["utls"] = QJsonObject{ tls["utls"] = QJsonObject{
{"enabled", true}, {"enabled", true},
{"fingerprint", utlsFingerprint}, {"fingerprint", fp},
}; };
} }
outbound->insert("tls", tls); outbound->insert("tls", tls);

View File

@@ -47,7 +47,8 @@ namespace NekoRay::fmt {
} }
if (security == "tls") { if (security == "tls") {
bool v5_utls = !utlsFingerprint.isEmpty(); auto fp = utlsFingerprint.isEmpty() ? NekoRay::dataStore->utlsFingerprint : utlsFingerprint;
bool v5_utls = !fp.isEmpty();
QJsonObject tls; QJsonObject tls;
if (allow_insecure || dataStore->skip_cert) tls["allowInsecure"] = true; if (allow_insecure || dataStore->skip_cert) tls["allowInsecure"] = true;
if (!sni.trimmed().isEmpty()) tls["serverName"] = sni; if (!sni.trimmed().isEmpty()) tls["serverName"] = sni;
@@ -65,7 +66,7 @@ namespace NekoRay::fmt {
} }
if (v5_utls) { if (v5_utls) {
streamSettings["utlsSettings"] = QJsonObject{ streamSettings["utlsSettings"] = QJsonObject{
{"imitate", utlsFingerprint}, {"imitate", fp},
{"tlsConfig", tls}, {"tlsConfig", tls},
}; };
streamSettings["security"] = "utls"; streamSettings["security"] = "utls";

View File

@@ -16,9 +16,14 @@ namespace Preset {
"}"; "}";
} // namespace Hysteria } // 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 { namespace SingBox {
inline QStringList VpnImplementation = {"gvisor", "system"}; inline QStringList VpnImplementation = {"gvisor", "system"};
inline QStringList DomainStrategy = {"", "ipv4_only", "ipv6_only", "prefer_ipv4", "prefer_ipv6"}; 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 SingBox
namespace Windows { namespace Windows {

View File

@@ -102,6 +102,7 @@ namespace NekoRay {
bool insecure_hint = true; bool insecure_hint = true;
bool skip_cert = false; bool skip_cert = false;
int enable_js_hook = 0; int enable_js_hook = 0;
QString utlsFingerprint = "";
// Remember // Remember
int remember_spmode = NekoRay::SystemProxyMode::DISABLE; int remember_spmode = NekoRay::SystemProxyMode::DISABLE;

View File

@@ -113,7 +113,7 @@
<translation>اشاره ناامن</translation> <translation>اشاره ناامن</translation>
</message> </message>
<message> <message>
<source>Traffic statistics refresh rate</source> <source>Statistics refresh rate</source>
<translation>نرخ تازه سازی آمار ترافیک</translation> <translation>نرخ تازه سازی آمار ترافیک</translation>
</message> </message>
<message> <message>
@@ -225,10 +225,6 @@
<source>Password</source> <source>Password</source>
<translation>رمز عبور</translation> <translation>رمز عبور</translation>
</message> </message>
<message>
<source>Maybe useful for HiDPI screens.</source>
<translation>شاید برای صفحه نمایش های HiDPI مفید باشد.</translation>
</message>
<message> <message>
<source>Skip TLS certificate authentication by default (allowInsecure)</source> <source>Skip TLS certificate authentication by default (allowInsecure)</source>
<translation>رد شدن از احراز هویت گواهی TLS به طور پیش فرض (allowInsecure)</translation> <translation>رد شدن از احراز هویت گواهی TLS به طور پیش فرض (allowInsecure)</translation>

View File

@@ -108,7 +108,7 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<source>Traffic statistics refresh rate</source> <source>Statistics refresh rate</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
@@ -219,14 +219,14 @@
<source>Password</source> <source>Password</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Maybe useful for HiDPI screens.</source>
<translation> HiDPI </translation>
</message>
<message> <message>
<source>Skip TLS certificate authentication by default (allowInsecure)</source> <source>Skip TLS certificate authentication by default (allowInsecure)</source>
<translation> TLS (allowInsecure)</translation> <translation> TLS (allowInsecure)</translation>
</message> </message>
<message>
<source>Default uTLS Fingerprint</source>
<translation> uTLS </translation>
</message>
</context> </context>
<context> <context>
<name>DialogEditGroup</name> <name>DialogEditGroup</name>

View File

@@ -246,9 +246,12 @@ DialogBasicSettings::DialogBasicSettings(QWidget *parent)
// Security // Security
ui->utlsFingerprint->addItems(IS_NEKO_BOX ? Preset::SingBox::UtlsFingerPrint : Preset::V2Ray::UtlsFingerPrint);
D_LOAD_BOOL(insecure_hint) D_LOAD_BOOL(insecure_hint)
D_LOAD_BOOL(skip_cert) D_LOAD_BOOL(skip_cert)
ui->enable_js_hook->setCurrentIndex(NekoRay::dataStore->enable_js_hook); ui->enable_js_hook->setCurrentIndex(NekoRay::dataStore->enable_js_hook);
ui->utlsFingerprint->setCurrentText(NekoRay::dataStore->utlsFingerprint);
} }
DialogBasicSettings::~DialogBasicSettings() { DialogBasicSettings::~DialogBasicSettings() {
@@ -306,6 +309,7 @@ void DialogBasicSettings::accept() {
D_SAVE_BOOL(insecure_hint) D_SAVE_BOOL(insecure_hint)
D_SAVE_BOOL(skip_cert) D_SAVE_BOOL(skip_cert)
NekoRay::dataStore->enable_js_hook = ui->enable_js_hook->currentIndex(); 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) { if (NekoRay::dataStore->traffic_loop_interval == 0 || NekoRay::dataStore->connection_statistics == false) {

View File

@@ -48,7 +48,7 @@
<item> <item>
<widget class="QPushButton" name="inbound_auth"> <widget class="QPushButton" name="inbound_auth">
<property name="text"> <property name="text">
<string notr="true">Auth</string> <string notr="true"/>
</property> </property>
</widget> </widget>
</item> </item>
@@ -276,19 +276,23 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="horizontalGroupBox_5"> <widget class="QGroupBox" name="groupBox_2">
<layout class="QHBoxLayout" name="horizontalLayout_6"> <layout class="QHBoxLayout" name="horizontalLayout_23">
<item> <item>
<widget class="QCheckBox" name="start_minimal"> <widget class="QLabel" name="label_17">
<property name="text">
<string>Max log lines</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="max_log_line">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text">
<string>Hide dashboard at startup</string>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>
@@ -394,7 +398,7 @@
<item> <item>
<widget class="QLabel" name="label_16"> <widget class="QLabel" name="label_16">
<property name="text"> <property name="text">
<string>Traffic statistics refresh rate</string> <string>Statistics refresh rate</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -445,23 +449,19 @@
<item row="5" column="0"> <item row="5" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_24"> <layout class="QHBoxLayout" name="horizontalLayout_24">
<item> <item>
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="horizontalGroupBox_5">
<layout class="QHBoxLayout" name="horizontalLayout_23"> <layout class="QHBoxLayout" name="horizontalLayout_6">
<item> <item>
<widget class="QLabel" name="label_17"> <widget class="QCheckBox" name="start_minimal">
<property name="text">
<string>Max log lines</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="max_log_line">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text">
<string>Hide dashboard at startup</string>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>
@@ -473,10 +473,10 @@
<item> <item>
<widget class="QCheckBox" name="AA_EnableHighDpiScaling"> <widget class="QCheckBox" name="AA_EnableHighDpiScaling">
<property name="toolTip"> <property name="toolTip">
<string>Maybe useful for HiDPI screens.</string> <string notr="true">Enable Qt::AA_EnableHighDpiScaling, maybe useful for HiDPI screens.</string>
</property> </property>
<property name="text"> <property name="text">
<string notr="true">Qt::AA_EnableHighDpiScaling</string> <string notr="true">HiDPI Screen wrokaround</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -701,6 +701,32 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="horizontalGroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_26">
<item>
<widget class="QLabel" name="label_18">
<property name="text">
<string>Default uTLS Fingerprint</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="utlsFingerprint">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>

View File

@@ -10,6 +10,7 @@
#include "ui/edit/edit_custom.h" #include "ui/edit/edit_custom.h"
#include "fmt/includes.h" #include "fmt/includes.h"
#include "fmt/Preset.hpp"
#include "qv2ray/v2/ui/widgets/editors/w_JsonEditor.hpp" #include "qv2ray/v2/ui/widgets/editors/w_JsonEditor.hpp"
#include "main/GuiUtils.hpp" #include "main/GuiUtils.hpp"
@@ -75,9 +76,9 @@ DialogEditProfile::DialogEditProfile(const QString &_type, int profileOrGroupId,
if (IS_NEKO_BOX) { if (IS_NEKO_BOX) {
ui->header_type->setVisible(false); ui->header_type->setVisible(false);
ui->header_type_l->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 { } 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; int networkBoxVisible = 0;