-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathwindows.rs
54 lines (43 loc) · 1.79 KB
/
windows.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use crate::{Error, Result, Sysproxy};
use std::{net::SocketAddr, str::FromStr};
use winapi::shared::ntdef::NULL;
use winapi::um::wininet::{
InternetSetOptionA, INTERNET_OPTION_REFRESH, INTERNET_OPTION_SETTINGS_CHANGED,
};
use winreg::{enums, RegKey};
const SUB_KEY: &str = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
impl Sysproxy {
pub fn get_system_proxy() -> Result<Sysproxy> {
let hkcu = RegKey::predef(enums::HKEY_CURRENT_USER);
let cur_var = hkcu.open_subkey_with_flags(SUB_KEY, enums::KEY_READ)?;
let enable = cur_var.get_value::<u32, _>("ProxyEnable")? == 1u32;
let server = cur_var.get_value::<String, _>("ProxyServer")?;
let server = server.as_str();
let socket = SocketAddr::from_str(server).or(Err(Error::ParseStr))?;
let host = socket.ip().to_string();
let port = socket.port();
let bypass = cur_var.get_value("ProxyOverride").unwrap_or("".into());
Ok(Sysproxy {
enable,
host,
port,
bypass,
})
}
pub fn set_system_proxy(&self) -> Result<()> {
let hkcu = RegKey::predef(enums::HKEY_CURRENT_USER);
let cur_var = hkcu.open_subkey_with_flags(SUB_KEY, enums::KEY_SET_VALUE)?;
let enable = if self.enable { 1u32 } else { 0u32 };
let server = format!("{}:{}", self.host, self.port);
let bypass = self.bypass.as_str();
cur_var.set_value("ProxyEnable", &enable)?;
cur_var.set_value("ProxyServer", &server)?;
cur_var.set_value("ProxyOverride", &bypass)?;
// flush settings
unsafe {
InternetSetOptionA(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOptionA(NULL, INTERNET_OPTION_REFRESH, NULL, 0);
}
Ok(())
}
}