Add TLS trick config options

This commit is contained in:
problematicconsumer
2023-12-04 17:36:02 +03:30
parent d434467090
commit 5def216b57
13 changed files with 208 additions and 21 deletions

View File

@@ -188,6 +188,7 @@
"route": "Route Options", "route": "Route Options",
"dns": "DNS Options", "dns": "DNS Options",
"inbound": "Inbound Options", "inbound": "Inbound Options",
"outbound": "Outbound Options",
"misc": "Misc Options" "misc": "Misc Options"
}, },
"pageTitle": "Config Options", "pageTitle": "Config Options",
@@ -216,7 +217,13 @@
"setSystemProxy": "Set System Proxy", "setSystemProxy": "Set System Proxy",
"enableFakeDns": "Enable Fake DNS", "enableFakeDns": "Enable Fake DNS",
"bypassLan": "Bypass Lan", "bypassLan": "Bypass Lan",
"strictRoute": "Strict Route" "strictRoute": "Strict Route",
"enableTlsFragment": "Enable TLS Fragment",
"tlsFragmentSize": "TLS Fragment Size",
"tlsFragmentSleep": "TLS Fragment Sleep",
"enableTlsMixedSniCase": "Enable TLS Mixed SNI Case",
"enableTlsPadding": "Enable TLS Padding",
"tlsPaddingSize": "TLS Padding"
}, },
"geoAssets": { "geoAssets": {
"pageTitle": "Routing Assets", "pageTitle": "Routing Assets",

View File

@@ -188,6 +188,7 @@
"route": "تنظیمات مسیریاب", "route": "تنظیمات مسیریاب",
"dns": "تنظیمات DNS", "dns": "تنظیمات DNS",
"inbound": "تنظیمات ورودی", "inbound": "تنظیمات ورودی",
"outbound": "Outbound Options",
"misc": "تنظیمات متفرقه" "misc": "تنظیمات متفرقه"
}, },
"pageTitle": "تنظیمات کانفیگ", "pageTitle": "تنظیمات کانفیگ",
@@ -216,7 +217,13 @@
"setSystemProxy": "تنظیم پروکسی سیستم", "setSystemProxy": "تنظیم پروکسی سیستم",
"enableFakeDns": "Enable Fake DNS", "enableFakeDns": "Enable Fake DNS",
"bypassLan": "Bypass Lan", "bypassLan": "Bypass Lan",
"strictRoute": "Strict Route" "strictRoute": "Strict Route",
"enableTlsFragment": "Enable TLS Fragment",
"tlsFragmentSize": "TLS Fragment Size",
"tlsFragmentSleep": "TLS Fragment Sleep",
"enableTlsMixedSniCase": "Enable TLS Mixed SNI Case",
"enableTlsPadding": "Enable TLS Padding",
"tlsPaddingSize": "TLS Padding"
}, },
"geoAssets": { "geoAssets": {
"pageTitle": "فایل‌های مسیریابی", "pageTitle": "فایل‌های مسیریابی",
@@ -307,4 +314,4 @@
"short_description": "Auto, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", "short_description": "Auto, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks",
"full_description": "هدف اصلی HiddifyNext ارائه یک کلاینت تونل زنی ایمن، کاربرپسند و کارآمد است. این به شما امکان می دهد تا با استفاده از مجوز VPN-Service، تمام ترافیک یا ترافیک برنامه انتخابی را به یک سرور راه دور مورد نظر خود هدایت کنید.\n\nتوجه: ما هیچ سروری ارائه نمی دهیم. کاربران موظفند با استفاده از سرورهای خود میزبان یا سرورهای مورد اعتماد، فعالیت‌های آنلاین خود را خصوصی نگه دارند.\n \nما از سرورهایی با موارد زیر پشتیبانی می کنیم:\n- لینک اشتراک V2ray/Xray معمولی\n- لینک اشتراک کلش\n- لینک اشتراک Sing-Box\n\nویژگی های منحصر به فرد ما چیست؟\n - کاربر پسند\n - بهینه و سریع\n - به طور خودکار LowestPing را انتخاب کنید\n - نمایش اطلاعات استفاده کاربر\n - به راحتی لینک فرعی را با یک کلیک با استفاده از دیپ لینک وارد کنید\n - رایگان و بدون تبلیغات\n - به راحتی پیوندهای فرعی کاربر را تغییر دهید\n - بیشتر و بیشتر\n\nحمایت کردن:\n- تمام پروتکل های پشتیبانی شده توسط Sing-Box\n- VLESS + xtls \n- VMESS\n- تروجان\n- ShoadowSocks\n- ریالیتی\n- V2ray\n- هیستریا 2\n- TUIC\n- SSH\n- ShadowTLS\n\n\nکد منبع در https://github.com/hiddify/Hiddify-Next وجود دارد\nهسته برنامه بر اساس sing-box منبع باز است.\n\nتوضیحات مجوز:\n- سرویس VPN: از آنجا که هدف این برنامه ارائه یک کلاینت تونل زنی ایمن، کاربر پسند و کارآمد است، ما به این مجوز نیاز داریم تا بتوانیم ترافیک را از طریق تونل به سرور راه دور هدایت کنیم.\n- QUERY ALL PACKAGES: این مجوز برای اجازه دادن به کاربران برای گنجاندن یا حذف برنامه های کاربردی خاص برای تونل زدن استفاده می شود.\n- دریافت بوت تکمیل شد: این مجوز را می توان از تنظیمات برنامه فعال یا غیرفعال کرد تا این برنامه پس از بوت شدن دستگاه فعال شود.\n- اعلان های ارسالی: این مجوز ضروری است زیرا ما از یک سرویس پیش زمینه برای اطمینان از عملکرد مداوم سرویس VPN استفاده می کنیم.\n- این برنامه بدون تبلیغات است. تجزیه و تحلیل و داده های اشکال فقط با رضایت صریح کاربر در اولین استفاده از برنامه اتفاق می افتد." "full_description": "هدف اصلی HiddifyNext ارائه یک کلاینت تونل زنی ایمن، کاربرپسند و کارآمد است. این به شما امکان می دهد تا با استفاده از مجوز VPN-Service، تمام ترافیک یا ترافیک برنامه انتخابی را به یک سرور راه دور مورد نظر خود هدایت کنید.\n\nتوجه: ما هیچ سروری ارائه نمی دهیم. کاربران موظفند با استفاده از سرورهای خود میزبان یا سرورهای مورد اعتماد، فعالیت‌های آنلاین خود را خصوصی نگه دارند.\n \nما از سرورهایی با موارد زیر پشتیبانی می کنیم:\n- لینک اشتراک V2ray/Xray معمولی\n- لینک اشتراک کلش\n- لینک اشتراک Sing-Box\n\nویژگی های منحصر به فرد ما چیست؟\n - کاربر پسند\n - بهینه و سریع\n - به طور خودکار LowestPing را انتخاب کنید\n - نمایش اطلاعات استفاده کاربر\n - به راحتی لینک فرعی را با یک کلیک با استفاده از دیپ لینک وارد کنید\n - رایگان و بدون تبلیغات\n - به راحتی پیوندهای فرعی کاربر را تغییر دهید\n - بیشتر و بیشتر\n\nحمایت کردن:\n- تمام پروتکل های پشتیبانی شده توسط Sing-Box\n- VLESS + xtls \n- VMESS\n- تروجان\n- ShoadowSocks\n- ریالیتی\n- V2ray\n- هیستریا 2\n- TUIC\n- SSH\n- ShadowTLS\n\n\nکد منبع در https://github.com/hiddify/Hiddify-Next وجود دارد\nهسته برنامه بر اساس sing-box منبع باز است.\n\nتوضیحات مجوز:\n- سرویس VPN: از آنجا که هدف این برنامه ارائه یک کلاینت تونل زنی ایمن، کاربر پسند و کارآمد است، ما به این مجوز نیاز داریم تا بتوانیم ترافیک را از طریق تونل به سرور راه دور هدایت کنیم.\n- QUERY ALL PACKAGES: این مجوز برای اجازه دادن به کاربران برای گنجاندن یا حذف برنامه های کاربردی خاص برای تونل زدن استفاده می شود.\n- دریافت بوت تکمیل شد: این مجوز را می توان از تنظیمات برنامه فعال یا غیرفعال کرد تا این برنامه پس از بوت شدن دستگاه فعال شود.\n- اعلان های ارسالی: این مجوز ضروری است زیرا ما از یک سرویس پیش زمینه برای اطمینان از عملکرد مداوم سرویس VPN استفاده می کنیم.\n- این برنامه بدون تبلیغات است. تجزیه و تحلیل و داده های اشکال فقط با رضایت صریح کاربر در اولین استفاده از برنامه اتفاق می افتد."
} }
} }

