Files
khadhroony-solana-project/crates/ksp-app-store-desk/tests/desktop_security.rs
2026-09-03 17:54:50 +02:00

131 lines
6.2 KiB
Rust

// file: crates/ksp-app-store-desk/tests/desktop_security.rs
// version: 5
//! Security boundary tests for the Store Desk scaffold.
fn parse_json(source: &str) -> serde_json::Result<serde_json::Value> {
return serde_json::from_str::<serde_json::Value>(source);
}
#[test]
fn pre_002_capabilities_are_core_and_tracing_only() {
let parsed = parse_json(include_str!("../capabilities/default.json"));
assert!(parsed.is_ok(), "committed capability JSON must be valid");
let capability = match parsed {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let permissions = capability["permissions"].as_array();
assert!(permissions.is_some(), "capability permissions must be an array");
let permissions = match permissions {
std::option::Option::Some(value) => value,
std::option::Option::None => return,
};
assert_eq!(permissions.len(), 2);
assert_eq!(permissions[0], "core:default");
assert_eq!(permissions[1], "tracing:default");
}
#[test]
fn pre_002_frontend_avoids_network_browser_storage_and_blocking_dialogs() {
let frontend = [
include_str!("../frontend/ts/frontend_log.ts"),
include_str!("../frontend/ts/invoke.ts"),
include_str!("../frontend/ts/main.ts"),
include_str!("../frontend/ts/splash.ts"),
]
.join("\n");
for forbidden in ["fetch(", "XMLHttpRequest", "localStorage", "sessionStorage", "window.alert", "window.confirm", "window.prompt"] {
assert!(!frontend.contains(forbidden), "forbidden frontend primitive present: {forbidden}");
}
}
#[test]
fn pre_003_frontend_tracing_covers_navigation_buttons_tabs_controls_refresh_and_ipc() {
let main = include_str!("../frontend/ts/main.ts");
let invoke = include_str!("../frontend/ts/invoke.ts");
assert!(main.contains("navigation button clicked"));
assert!(main.contains("diagnostics refresh button clicked"));
assert!(main.contains("generic button clicked"));
assert!(main.contains("tab control clicked"));
assert!(main.contains("tab activated"));
assert!(main.contains("interactive control changed"));
assert!(main.contains("view activated"));
assert!(invoke.contains("IPC command requested"));
assert!(invoke.contains("IPC command completed"));
assert!(invoke.contains("IPC command failed"));
}
#[test]
fn pre_003_store_desk_development_logging_explicitly_selects_supertrace() {
let constants = include_str!("../src/constants.rs");
let bootstrap = include_str!("../src/bootstrap.rs");
assert!(constants.contains("DEVELOPMENT_LOGGING_PROFILE: &str = \"supertrace\""));
assert!(bootstrap.contains("FILE_ID_COMPOSITE_KSP_APP_STORE_DESK"));
assert!(bootstrap.contains("logging_profile.profile_id() != crate::DEVELOPMENT_LOGGING_PROFILE"));
assert!(bootstrap.contains("LogFilterLevel::Trace"));
return;
}
#[test]
fn pre_006_store_status_ipc_is_backend_neutral_and_secret_free() {
let dto = include_str!("../src/dto_common.rs");
let runtime = include_str!("../src/store_runtime.rs");
let tauri = include_str!("../src/tauri.rs");
assert!(dto.contains("StoreRuntimeStatusDto"));
assert!(runtime.contains("runtime_snapshot"));
assert!(runtime.contains("health().await"));
assert!(tauri.contains("store_runtime_status"));
for forbidden in ["connection_uri", "connectionUri", "postgresql://", "password", "RawPayload", "RawAccountState", "tokio_postgres"] {
assert!(!dto.contains(forbidden), "Store status DTO source contains forbidden field/material: {forbidden}");
}
}
#[test]
fn pre_007_transaction_rows_are_payload_free_detail_is_bounded_and_filter_values_are_not_logged() {
let dto = include_str!("../src/dto_transaction.rs");
let runtime = include_str!("../src/store_runtime.rs");
let frontend = include_str!("../frontend/ts/main.ts");
let row_start = dto.find("pub(crate) struct StoreTransactionRowDto");
let response_start = dto.find("pub(crate) struct StoreTransactionQueryResponseDto");
assert!(row_start.is_some());
assert!(response_start.is_some());
if let (std::option::Option::Some(row_start), std::option::Option::Some(response_start)) = (row_start, response_start) {
let row_source = &dto[row_start..response_start];
assert!(!row_source.contains("payload_preview_hex"));
assert!(!row_source.contains("payload: "));
}
assert!(dto.contains("payload_preview_hex"));
assert!(dto.contains("payload_preview_truncated"));
assert!(runtime.contains("TRANSACTION_DETAIL_PREVIEW_BYTES: usize = 512"));
assert!(runtime.contains("std::cmp::min(payload_bytes.len(), TRANSACTION_DETAIL_PREVIEW_BYTES)"));
assert!(frontend.contains("transaction DataTables server-side query started"));
assert!(frontend.contains("transaction DataTables page changed"));
assert!(frontend.contains("transaction DataTables page length changed"));
assert!(frontend.contains("transaction DataTables redraw completed"));
assert!(frontend.contains("transaction detail opened"));
assert!(frontend.contains("transaction detail closed"));
for forbidden in [
"frontendDebug(\"main\", \"Store Desk transaction Store filter changed\", { slotMin",
"frontendDebug(\"main\", \"Store Desk transaction Store filter changed\", { slotMax",
"frontendDebug(\"main\", \"Store Desk transaction detail opened\", { signature",
"payloadPreviewHex:",
] {
assert!(!frontend.contains(forbidden), "transaction business/filter value leaked into frontend tracing: {forbidden}");
}
}
#[test]
fn pre_007_transaction_request_rejects_datatables_search_order_draw_and_physical_material() {
let dto = include_str!("../src/dto_transaction.rs");
let runtime = include_str!("../src/store_runtime.rs");
for forbidden in ["draw:", "columns:", "search:", "order:", "cursor:", "connection_uri", "postgresql://", "endpoint"] {
assert!(!dto.contains(forbidden), "forbidden DataTables/physical request material present: {forbidden}");
}
assert!(runtime.contains("25 | 50 | 100"));
assert!(runtime.contains("request.offset.parse::<u64>()"));
assert!(runtime.contains("RawSlotRange::new"));
assert!(runtime.contains("\"ascending\" =>"));
assert!(runtime.contains("\"descending\" =>"));
}