mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-06-10 01:14:53 +08:00
150 lines
5.9 KiB
C++
150 lines
5.9 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 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;
|
|
}
|