Initial commit
This commit is contained in:
208
plugins/proxy/lib/proxy.dart
Normal file
208
plugins/proxy/lib/proxy.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
27
plugins/proxy/lib/proxy_method_channel.dart
Normal file
27
plugins/proxy/lib/proxy_method_channel.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
32
plugins/proxy/lib/proxy_platform_interface.dart
Normal file
32
plugins/proxy/lib/proxy_platform_interface.dart
Normal 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.');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user