Status : EN ATTENTE
Quand on modifie une instance SSH (nom, tags, host, etc.) sans re-saisir le mot de passe, celui-ci est écrasé et disparaît.
Chaîne d'événements :
GET /api/user/instances/:id retourne token_metadata sans password_encrypted ni private_key_encrypted (sécurité - lignes 2216-2218 de index.ts) :
{ "host": "...", "port": 22, "username": "...", "has_password": true, "has_key": false }
Frontend ouvre le modal d'édition, initialise editSshPassword = '' (ligne 234 de layout.tsx)
Lors de la sauvegarde, le frontend fait un spread de instance.value.token_metadata (qui n'a PAS password_encrypted) puis ajoute conditionnellement le mdp :
token_metadata: {
...instance.value.token_metadata, // pas de password_encrypted dedans
host: editSshHost.value,
...(editSshPassword.value && { password_encrypted: editSshPassword.value })
// si vide → pas ajouté → password_encrypted absent du payload
}
Backend instances.update reçoit token_metadata COMPLET (pas un merge) → il remplace tout → mot de passe perdu.
Modifier instances.update dans src/services/instances.ts pour merger le token_metadata entrant avec l'existant, au lieu de le remplacer entièrement.
/stock_8to/33800-stack/projects/connectors-api/src/services/instances.tsLigne 325, remplacer :
if (updates.tokenMetadata !== undefined) updateData.token_metadata = updates.tokenMetadata;
Par :
if (updates.tokenMetadata !== undefined) {
// Merge with existing token_metadata to preserve encrypted fields not sent by frontend
const existingMeta = existing.data.token_metadata as Record<string, any> || {};
updateData.token_metadata = { ...existingMeta, ...updates.tokenMetadata };
}
password_encrypted car il ne l'a jamais reçu (sécurité)existing.data) déjà chargé ligne 283| Action utilisateur | Résultat attendu |
|---|---|
| Modifie le nom sans toucher au SSH | password_encrypted préservé |
| Change le host/port | password_encrypted préservé, host/port mis à jour |
| Saisit un nouveau mot de passe | password_encrypted remplacé par le nouveau (spread écrase) |
| Vide explicitement le mot de passe | Cas non impacté (le champ vide n'est pas envoyé) |
src/services/instances.tsgit add + commit + push → CI/CD auto