From ed72aaba6761fb4adbad1539d0b2659f76db6891 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Wed, 2 Sep 2026 17:14:00 +0200 Subject: [PATCH] v0.3.7-pre.008-fix.003 --- Cargo.toml | 4 +- .../tests/desktop_security.rs | 35 +++--- deltas/0.3.7/pre.008-fix.003.md | 100 ++++++++++++++++++ docs/validation/024-V0_3_7_BACKFILL_DESK.md | 23 +++- 4 files changed, 141 insertions(+), 21 deletions(-) create mode 100644 deltas/0.3.7/pre.008-fix.003.md diff --git a/Cargo.toml b/Cargo.toml index dcd7ec5..173f3d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 429 +# version: 430 [workspace] resolver = "3" members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.3.7-pre.8.fix.2" +version = "0.3.7-pre.8.fix.3" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-app-backfill-desk/tests/desktop_security.rs b/crates/ksp-app-backfill-desk/tests/desktop_security.rs index 897ae72..0080305 100644 --- a/crates/ksp-app-backfill-desk/tests/desktop_security.rs +++ b/crates/ksp-app-backfill-desk/tests/desktop_security.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-backfill-desk/tests/desktop_security.rs -// version: 8 +// version: 9 //! Security and dependency-boundary checks for the Backfill Desk scaffold. @@ -11,6 +11,19 @@ fn app_root() -> std::path::PathBuf { return std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); } +fn struct_source<'a>(source: &'a str, marker: &str) -> &'a str { + let start = match source.find(marker) { + std::option::Option::Some(value) => value, + std::option::Option::None => return "", + }; + let tail = &source[start..]; + let end = match tail.find("\n}") { + std::option::Option::Some(value) => value + 2, + std::option::Option::None => return "", + }; + return &tail[..end]; +} + fn collect_files(directory: &std::path::Path, extension: &str, files: &mut std::vec::Vec) { let entries = std::fs::read_dir(directory); let entries = match entries { @@ -166,14 +179,8 @@ fn pre_006_frontend_receives_only_safe_http_route_metadata_and_no_endpoint_mater fn pre_007_request_mapping_keeps_network_endpoint_and_payload_secrets_backend_owned() { let root = app_root(); let dto = read_text(root.join("src/dto_backfill.rs").as_path()); - let request_start = dto.find("pub(crate) struct BackfillStartRequestDto"); - let preview_start = dto.find("pub(crate) struct BackfillRequestPreviewDto"); - assert!(request_start.is_some()); - assert!(preview_start.is_some()); - let request_source = match (request_start, preview_start) { - (std::option::Option::Some(start), std::option::Option::Some(end)) if start < end => &dto[start..end], - _ => "", - }; + let request_source = struct_source(dto.as_str(), "pub(crate) struct BackfillStartRequestDto"); + assert!(!request_source.is_empty()); for forbidden in [ "pub(crate) network:", "pub(crate) provider", @@ -209,14 +216,8 @@ fn pre_007_request_mapping_keeps_network_endpoint_and_payload_secrets_backend_ow fn pre_008_start_surface_keeps_payload_and_physical_resources_backend_owned() { let root = app_root(); let dto = read_text(root.join("src/dto_backfill.rs").as_path()); - let response_start = dto.find("pub(crate) struct BackfillStartResponseDto"); - let preview_start = dto.find("pub(crate) struct BackfillRequestPreviewDto"); - assert!(response_start.is_some()); - assert!(preview_start.is_some()); - let response_source = match (response_start, preview_start) { - (std::option::Option::Some(start), std::option::Option::Some(end)) if start < end => &dto[start..end], - _ => "", - }; + let response_source = struct_source(dto.as_str(), "pub(crate) struct BackfillStartResponseDto"); + assert!(!response_source.is_empty()); assert!(response_source.contains("pub(crate) job_id: String")); assert!(response_source.contains("pub(crate) state: String")); for forbidden in ["address", "signature", "provider", "endpoint", "url", "credential", "token", "network"] { diff --git a/deltas/0.3.7/pre.008-fix.003.md b/deltas/0.3.7/pre.008-fix.003.md new file mode 100644 index 0000000..f08e729 --- /dev/null +++ b/deltas/0.3.7/pre.008-fix.003.md @@ -0,0 +1,100 @@ + + + +# Delta `0.3.7-pre.008-fix.003` — canaris sécurité bornés aux DTO exacts + +## 1. Base requise + +```text +0.3.7-pre.008-fix.002 +workspace.package.version = 0.3.7-pre.8.fix.2 +``` + +## 2. Objectif + +Corriger les deux derniers faux positifs du gate `pre.008` sans modifier la production : les canaris sécurité de la request et de l'acknowledgement Start inspectaient des fenêtres textuelles qui débordaient sur les DTO voisins. + +## 3. Cause + +`BackfillStartRequestDto` est suivi de `BackfillStartResponseDto`, lui-même suivi de `BackfillRequestPreviewDto`. Le test request découpait depuis le début de la request jusqu'au début de la preview : il incluait donc `BackfillStartResponseDto::job_id` et concluait à tort que le frontend request DTO possédait un JobId. + +Le test Start acknowledgement découpait depuis le début de la response jusqu'au début de la preview. Cette fenêtre incluait les commentaires de documentation placés avant `BackfillRequestPreviewDto`, dont les mots `address` et `signature`, et concluait à tort à une fuite de payload. + +## 4. Correction + +- ajouter un helper de test `struct_source` ; +- borner l'audit request au corps exact de `BackfillStartRequestDto` ; +- borner l'audit acknowledgement au corps exact de `BackfillStartResponseDto` ; +- conserver tous les marqueurs interdits existants ; +- ne modifier aucun DTO ni code de production. + +## 5. Version + +```text +workspace.package.version = 0.3.7-pre.8.fix.3 +label = 0.3.7-pre.008-fix.003 +``` + +## 6. Fichiers ajoutés + +```text +deltas/0.3.7/pre.008-fix.003.md +``` + +## 7. Fichiers modifiés + +```text +Cargo.toml +crates/ksp-app-backfill-desk/tests/desktop_security.rs +docs/validation/024-V0_3_7_BACKFILL_DESK.md +``` + +## 8. Fichiers supprimés + +Aucun. + +## 9. Gate opérateur ayant déclenché le fix + +```text +python3 scripts/audit_rust_workspace_rules.py PASS +python3 scripts/audit_markdown_tables.py ... deltas/0.3.7 PASS +cargo check --workspace PASS +cargo clippy --workspace --all-targets PASS +cargo test -p ksp-job-backfill-lib PASS — 49 unitaires + suites d'intégration +cargo test -p ksp-app-backfill-desk FAIL — 2 faux positifs desktop_security +``` + +Le canari `pre_008_start_installs_handle_before_non_blocking_spawn_and_keeps_single_run_backend_owned` de `pre.008-fix.002` passe désormais. + +## 10. Validations exécutées dans l'environnement d'assemblage + +```text +python3 scripts/audit_rust_workspace_rules.py +python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.7 +``` + +Contrôles ciblés : + +- `BackfillStartRequestDto` de production byte-for-byte inchangé ; +- `BackfillStartResponseDto` de production byte-for-byte inchangé ; +- fenêtre request limitée à sa propre struct ; +- fenêtre acknowledgement limitée à sa propre struct ; +- aucun fichier fonctionnel Backfill Desk/Job/Store/Transport modifié. + +## 11. Gate opérateur requis + +```text +cargo fmt --all +python3 scripts/audit_rust_workspace_rules.py +python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.7 +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test -p ksp-job-backfill-lib +cargo test -p ksp-app-backfill-desk +``` + +Les `cargo tree` ne sont pas requis pour ce fix : aucune dépendance ni feature Cargo n'est modifiée. + +## 12. Questions ouvertes + +Aucune pour ce correctif. diff --git a/docs/validation/024-V0_3_7_BACKFILL_DESK.md b/docs/validation/024-V0_3_7_BACKFILL_DESK.md index f85b8a9..7d85f4e 100644 --- a/docs/validation/024-V0_3_7_BACKFILL_DESK.md +++ b/docs/validation/024-V0_3_7_BACKFILL_DESK.md @@ -1,5 +1,5 @@ - + # Validation v0.3.7 — Backfill Desk @@ -380,7 +380,7 @@ Le gate opérateur de `pre.008` confirme que les audits Rust/Markdown sont propr - [X] aucune API publique Job, logique de requête, Start Desk, Store, Transport ou frontend n'est modifiée ; - [X] audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ; - [ ] replay opérateur `cargo fmt/check/clippy/test` de `pre.008-fix.001` à exécuter. -## 18. `pre.008-fix.002` — canari d'ordre Start local au bon spawn +## 19. `pre.008-fix.002` — canari d'ordre Start local au bon spawn Le replay opérateur de `pre.008-fix.001` confirme que la correction `Send` est effective : audits, `cargo check --workspace`, Clippy et `ksp-job-backfill-lib` passent. La suite Backfill Desk atteint alors le canari `pre_008_start_installs_handle_before_non_blocking_spawn_and_keeps_single_run_backend_owned`, qui échoue sur `prepare_index < spawn_index`. @@ -401,3 +401,22 @@ cargo test -p ksp-app-backfill-desk cargo tree -p ksp-app-backfill-desk --edges normal cargo tree -p ksp-app-backfill-desk -e features ``` + +## 20. `pre.008-fix.003` — canaris sécurité bornés aux DTO exacts + +Le replay opérateur de `pre.008-fix.002` confirme que les corrections précédentes sont effectives : audits Rust/Markdown, `cargo check --workspace`, Clippy et `ksp-job-backfill-lib` passent, puis le canari d'ordre Start corrigé passe également. Le dernier blocage est limité à deux canaris `desktop_security`. + +Les DTO de production sont conformes. Les deux échecs sont des faux positifs causés par des fenêtres textuelles trop larges : le contrôle de `BackfillStartRequestDto` s'étendait jusqu'à `BackfillRequestPreviewDto` et incluait donc légitimement `BackfillStartResponseDto::job_id`; le contrôle de `BackfillStartResponseDto` incluait les commentaires de documentation du DTO suivant, qui contiennent les mots `address`/`signature`. + +Le correctif ajoute un helper de test qui extrait uniquement la déclaration de struct visée, de son marqueur `struct` jusqu'à son accolade fermante immédiate. Les deux canaris auditeront désormais exactement `BackfillStartRequestDto` et `BackfillStartResponseDto`, sans modifier les DTO ni aucun code de production. + +### Gate du fix + +- [X] aucun fichier de production Backfill Desk, Job Backfill, Store ou Transport modifié ; +- [X] le canari request ne peut plus inclure `BackfillStartResponseDto::job_id` ; +- [X] le canari Start acknowledgement ne peut plus inclure la documentation de `BackfillRequestPreviewDto` ; +- [X] les champs réellement interdits restent vérifiés dans le corps exact des DTO exposés ; +- [X] version Cargo synchronisée en `0.3.7-pre.8.fix.3` ; +- [X] audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ; +- [ ] replay opérateur `cargo fmt/check/clippy/test` de `pre.008-fix.003` à exécuter ; aucun `cargo tree` requis car dépendances/features inchangées. +