v0.2.6-pre.013-fix.001
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
# file: Cargo.toml
|
# file: Cargo.toml
|
||||||
# version: 183
|
# version: 184
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
resolver = "3"
|
resolver = "3"
|
||||||
members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
|
members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.2.6-pre.13"
|
version = "0.2.6-pre.13.fix.1"
|
||||||
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,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ksp-app-wallet-desk",
|
"name": "ksp-app-wallet-desk",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.2.6-pre.13",
|
"version": "0.2.6-pre.13.fix.1",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "KSP Wallet Desk",
|
"productName": "KSP Wallet Desk",
|
||||||
"version": "0.2.6-pre.13",
|
"version": "0.2.6-pre.13.fix.1",
|
||||||
"identifier": "com.sasedev.ksp-app-wallet-desk",
|
"identifier": "com.sasedev.ksp-app-wallet-desk",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "npm run dev",
|
"beforeDevCommand": "npm run dev",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-wallet-desk/tests/release_compliance.rs
|
// file: crates/ksp-app-wallet-desk/tests/release_compliance.rs
|
||||||
// version: 1
|
// version: 2
|
||||||
|
|
||||||
//! Release-wide deterministic compliance canaries for Wallet Desk.
|
//! Release-wide deterministic compliance canaries for Wallet Desk.
|
||||||
|
|
||||||
@@ -43,16 +43,16 @@ fn read_rust_source_tree(root: &std::path::Path) -> String {
|
|||||||
return combined;
|
return combined;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn struct_field_block<'a>(source: &'a str, name: &str) -> &'a str {
|
fn struct_field_lines(source: &str, name: &str) -> String {
|
||||||
let marker = std::format!("struct {name}");
|
let marker = std::format!("struct {name}");
|
||||||
let start = source.find(marker.as_str());
|
let start = source.find(marker.as_str());
|
||||||
assert!(start.is_some(), "missing struct {name}");
|
assert!(start.is_some(), "missing struct {name}");
|
||||||
let start = match start {
|
let start = match start {
|
||||||
std::option::Option::Some(value) => value,
|
std::option::Option::Some(value) => value,
|
||||||
std::option::Option::None => return "",
|
std::option::Option::None => return String::new(),
|
||||||
};
|
};
|
||||||
let tail = &source[start..];
|
let block = source[start..].split("}\n").next().unwrap_or_default();
|
||||||
return tail.split("}\n").next().unwrap_or_default();
|
return block.lines().filter(|line| return line.trim_start().starts_with("pub(crate) ")).collect::<std::vec::Vec<_>>().join("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -135,13 +135,13 @@ fn response_dtos_keep_secret_key_material_out_of_ipc() {
|
|||||||
(security.as_str(), "WalletViewSecurityStatusDto"),
|
(security.as_str(), "WalletViewSecurityStatusDto"),
|
||||||
(common.as_str(), "RuntimeStatusDto"),
|
(common.as_str(), "RuntimeStatusDto"),
|
||||||
] {
|
] {
|
||||||
let fields = struct_field_block(source, name);
|
let fields = struct_field_lines(source, name);
|
||||||
for forbidden in ["password", "secret_key", "private_key", "keypair_bytes", "ciphertext"] {
|
for forbidden in ["password", "secret_key", "private_key", "keypair_bytes", "ciphertext"] {
|
||||||
assert!(!fields.contains(forbidden), "response DTO {name} contains forbidden field material {forbidden}");
|
assert!(!fields.contains(forbidden), "response DTO {name} contains forbidden field material {forbidden}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let inspection = struct_field_block(import.as_str(), "WalletTransferInspectionDto");
|
let inspection = struct_field_lines(import.as_str(), "WalletTransferInspectionDto");
|
||||||
let export_result = struct_field_block(export.as_str(), "WalletExportResultDto");
|
let export_result = struct_field_lines(export.as_str(), "WalletExportResultDto");
|
||||||
assert!(!inspection.contains("path"));
|
assert!(!inspection.contains("path"));
|
||||||
assert!(!export_result.contains("path"));
|
assert!(!export_result.contains("path"));
|
||||||
assert!(!export_result.contains("content"));
|
assert!(!export_result.contains("content"));
|
||||||
|
|||||||
44
deltas/0.2.6/pre.013-fix.001.md
Normal file
44
deltas/0.2.6/pre.013-fix.001.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<!-- file: deltas/0.2.6/pre.013-fix.001.md -->
|
||||||
|
<!-- version: 1 -->
|
||||||
|
|
||||||
|
# Delta `0.2.6-pre.013-fix.001` — correction du canari DTO/IPC
|
||||||
|
|
||||||
|
## Objet
|
||||||
|
|
||||||
|
Corriger le faux positif du gate `response_dtos_keep_secret_key_material_out_of_ipc` révélé par la validation opérateur de `pre.013`, sans modifier le runtime Wallet Desk ni assouplir les frontières de sécurité.
|
||||||
|
|
||||||
|
## Diagnostic
|
||||||
|
|
||||||
|
`WalletAuthorizedDto` ne contient aucun champ password. Son champ sûr `configured_secret_candidate_count` possède toutefois une documentation mentionnant `Wallet password candidates`. Le helper `struct_field_block` de `release_compliance.rs` analysait le bloc Rust complet, commentaires inclus, puis interprétait ce mot comme du matériau de champ interdit.
|
||||||
|
|
||||||
|
Cette classe de faux positif avait déjà été rencontrée et corrigée en `pre.006-fix.001`.
|
||||||
|
|
||||||
|
## Changements
|
||||||
|
|
||||||
|
- remplace le scan du bloc struct complet par `struct_field_lines`, limité aux lignes de champs `pub(crate)` ;
|
||||||
|
- applique cette extraction aux sept DTOs de réponse audités ;
|
||||||
|
- applique la même extraction aux contrôles `path`, `content` et `bytes` d'import/export ;
|
||||||
|
- conserve strictement les listes de matériaux interdits ;
|
||||||
|
- ne modifie aucun DTO, aucune commande Tauri, aucune capability, aucune dépendance et aucun comportement runtime ;
|
||||||
|
- documente le checkpoint dans la matrice de compliance et le plan détaillé `0.2.6`.
|
||||||
|
|
||||||
|
## Version
|
||||||
|
|
||||||
|
```text
|
||||||
|
workspace.package.version = 0.2.6-pre.13.fix.1
|
||||||
|
commit attendu = v0.2.6-pre.013-fix.001
|
||||||
|
aucun tag
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validation attendue
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo fmt --all
|
||||||
|
python3 scripts/audit_rust_workspace_rules.py
|
||||||
|
cargo check --workspace
|
||||||
|
cargo clippy --workspace --all-targets
|
||||||
|
cargo test -p ksp-app-wallet-desk
|
||||||
|
cargo test --workspace
|
||||||
|
```
|
||||||
|
|
||||||
|
Puis exécuter le smoke Devnet `pre.013` déjà prévu. Aucun nouveau `cargo tauri dev` n'est requis par ce correctif test-only.
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: docs/validation/009-V0_2_6_WALLET_DESK_COMPLIANCE.md -->
|
<!-- file: docs/validation/009-V0_2_6_WALLET_DESK_COMPLIANCE.md -->
|
||||||
<!-- version: 1 -->
|
<!-- version: 2 -->
|
||||||
|
|
||||||
# Validation `0.2.6` — Wallet Desk integration / compliance / security
|
# Validation `0.2.6` — Wallet Desk integration / compliance / security
|
||||||
|
|
||||||
@@ -22,6 +22,10 @@ Cargo tree / inverse tree
|
|||||||
workspace checkpoint complet
|
workspace checkpoint complet
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Checkpoint `pre.013-fix.001`
|
||||||
|
|
||||||
|
Le premier run opérateur de `pre.013` du 21 août 2026 a validé `cargo fmt`, l'audit Python, `cargo check` et Clippy. Les tests ont ensuite révélé un défaut du **canari**, pas du DTO : `WalletAuthorizedDto` documente `configured_secret_candidate_count` avec les mots `Wallet password candidates`, et le scanner de `release_compliance` inspectait commentaires et champs ensemble. Le correctif restreint désormais l'analyse aux lignes de champs `pub(crate)`, comme le canari éprouvé depuis `pre.006-fix.001`. Les frontières IPC ne changent pas.
|
||||||
|
|
||||||
## 2. Surface intégrée auditée
|
## 2. Surface intégrée auditée
|
||||||
|
|
||||||
Au démarrage de `pre.013`, Wallet Desk a déjà validé en runtime :
|
Au démarrage de `pre.013`, Wallet Desk a déjà validé en runtime :
|
||||||
|
|||||||
Reference in New Issue
Block a user