#include #include #include #include #include #include "interactive_state.h" namespace { std::filesystem::path FindRepoRoot() { std::filesystem::path current = std::filesystem::current_path(); while (!current.empty()) { if (std::filesystem::exists(current / "xmake.lua") && std::filesystem::exists( current / "src/service/windows/service_host.cpp")) { return current; } current = current.parent_path(); } return {}; } std::string ReadFile(const std::filesystem::path& path) { std::ifstream file(path, std::ios::binary); if (!file) { return {}; } std::ostringstream stream; stream << file.rdbuf(); return stream.str(); } bool ExpectContains(const char* name, const std::string& value, const std::string& expected) { if (value.find(expected) != std::string::npos) { return true; } std::cerr << name << " missing expected text: " << expected << "\n"; return false; } bool ExpectNotContains(const char* name, const std::string& value, const std::string& unexpected) { if (value.find(unexpected) == std::string::npos) { return true; } std::cerr << name << " contains unexpected text: " << unexpected << "\n"; return false; } bool ExpectTrue(const char* name, bool value) { if (value) { return true; } std::cerr << name << " expected true\n"; return false; } } // namespace int main() { const std::filesystem::path repo_root = FindRepoRoot(); if (repo_root.empty()) { std::cerr << "failed to locate repository root\n"; return 1; } const std::string control_bar = ReadFile(repo_root / "src/gui/toolbars/control_bar.cpp"); const std::string render = ReadFile(repo_root / "src/gui/render.cpp"); const std::string render_h = ReadFile(repo_root / "src/gui/render.h"); const std::string service_host = ReadFile(repo_root / "src/service/windows/service_host.cpp"); const std::string service_host_h = ReadFile(repo_root / "src/service/windows/service_host.h"); const std::string session_helper = ReadFile(repo_root / "src/service/windows/session_helper_main.cpp"); bool ok = true; ok &= ExpectTrue("secure desktop input routing", crossdesk::IsSecureDesktopInteractionRequired( "secure-desktop")); ok &= ExpectNotContains("control_bar.cpp", control_bar, "CanSendSecureAttentionSequence(" "props->remote_interactive_stage_)"); ok &= ExpectNotContains("control_bar.cpp", control_bar, "ImGui::BeginDisabled();\n" " }\n" " if (ImGui::Selectable(sas_label.c_str()))"); ok &= ExpectNotContains("render.cpp", render, "sas_requires_lock_screen"); ok &= ExpectContains("render.h", render_h, "optimistic_windows_secure_desktop_until_tick_"); ok &= ExpectContains("render.cpp", render, "kWindowsServiceSasSecureDesktopGraceMs"); ok &= ExpectContains("render.cpp", render, "status->sas_secure_desktop_grace_active"); ok &= ExpectContains("render.cpp", render, "json.value(\"sas_secure_desktop_grace_active\", false)"); ok &= ExpectContains("render.cpp", render, "status.sas_secure_desktop_grace_active"); ok &= ExpectContains("render.cpp", render, "local_interactive_stage_ = \"secure-desktop\""); ok &= ExpectContains("service_host.h", service_host_h, "sas_secure_desktop_until_tick_"); ok &= ExpectContains("service_host.h", service_host_h, "sas_secure_desktop_seen_"); ok &= ExpectContains("service_host.cpp", service_host, "kSasSecureDesktopGraceMs"); ok &= ExpectContains("service_host.cpp", service_host, "IsSasSecureDesktopGraceActiveLocked()"); ok &= ExpectContains("service_host.cpp", service_host, "UpdateSasSecureDesktopGraceLocked(" "session_helper_report_interactive_stage_)"); ok &= ExpectContains("service_host.cpp", service_host, "sas_secure_desktop_seen_ = true"); ok &= ExpectContains("service_host.cpp", service_host, "sas_secure_desktop_until_tick_ = 0"); ok &= ExpectContains("service_host.cpp", service_host, "sas_secure_desktop_until_tick_ ="); ok &= ExpectContains("service_host.cpp", service_host, "now + kSasSecureDesktopGraceMs"); ok &= ExpectContains("service_host.cpp", service_host, "\\\"sas_secure_desktop_grace_active\\\""); ok &= ExpectContains("service_host.cpp", service_host, "raw_interactive_stage = ResolveInteractiveStageLocked()"); ok &= ExpectContains("session_helper_main.cpp", session_helper, "kSessionHelperStatePollMs = 1000"); ok &= ExpectContains("session_helper_main.cpp", session_helper, "EVENT_SYSTEM_DESKTOPSWITCH"); ok &= ExpectContains("session_helper_main.cpp", session_helper, "SetWinEventHook("); ok &= ExpectContains("session_helper_main.cpp", session_helper, "MsgWaitForMultipleObjects"); ok &= ExpectContains("session_helper_main.cpp", session_helper, "WaitForSessionHelperStateChange(stop_event, " "desktop_switch_event)"); ok &= ExpectContains("session_helper_main.cpp", session_helper, "inaccessible_secure_input_desktop"); ok &= ExpectContains("session_helper_main.cpp", session_helper, "desktop_info.error_code == ERROR_ACCESS_DENIED"); ok &= ExpectContains("session_helper_main.cpp", session_helper, "secure_desktop_active = input_desktop_is_winlogon ||"); return ok ? 0 : 1; }