5.6 KiB
Delta 0.2.6-pre.004 — inventory .kspwallet et inspection locked
Base requise
0.2.6-pre.003-fix.004 appliquée
workspace.package.version = 0.2.6-pre.3.fix.4
Les preuves opérateur de pre.003-fix.004 sont vertes : cargo fmt --all, audit structurel Python, cargo check --workspace, cargo clippy --workspace --all-targets, cargo test -p ksp-app-config-desk, cargo test --workspace et cargo tauri dev -c crates/ksp-app-wallet-desk/tauri.conf.json. Le runtime utilise le profil composite Logging supertrace et démarre correctement.
Type de livraison
ksp-general-0.2.6-pre.004.zip
Cette tranche ajoute une dépendance interne Wallet et du runtime Rust/frontend ; le signal technique devient :
workspace.package.version = 0.2.6-pre.4
commit = v0.2.6-pre.004
Aucun tag stable.
Objet
Brancher l'inventory réel des fichiers natifs .kspwallet dans Wallet Desk sans introduire encore de password, de handle VIEW/OWNER ni de projection d'identité protégée.
Frontière Wallet
ksp-app-wallet-desk dépend désormais directement de ksp-wallet-lib et délègue l'inspection locked à :
ksp_wallet_lib::inspect_locked_wallet_file_v1
Aucune crypto, parser .kspwallet, keypair ou signature n'est réimplémenté dans l'application.
Inventory filesystem
La racine unique est :
ResolvedWalletConfig::effective_wallets_directory
Politique :
read_dir asynchrone non récursif
filename UTF-8
suffixe exact .kspwallet
un seul composant filename
slash et backslash rejetés pour les sélections frontend
fichiers réguliers uniquement
symlinks d'entrée exclus
répertoires même nommés *.kspwallet exclus
tri déterministe par filename
Le bootstrap Config durcit aussi la racine globale : un wallets_directory existant sous forme de symlink est désormais refusé au lieu d'être suivi par metadata().
Une erreur de lecture de la racine fait échouer la commande avec wallet_desk.wallet_inventory_failed. Une entrée .kspwallet présente mais invalide ne fait pas échouer tout l'inventory : elle reste visible avec état error, inspection invalid et CommandErrorDto sans context/source.
DTOs locked
La tranche ajoute :
WalletInventoryEntryDto
WalletInventoryStateDto
WalletInspectionStatusDto
LockedWalletDto
WalletSelectionRequestDto
Une ligne valide expose uniquement :
wallet_id / filename
format_version
view_enabled
state = locked
inspection_status = valid
Une ligne invalide expose filename + diagnostic sûr. Aucun DTO ne porte Pubkey, alias, notes, password, path complet ou handle Wallet.
Commandes Tauri
list_wallets
refresh_wallets
select_wallet
select_wallet reçoit uniquement un wallet_id/filename, reconstruit le path sous la racine effective, rejette traversal/séparateurs/symlink/non-file puis relance l'inspection locked avant de répondre. La sélection n'installe pas encore un WalletSession durable ; celui-ci reste pre.005.
Frontend
Le tableau Wallet devient un vrai DataTable alimenté par le backend :
État -> fa-lock ou fa-triangle-exclamation
Filename -> texte DOM sûr
Format -> version ou —
VIEW -> enabled / disabled / —
Inspection -> Valide ou code diagnostic sûr
Le bouton Refresh appelle refresh_wallets. La sélection d'une ligne valide appelle select_wallet et affiche seulement filename/format/VIEW dans la carte « Wallet courant ». Les lignes invalides restent visibles mais ne sont pas sélectionnables. Un refresh purge la projection sélectionnée frontend afin de ne pas conserver une vue stale.
Le rendu utilise textContent/création DOM pour les valeurs issues du filesystem ; aucun filename n'est injecté par HTML.
Logging
Les opérations suivantes sont instrumentées :
inventory refresh start/completion
invalid locked inspection
non-regular/symlink skip
selection accepted/rejected
frontend inventory load/render/refresh/row selection
Le profil composite reste supertrace; aucun changement de std.logging n'est requis.
Tests
Les canaris ajoutés couvrent :
valid .kspwallet + invalid .kspwallet dans le même inventory
wrong extension ignorée
subdirectory *.kspwallet ignoré
tri déterministe
traversal slash/backslash rejeté
symlink Wallet ignoré et non sélectionnable sur Unix
root wallets_directory symlink rejeté sur Unix
DTO locked sans Pubkey/alias/notes/password
commands Tauri list/refresh/select présentes
frontend DataTable réellement branché sur les DTOs Wallet
Dépendances
Cargo :
ksp-wallet-lib = { path = "../ksp-wallet-lib" }
tokio features += fs, rt
Aucune dépendance npm et aucun script npm ne changent. Aucune commande npm directe n'est nécessaire pour cette tranche.
Validation opérateur requise
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-pre004 cargo tauri dev -c crates/ksp-app-wallet-desk/tauri.conf.json
Pour la vérification UI, placer si souhaité un ou plusieurs .kspwallet existants dans var/wallet-desk-pre004, ainsi qu'un fichier invalid.kspwallet non valide, puis tester recherche/tri, Refresh et sélection des lignes valides.
Toujours aucun cargo tauri build à ce stade.
Suite
Après validation de pre.004, pre.005 introduira la création de Wallet et le lifecycle/session Rust sans avancer encore la balance HTTP.