mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-07-23 07:40:11 +08:00
160 lines
6.5 KiB
C++
160 lines
6.5 KiB
C++
#include <filesystem>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <string>
|
|
|
|
#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 stream_window =
|
|
ReadFile(repo_root / "src/gui/ui/stream_window.slint");
|
|
const std::string gui_application =
|
|
ReadFile(repo_root / "src/gui/application/gui_application.cpp");
|
|
const std::string windows_service_runtime =
|
|
ReadFile(repo_root / "src/gui/runtime/windows_service_runtime.cpp");
|
|
const std::string runtime_state_h =
|
|
ReadFile(repo_root / "src/gui/runtime/runtime_state.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 &= ExpectContains("stream_window.slint", stream_window,
|
|
"for shortcut in [\"Ctrl+Alt+Del\", \"Win+L\"]");
|
|
ok &= ExpectContains("stream_window.slint", stream_window,
|
|
"root.send-shortcut(shortcut)");
|
|
ok &= ExpectContains("gui_application.cpp", gui_application,
|
|
"std::string(shortcut) == \"Ctrl+Alt+Del\"");
|
|
ok &= ExpectContains("gui_application.cpp", gui_application,
|
|
"ServiceCommandFlag::send_sas");
|
|
ok &= ExpectContains("gui_application.cpp", gui_application,
|
|
"ServiceCommandFlag::lock_workstation");
|
|
ok &= ExpectNotContains("windows_service_runtime.cpp",
|
|
windows_service_runtime, "sas_requires_lock_screen");
|
|
ok &= ExpectContains("runtime_state.h", runtime_state_h,
|
|
"optimistic_windows_secure_desktop_until_tick_");
|
|
ok &= ExpectContains("windows_service_runtime.cpp", windows_service_runtime,
|
|
"kWindowsServiceSasSecureDesktopGraceMs");
|
|
ok &= ExpectContains("windows_service_runtime.cpp", windows_service_runtime,
|
|
"status->sas_secure_desktop_grace_active");
|
|
ok &=
|
|
ExpectContains("windows_service_runtime.cpp", windows_service_runtime,
|
|
"json.value(\"sas_secure_desktop_grace_active\", false)");
|
|
ok &= ExpectContains("windows_service_runtime.cpp", windows_service_runtime,
|
|
"status.sas_secure_desktop_grace_active");
|
|
ok &= ExpectContains("windows_service_runtime.cpp", windows_service_runtime,
|
|
"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;
|
|
}
|