feat: v1.7.6 - Split Tunneling (Per-App Proxy) for Desktop
Some checks failed
CI / run (push) Has been cancelled
Some checks failed
CI / run (push) Has been cancelled
Flutter integration: - Update SingboxConfigOption with per-app proxy fields - Add perAppProxyMode, includedApplications, excludedApplications - Read per-app settings from SharedPreferences - Pass settings to libcore via HiddifyOptions libcore backend: - Implement ProcessName routing rules for desktop platforms - Support include mode (whitelist) and exclude mode (blacklist) - Only Chrome/Firefox/etc. specified by name use VPN Version bump: 1.7.5 → 1.7.6 Update libcore submodule to include per-app proxy support
This commit is contained in:
@@ -334,6 +334,32 @@ abstract class ConfigOptions {
|
||||
"",
|
||||
);
|
||||
|
||||
// Per-App Proxy Settings (Desktop platforms)
|
||||
static final perAppProxyMode = PreferencesNotifier.create<String, String>(
|
||||
"per-app-proxy-mode",
|
||||
"off",
|
||||
);
|
||||
|
||||
static final perAppProxyIncludeList = PreferencesNotifier.create<List<String>, String>(
|
||||
"per-app-proxy-include-list",
|
||||
[],
|
||||
mapFrom: (value) {
|
||||
if (value.isEmpty) return [];
|
||||
return value.split(',').map((e) => e.trim()).where((e) => e.isNotEmpty).toList();
|
||||
},
|
||||
mapTo: (value) => value.join(','),
|
||||
);
|
||||
|
||||
static final perAppProxyExcludeList = PreferencesNotifier.create<List<String>, String>(
|
||||
"per-app-proxy-exclude-list",
|
||||
[],
|
||||
mapFrom: (value) {
|
||||
if (value.isEmpty) return [];
|
||||
return value.split(',').map((e) => e.trim()).where((e) => e.isNotEmpty).toList();
|
||||
},
|
||||
mapTo: (value) => value.join(','),
|
||||
);
|
||||
|
||||
static final hasExperimentalFeatures = Provider.autoDispose<bool>(
|
||||
(ref) {
|
||||
final mode = ref.watch(serviceMode);
|
||||
@@ -557,6 +583,10 @@ abstract class ConfigOptions {
|
||||
noiseSize: ref.watch(warpNoiseSize),
|
||||
noiseDelay: ref.watch(warpNoiseDelay),
|
||||
),
|
||||
// Per-App Proxy
|
||||
perAppProxyMode: ref.watch(perAppProxyMode),
|
||||
includedApplications: ref.watch(perAppProxyMode) == 'include' ? ref.watch(perAppProxyIncludeList) : [],
|
||||
excludedApplications: ref.watch(perAppProxyMode) == 'exclude' ? ref.watch(perAppProxyExcludeList) : [],
|
||||
// geoipPath: ref.watch(geoAssetPathResolverProvider).relativePath(
|
||||
// geoAssets.geoip.providerName,
|
||||
// geoAssets.geoip.fileName,
|
||||
|
||||
@@ -52,6 +52,9 @@ class SingboxConfigOption with _$SingboxConfigOption {
|
||||
required SingboxTlsTricks tlsTricks,
|
||||
required SingboxWarpOption warp,
|
||||
required SingboxWarpOption warp2,
|
||||
@JsonKey(name: 'per-app-proxy-mode') @Default('off') String perAppProxyMode,
|
||||
@JsonKey(name: 'included-applications') @Default([]) List<String> includedApplications,
|
||||
@JsonKey(name: 'excluded-applications') @Default([]) List<String> excludedApplications,
|
||||
}) = _SingboxConfigOption;
|
||||
|
||||
String format() {
|
||||
|
||||
Reference in New Issue
Block a user