[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";
}
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(
const std::string& interactive_stage) {
if (interactive_stage == "credential-ui" ||
@@ -1323,8 +1331,13 @@ bool CrossDeskServiceHost::IsHelperReportingLockScreenLocked() 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_ ||
secure_desktop_active_ || logon_ui_visible_ ||
secure_desktop_active_ || service_host_credential_ui_visible ||
session_helper_report_credential_ui_visible_ ||
session_helper_report_secure_desktop_active_ ||
session_helper_report_unlock_ui_visible_ ||
@@ -1377,9 +1390,14 @@ std::string CrossDeskServiceHost::ResolveInteractiveStageLocked() const {
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(
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_);
}
@@ -1991,12 +2009,17 @@ std::string CrossDeskServiceHost::BuildStatusResponse() {
interactive_state_ready
? (effective_session_locked && IsHelperReportingLockScreenLocked())
: 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 =
interactive_state_ready ? session_helper_report_credential_ui_visible_
: logon_ui_visible_;
: service_host_credential_ui_visible;
bool unlock_ui_visible = interactive_state_ready
? 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;
bool interactive_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 || sas_secure_desktop_grace_active;
bool interactive_logon_ui_visible =
interactive_state_ready ? session_helper_report_logon_ui_visible_
: logon_ui_visible_;
credential_ui_visible;
bool interactive_session_locked = effective_session_locked ||
interactive_lock_screen_visible ||
unlock_ui_visible ||
+14 -4
View File
@@ -340,6 +340,13 @@ const char* DetermineInteractiveStage(bool lock_app_visible,
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) {
Json json;
json["ok"] = false;
@@ -392,9 +399,10 @@ std::string BuildHelperStatusResponse(HelperState* helper_state) {
Json json;
std::lock_guard<std::mutex> lock(helper_state->mutex);
const bool credential_ui_visible =
helper_state->logon_ui_visible ||
(helper_state->session_locked && !helper_state->input_desktop_available);
const bool credential_ui_visible = IsCredentialUiVisible(
helper_state->session_locked, helper_state->logon_ui_visible,
helper_state->input_desktop_available,
helper_state->secure_desktop_active);
const bool unlock_ui_visible =
credential_ui_visible || helper_state->secure_desktop_active;
json["ok"] = true;
@@ -1901,7 +1909,9 @@ int main(int argc, char* argv[]) {
secure_desktop_active = helper_state.secure_desktop_active;
}
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(
lock_app_visible, credential_ui_visible, secure_desktop_active);