feat: windows uses sysproxy.exe for system proxy

This commit is contained in:
huzibaca 2024-10-03 02:09:22 +08:00
parent 44b4187365
commit 9a7826752f
2 changed files with 123 additions and 32 deletions

View File

@ -422,6 +422,12 @@ const resolveEnableLoopback = () =>
downloadURL: `https://github.com/Kuingsmile/uwp-tool/releases/download/latest/enableLoopback.exe`, downloadURL: `https://github.com/Kuingsmile/uwp-tool/releases/download/latest/enableLoopback.exe`,
}); });
const resolveWinSysproxy = () =>
resolveResource({
file: "sysproxy.exe",
downloadURL: `https://github.com/clash-verge-rev/sysproxy/releases/download/${arch}/sysproxy.exe`,
});
const tasks = [ const tasks = [
// { name: "clash", func: resolveClash, retry: 5 }, // { name: "clash", func: resolveClash, retry: 5 },
{ {
@ -455,6 +461,12 @@ const tasks = [
retry: 1, retry: 1,
unixOnly: true, unixOnly: true,
}, },
{
name: "windows-sysproxy",
func: resolveWinSysproxy,
retry: 5,
winOnly: true,
},
]; ];
async function runTask() { async function runTask() {

View File

@ -98,34 +98,80 @@ impl Sysopt {
) )
}; };
if enable == false { #[cfg(not(target_os = "windows"))]
return Ok(()); {
let mut sys = Sysproxy {
enable,
host: String::from("127.0.0.1"),
port,
bypass: get_bypass(),
};
let mut auto = Autoproxy {
enable,
url: format!("http://127.0.0.1:{pac_port}/commands/pac"),
};
if pac {
sys.enable = false;
auto.enable = true;
sys.set_system_proxy()?;
auto.set_auto_proxy()?;
} else {
auto.enable = false;
sys.enable = true;
auto.set_auto_proxy()?;
sys.set_system_proxy()?;
}
}
#[cfg(target_os = "windows")]
{
if !enable {
return self.reset_sysproxy();
}
use crate::core::handle::Handle;
use crate::utils::dirs;
use anyhow::bail;
use tauri_plugin_shell::ShellExt;
let app_handle = Handle::global().app_handle().unwrap();
let binary_path = dirs::app_resources_dir()?;
let sysproxy_exe = binary_path.with_file_name("sysproxy.exe");
if !sysproxy_exe.exists() {
bail!("sysproxy.exe not found");
}
let shell = app_handle.shell();
let output = if pac {
let address = format!("http://{}:{}/pac", "127.0.0.1", port);
let output = tauri::async_runtime::block_on(async move {
shell
.command(sysproxy_exe.as_path().to_str().unwrap())
.args(["opac", address.as_str()])
.output()
.await
.unwrap()
});
output
} else {
let address = format!("{}:{}", "127.0.0.1", port);
let bypass = get_bypass();
let output = tauri::async_runtime::block_on(async move {
shell
.command(sysproxy_exe.as_path().to_str().unwrap())
.args(["global", address.as_str(), bypass.as_ref()])
.output()
.await
.unwrap()
});
output
};
if !output.status.success() {
bail!("sysproxy exe run failed");
}
} }
let mut sys = Sysproxy {
enable,
host: String::from("127.0.0.1"),
port,
bypass: get_bypass(),
};
let mut auto = Autoproxy {
enable,
url: format!("http://127.0.0.1:{pac_port}/commands/pac"),
};
if pac {
sys.enable = false;
auto.enable = true;
sys.set_system_proxy()?;
auto.set_auto_proxy()?;
} else {
auto.enable = false;
sys.enable = true;
auto.set_auto_proxy()?;
sys.set_system_proxy()?;
}
// run the system proxy guard
//self.guard_proxy();
Ok(()) Ok(())
} }
@ -133,13 +179,46 @@ impl Sysopt {
pub fn reset_sysproxy(&self) -> Result<()> { pub fn reset_sysproxy(&self) -> Result<()> {
let _ = self.reset_sysproxy.lock(); let _ = self.reset_sysproxy.lock();
//直接关闭所有代理 //直接关闭所有代理
let mut sysproxy: Sysproxy = Sysproxy::get_system_proxy()?; #[cfg(not(target_os = "windows"))]
sysproxy.enable = false; {
sysproxy.set_system_proxy()?; let mut sysproxy: Sysproxy = Sysproxy::get_system_proxy()?;
let mut autoproxy = Autoproxy::get_auto_proxy()?;
sysproxy.enable = false;
autoproxy.enable = false;
autoproxy.set_auto_proxy()?;
sysproxy.set_system_proxy()?;
}
let mut autoproxy = Autoproxy::get_auto_proxy()?; #[cfg(target_os = "windows")]
autoproxy.enable = false; {
autoproxy.set_auto_proxy()?; use crate::core::handle::Handle;
use crate::utils::dirs;
use anyhow::bail;
use tauri_plugin_shell::ShellExt;
let app_handle = Handle::global().app_handle().unwrap();
let binary_path = dirs::app_resources_dir()?;
let sysproxy_exe = binary_path.with_file_name("sysproxy.exe");
if !sysproxy_exe.exists() {
bail!("sysproxy.exe not found");
}
let shell = app_handle.shell();
let output = tauri::async_runtime::block_on(async move {
shell
.command(sysproxy_exe.as_path().to_str().unwrap())
.args(["set", "1"])
.output()
.await
.unwrap()
});
if !output.status.success() {
bail!("sysproxy exe run failed");
}
}
Ok(()) Ok(())
} }