View File

@@ -188,6 +188,7 @@
"route": "Варианты маршрутизации", "route": "Варианты маршрутизации",
"dns": "Параметры DNS", "dns": "Параметры DNS",
"inbound": "Входящие параметры", "inbound": "Входящие параметры",
"outbound": "Outbound Options",
"misc": "Разные параметры" "misc": "Разные параметры"
}, },
"pageTitle": "Параметры конфигурации", "pageTitle": "Параметры конфигурации",
@@ -216,7 +217,13 @@
"setSystemProxy": "Использовать системный прокси", "setSystemProxy": "Использовать системный прокси",
"enableFakeDns": "Использовать поддельную DNS", "enableFakeDns": "Использовать поддельную DNS",
"bypassLan": "Обход локальной сети", "bypassLan": "Обход локальной сети",
"strictRoute": "Строгая маршрутизация" "strictRoute": "Строгая маршрутизация",
"enableTlsFragment": "Enable TLS Fragment",
"tlsFragmentSize": "TLS Fragment Size",
"tlsFragmentSleep": "TLS Fragment Sleep",
"enableTlsMixedSniCase": "Enable TLS Mixed SNI Case",
"enableTlsPadding": "Enable TLS Padding",
"tlsPaddingSize": "TLS Padding"
}, },
"geoAssets": { "geoAssets": {
"pageTitle": "Активы маршрутизации", "pageTitle": "Активы маршрутизации",

View File

@@ -188,6 +188,7 @@
"route": "Rota Seçenekleri", "route": "Rota Seçenekleri",
"dns": "DNS Seçenekleri", "dns": "DNS Seçenekleri",
"inbound": "Gelen Seçenekler", "inbound": "Gelen Seçenekler",
"outbound": "Outbound Options",
"misc": "Çeşitli Seçenekler" "misc": "Çeşitli Seçenekler"
}, },
"pageTitle": "Yapılandırma Seçenekleri", "pageTitle": "Yapılandırma Seçenekleri",
@@ -216,7 +217,13 @@
"setSystemProxy": "Sistem Proxy'sini Ayarla", "setSystemProxy": "Sistem Proxy'sini Ayarla",
"enableFakeDns": "Sahte DNS'yi Etkinleştir", "enableFakeDns": "Sahte DNS'yi Etkinleştir",
"bypassLan": "Lan'ı Atla", "bypassLan": "Lan'ı Atla",
"strictRoute": "Kesin Rota" "strictRoute": "Kesin Rota",
"enableTlsFragment": "Enable TLS Fragment",
"tlsFragmentSize": "TLS Fragment Size",
"tlsFragmentSleep": "TLS Fragment Sleep",
"enableTlsMixedSniCase": "Enable TLS Mixed SNI Case",
"enableTlsPadding": "Enable TLS Padding",
"tlsPaddingSize": "TLS Padding"
}, },
"geoAssets": { "geoAssets": {
"pageTitle": "Varlıkları Yönlendirme", "pageTitle": "Varlıkları Yönlendirme",
@@ -307,4 +314,4 @@
"short_description": "Otomatik, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks", "short_description": "Otomatik, SSH, VLESS, Vmess, Trojan, Reality, Sing-Box, Clash, Xray, Shadowsocks",
"full_description": "HiddifyNext'in temel hedefi güvenli, kullanıcı dostu ve verimli bir tünel istemcisi sağlamaktır. VPN Hizmeti iznini kullanarak tüm trafiği veya seçilen uygulama trafiğini seçtiğiniz uzak bir sunucuya yönlendirmenizi sağlar. Not: Herhangi bir sunucu sağlamıyoruz; kullanıcıların kendi barındırılan sunucularını veya güvenilir sunucularını kullanarak çevrimiçi etkinliklerinin gizli kalmasını sağlamaları gerekir. Sunucuları aşağıdakilerle destekliyoruz: - Normal V2ray/Xray Abonelik Bağlantısı - Clash Abonelik Bağlantısı - Sing-Box Abonelik Bağlantısı Benzersiz özelliklerimiz nelerdir? - Kullanıcı Dostu - Optimize Edilmiş ve Hızlı - En Düşük Ping'i otomatik olarak seçin - Kullanıcı kullanım bilgilerini gösterin - Derin bağlantı kullanarak tek tıklamayla alt bağlantıyı kolayca içe aktarın - Ücretsiz ve ADS Yok - Kullanıcı alt bağlantılarını kolayca değiştirin - giderek daha fazla Destek: - Sing-Box tarafından desteklenen tüm Protokoller - VLESS + xtls gerçeklik, vizyon - VMESS - Trojan - ShoadowSocks - Reality - V2ray - Hystria2 - TUIC - SSH - ShadowTLS Kaynak kodu https://github.com/hiddify/Hiddify-Next adresinde mevcuttur. Uygulama çekirdeği açık tabanlıdır. kaynak şarkı kutusu. İzin Açıklaması: - VPN Hizmeti: Bu uygulamanın amacı güvenli, kullanıcı dostu ve verimli bir tünel istemcisi sağlamak olduğundan, trafiği tünel aracılığıyla uzak sunucuya yönlendirebilmek için bu izne ihtiyacımız var. - TÜM PAKETLERİ SORGULAYIN: Bu izin, kullanıcıların tünelleme için belirli uygulamaları dahil etmesine veya hariç tutmasına izin vermek için kullanılır. - ALMA ÖNYÜKLEME TAMAMLANDI: Bu izin, cihaz önyüklemesi sırasında bu uygulamayı etkinleştirmek için uygulama ayarlarından etkinleştirilebilir veya devre dışı bırakılabilir. - BİLDİRİMLER SONRASI: VPN hizmetinin sürekli çalışmasını sağlamak için bir ön plan hizmeti kullandığımız için bu izin önemlidir. - Bu uygulama reklam içermez. Analitik ve kilitlenme verileri yalnızca uygulamanın ilk kullanımında kullanıcının açık rızası ile gerçekleşir." "full_description": "HiddifyNext'in temel hedefi güvenli, kullanıcı dostu ve verimli bir tünel istemcisi sağlamaktır. VPN Hizmeti iznini kullanarak tüm trafiği veya seçilen uygulama trafiğini seçtiğiniz uzak bir sunucuya yönlendirmenizi sağlar. Not: Herhangi bir sunucu sağlamıyoruz; kullanıcıların kendi barındırılan sunucularını veya güvenilir sunucularını kullanarak çevrimiçi etkinliklerinin gizli kalmasını sağlamaları gerekir. Sunucuları aşağıdakilerle destekliyoruz: - Normal V2ray/Xray Abonelik Bağlantısı - Clash Abonelik Bağlantısı - Sing-Box Abonelik Bağlantısı Benzersiz özelliklerimiz nelerdir? - Kullanıcı Dostu - Optimize Edilmiş ve Hızlı - En Düşük Ping'i otomatik olarak seçin - Kullanıcı kullanım bilgilerini gösterin - Derin bağlantı kullanarak tek tıklamayla alt bağlantıyı kolayca içe aktarın - Ücretsiz ve ADS Yok - Kullanıcı alt bağlantılarını kolayca değiştirin - giderek daha fazla Destek: - Sing-Box tarafından desteklenen tüm Protokoller - VLESS + xtls gerçeklik, vizyon - VMESS - Trojan - ShoadowSocks - Reality - V2ray - Hystria2 - TUIC - SSH - ShadowTLS Kaynak kodu https://github.com/hiddify/Hiddify-Next adresinde mevcuttur. Uygulama çekirdeği açık tabanlıdır. kaynak şarkı kutusu. İzin Açıklaması: - VPN Hizmeti: Bu uygulamanın amacı güvenli, kullanıcı dostu ve verimli bir tünel istemcisi sağlamak olduğundan, trafiği tünel aracılığıyla uzak sunucuya yönlendirebilmek için bu izne ihtiyacımız var. - TÜM PAKETLERİ SORGULAYIN: Bu izin, kullanıcıların tünelleme için belirli uygulamaları dahil etmesine veya hariç tutmasına izin vermek için kullanılır. - ALMA ÖNYÜKLEME TAMAMLANDI: Bu izin, cihaz önyüklemesi sırasında bu uygulamayı etkinleştirmek için uygulama ayarlarından etkinleştirilebilir veya devre dışı bırakılabilir. - BİLDİRİMLER SONRASI: VPN hizmetinin sürekli çalışmasını sağlamak için bir ön plan hizmeti kullandığımız için bu izin önemlidir. - Bu uygulama reklam içermez. Analitik ve kilitlenme verileri yalnızca uygulamanın ilk kullanımında kullanıcının açık rızası ile gerçekleşir."
} }
} }

