Initial commit

This commit is contained in:
chen08209
2024-04-30 23:38:49 +08:00
commit df4d38012b
295 changed files with 33443 additions and 0 deletions

View File

@@ -0,0 +1,208 @@
import 'dart:io';
import 'proxy_platform_interface.dart';
import "package:path/path.dart";
enum ProxyTypes { http, https, socks }
class Proxy extends ProxyPlatform {
static String url = "127.0.0.1";
@override
Future<bool?> startProxy(int port, String? args) async {
bool? isStart = false;
switch (Platform.operatingSystem) {
case "macos":
isStart = await _startProxyWithMacos(port);
break;
case "linux":
isStart = await _startProxyWithLinux(port);
break;
case "windows":
isStart = await ProxyPlatform.instance.startProxy(port, args);
break;
}
if (isStart == true) {
startTime = DateTime.now();
}
return isStart;
}
@override
Future<bool?> stopProxy() async {
bool? isStop = false;
switch (Platform.operatingSystem) {
case "macos":
isStop = await _stopProxyWithMacos();
break;
case "linux":
isStop = await _stopProxyWithLinux();
break;
case "windows":
isStop = await ProxyPlatform.instance.stopProxy();
break;
}
if (isStop == true) {
startTime = null;
}
return isStop;
}
@override
get startTime => ProxyPlatform.instance.startTime;
@override
set startTime(DateTime? dateTime) {
ProxyPlatform.instance.startTime = dateTime;
}
Future<bool> _startProxyWithLinux(int port) async {
try {
final homeDir = Platform.environment['HOME']!;
final configDir = join(homeDir, ".config");
final cmdList = List<List<String>>.empty(growable: true);
final desktop = Platform.environment['XDG_CURRENT_DESKTOP'];
final isKDE = desktop == "KDE";
for (final type in ProxyTypes.values) {
cmdList.add(
["gsettings", "set", "org.gnome.system.proxy", "mode", "manual"],
);
cmdList.add(
[
"gsettings",
"set",
"org.gnome.system.proxy.${type.name}",
"host",
url
],
);
cmdList.add(
[
"gsettings",
"set",
"org.gnome.system.proxy.${type.name}",
"port",
"$port"
],
);
if (isKDE) {
cmdList.add(
[
"kwriteconfig5",
"--file",
"$configDir/kioslaverc",
"--group",
"Proxy Settings",
"--key",
"ProxyType",
"1"
],
);
cmdList.add(
[
"kwriteconfig5",
"--file",
"$configDir/kioslaverc",
"--group",
"Proxy Settings",
"--key",
"${type.name}Proxy",
"${type.name}://$url:$port"
],
);
}
}
for (final cmd in cmdList) {
await Process.run(cmd[0], cmd.sublist(1), runInShell: true);
}
return true;
} catch (_) {
return false;
}
}
Future<bool> _stopProxyWithLinux() async {
try {
final homeDir = Platform.environment['HOME']!;
final configDir = join(homeDir, ".config/");
final cmdList = List<List<String>>.empty(growable: true);
final desktop = Platform.environment['XDG_CURRENT_DESKTOP'];
final isKDE = desktop == "KDE";
cmdList
.add(["gsettings", "set", "org.gnome.system.proxy", "mode", "none"]);
if (isKDE) {
cmdList.add([
"kwriteconfig5",
"--file",
"$configDir/kioslaverc",
"--group",
"Proxy Settings",
"--key",
"ProxyType",
"0"
]);
}
for (final cmd in cmdList) {
await Process.run(cmd[0], cmd.sublist(1));
}
return true;
} catch (_) {
return false;
}
}
Future<bool> _startProxyWithMacos(int port) async {
try {
final devices = await _getNetworkDeviceListWithMacos();
for (final dev in devices) {
await Future.wait([
Process.run(
"/usr/sbin/networksetup", ["-setwebproxystate", dev, "on"]),
Process.run(
"/usr/sbin/networksetup", ["-setwebproxy", dev, url, "$port"]),
Process.run(
"/usr/sbin/networksetup", ["-setsecurewebproxystate", dev, "on"]),
Process.run("/usr/sbin/networksetup",
["-setsecurewebproxy", dev, url, "$port"]),
Process.run("/usr/sbin/networksetup",
["-setsocksfirewallproxystate", dev, "on"]),
Process.run("/usr/sbin/networksetup",
["-setsocksfirewallproxy", dev, url, "$port"]),
]);
}
return true;
} catch (e) {
return false;
}
}
Future<bool> _stopProxyWithMacos() async {
try {
final devices = await _getNetworkDeviceListWithMacos();
for (final dev in devices) {
await Future.wait([
Process.run(
"/usr/sbin/networksetup", ["-setautoproxystate", dev, "off"]),
Process.run(
"/usr/sbin/networksetup", ["-setwebproxystate", dev, "off"]),
Process.run("/usr/sbin/networksetup",
["-setsecurewebproxystate", dev, "off"]),
Process.run("/usr/sbin/networksetup",
["-setsocksfirewallproxystate", dev, "off"]),
]);
}
return true;
} catch (e) {
return false;
}
}
Future<List<String>> _getNetworkDeviceListWithMacos() async {
final res = await Process.run(
"/usr/sbin/networksetup", ["-listallnetworkservices"]);
final lines = res.stdout.toString().split("\n");
lines.removeWhere((element) => element.contains("*"));
return lines;
}
}

View File

@@ -0,0 +1,27 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'proxy_platform_interface.dart';
/// An implementation of [ProxyPlatform] that uses method channels.
class MethodChannelProxy extends ProxyPlatform {
/// The method channel used to interact with the native platform.
@visibleForTesting
final methodChannel = const MethodChannel('proxy');
MethodChannelProxy();
@override
Future<bool?> startProxy(int port, String? args) async {
return await methodChannel.invokeMethod<bool>("StartProxy", {'port': port});
}
@override
Future<bool?> stopProxy() async {
final isStop = await methodChannel.invokeMethod<bool>("StopProxy");
if (isStop == true) {
startTime = null;
}
return isStop;
}
}

View File

@@ -0,0 +1,32 @@
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
import 'proxy_method_channel.dart';
abstract class ProxyPlatform extends PlatformInterface {
/// Constructs a ProxyPlatform.
ProxyPlatform() : super(token: _token);
static final Object _token = Object();
static ProxyPlatform _instance = MethodChannelProxy();
/// The default instance of [ProxyPlatform] to use.
///
/// Defaults to [MethodChannelProxy].
static ProxyPlatform get instance => _instance;
static set instance(ProxyPlatform instance) {
PlatformInterface.verifyToken(instance, _token);
_instance = instance;
}
DateTime? startTime;
Future<bool?> startProxy(int port, String? args) {
throw UnimplementedError('startProxy() has not been implemented.');
}
Future<bool?> stopProxy() {
throw UnimplementedError('stopProxy() has not been implemented.');
}
}