v0.2.6-pre.012

This commit is contained in:
2026-08-21 16:22:16 +02:00
parent 8ba554306a
commit ecbd6b746d
21 changed files with 634 additions and 94 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-wallet-desk/tests/desktop_security.rs
// version: 12
// version: 13
//! Static desktop security contracts for the Wallet Desk pre.002 shell.
@@ -181,7 +181,7 @@ fn owner_metadata_values_are_request_only_and_state_conflict_forces_reauthorizat
assert!(!main.contains("frontendTrace(\"main\", request.text"));
assert!(!main.contains("frontendDebug(\"main\", request.alias"));
assert!(!main.contains("window.confirm"));
assert!(main.contains("new Modal(modalElement)"));
assert!(main.contains("deleteNoteModal = new Modal(modalElement)"));
}
#[test]
@@ -262,3 +262,63 @@ fn strong_view_administration_is_owner_only_uses_bootstrap_modals_and_returns_no
assert!(!main.contains("frontendDebug(\"main\", request.password"));
assert!(!main.contains("frontendTrace(\"main\", request.password"));
}
#[test]
fn owner_export_never_projects_key_material_or_full_destination_path_to_frontend() {
let root = app_root();
let export = read_text(root.join("src/wallet_export.rs").as_path());
let state = read_text(root.join("src/app_state.rs").as_path());
let tauri = read_text(root.join("src/tauri.rs").as_path());
let main = read_text(root.join("frontend/ts/main.ts").as_path());
let request = export.split("pub(crate) struct WalletExportRequestDto").nth(1);
assert!(request.is_some());
let request_fields = request
.unwrap_or_default()
.split("}\n")
.next()
.unwrap_or_default()
.lines()
.filter(|line| return line.trim_start().starts_with("pub(crate) "))
.collect::<std::vec::Vec<_>>()
.join("\n");
assert!(request_fields.contains("format"));
assert!(!export.contains("#[derive(Clone, serde::Deserialize"));
assert!(!export.contains("#[derive(Debug, serde::Deserialize"));
assert!(!request_fields.contains("path"));
assert!(!request_fields.contains("password"));
assert!(!request_fields.contains("secret"));
let result = export.split("pub(crate) struct WalletExportResultDto").nth(1);
assert!(result.is_some());
let result_fields = result
.unwrap_or_default()
.split("}\n")
.next()
.unwrap_or_default()
.lines()
.filter(|line| return line.trim_start().starts_with("pub(crate) "))
.collect::<std::vec::Vec<_>>()
.join("\n");
assert!(result_fields.contains("destination_name"));
assert!(result_fields.contains("format"));
assert!(result_fields.contains("wallet_id"));
assert!(!result_fields.contains("path"));
assert!(!result_fields.contains("pubkey"));
assert!(!result_fields.contains("password"));
assert!(!result_fields.contains("secret"));
assert!(!result_fields.contains("content"));
assert!(!result_fields.contains("bytes"));
assert!(state.contains("owner.export_transfer_file"));
assert!(!state.contains("owner.export_transfer(format"));
let command_start = tauri.find("async fn export_wallet_transfer");
assert!(command_start.is_some());
let command = &tauri[command_start.unwrap_or_default()..];
let command = command.split("#[tauri::command]").next().unwrap_or_default();
assert!(command.contains("WalletExportRequestDto"));
assert!(command.contains("WalletExportResultDto"));
assert!(!main.contains("navigator.clipboard"));
assert!(!main.contains("destinationPath"));
assert!(!main.contains("destination_path"));
assert!(!main.contains("keypairBytes"));
assert!(!main.contains("secretKey"));
assert!(main.contains("exportWalletModal = new Modal(modalElement)"));
}