59 lines
2.9 KiB
Markdown
59 lines
2.9 KiB
Markdown
<!-- file: deltas/0.2.6/pre.012.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# Delta `0.2.6-pre.012` — export OWNER Solana CLI JSON / Base58
|
|
|
|
## Objet
|
|
|
|
Exposer dans Wallet Desk l'export explicite OWNER de la keypair Solana vers un fichier externe, en réutilisant `WalletOwner::export_transfer_file` et le plugin Dialog déjà installé, sans jamais projeter le secret ou le chemin complet vers le frontend.
|
|
|
|
## Changements
|
|
|
|
- `workspace.package.version` passe à `0.2.6-pre.12` ;
|
|
- extraction de `WalletTransferFormatDto` dans `wallet_transfer.rs`, contrat partagé import/export sans changement des codes wire ;
|
|
- ajout de `wallet_export.rs` :
|
|
- `WalletExportRequestDto` contient uniquement le format ;
|
|
- `WalletExportResultDto` contient uniquement `wallet_id`, format et basename de destination ;
|
|
- nom de fichier proposé déterministe `*-solana-keypair.{json|txt}` ;
|
|
- ajout de `export_wallet_transfer` :
|
|
- OWNER-only ;
|
|
- vérification OWNER avant ouverture du picker ;
|
|
- `blocking_save_file` exécuté uniquement dans la commande Tauri async ;
|
|
- chemin sélectionné conservé uniquement côté Rust ;
|
|
- délégation à `WalletOwner::export_transfer_file` ;
|
|
- no-clobber hérité de `ksp-wallet-lib` ;
|
|
- session OWNER restaurée après succès ou erreur non conflictuelle ;
|
|
- UI Security :
|
|
- choix Solana CLI JSON / Base58 ;
|
|
- modal Bootstrap explicite avant export d'une keypair non chiffrée ;
|
|
- save picker natif ouvert depuis Rust ;
|
|
- statut final limité au basename ;
|
|
- aucun export texte/clipboard ;
|
|
- domaine de log dédié `wallet.export` ;
|
|
- le `shell_phase` est réaligné sur `pre.012-owner-transfer-export` ;
|
|
- badge/footer Wallet Desk réalignés sur `pre.012` ;
|
|
- canaries contract/security et unit tests ajoutés ;
|
|
- `ROADMAP.md`, `CHANGELOG.md` et `docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md` restent inchangés.
|
|
|
|
## Sécurité
|
|
|
|
Le frontend ne fournit jamais de chemin de destination et ne reçoit jamais la keypair, son encodage ou un chemin complet. Seul le format traverse l'IPC en entrée. Le save picker et `export_transfer_file` restent côté Rust. Le contenu exporté n'est jamais loggé, et le nom de destination n'est pas persisté dans les logs.
|
|
|
|
L'export produit volontairement un fichier secret non chiffré compatible Solana. La confirmation Bootstrap avertit explicitement l'opérateur de le traiter comme une clé privée.
|
|
|
|
## Validation opérateur
|
|
|
|
```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
|
|
|
|
KSP_WALLETS_DIRECTORY=var/wallet-desk-pre012 \
|
|
cargo tauri dev -c crates/ksp-app-wallet-desk/tauri.conf.json
|
|
```
|
|
|
|
Runtime : ouvrir OWNER -> exporter JSON -> réimporter dans un nouveau `.kspwallet` et vérifier la même Pubkey ; exporter Base58 -> même round-trip ; vérifier Cancel sans fichier ; tenter une destination existante et vérifier no-clobber ; confirmer qu'une session VIEW n'active jamais l'export.
|