diff options
| author | Emīls <emils@mullvad.net> | 2021-01-29 14:58:17 +0000 |
|---|---|---|
| committer | Emīls <emils@mullvad.net> | 2021-01-29 14:58:17 +0000 |
| commit | f6e4ed4f3865782f03f3da5c491975d20aa40d93 (patch) | |
| tree | d7c3b389d93b7d6aea20676c4b1c9dd84f42a7b2 | |
| parent | e0b5655614cf2b65cffd136b22106e547b15fb7c (diff) | |
| parent | 7b05ea25293fbba979752b139b913fd8a8b0b554 (diff) | |
| download | mullvadvpn-f6e4ed4f3865782f03f3da5c491975d20aa40d93.tar.xz mullvadvpn-f6e4ed4f3865782f03f3da5c491975d20aa40d93.zip | |
Merge branch 'win-fix-version-string'
| -rw-r--r-- | Cargo.lock | 22 | ||||
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | mullvad-daemon/Cargo.toml | 2 | ||||
| -rw-r--r-- | mullvad-daemon/src/version_check.rs | 2 | ||||
| -rw-r--r-- | mullvad-platform-metadata/src/windows.rs | 54 | ||||
| -rw-r--r-- | mullvad-problem-report/Cargo.toml | 2 | ||||
| -rw-r--r-- | mullvad-problem-report/src/metadata.rs | 4 | ||||
| -rw-r--r-- | talpid-core/Cargo.toml | 3 | ||||
| -rw-r--r-- | talpid-core/src/dns/windows/mod.rs | 42 | ||||
| -rw-r--r-- | talpid-platform-metadata/Cargo.toml (renamed from mullvad-platform-metadata/Cargo.toml) | 5 | ||||
| -rw-r--r-- | talpid-platform-metadata/src/android.rs (renamed from mullvad-platform-metadata/src/android.rs) | 0 | ||||
| -rw-r--r-- | talpid-platform-metadata/src/command.rs (renamed from mullvad-platform-metadata/src/command.rs) | 0 | ||||
| -rw-r--r-- | talpid-platform-metadata/src/lib.rs (renamed from mullvad-platform-metadata/src/lib.rs) | 3 | ||||
| -rw-r--r-- | talpid-platform-metadata/src/linux.rs (renamed from mullvad-platform-metadata/src/linux.rs) | 0 | ||||
| -rw-r--r-- | talpid-platform-metadata/src/macos.rs (renamed from mullvad-platform-metadata/src/macos.rs) | 0 | ||||
| -rw-r--r-- | talpid-platform-metadata/src/windows.rs | 98 |
16 files changed, 128 insertions, 111 deletions
diff --git a/Cargo.lock b/Cargo.lock index e067e9cfb2..b5ba8a132e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1243,7 +1243,6 @@ dependencies = [ "log-panics", "mullvad-management-interface", "mullvad-paths", - "mullvad-platform-metadata", "mullvad-rpc", "mullvad-types", "nix 0.19.0", @@ -1254,6 +1253,7 @@ dependencies = [ "serde_json", "simple-signal", "talpid-core", + "talpid-platform-metadata", "talpid-types", "tokio", "triggered", @@ -1322,14 +1322,6 @@ dependencies = [ ] [[package]] -name = "mullvad-platform-metadata" -version = "0.1.0" -dependencies = [ - "rs-release", - "talpid-dbus", -] - -[[package]] name = "mullvad-problem-report" version = "2021.1.0-beta1" dependencies = [ @@ -1340,9 +1332,9 @@ dependencies = [ "err-derive", "lazy_static", "mullvad-paths", - "mullvad-platform-metadata", "mullvad-rpc", "regex", + "talpid-platform-metadata", "talpid-types", "tokio", "uuid", @@ -2567,6 +2559,7 @@ dependencies = [ "socket2", "system-configuration", "talpid-dbus", + "talpid-platform-metadata", "talpid-types", "tempfile", "tokio", @@ -2612,6 +2605,15 @@ dependencies = [ ] [[package]] +name = "talpid-platform-metadata" +version = "0.1.0" +dependencies = [ + "rs-release", + "talpid-dbus", + "winapi 0.3.9", +] + +[[package]] name = "talpid-types" version = "0.1.0" dependencies = [ diff --git a/Cargo.toml b/Cargo.toml index cd57754721..a2ac2f12cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,6 @@ members = [ "mullvad-problem-report", "mullvad-jni", "mullvad-paths", - "mullvad-platform-metadata", "mullvad-types", "mullvad-rpc", # "mullvad-tests", @@ -15,6 +14,7 @@ members = [ "talpid-openvpn-plugin", "talpid-core", "talpid-dbus", + "talpid-platform-metadata", "mullvad-management-interface", ] exclude = ["dist-assets/binaries/shadowsocks-rust"] diff --git a/mullvad-daemon/Cargo.toml b/mullvad-daemon/Cargo.toml index daee54b7bb..03dbd5951e 100644 --- a/mullvad-daemon/Cargo.toml +++ b/mullvad-daemon/Cargo.toml @@ -27,11 +27,11 @@ tokio = { version = "0.2", features = [ "fs", "rt-threaded", "stream", "sync" ] uuid = { version = "0.8", features = ["v4"] } mullvad-paths = { path = "../mullvad-paths" } -mullvad-platform-metadata = { path = "../mullvad-platform-metadata" } mullvad-types = { path = "../mullvad-types" } mullvad-rpc = { path = "../mullvad-rpc" } talpid-core = { path = "../talpid-core" } talpid-types = { path = "../talpid-types" } +talpid-platform-metadata = { path = "../talpid-platform-metadata" } [target.'cfg(not(target_os="android"))'.dependencies] triggered = "0.1.1" diff --git a/mullvad-daemon/src/version_check.rs b/mullvad-daemon/src/version_check.rs index acb2239d37..fbf5947b68 100644 --- a/mullvad-daemon/src/version_check.rs +++ b/mullvad-daemon/src/version_check.rs @@ -140,7 +140,7 @@ impl VersionUpdater { let version_proxy = AppVersionProxy::new(rpc_handle); let cache_path = cache_dir.join(VERSION_INFO_FILENAME); let (tx, rx) = mpsc::channel(1); - let platform_version = mullvad_platform_metadata::short_version(); + let platform_version = talpid_platform_metadata::short_version(); ( Self { diff --git a/mullvad-platform-metadata/src/windows.rs b/mullvad-platform-metadata/src/windows.rs deleted file mode 100644 index 41faf0099b..0000000000 --- a/mullvad-platform-metadata/src/windows.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::collections::HashMap; - -mod command; -use command::command_stdout_lossy; - -pub fn version() -> String { - let system_info = system_info(); - let os_name = system_info.get("OS Name"); - let os_version = system_info.get("OS Version"); - let version = os_name.map(parse_version).unwrap_or(String::from("N/A")); - let full_version = os_version - .map(parse_full_version) - .unwrap_or(String::from("N/A")); - format!("Windows {} ({})", version, full_version) -} - -pub fn short_version() -> String { - let system_info = system_info(); - let os_name = system_info.get("OS Name"); - let version = os_name.map(parse_version).unwrap_or(String::from("N/A")); - format!("Windows {}", version) -} - -fn system_info() -> HashMap<String, String> { - let system_info = - command_stdout_lossy("systeminfo", &["/FO", "LIST"]).unwrap_or_else(String::new); - - let mut info_map = HashMap::new(); - system_info.lines().for_each(|line| { - let mut split = line.split(":"); - if let Some(key) = split.next() { - if let Some(value) = split.next() { - info_map.insert(key.to_owned(), value.to_owned()); - } - } - }); - - info_map -} - -fn parse_version(os_name: &String) -> String { - os_name - .trim() - .trim_start_matches("Microsoft Windows ") - .to_owned() -} - -fn parse_full_version(os_version: &String) -> String { - os_version.trim().to_owned() -} - -pub fn extra_metadata() -> impl Iterator<Item = (String, String)> { - std::iter::empty() -} diff --git a/mullvad-problem-report/Cargo.toml b/mullvad-problem-report/Cargo.toml index 8e415e0e71..c711994164 100644 --- a/mullvad-problem-report/Cargo.toml +++ b/mullvad-problem-report/Cargo.toml @@ -18,9 +18,9 @@ uuid = { version = "0.8", features = ["v4"] } tokio = { version = "0.2", features = [ "rt-core" ] } mullvad-paths = { path = "../mullvad-paths" } -mullvad-platform-metadata = { path = "../mullvad-platform-metadata" } mullvad-rpc = { path = "../mullvad-rpc" } talpid-types = { path = "../talpid-types" } +talpid-platform-metadata = { path = "../talpid-platform-metadata" } [target.'cfg(target_os = "android")'.dependencies] diff --git a/mullvad-problem-report/src/metadata.rs b/mullvad-problem-report/src/metadata.rs index 0d7eecfb47..ac4b8c9255 100644 --- a/mullvad-problem-report/src/metadata.rs +++ b/mullvad-problem-report/src/metadata.rs @@ -9,7 +9,7 @@ pub fn collect() -> BTreeMap<String, String> { "mullvad-product-version".to_owned(), PRODUCT_VERSION.to_owned(), ); - metadata.insert("os".to_owned(), mullvad_platform_metadata::version()); - metadata.extend(mullvad_platform_metadata::extra_metadata()); + metadata.insert("os".to_owned(), talpid_platform_metadata::version()); + metadata.extend(talpid_platform_metadata::extra_metadata()); metadata } diff --git a/talpid-core/Cargo.toml b/talpid-core/Cargo.toml index 1a698402f2..78295fe25d 100644 --- a/talpid-core/Cargo.toml +++ b/talpid-core/Cargo.toml @@ -72,9 +72,10 @@ tun = "0.5" [target.'cfg(windows)'.dependencies] widestring = "0.4" winreg = { version = "0.7", features = ["transactions"] } -winapi = { version = "0.3.6", features = ["handleapi", "ifdef", "libloaderapi", "netioapi", "stringapiset", "synchapi", "winbase", "winuser"] } +winapi = { version = "0.3.6", features = [ "combaseapi", "handleapi", "ifdef", "libloaderapi", "netioapi", "stringapiset", "synchapi", "winbase", "winuser"] } socket2 = "0.3" pnet_packet = "0.26" +talpid-platform-metadata = { path = "../talpid-platform-metadata" } [build-dependencies] tonic-build = { version = "0.3", default-features = false, features = ["transport", "prost"] } diff --git a/talpid-core/src/dns/windows/mod.rs b/talpid-core/src/dns/windows/mod.rs index 17165c2364..59f6ee349d 100644 --- a/talpid-core/src/dns/windows/mod.rs +++ b/talpid-core/src/dns/windows/mod.rs @@ -2,15 +2,9 @@ use crate::logging::windows::{log_sink, LogSink}; use lazy_static::lazy_static; use log::{error, trace, warn}; -use std::{ - env, ffi::OsString, io, iter, mem, net::IpAddr, os::windows::ffi::OsStrExt, path::Path, ptr, -}; +use std::{env, io, net::IpAddr, path::Path}; use talpid_types::ErrorExt; use widestring::WideCString; -use winapi::um::{ - libloaderapi::{GetModuleHandleW, GetProcAddress}, - winnt::RTL_OSVERSIONINFOW, -}; use winreg::{ enums::{HKEY_LOCAL_MACHINE, REG_MULTI_SZ}, transaction::Transaction, @@ -222,8 +216,8 @@ fn reset_dns_cache_policy() -> Result<(), Error> { } fn is_minimum_windows10() -> bool { - match is_minimum_windows10_inner() { - Ok(result) => result, + match talpid_platform_metadata::WindowsVersion::new() { + Ok(version_info) => version_info.major_version() >= 10, Err(error) => { error!( "{}", @@ -234,36 +228,6 @@ fn is_minimum_windows10() -> bool { } } -fn is_minimum_windows10_inner() -> Result<bool, io::Error> { - let rtl_get_version: extern "stdcall" fn(*mut RTL_OSVERSIONINFOW); - - let module_name: Vec<u16> = OsString::from("ntdll") - .as_os_str() - .encode_wide() - .chain(iter::once(0u16)) - .collect(); - - let ntdll = unsafe { GetModuleHandleW(module_name.as_ptr()) }; - if ntdll == ptr::null_mut() { - return Err(io::Error::last_os_error()); - } - - let function_address = - unsafe { GetProcAddress(ntdll, b"RtlGetVersion\0" as *const _ as *const i8) }; - if function_address == ptr::null_mut() { - return Err(io::Error::last_os_error()); - } - - rtl_get_version = unsafe { mem::transmute(function_address) }; - - let mut version_info: RTL_OSVERSIONINFOW = unsafe { std::mem::zeroed() }; - version_info.dwOSVersionInfoSize = mem::size_of_val(&version_info) as u32; - rtl_get_version(&mut version_info); - - Ok(version_info.dwMajorVersion >= 10) -} - - ffi_error!(InitializationResult, Error::Initialization); ffi_error!(DeinitializationResult, Error::Deinitialization); ffi_error!(SettingResult, Error::Setting); diff --git a/mullvad-platform-metadata/Cargo.toml b/talpid-platform-metadata/Cargo.toml index fa33efb362..d75ae1c3f1 100644 --- a/mullvad-platform-metadata/Cargo.toml +++ b/talpid-platform-metadata/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "mullvad-platform-metadata" +name = "talpid-platform-metadata" version = "0.1.0" authors = ["Mullvad VPN"] description = "Platform metadata detection functions" @@ -11,3 +11,6 @@ publish = false [target.'cfg(target_os = "linux")'.dependencies] rs-release = "0.1.7" talpid-dbus = { path = "../talpid-dbus" } + +[target.'cfg(target_os = "windows")'.dependencies] +winapi = { version = "0.3.6", features = ["winbase"] } diff --git a/mullvad-platform-metadata/src/android.rs b/talpid-platform-metadata/src/android.rs index 90d638772e..90d638772e 100644 --- a/mullvad-platform-metadata/src/android.rs +++ b/talpid-platform-metadata/src/android.rs diff --git a/mullvad-platform-metadata/src/command.rs b/talpid-platform-metadata/src/command.rs index 87ed6c40a0..87ed6c40a0 100644 --- a/mullvad-platform-metadata/src/command.rs +++ b/talpid-platform-metadata/src/command.rs diff --git a/mullvad-platform-metadata/src/lib.rs b/talpid-platform-metadata/src/lib.rs index f4ba78eaeb..5fd43e62d4 100644 --- a/mullvad-platform-metadata/src/lib.rs +++ b/talpid-platform-metadata/src/lib.rs @@ -15,3 +15,6 @@ mod imp; mod imp; pub use self::imp::{extra_metadata, short_version, version}; + +#[cfg(target_os = "windows")] +pub use self::imp::WindowsVersion; diff --git a/mullvad-platform-metadata/src/linux.rs b/talpid-platform-metadata/src/linux.rs index 016fb123c3..016fb123c3 100644 --- a/mullvad-platform-metadata/src/linux.rs +++ b/talpid-platform-metadata/src/linux.rs diff --git a/mullvad-platform-metadata/src/macos.rs b/talpid-platform-metadata/src/macos.rs index 9ee496adb1..9ee496adb1 100644 --- a/mullvad-platform-metadata/src/macos.rs +++ b/talpid-platform-metadata/src/macos.rs diff --git a/talpid-platform-metadata/src/windows.rs b/talpid-platform-metadata/src/windows.rs new file mode 100644 index 0000000000..0222f63221 --- /dev/null +++ b/talpid-platform-metadata/src/windows.rs @@ -0,0 +1,98 @@ +use std::{ + ffi::OsString, + io, iter, + mem::{self, MaybeUninit}, + os::windows::ffi::OsStrExt, + ptr, +}; +use winapi::um::{ + libloaderapi::{GetModuleHandleW, GetProcAddress}, + winnt::RTL_OSVERSIONINFOW, +}; + +pub fn version() -> String { + let (major, minor, build) = WindowsVersion::new() + .map(|version_info| { + ( + version_info.major_version().to_string(), + version_info.minor_version().to_string(), + version_info.build_number().to_string(), + ) + }) + .unwrap_or_else(|_| ("N/A".to_string(), "N/A".to_string(), "N/A".to_string())); + + format!("Windows {}.{} Build {}", major, minor, build) +} + +pub fn short_version() -> String { + let version_string = WindowsVersion::new() + .map(|version| version.major_version().to_string()) + .unwrap_or("N/A".into()); + format!("Windows {}", version_string) +} + +pub fn extra_metadata() -> impl Iterator<Item = (String, String)> { + std::iter::empty() +} + + +pub struct WindowsVersion { + inner: RTL_OSVERSIONINFOW, +} + +impl WindowsVersion { + pub fn new() -> Result<WindowsVersion, io::Error> { + let module_name: Vec<u16> = OsString::from("ntdll") + .as_os_str() + .encode_wide() + .chain(iter::once(0u16)) + .collect(); + + + let ntdll = unsafe { GetModuleHandleW(module_name.as_ptr()) }; + if ntdll == ptr::null_mut() { + return Err(io::Error::last_os_error()); + } + + let function_address = + unsafe { GetProcAddress(ntdll, b"RtlGetVersion\0" as *const _ as *const i8) }; + if function_address == ptr::null_mut() { + return Err(io::Error::last_os_error()); + } + + let rtl_get_version: extern "stdcall" fn(*mut RTL_OSVERSIONINFOW) = + unsafe { *(&function_address as *const _ as *const _) }; + + let mut version_info: MaybeUninit<RTL_OSVERSIONINFOW> = mem::MaybeUninit::zeroed(); + unsafe { + (*version_info.as_mut_ptr()).dwOSVersionInfoSize = + mem::size_of_val(&version_info) as u32; + rtl_get_version(version_info.as_mut_ptr()); + + Ok(WindowsVersion { + inner: version_info.assume_init(), + }) + } + } + + pub fn major_version(&self) -> u32 { + self.inner.dwMajorVersion + } + + pub fn minor_version(&self) -> u32 { + self.inner.dwMinorVersion + } + + pub fn build_number(&self) -> u32 { + self.inner.dwBuildNumber + } +} + +#[cfg(test)] +mod test { + use super::*; + #[test] + fn test_windows_version() { + WindowsVersion::new().unwrap(); + } +} |
