From a1090db80291d7a768e17abe4ceabd7171234101 Mon Sep 17 00:00:00 2001 From: enzo Date: Fri, 20 Mar 2026 22:54:47 +0100 Subject: [PATCH] fix: correction decodeJSON nil body + logs debug test-ssh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - helpers.go : corrige le cas r.Body == nil (panic → erreur explicite) - install.go : ajout logs étape par étape pour TestSSH (TCP, auth SSH) sans jamais logger le mot de passe (longueur uniquement) Co-Authored-By: Claude Sonnet 4.6 --- backend/internal/api/helpers.go | 5 +++-- backend/internal/api/install.go | 13 +++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/internal/api/helpers.go b/backend/internal/api/helpers.go index 26195dc..49efce8 100644 --- a/backend/internal/api/helpers.go +++ b/backend/internal/api/helpers.go @@ -3,14 +3,15 @@ package api import ( "encoding/json" + "errors" "net/http" ) // decodeJSON décode le corps JSON d'une requête dans dest. -// Retourne une erreur si le corps est invalide ou manquant. +// Retourne une erreur si le corps est manquant ou invalide. func decodeJSON(r *http.Request, dest any) error { if r.Body == nil { - return json.NewDecoder(r.Body).Decode(dest) + return errors.New("corps de requête vide") } return json.NewDecoder(r.Body).Decode(dest) } diff --git a/backend/internal/api/install.go b/backend/internal/api/install.go index b1a6524..c8f0814 100644 --- a/backend/internal/api/install.go +++ b/backend/internal/api/install.go @@ -4,6 +4,7 @@ package api import ( "fmt" + "log" "net" "net/http" "strings" @@ -55,32 +56,43 @@ func (h *InstallHandler) TestSSH(w http.ResponseWriter, r *http.Request) { Password string `json:"password"` } if err := decodeJSON(r, &body); err != nil { + log.Printf("[install/test-ssh] Décodage JSON échoué : %v", err) JSONError(w, "Corps de requête invalide", http.StatusBadRequest) return } + log.Printf("[install/test-ssh] Tentative — host=%s user=%s", body.Host, body.Username) + if body.Host == "" || body.Username == "" || body.Password == "" { + log.Printf("[install/test-ssh] Paramètres manquants — host=%q user=%q password_len=%d", + body.Host, body.Username, len(body.Password)) JSONError(w, "Paramètres host, username et password requis", http.StatusBadRequest) return } // Valider le format host:port if _, _, err := net.SplitHostPort(body.Host); err != nil { + log.Printf("[install/test-ssh] Format host invalide : %q — %v", body.Host, err) JSONError(w, "Format host invalide (attendu: host:port)", http.StatusBadRequest) return } // Test de connectivité réseau d'abord + log.Printf("[install/test-ssh] Test connectivité TCP vers %s...", body.Host) if err := auth.TestConnectivity(body.Host, 5*time.Second); err != nil { + log.Printf("[install/test-ssh] Connectivité échouée : %v", err) JSONResponse(w, http.StatusOK, map[string]any{ "success": false, "error": fmt.Sprintf("Impossible de joindre %s : %v", body.Host, err), }) return } + log.Printf("[install/test-ssh] Connectivité TCP OK") // Test d'authentification SSH + log.Printf("[install/test-ssh] Test authentification SSH — user=%s", body.Username) if err := auth.TestSSHAuth(body.Host, body.Username, body.Password); err != nil { + log.Printf("[install/test-ssh] Authentification échouée : %v", err) JSONResponse(w, http.StatusOK, map[string]any{ "success": false, "error": err.Error(), @@ -88,6 +100,7 @@ func (h *InstallHandler) TestSSH(w http.ResponseWriter, r *http.Request) { return } + log.Printf("[install/test-ssh] Succès — host=%s user=%s", body.Host, body.Username) JSONResponse(w, http.StatusOK, map[string]any{ "success": true, "message": "Connexion SSH réussie",