View File

@@ -188,6 +188,7 @@
"route": "路由选项", "route": "路由选项",
"dns": "DNS 选项", "dns": "DNS 选项",
"inbound": "入站选项", "inbound": "入站选项",
"outbound": "Outbound Options",
"misc": "其它选项" "misc": "其它选项"
}, },
"pageTitle": "配置选项", "pageTitle": "配置选项",
@@ -216,7 +217,13 @@
"setSystemProxy": "设置系统代理", "setSystemProxy": "设置系统代理",
"enableFakeDns": "启用 Fake DNS", "enableFakeDns": "启用 Fake DNS",
"bypassLan": "绕过局域网", "bypassLan": "绕过局域网",
"strictRoute": "严格路由" "strictRoute": "严格路由",
"enableTlsFragment": "Enable TLS Fragment",
"tlsFragmentSize": "TLS Fragment Size",
"tlsFragmentSleep": "TLS Fragment Sleep",
"enableTlsMixedSniCase": "Enable TLS Mixed SNI Case",
"enableTlsPadding": "Enable TLS Padding",
"tlsPaddingSize": "TLS Padding"
}, },
"geoAssets": { "geoAssets": {
"pageTitle": "路由资源文件", "pageTitle": "路由资源文件",

View File

@@ -1 +1 @@
core.version=0.8.4 core.version=0.9.0

45
lib/core/model/range.dart Normal file
View File

@@ -0,0 +1,45 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'range.freezed.dart';
@freezed
class RangeWithOptionalCeil with _$RangeWithOptionalCeil {
const RangeWithOptionalCeil._();
const factory RangeWithOptionalCeil({
required int min,
int? max,
}) = _RangeWithOptionalCeil;
String format() => "$min${max != null ? "-$max" : ""}";
factory RangeWithOptionalCeil.fromString(String input) =>
switch (input.split("-")) {
[final String min] => RangeWithOptionalCeil(min: int.parse(min)),
[final String min, final String max] => RangeWithOptionalCeil(
min: int.parse(min),
max: int.parse(max),
),
_ => throw Exception("Invalid range: $input"),
};
static RangeWithOptionalCeil? tryParse(String input) {
try {
return RangeWithOptionalCeil.fromString(input);
} catch (_) {
return null;
}
}
}
class RangeWithOptionalCeilJsonConverter
implements JsonConverter<RangeWithOptionalCeil, String> {
const RangeWithOptionalCeilJsonConverter();
@override
RangeWithOptionalCeil fromJson(String json) =>
RangeWithOptionalCeil.fromString(json);
@override
String toJson(RangeWithOptionalCeil object) => object.format();
}

View File

@@ -96,6 +96,12 @@ class ConfigOptionRepositoryImpl
bypassLan: persisted.bypassLan, bypassLan: persisted.bypassLan,
enableFakeDns: persisted.enableFakeDns, enableFakeDns: persisted.enableFakeDns,
independentDnsCache: persisted.independentDnsCache, independentDnsCache: persisted.independentDnsCache,
enableTlsFragment: persisted.enableTlsFragment,
tlsFragmentSize: persisted.tlsFragmentSize,
tlsFragmentSleep: persisted.tlsFragmentSleep,
enableTlsMixedSniCase: persisted.enableTlsMixedSniCase,
enableTlsPadding: persisted.enableTlsPadding,
tlsPaddingSize: persisted.tlsPaddingSize,
geoipPath: geoAssetPathResolver.relativePath( geoipPath: geoAssetPathResolver.relativePath(
geoAssets.geoip.providerName, geoAssets.geoip.providerName,
geoAssets.geoip.fileName, geoAssets.geoip.fileName,

View File

@@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hiddify/core/model/range.dart';
import 'package:hiddify/core/utils/json_converters.dart'; import 'package:hiddify/core/utils/json_converters.dart';
import 'package:hiddify/features/config_option/model/config_option_patch.dart'; import 'package:hiddify/features/config_option/model/config_option_patch.dart';
import 'package:hiddify/features/log/model/log_level.dart'; import 'package:hiddify/features/log/model/log_level.dart';
@@ -37,6 +38,18 @@ class ConfigOptionEntity with _$ConfigOptionEntity {
@Default(false) bool bypassLan, @Default(false) bool bypassLan,
@Default(false) bool enableFakeDns, @Default(false) bool enableFakeDns,
@Default(true) bool independentDnsCache, @Default(true) bool independentDnsCache,
@Default(false) bool enableTlsFragment,
@RangeWithOptionalCeilJsonConverter()
@Default(RangeWithOptionalCeil(min: 10, max: 100))
RangeWithOptionalCeil tlsFragmentSize,
@RangeWithOptionalCeilJsonConverter()
@Default(RangeWithOptionalCeil(min: 50, max: 200))
RangeWithOptionalCeil tlsFragmentSleep,
@Default(false) bool enableTlsMixedSniCase,
@Default(false) bool enableTlsPadding,
@RangeWithOptionalCeilJsonConverter()
@Default(RangeWithOptionalCeil(min: 100, max: 200))
RangeWithOptionalCeil tlsPaddingSize,
}) = _ConfigOptionEntity; }) = _ConfigOptionEntity;
static ConfigOptionEntity initial = ConfigOptionEntity( static ConfigOptionEntity initial = ConfigOptionEntity(
@@ -72,6 +85,13 @@ class ConfigOptionEntity with _$ConfigOptionEntity {
bypassLan: patch.bypassLan ?? bypassLan, bypassLan: patch.bypassLan ?? bypassLan,
enableFakeDns: patch.enableFakeDns ?? enableFakeDns, enableFakeDns: patch.enableFakeDns ?? enableFakeDns,
independentDnsCache: patch.independentDnsCache ?? independentDnsCache, independentDnsCache: patch.independentDnsCache ?? independentDnsCache,
enableTlsFragment: patch.enableTlsFragment ?? enableTlsFragment,
tlsFragmentSize: patch.tlsFragmentSize ?? tlsFragmentSize,
tlsFragmentSleep: patch.tlsFragmentSleep ?? tlsFragmentSleep,
enableTlsMixedSniCase:
patch.enableTlsMixedSniCase ?? enableTlsMixedSniCase,
enableTlsPadding: patch.enableTlsPadding ?? enableTlsPadding,
tlsPaddingSize: patch.tlsPaddingSize ?? tlsPaddingSize,
); );
} }

