33800 Docs

← Retour

Fix : Mot de passe SSH perdu lors de l'édition d'instance

Status : EN ATTENTE

Problème

Quand on modifie une instance SSH (nom, tags, host, etc.) sans re-saisir le mot de passe, celui-ci est écrasé et disparaît.

Cause racine

Chaîne d'événements :

  1. 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 }
  2. Frontend ouvre le modal d'édition, initialise editSshPassword = '' (ligne 234 de layout.tsx)

  3. 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
    }
  4. Backend instances.update reçoit token_metadata COMPLET (pas un merge) → il remplace tout → mot de passe perdu.

Solution proposée : Côté backend (merge token_metadata)

Modifier instances.update dans src/services/instances.ts pour merger le token_metadata entrant avec l'existant, au lieu de le remplacer entièrement.

Fichier : /stock_8to/33800-stack/projects/connectors-api/src/services/instances.ts

Ligne 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 };
}

Pourquoi côté backend ?

Cas couverts

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é)

Déploiement

  1. Modifier src/services/instances.ts
  2. git add + commit + push → CI/CD auto