[fix] refine Windows credential UI state detection

This commit is contained in:
dijunkun
2026-05-27 16:04:38 +08:00
parent a61e74d97b
commit 63a79a90ac
2 changed files with 42 additions and 10 deletions
+28 -6
View File
@@ -591,6 +591,14 @@ const char* DetermineInteractiveStage(bool lock_app_visible,
return "user-desktop"; return "user-desktop";
} }
bool IsCredentialUiVisible(bool prelogin, bool session_locked,
bool logon_ui_running,
bool input_desktop_available,
bool secure_desktop_active) {
return (prelogin || session_locked || secure_desktop_active) &&
(logon_ui_running || !input_desktop_available);
}
std::wstring SecureInputHelperDesktopForStage( std::wstring SecureInputHelperDesktopForStage(
const std::string& interactive_stage) { const std::string& interactive_stage) {
if (interactive_stage == "credential-ui" || if (interactive_stage == "credential-ui" ||
@@ -1323,8 +1331,13 @@ bool CrossDeskServiceHost::IsHelperReportingLockScreenLocked() const {
} }
bool CrossDeskServiceHost::HasSecureInputUiLocked() const { bool CrossDeskServiceHost::HasSecureInputUiLocked() const {
const bool service_host_credential_ui_visible =
!session_helper_status_ok_ &&
IsCredentialUiVisible(prelogin_, session_locked_, logon_ui_visible_,
input_desktop_available_,
secure_desktop_active_);
return IsSasSecureDesktopGraceActiveLocked() || prelogin_ || return IsSasSecureDesktopGraceActiveLocked() || prelogin_ ||
secure_desktop_active_ || logon_ui_visible_ || secure_desktop_active_ || service_host_credential_ui_visible ||
session_helper_report_credential_ui_visible_ || session_helper_report_credential_ui_visible_ ||
session_helper_report_secure_desktop_active_ || session_helper_report_secure_desktop_active_ ||
session_helper_report_unlock_ui_visible_ || session_helper_report_unlock_ui_visible_ ||
@@ -1377,9 +1390,14 @@ std::string CrossDeskServiceHost::ResolveInteractiveStageLocked() const {
return session_helper_report_interactive_stage_; return session_helper_report_interactive_stage_;
} }
const bool service_host_credential_ui_visible =
IsCredentialUiVisible(prelogin_, session_locked_, logon_ui_visible_,
input_desktop_available_,
secure_desktop_active_);
return DetermineInteractiveStage( return DetermineInteractiveStage(
IsHelperReportingLockScreenLocked(), IsHelperReportingLockScreenLocked(),
session_helper_report_credential_ui_visible_ || logon_ui_visible_, session_helper_report_credential_ui_visible_ ||
service_host_credential_ui_visible,
session_helper_report_secure_desktop_active_ || secure_desktop_active_); session_helper_report_secure_desktop_active_ || secure_desktop_active_);
} }
@@ -1991,12 +2009,17 @@ std::string CrossDeskServiceHost::BuildStatusResponse() {
interactive_state_ready interactive_state_ready
? (effective_session_locked && IsHelperReportingLockScreenLocked()) ? (effective_session_locked && IsHelperReportingLockScreenLocked())
: false; : false;
const bool service_host_credential_ui_visible =
IsCredentialUiVisible(prelogin_, session_locked_, logon_ui_visible_,
input_desktop_available_,
secure_desktop_active_);
bool credential_ui_visible = bool credential_ui_visible =
interactive_state_ready ? session_helper_report_credential_ui_visible_ interactive_state_ready ? session_helper_report_credential_ui_visible_
: logon_ui_visible_; : service_host_credential_ui_visible;
bool unlock_ui_visible = interactive_state_ready bool unlock_ui_visible = interactive_state_ready
? session_helper_report_unlock_ui_visible_ ? session_helper_report_unlock_ui_visible_
: (logon_ui_visible_ || secure_desktop_active_); : (credential_ui_visible ||
secure_desktop_active_);
unlock_ui_visible = unlock_ui_visible || sas_secure_desktop_grace_active; unlock_ui_visible = unlock_ui_visible || sas_secure_desktop_grace_active;
bool interactive_secure_desktop_active = bool interactive_secure_desktop_active =
interactive_state_ready ? session_helper_report_secure_desktop_active_ interactive_state_ready ? session_helper_report_secure_desktop_active_
@@ -2004,8 +2027,7 @@ std::string CrossDeskServiceHost::BuildStatusResponse() {
interactive_secure_desktop_active = interactive_secure_desktop_active =
interactive_secure_desktop_active || sas_secure_desktop_grace_active; interactive_secure_desktop_active || sas_secure_desktop_grace_active;
bool interactive_logon_ui_visible = bool interactive_logon_ui_visible =
interactive_state_ready ? session_helper_report_logon_ui_visible_ credential_ui_visible;
: logon_ui_visible_;
bool interactive_session_locked = effective_session_locked || bool interactive_session_locked = effective_session_locked ||
interactive_lock_screen_visible || interactive_lock_screen_visible ||
unlock_ui_visible || unlock_ui_visible ||
+14 -4
View File
@@ -340,6 +340,13 @@ const char* DetermineInteractiveStage(bool lock_app_visible,
return "user-desktop"; return "user-desktop";
} }
bool IsCredentialUiVisible(bool session_locked, bool logon_ui_running,
bool input_desktop_available,
bool secure_desktop_active) {
return (session_locked || secure_desktop_active) &&
(logon_ui_running || !input_desktop_available);
}
std::string BuildErrorJson(const char* error, DWORD error_code = 0) { std::string BuildErrorJson(const char* error, DWORD error_code = 0) {
Json json; Json json;
json["ok"] = false; json["ok"] = false;
@@ -392,9 +399,10 @@ std::string BuildHelperStatusResponse(HelperState* helper_state) {
Json json; Json json;
std::lock_guard<std::mutex> lock(helper_state->mutex); std::lock_guard<std::mutex> lock(helper_state->mutex);
const bool credential_ui_visible = const bool credential_ui_visible = IsCredentialUiVisible(
helper_state->logon_ui_visible || helper_state->session_locked, helper_state->logon_ui_visible,
(helper_state->session_locked && !helper_state->input_desktop_available); helper_state->input_desktop_available,
helper_state->secure_desktop_active);
const bool unlock_ui_visible = const bool unlock_ui_visible =
credential_ui_visible || helper_state->secure_desktop_active; credential_ui_visible || helper_state->secure_desktop_active;
json["ok"] = true; json["ok"] = true;
@@ -1901,7 +1909,9 @@ int main(int argc, char* argv[]) {
secure_desktop_active = helper_state.secure_desktop_active; secure_desktop_active = helper_state.secure_desktop_active;
} }
const bool credential_ui_visible = const bool credential_ui_visible =
logon_ui_running || (session_locked && !input_desktop_available); IsCredentialUiVisible(session_locked, logon_ui_running,
input_desktop_available,
secure_desktop_active);
std::string stage = DetermineInteractiveStage( std::string stage = DetermineInteractiveStage(
lock_app_visible, credential_ui_visible, secure_desktop_active); lock_app_visible, credential_ui_visible, secure_desktop_active);