View File

@@ -1,4 +1,5 @@
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hiddify/core/model/range.dart';
import 'package:hiddify/core/utils/json_converters.dart'; import 'package:hiddify/core/utils/json_converters.dart';
import 'package:hiddify/features/log/model/log_level.dart'; import 'package:hiddify/features/log/model/log_level.dart';
import 'package:hiddify/singbox/model/singbox_config_enum.dart'; import 'package:hiddify/singbox/model/singbox_config_enum.dart';
@@ -32,6 +33,14 @@ class ConfigOptionPatch with _$ConfigOptionPatch {
bool? bypassLan, bool? bypassLan,
bool? enableFakeDns, bool? enableFakeDns,
bool? independentDnsCache, bool? independentDnsCache,
bool? enableTlsFragment,
@RangeWithOptionalCeilJsonConverter()
RangeWithOptionalCeil? tlsFragmentSize,
@RangeWithOptionalCeilJsonConverter()
RangeWithOptionalCeil? tlsFragmentSleep,
bool? enableTlsMixedSniCase,
bool? enableTlsPadding,
@RangeWithOptionalCeilJsonConverter() RangeWithOptionalCeil? tlsPaddingSize,
}) = _ConfigOptionPatch; }) = _ConfigOptionPatch;
factory ConfigOptionPatch.fromJson(Map<String, dynamic> json) => factory ConfigOptionPatch.fromJson(Map<String, dynamic> json) =>

