Files
IdeA/.ideai/tickets/135/issue.md
Blomios 59d81851e9 chore(tickets): synchronise index/carnets tickets #131-#139 + note mémoire assets/persistance plugins
État runtime .ideai séparé du code (index, counter, carnets, note mémoire
plugin-asset-serving-and-owned-storage-contracts). Purge des tickets obsolètes
51/63/66.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 11:06:30 +02:00

2.5 KiB

id, number, title, status, priority, sprint, links, agentRefs, attachments, createdBy, updatedBy, createdAt, updatedAt, version
id number title status priority sprint links agentRefs attachments createdBy updatedBy createdAt updatedAt version
13442dae-7860-45e3-9287-31b9bde19170 135 Plugins: audit confinement install & désinstallation 100% propre qa high null
target kind
#133 dependsOn
agentId role
ab328d90-c307-4771-a3b6-6c56089c8506 assigned
kind agent_id
agent b4730d7f-c54d-4736-8a04-c6203aa2fd49
kind agent_id
agent a6c6ea12-bfc6-4bdc-8031-324102dfa34d
1785702662938 1785708498776 4

Applique le contrat de confinement/désinstallation décidé en #133.

Auditer plugin_install_from_archive / plugin_install_from_directory (crates/app-tauri/src/plugins.rs:67-142) et le store d'infrastructure (crates/infrastructure/src/plugin/mod.rs) pour confirmer qu'aucune écriture ne peut jamais sortir de app_data/plugins/installed/<id> :

  • Un plugin dont le manifeste ou l'archive contient un chemin ../ ou un symlink pointant hors de sa racine doit échouer à l'install (vérifier que RelativePath::new — qui rejette déjà .. et les chemins absolus, cf. crates/domain/src/plugin.rs — est bien appliqué à l'INSTALL, pas seulement au SERVE ajouté en #134).
  • Aucune écriture ne doit jamais toucher le project root ni .ideai/ du projet ouvert : le plugin est un citoyen de app_data, jamais du repo utilisateur.

Vérifier que plugin_uninstall (crates/app-tauri/src/plugins.rs:142) supprime bien 100% : dossier entier + entrée registry, zéro résidu. Étendre si besoin les tests existants (uninstall_removes_registry_package_and_stops_mcp, uninstall_then_reinstall_leaves_runtime_catalog_active_without_residue dans crates/application/src/plugin/mod.rs) pour couvrir explicitement le cas d'un plugin multi-fichiers (plusieurs fichiers sous dist/).

Si un chemin d'attaque (symlink sortant, ../ dans une archive zip malveillante) n'est pas déjà bloqué à l'install, ouvrir un correctif dans ce même ticket (pas de nouveau ticket) : c'est un renforcement du même contrat, pas une nouvelle feature.

Critères d'acceptation :

  • Rapport d'audit écrit (dans le carnet du ticket) listant les points vérifiés et leur statut.
  • Test explicite : tentative d'installer un plugin avec chemin ../ ou symlink sortant → échec propre, aucun fichier écrit hors racine.
  • Test explicite : désinstallation d'un plugin multi-fichiers → dossier disparu, entrée registry disparue, aucun résidu.
  • cargo test -p app-tauri -p infrastructure -p application vert.