v0.3.7-pre.012

This commit is contained in:
2026-09-02 20:29:50 +02:00
parent 618f940310
commit 4c16607e22
14 changed files with 388 additions and 26 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/tests/desktop_contract.rs
// version: 13
// version: 14
//! Structural desktop contract checks for the Backfill Desk scaffold.
@@ -404,3 +404,33 @@ fn pre_011_resume_reissues_rust_only_checkpoint_for_new_backend_job_without_ipc_
assert!(html.contains("resumeBackfillRun"));
assert!(html.contains("Reprendre"));
}
#[test]
fn pre_012_free_address_autocomplete_is_html_datalist_derived_from_core_registry() {
let root = app_root();
let dto = read_text(root.join("src/dto_common.rs").as_path());
assert!(dto.contains("ksp_core_lib::entries()"));
assert!(dto.contains("ProgramIdAutocompleteOptionDto"));
assert!(dto.contains("program_id_autocomplete_options"));
let html = read_text(root.join("frontend/main.html").as_path());
assert!(html.contains("list=\"backfillProgramIds\""));
assert!(html.contains("<datalist id=\"backfillProgramIds\"></datalist>"));
assert!(html.contains("toute adresse Solana valide reste acceptée"));
let frontend = read_text(root.join("frontend/ts/main.ts").as_path());
for required in [
"renderProgramIdAutocomplete(options.programIdOptions)",
"option.value = program.programId",
"option.dataset.code = program.code",
"option.dataset.domain = program.domain",
"registryMatch: selected !== null",
"Backfill Desk Program ID autocomplete dataset rendered",
] {
assert!(frontend.contains(required), "missing pre.012 autocomplete marker {required}");
}
for forbidden in
["AddressLookupTab1e1111111111111111111111111", "ComputeBudget111111111111111111111111111111", "Vote111111111111111111111111111111111111111"]
{
assert!(!frontend.contains(forbidden), "frontend hardcodes canonical Program ID {forbidden}");
assert!(!html.contains(forbidden), "HTML hardcodes canonical Program ID {forbidden}");
}
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/tests/desktop_security.rs
// version: 14
// version: 15
//! Security and dependency-boundary checks for the Backfill Desk scaffold.
@@ -339,3 +339,29 @@ fn pre_011_resume_surface_exposes_only_new_job_acknowledgement_and_never_checkpo
assert!(!resume_source.contains(forbidden), "Resume frontend sends or logs forbidden payload marker {forbidden}");
}
}
#[test]
fn pre_012_program_id_autocomplete_exposes_only_public_registry_metadata_and_no_browser_storage() {
let root = app_root();
let dto_source = read_text(root.join("src/dto_common.rs").as_path());
let dto = struct_source(dto_source.as_str(), "ProgramIdAutocompleteOptionDto");
for required in ["code", "domain", "family", "name", "program_id", "protocol"] {
assert!(dto.contains(required), "Program ID autocomplete DTO missing safe registry field {required}");
}
for forbidden in ["url", "credential", "token", "secret", "endpoint", "connection", "private_key"] {
assert!(!dto.contains(forbidden), "Program ID autocomplete DTO leaks forbidden marker {forbidden}");
}
let frontend = read_text(root.join("frontend/ts/main.ts").as_path());
for forbidden in ["localStorage", "sessionStorage", "indexedDB", "document.cookie"] {
assert!(!frontend.contains(forbidden), "frontend persists campaign/autocomplete material via {forbidden}");
}
let selection_marker = frontend.find("Backfill Desk address autocomplete selection evaluated");
assert!(selection_marker.is_some());
let selection_source = match selection_marker {
std::option::Option::Some(index) => &frontend[index..std::cmp::min(index + 320, frontend.len())],
std::option::Option::None => "",
};
assert!(selection_source.contains("programCode"));
assert!(selection_source.contains("registryMatch"));
assert!(!selection_source.contains("address.value"));
}