summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls <emils@mullvad.net>2021-01-29 14:58:17 +0000
committerEmīls <emils@mullvad.net>2021-01-29 14:58:17 +0000
commitf6e4ed4f3865782f03f3da5c491975d20aa40d93 (patch)
treed7c3b389d93b7d6aea20676c4b1c9dd84f42a7b2
parente0b5655614cf2b65cffd136b22106e547b15fb7c (diff)
parent7b05ea25293fbba979752b139b913fd8a8b0b554 (diff)
downloadmullvadvpn-f6e4ed4f3865782f03f3da5c491975d20aa40d93.tar.xz
mullvadvpn-f6e4ed4f3865782f03f3da5c491975d20aa40d93.zip
Merge branch 'win-fix-version-string'
-rw-r--r--Cargo.lock22
-rw-r--r--Cargo.toml2
-rw-r--r--mullvad-daemon/Cargo.toml2
-rw-r--r--mullvad-daemon/src/version_check.rs2
-rw-r--r--mullvad-platform-metadata/src/windows.rs54
-rw-r--r--mullvad-problem-report/Cargo.toml2
-rw-r--r--mullvad-problem-report/src/metadata.rs4
-rw-r--r--talpid-core/Cargo.toml3
-rw-r--r--talpid-core/src/dns/windows/mod.rs42
-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.rs98
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();
+ }
+}