v0.3.7-pre.008-fix.003
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
# file: Cargo.toml
|
# file: Cargo.toml
|
||||||
# version: 429
|
# version: 430
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
resolver = "3"
|
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"]
|
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]
|
[workspace.package]
|
||||||
version = "0.3.7-pre.8.fix.2"
|
version = "0.3.7-pre.8.fix.3"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-backfill-desk/tests/desktop_security.rs
|
// file: crates/ksp-app-backfill-desk/tests/desktop_security.rs
|
||||||
// version: 8
|
// version: 9
|
||||||
|
|
||||||
//! Security and dependency-boundary checks for the Backfill Desk scaffold.
|
//! 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"));
|
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<std::path::PathBuf>) {
|
fn collect_files(directory: &std::path::Path, extension: &str, files: &mut std::vec::Vec<std::path::PathBuf>) {
|
||||||
let entries = std::fs::read_dir(directory);
|
let entries = std::fs::read_dir(directory);
|
||||||
let entries = match entries {
|
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() {
|
fn pre_007_request_mapping_keeps_network_endpoint_and_payload_secrets_backend_owned() {
|
||||||
let root = app_root();
|
let root = app_root();
|
||||||
let dto = read_text(root.join("src/dto_backfill.rs").as_path());
|
let dto = read_text(root.join("src/dto_backfill.rs").as_path());
|
||||||
let request_start = dto.find("pub(crate) struct BackfillStartRequestDto");
|
let request_source = struct_source(dto.as_str(), "pub(crate) struct BackfillStartRequestDto");
|
||||||
let preview_start = dto.find("pub(crate) struct BackfillRequestPreviewDto");
|
assert!(!request_source.is_empty());
|
||||||
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],
|
|
||||||
_ => "",
|
|
||||||
};
|
|
||||||
for forbidden in [
|
for forbidden in [
|
||||||
"pub(crate) network:",
|
"pub(crate) network:",
|
||||||
"pub(crate) provider",
|
"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() {
|
fn pre_008_start_surface_keeps_payload_and_physical_resources_backend_owned() {
|
||||||
let root = app_root();
|
let root = app_root();
|
||||||
let dto = read_text(root.join("src/dto_backfill.rs").as_path());
|
let dto = read_text(root.join("src/dto_backfill.rs").as_path());
|
||||||
let response_start = dto.find("pub(crate) struct BackfillStartResponseDto");
|
let response_source = struct_source(dto.as_str(), "pub(crate) struct BackfillStartResponseDto");
|
||||||
let preview_start = dto.find("pub(crate) struct BackfillRequestPreviewDto");
|
assert!(!response_source.is_empty());
|
||||||
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],
|
|
||||||
_ => "",
|
|
||||||
};
|
|
||||||
assert!(response_source.contains("pub(crate) job_id: String"));
|
assert!(response_source.contains("pub(crate) job_id: String"));
|
||||||
assert!(response_source.contains("pub(crate) state: String"));
|
assert!(response_source.contains("pub(crate) state: String"));
|
||||||
for forbidden in ["address", "signature", "provider", "endpoint", "url", "credential", "token", "network"] {
|
for forbidden in ["address", "signature", "provider", "endpoint", "url", "credential", "token", "network"] {
|
||||||
|
|||||||
100
deltas/0.3.7/pre.008-fix.003.md
Normal file
100
deltas/0.3.7/pre.008-fix.003.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<!-- file: deltas/0.3.7/pre.008-fix.003.md -->
|
||||||
|
<!-- version: 1 -->
|
||||||
|
|
||||||
|
# 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.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: docs/validation/024-V0_3_7_BACKFILL_DESK.md -->
|
<!-- file: docs/validation/024-V0_3_7_BACKFILL_DESK.md -->
|
||||||
<!-- version: 13 -->
|
<!-- version: 14 -->
|
||||||
|
|
||||||
# Validation v0.3.7 — Backfill Desk
|
# 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] 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 ;
|
- [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.
|
- [ ] 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`.
|
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 --edges normal
|
||||||
cargo tree -p ksp-app-backfill-desk -e features
|
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.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user