View File

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:hiddify/core/localization/translations.dart'; import 'package:hiddify/core/localization/translations.dart';
import 'package:hiddify/core/model/range.dart';
import 'package:hiddify/features/config_option/model/config_option_entity.dart'; import 'package:hiddify/features/config_option/model/config_option_entity.dart';
import 'package:hiddify/features/config_option/model/config_option_patch.dart'; import 'package:hiddify/features/config_option/model/config_option_patch.dart';
import 'package:hiddify/features/config_option/notifier/config_option_notifier.dart'; import 'package:hiddify/features/config_option/notifier/config_option_notifier.dart';
@@ -164,18 +165,6 @@ class ConfigOptionsPage extends HookConsumerWidget {
// ), // ),
const SettingsDivider(), const SettingsDivider(),
SettingsSection(t.settings.config.section.inbound), SettingsSection(t.settings.config.section.inbound),
// if (PlatformUtils.isDesktop) ...[
// SwitchListTile(
// title: Text(t.settings.config.enableTun),
// value: options.enableTun,
// onChanged: ref.read(enableTunStore.notifier).update,
// ),
// SwitchListTile(
// title: Text(t.settings.config.setSystemProxy),
// value: options.setSystemProxy,
// onChanged: ref.read(setSystemProxyStore.notifier).update,
// ),
// ],
ListTile( ListTile(
title: Text(t.settings.config.serviceMode), title: Text(t.settings.config.serviceMode),
subtitle: Text(options.serviceMode.present(t)), subtitle: Text(options.serviceMode.present(t)),
@@ -251,6 +240,79 @@ class ConfigOptionsPage extends HookConsumerWidget {
}, },
), ),
const SettingsDivider(), const SettingsDivider(),
SettingsSection(t.settings.config.section.outbound),
SwitchListTile(
title: Text(t.settings.config.enableTlsFragment),
value: options.enableTlsFragment,
onChanged: (value) async =>
changeOption(ConfigOptionPatch(enableTlsFragment: value)),
),
ListTile(
title: Text(t.settings.config.tlsFragmentSize),
subtitle: Text(options.tlsFragmentSize.format()),
onTap: () async {
final range = await SettingsInputDialog(
title: t.settings.config.tlsFragmentSize,
initialValue: options.tlsFragmentSize.format(),
resetValue: defaultOptions.tlsFragmentSize.format(),
).show(context);
if (range == null) return;
await changeOption(
ConfigOptionPatch(
tlsFragmentSize: RangeWithOptionalCeil.tryParse(range),
),
);
},
),
ListTile(
title: Text(t.settings.config.tlsFragmentSleep),
subtitle: Text(options.tlsFragmentSleep.format()),
onTap: () async {
final range = await SettingsInputDialog(
title: t.settings.config.tlsFragmentSleep,
initialValue: options.tlsFragmentSleep.format(),
resetValue: defaultOptions.tlsFragmentSleep.format(),
).show(context);
if (range == null) return;
await changeOption(
ConfigOptionPatch(
tlsFragmentSleep: RangeWithOptionalCeil.tryParse(range),
),
);
},
),
SwitchListTile(
title: Text(t.settings.config.enableTlsMixedSniCase),
value: options.enableTlsMixedSniCase,
onChanged: (value) async => changeOption(
ConfigOptionPatch(enableTlsMixedSniCase: value),
),
),
SwitchListTile(
title: Text(t.settings.config.enableTlsPadding),
value: options.enableTlsPadding,
onChanged: (value) async => changeOption(
ConfigOptionPatch(enableTlsPadding: value),
),
),
ListTile(
title: Text(t.settings.config.tlsPaddingSize),
subtitle: Text(options.tlsPaddingSize.format()),
onTap: () async {
final range = await SettingsInputDialog(
title: t.settings.config.tlsPaddingSize,
initialValue: options.tlsPaddingSize.format(),
resetValue: defaultOptions.tlsPaddingSize.format(),
).show(context);
if (range == null) return;
await changeOption(
ConfigOptionPatch(
tlsPaddingSize: RangeWithOptionalCeil.tryParse(range),
),
);
},
),
const SettingsDivider(),
SettingsSection(t.settings.config.section.misc), SettingsSection(t.settings.config.section.misc),
ListTile( ListTile(
title: Text(t.settings.config.connectionTestUrl), title: Text(t.settings.config.connectionTestUrl),

View File

@@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hiddify/core/model/range.dart';
import 'package:hiddify/features/log/model/log_level.dart'; import 'package:hiddify/features/log/model/log_level.dart';
import 'package:hiddify/singbox/model/singbox_config_enum.dart'; import 'package:hiddify/singbox/model/singbox_config_enum.dart';
import 'package:hiddify/singbox/model/singbox_rule.dart'; import 'package:hiddify/singbox/model/singbox_rule.dart';
@@ -36,6 +37,15 @@ class SingboxConfigOption with _$SingboxConfigOption {
required bool bypassLan, required bool bypassLan,
required bool enableFakeDns, required bool enableFakeDns,
required bool independentDnsCache, required bool independentDnsCache,
required bool enableTlsFragment,
@RangeWithOptionalCeilJsonConverter()
required RangeWithOptionalCeil tlsFragmentSize,
@RangeWithOptionalCeilJsonConverter()
required RangeWithOptionalCeil tlsFragmentSleep,
required bool enableTlsMixedSniCase,
required bool enableTlsPadding,
@RangeWithOptionalCeilJsonConverter()
required RangeWithOptionalCeil tlsPaddingSize,
required String geoipPath, required String geoipPath,
required String geositePath, required String geositePath,
required List<SingboxRule> rules, required List<SingboxRule> rules,

Submodule libcore updated: 24648282bc...c499693ddc