From 8a74764d0f783a0b70899025deb7cb1a9c7b14b1 Mon Sep 17 00:00:00 2001 From: Colton Hurst Date: Mon, 19 May 2025 21:12:36 -0400 Subject: [PATCH] PM-19255: Adding potential fixes as well as refactoring --- apps/browser/store/windows/AppxManifest.xml | 7 ++ apps/desktop/desktop_native/Cargo.lock | 96 +++++++++++++++++-- .../windows_plugin_authenticator/src/lib.rs | 8 +- .../src/pluginauthenticator.rs | 16 +++- 4 files changed, 113 insertions(+), 14 deletions(-) diff --git a/apps/browser/store/windows/AppxManifest.xml b/apps/browser/store/windows/AppxManifest.xml index 9765506a558..2063534f62e 100644 --- a/apps/browser/store/windows/AppxManifest.xml +++ b/apps/browser/store/windows/AppxManifest.xml @@ -44,6 +44,13 @@ DisplayName="Bitwarden Password Manager"> + + + + + + + diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index e6f64c9fc93..031500305b4 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -937,7 +937,7 @@ dependencies = [ "tokio", "tokio-stream", "tokio-util", - "windows-registry", + "windows-registry 0.5.1", "windows_plugin_authenticator", ] @@ -1786,7 +1786,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a793df0d7afeac54f95b471d3af7f0d4fb975699f972341a4b76988d49cdf0c" dependencies = [ "cfg-if", - "windows-targets 0.53.0", + "windows-targets 0.48.5", ] [[package]] @@ -2807,7 +2807,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows-registry", + "windows-registry 0.4.0", ] [[package]] @@ -4147,7 +4147,7 @@ dependencies = [ "windows-interface 0.59.1", "windows-link", "windows-result 0.3.2", - "windows-strings", + "windows-strings 0.4.0", ] [[package]] @@ -4220,6 +4220,17 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result 0.3.2", + "windows-strings 0.3.1", + "windows-targets 0.53.0", +] + [[package]] name = "windows-registry" version = "0.5.1" @@ -4228,7 +4239,7 @@ checksum = "ad1da3e436dc7653dfdf3da67332e22bff09bb0e28b0239e1624499c7830842e" dependencies = [ "windows-link", "windows-result 0.3.2", - "windows-strings", + "windows-strings 0.4.0", ] [[package]] @@ -4249,6 +4260,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-strings" version = "0.4.0" @@ -4300,13 +4320,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -4319,6 +4355,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -4331,6 +4373,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -4343,12 +4391,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -4361,6 +4421,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_plugin_authenticator" version = "0.0.0" @@ -4384,6 +4450,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -4396,6 +4468,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -4408,6 +4486,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.7.10" diff --git a/apps/desktop/desktop_native/windows_plugin_authenticator/src/lib.rs b/apps/desktop/desktop_native/windows_plugin_authenticator/src/lib.rs index 5981ed9860d..1f994a1e55e 100644 --- a/apps/desktop/desktop_native/windows_plugin_authenticator/src/lib.rs +++ b/apps/desktop/desktop_native/windows_plugin_authenticator/src/lib.rs @@ -109,7 +109,7 @@ pub fn register() -> std::result::Result<(), String> { &mut credential_details; std::mem::forget(credential_details); - let mut clsid_string = String::from(format!("{{{}}}",CLSID)); + let mut clsid_string = String::from(format!("{{{}}}", CLSID)); let mut clsid_vec: Vec = clsid_string.encode_utf16().collect(); clsid_vec.push(0); let plugin_clsid: *mut u16 = clsid_vec.as_mut_ptr(); @@ -250,13 +250,15 @@ fn initialize_com_library() -> std::result::Result<(), String> { /// Registers the Bitwarden Plugin Authenticator COM library with Windows. fn register_com_library() -> std::result::Result<(), String> { static FACTORY: windows_core::StaticComObject = - pluginauthenticator::Factory().into_static(); - let clsid: *const GUID = &GUID::from_u128(0xa98925d161f640de9327dc418fcb2ff4); + pluginauthenticator::Factory.into_static(); + //let clsid: *const GUID = &GUID::from_u128(0xa98925d161f640de9327dc418fcb2ff4); + let clsid: *const GUID = &GUID::from_u128(0x0f7dc5d969ce465285726877fd695062); match unsafe { CoRegisterClassObject( clsid, FACTORY.as_interface_ref(), + //FACTORY.as_interface::(), CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, ) diff --git a/apps/desktop/desktop_native/windows_plugin_authenticator/src/pluginauthenticator.rs b/apps/desktop/desktop_native/windows_plugin_authenticator/src/pluginauthenticator.rs index 1579b873c05..75cf48885b0 100644 --- a/apps/desktop/desktop_native/windows_plugin_authenticator/src/pluginauthenticator.rs +++ b/apps/desktop/desktop_native/windows_plugin_authenticator/src/pluginauthenticator.rs @@ -3,9 +3,15 @@ Windows Plugin Authenticator API defined here: https://github.com/microsoft/webauthn/blob/master/experimental/pluginauthenticator.h + + The Factory pattern & COM interactions are based on the examples provided here: + - https://github.com/microsoft/windows-rs/blob/bb15076311bf185400ecd244d47596b8415450fa/crates/tests/libs/implement/tests/class_factory.rs + - https://github.com/microsoft/windows-rs/pull/3531 + - https://kennykerr.ca/rust-getting-started/how-to-implement-com-interface.html */ use windows::Win32::System::Com::*; +use windows::{Foundation::*, Win32::System::Com::*}; use windows_core::*; use crate::util; @@ -52,12 +58,12 @@ pub unsafe trait EXPERIMENTAL_IPluginAuthenticator: IUnknown { fn EXPERIMENTAL_PluginMakeCredential( &self, request: *const ExperimentalWebAuthnPluginOperationRequest, - response: *mut ExperimentalWebAuthnPluginOperationResponse, + response: *mut *mut ExperimentalWebAuthnPluginOperationResponse, ) -> HRESULT; fn EXPERIMENTAL_PluginGetAssertion( &self, request: *const ExperimentalWebAuthnPluginOperationRequest, - response: *mut ExperimentalWebAuthnPluginOperationResponse, + response: *mut *mut ExperimentalWebAuthnPluginOperationResponse, ) -> HRESULT; fn EXPERIMENTAL_PluginCancelOperation( &self, @@ -69,13 +75,13 @@ pub unsafe trait EXPERIMENTAL_IPluginAuthenticator: IUnknown { pub struct PluginAuthenticatorComObject; #[implement(IClassFactory)] -pub struct Factory(); +pub struct Factory; impl EXPERIMENTAL_IPluginAuthenticator_Impl for PluginAuthenticatorComObject_Impl { unsafe fn EXPERIMENTAL_PluginMakeCredential( &self, _request: *const ExperimentalWebAuthnPluginOperationRequest, - _response: *mut ExperimentalWebAuthnPluginOperationResponse, + _response: *mut *mut ExperimentalWebAuthnPluginOperationResponse, ) -> HRESULT { util::message(String::from("EXPERIMENTAL_PluginMakeCredential() called")); HRESULT(0) @@ -84,7 +90,7 @@ impl EXPERIMENTAL_IPluginAuthenticator_Impl for PluginAuthenticatorComObject_Imp unsafe fn EXPERIMENTAL_PluginGetAssertion( &self, _request: *const ExperimentalWebAuthnPluginOperationRequest, - _response: *mut ExperimentalWebAuthnPluginOperationResponse, + _response: *mut *mut ExperimentalWebAuthnPluginOperationResponse, ) -> HRESULT { util::message(String::from("EXPERIMENTAL_PluginGetAssertion() called")); HRESULT(0)