From b8f0c62446503b4e0ea5717d39b00ce988486376 Mon Sep 17 00:00:00 2001 From: Juliette Cordor Date: Mon, 6 May 2024 22:11:26 +1000 Subject: [PATCH] added files --- Cargo.toml | 5 ++++- src/lib.rs | 50 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5072f84..eb1c11a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,12 @@ [package] edition = "2021" -name = "library-name" +name = "system-proxy" version = "0.1.0" [dependencies] +thiserror = "1.0.59" +windows = { version = "0.56.0", features = ["Win32_Networking_WinInet", "Win32_Foundation"] } +winreg = "0.52.0" [dev-dependencies] cargo-husky = { version = "1.5.0", features = ["user-hooks"] } diff --git a/src/lib.rs b/src/lib.rs index 7d12d9a..374af92 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,46 @@ -pub fn add(left: usize, right: usize) -> usize { - left + right +use std::{ + net::{AddrParseError, IpAddr, SocketAddr}, + str::FromStr, +}; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("IO error: {0}")] + IOError(#[from] std::io::Error), + #[error("AddrParse error: {0}")] + AddrParse(#[from] AddrParseError), + #[error("Missing system proxy configuration")] + MissingProxyConfig, +} + +pub type Result = std::result::Result; + +#[derive(Debug, Clone)] +pub struct SystemProxy { + pub enabled: bool, + pub address: IpAddr, + pub port: u16, } -#[cfg(test)] -mod tests { - use super::*; +impl SystemProxy { + pub fn get_system_proxy() -> Result { + let hklm = winreg::RegKey::predef(winreg::enums::HKEY_LOCAL_MACHINE); + let key = hklm.open_subkey("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters")?; + let enabled = key.get_value("EnableProxy").unwrap_or(0u32) == 1; + let server: String = key.get_value("ProxyServer")?; + + let (host, port) = if server.is_empty() { + return Err(Error::MissingProxyConfig); + } else { + let socket = SocketAddr::from_str(&server)?; + + (socket.ip(), socket.port()) + }; - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); + Ok(Self { + enabled, + address: host, + port, + }) } }