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",
"dns": "DNS Options",
"inbound": "Inbound Options",
"outbound": "Outbound Options",
"misc": "Misc Options"
},
"pageTitle": "Config Options",
@@ -216,7 +217,13 @@
"setSystemProxy": "Set System Proxy",
"enableFakeDns": "Enable Fake DNS",
"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": {
"pageTitle": "Routing Assets",

View File

@@ -188,6 +188,7 @@
"route": "تنظیمات مسیریاب",
"dns": "تنظیمات DNS",
"inbound": "تنظیمات ورودی",
"outbound": "Outbound Options",
"misc": "تنظیمات متفرقه"
},
"pageTitle": "تنظیمات کانفیگ",
@@ -216,7 +217,13 @@
"setSystemProxy": "تنظیم پروکسی سیستم",
"enableFakeDns": "Enable Fake DNS",
"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": {
"pageTitle": "فایل‌های مسیریابی",

View File

@@ -188,6 +188,7 @@
"route": "Варианты маршрутизации",
"dns": "Параметры DNS",
"inbound": "Входящие параметры",
"outbound": "Outbound Options",
"misc": "Разные параметры"
},
"pageTitle": "Параметры конфигурации",
@@ -216,7 +217,13 @@
"setSystemProxy": "Использовать системный прокси",
"enableFakeDns": "Использовать поддельную DNS",
"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": {
"pageTitle": "Активы маршрутизации",

View File

@@ -188,6 +188,7 @@
"route": "Rota Seçenekleri",
"dns": "DNS Seçenekleri",
"inbound": "Gelen Seçenekler",
"outbound": "Outbound Options",
"misc": "Çeşitli Seçenekler"
},
"pageTitle": "Yapılandırma Seçenekleri",
@@ -216,7 +217,13 @@
"setSystemProxy": "Sistem Proxy'sini Ayarla",
"enableFakeDns": "Sahte DNS'yi Etkinleştir",
"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": {
"pageTitle": "Varlıkları Yönlendirme",

View File

@@ -188,6 +188,7 @@
"route": "路由选项",
"dns": "DNS 选项",
"inbound": "入站选项",
"outbound": "Outbound Options",
"misc": "其它选项"
},
"pageTitle": "配置选项",
@@ -216,7 +217,13 @@
"setSystemProxy": "设置系统代理",
"enableFakeDns": "启用 Fake DNS",
"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": {
"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,
enableFakeDns: persisted.enableFakeDns,
independentDnsCache: persisted.independentDnsCache,
enableTlsFragment: persisted.enableTlsFragment,
tlsFragmentSize: persisted.tlsFragmentSize,
tlsFragmentSleep: persisted.tlsFragmentSleep,
enableTlsMixedSniCase: persisted.enableTlsMixedSniCase,
enableTlsPadding: persisted.enableTlsPadding,
tlsPaddingSize: persisted.tlsPaddingSize,
geoipPath: geoAssetPathResolver.relativePath(
geoAssets.geoip.providerName,
geoAssets.geoip.fileName,

View File

@@ -1,6 +1,7 @@
import 'dart:convert';
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/features/config_option/model/config_option_patch.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 enableFakeDns,
@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;
static ConfigOptionEntity initial = ConfigOptionEntity(
@@ -72,6 +85,13 @@ class ConfigOptionEntity with _$ConfigOptionEntity {
bypassLan: patch.bypassLan ?? bypassLan,
enableFakeDns: patch.enableFakeDns ?? enableFakeDns,
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:hiddify/core/model/range.dart';
import 'package:hiddify/core/utils/json_converters.dart';
import 'package:hiddify/features/log/model/log_level.dart';
import 'package:hiddify/singbox/model/singbox_config_enum.dart';
@@ -32,6 +33,14 @@ class ConfigOptionPatch with _$ConfigOptionPatch {
bool? bypassLan,
bool? enableFakeDns,
bool? independentDnsCache,
bool? enableTlsFragment,
@RangeWithOptionalCeilJsonConverter()
RangeWithOptionalCeil? tlsFragmentSize,
@RangeWithOptionalCeilJsonConverter()
RangeWithOptionalCeil? tlsFragmentSleep,
bool? enableTlsMixedSniCase,
bool? enableTlsPadding,
@RangeWithOptionalCeilJsonConverter() RangeWithOptionalCeil? tlsPaddingSize,
}) = _ConfigOptionPatch;
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:gap/gap.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_patch.dart';
import 'package:hiddify/features/config_option/notifier/config_option_notifier.dart';
@@ -164,18 +165,6 @@ class ConfigOptionsPage extends HookConsumerWidget {
// ),
const SettingsDivider(),
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(
title: Text(t.settings.config.serviceMode),
subtitle: Text(options.serviceMode.present(t)),
@@ -251,6 +240,79 @@ class ConfigOptionsPage extends HookConsumerWidget {
},
),
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),
ListTile(
title: Text(t.settings.config.connectionTestUrl),

View File

@@ -1,6 +1,7 @@
import 'dart:convert';
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/singbox/model/singbox_config_enum.dart';
import 'package:hiddify/singbox/model/singbox_rule.dart';
@@ -36,6 +37,15 @@ class SingboxConfigOption with _$SingboxConfigOption {
required bool bypassLan,
required bool enableFakeDns,
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 geositePath,
required List<SingboxRule> rules,

Submodule libcore updated: 24648282bc...c499693ddc