Files
Loki/internal/ajean/relay_localauth_test.go
T
nathaninline 59eb2357e9 L'acces distant suit la cle de pilotage courante
withLocalAuth capturait la cle UNE FOIS a l'ouverture du tunnel.
Changer la cle ensuite, depuis l'interface ou avec set-web-key, faisait
donc injecter l'ANCIENNE dans chaque requete venue du relais : tout
l'acces distant passait en 401 jusqu'au prochain redemarrage du
service. Et comme le chat n'affiche pas le code HTTP d'un flux qui
n'arrive jamais, le symptome etait un « chargement de la conversation »
infini, sans une ligne d'explication.

La cle est relue a chaque requete. Cout nul : requireWebAuth le fait
deja de l'autre cote. Deux tests, dont un qui echoue bien sur l'ancien
code.
2026-08-08 21:26:41 +02:00

65 lines
2.1 KiB
Go

package ajean
import (
"net/http"
"net/http/httptest"
"testing"
)
// Changer la clé de pilotage ne doit PAS couper l'accès distant jusqu'au
// prochain redémarrage. La clé était capturée à l'ouverture du tunnel : après un
// `ajean set-web-key`, le tunnel injectait l'ancienne, tout passait en 401, et
// le portail restait bloqué sur « chargement de la conversation » sans jamais
// dire pourquoi.
func TestWithLocalAuthSuitLaCleCourante(t *testing.T) {
testHome(t)
if err := putStr(bkState, "web_key", "cle-numero-1"); err != nil {
t.Fatal(err)
}
// Handler protégé, comme l'API web réelle.
protege := withLocalAuth(requireWebAuth(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
}))
appel := func() int {
rr := httptest.NewRecorder()
protege.ServeHTTP(rr, httptest.NewRequest("GET", "/api/status", nil))
return rr.Code
}
if code := appel(); code != 200 {
t.Fatalf("clé initiale : HTTP %d", code)
}
// La clé change pendant que le tunnel tourne (bouton de l'interface, CLI).
if err := putStr(bkState, "web_key", "cle-numero-2"); err != nil {
t.Fatal(err)
}
if code := appel(); code != 200 {
t.Fatalf("après changement de clé : HTTP %d — le tunnel injecte encore l'ancienne", code)
}
// Clé retirée : l'API est ouverte, le tunnel ne doit rien casser non plus.
if err := putStr(bkState, "web_key", ""); err != nil {
t.Fatal(err)
}
if code := appel(); code != 200 {
t.Fatalf("sans clé : HTTP %d", code)
}
}
// Une requête qui porte DÉJÀ une autorisation n'est pas réécrite : c'est le
// client distant qui décide dans ce cas.
func TestWithLocalAuthNecraseAucunEnTete(t *testing.T) {
testHome(t)
if err := putStr(bkState, "web_key", "cle-locale"); err != nil {
t.Fatal(err)
}
var vu string
protege := withLocalAuth(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
vu = r.Header.Get("Authorization")
}))
req := httptest.NewRequest("GET", "/api/status", nil)
req.Header.Set("Authorization", "Bearer venue-du-client")
protege.ServeHTTP(httptest.NewRecorder(), req)
if vu != "Bearer venue-du-client" {
t.Fatalf("en-tête client écrasé : %q", vu)
}
}