From a2d21df237e5bb45dd2c842a74c33e8a9837ec54 Mon Sep 17 00:00:00 2001 From: 21pages Date: Sat, 31 Oct 2026 16:54:28 +0800 Subject: [PATCH] fix: preserve login method across session windows --- flutter/lib/common/widgets/toolbar.dart | 4 +++- flutter/lib/models/model.dart | 2 -- flutter/lib/web/bridge.dart | 3 +++ src/client/login_method.rs | 25 +++++++++++++++++++++++++ src/flutter_ffi.rs | 2 ++ 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/flutter/lib/common/widgets/toolbar.dart b/flutter/lib/common/widgets/toolbar.dart index b1f84438d..c1964d787 100644 --- a/flutter/lib/common/widgets/toolbar.dart +++ b/flutter/lib/common/widgets/toolbar.dart @@ -579,7 +579,9 @@ List toolbarControls(BuildContext context, String id, FFI ffi) { bool isTerminal = false}) { final connToken = bind.sessionGetConnToken(sessionId: ffi.sessionId); connect(context, id, - loginMethod: ffi.loginMethod, + loginMethod: bind.sessionGetCommonSync( + sessionId: ffi.sessionId, key: 'login_method', param: '') ?? + '', isFileTransfer: isFileTransfer, isViewCamera: isViewCamera, isTerminal: isTerminal, diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 501a6fab9..5e41dac2e 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -4032,7 +4032,6 @@ class FFI { var id = ''; var version = ''; var connType = ConnType.defaultConn; - var loginMethod = ''; var closed = false; /// dialogManager use late to ensure init after main page binding [globalKey] @@ -4127,7 +4126,6 @@ class FFI { List? displays, String loginMethod = '', }) { - this.loginMethod = loginMethod; closed = false; if (isMobile) mobileReset(); assert( diff --git a/flutter/lib/web/bridge.dart b/flutter/lib/web/bridge.dart index 9f601bfa0..a2e7f4fa1 100644 --- a/flutter/lib/web/bridge.dart +++ b/flutter/lib/web/bridge.dart @@ -1966,6 +1966,9 @@ class RustdeskImpl { required String key, required String param, dynamic hint}) { + if (key == 'login_method') { + return js.context.callMethod('getByName', ['login_method']); + } throw UnimplementedError("sessionGetCommonSync"); } diff --git a/src/client/login_method.rs b/src/client/login_method.rs index cdd2de7bf..7d4375edc 100644 --- a/src/client/login_method.rs +++ b/src/client/login_method.rs @@ -19,6 +19,13 @@ impl LoginConfigHandler { pub(crate) fn skips_saved_password(&self) -> bool { self.login_method != LoginMethod::Automatic } + + pub(crate) fn get_login_method(&self) -> &'static str { + match self.login_method { + LoginMethod::Automatic => "", + LoginMethod::Consent => "consent", + } + } } #[cfg(all(test, feature = "flutter"))] @@ -70,9 +77,27 @@ mod tests { None, method.to_owned(), ); + let monitor_session_id = uuid::Uuid::new_v4(); + let monitor_result = crate::flutter_ffi::session_add_existed_sync( + format!("login-method-init-{}", session_id), + monitor_session_id, + vec![0], + false, + ); + let methods = [session_id, monitor_session_id].map(|id| { + crate::flutter_ffi::session_get_common_sync( + id, + "login_method".to_owned(), + String::new(), + ) + .0 + }); + crate::flutter::sessions::remove_session_by_session_id(&monitor_session_id); let session = crate::flutter::sessions::remove_session_by_session_id(&session_id); hbb_common::config::LocalConfig::set_remote_id(&remote_id); assert!(result.0.is_empty(), "{}", result.0); + assert!(monitor_result.0.is_empty(), "{}", monitor_result.0); + assert_eq!(methods, [Some(method.to_owned()), Some(method.to_owned())]); let session = session.unwrap(); let request = session .lc diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 1b7ef4d8f..0d6ca0ab5 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -3055,6 +3055,8 @@ pub fn session_get_common( if let Some(s) = sessions::get_session_by_session_id(&session_id) { let v = if key == "is_screenshot_supported" { s.is_screenshot_supported().to_string() + } else if key == "login_method" { + s.lc.read().unwrap().get_login_method().to_owned() } else { "".to_owned() };