fix(console): testMode auth — X-Auth-Token accepted as sub v0.8.1

This commit is contained in:
Naeel
2026-04-20 15:09:49 +03:00
parent 9997dce2bb
commit d76aa53f73
+27 -12
View File
@@ -10,12 +10,12 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"go/parser"
"go/token"
"io" "io"
"log" "log"
"net" "net"
"net/http" "net/http"
"go/parser"
"go/token"
"os" "os"
"os/exec" "os/exec"
"regexp" "regexp"
@@ -174,8 +174,11 @@ func main() {
if s.testMode { if s.testMode {
// TEST_MODE: deck API не вызывается. // TEST_MODE: deck API не вызывается.
// X-Test-Sub задаёт произвольный sub → разные namespace-ы для тестирования. // X-Test-Sub или X-Auth-Token задают sub → разные namespace-ы для тестирования.
sub := strings.TrimSpace(r.Header.Get("X-Test-Sub")) sub := strings.TrimSpace(r.Header.Get("X-Test-Sub"))
if sub == "" {
sub = strings.TrimSpace(r.Header.Get("X-Auth-Token"))
}
if sub == "" { if sub == "" {
writeJSONError(w, http.StatusUnauthorized, "test mode: X-Test-Sub required") writeJSONError(w, http.StatusUnauthorized, "test mode: X-Test-Sub required")
return return
@@ -1450,14 +1453,24 @@ func (s *server) handleAuth(w http.ResponseWriter, r *http.Request) {
if _, ok := deckAPIs[env]; !ok { if _, ok := deckAPIs[env]; !ok {
env = "test" env = "test"
} }
if err := s.validateDeckToken(body.Token, env); err != nil { var ns string
writeJSONError(w, http.StatusUnauthorized, "invalid token") if s.testMode {
return // testMode: токен — это sub (email), Deck не вызывается
} ns = func() string {
ns, err := namespaceFromJWT(body.Token) h32 := sha256.Sum256([]byte(body.Token))
if err != nil { return "fission-" + hex.EncodeToString(h32[:8])
log.Printf("handleAuth: namespaceFromJWT: %v", err) }()
ns = s.ns } else {
if err := s.validateDeckToken(body.Token, env); err != nil {
writeJSONError(w, http.StatusUnauthorized, "invalid token")
return
}
var err error
ns, err = namespaceFromJWT(body.Token)
if err != nil {
log.Printf("handleAuth: namespaceFromJWT: %v", err)
ns = s.ns
}
} }
ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second)
defer cancel() defer cancel()
@@ -1966,7 +1979,9 @@ func (s *server) handleAIAsk(w http.ResponseWriter, r *http.Request) {
Content string `json:"content"` Content string `json:"content"`
} `json:"message"` } `json:"message"`
} `json:"choices"` } `json:"choices"`
Error *struct{ Message string `json:"message"` } `json:"error"` Error *struct {
Message string `json:"message"`
} `json:"error"`
} }
if err := json.NewDecoder(io.LimitReader(resp.Body, 64*1024)).Decode(&llmResp); err != nil { if err := json.NewDecoder(io.LimitReader(resp.Body, 64*1024)).Decode(&llmResp); err != nil {
writeJSONError(w, http.StatusBadGateway, "parse error: "+err.Error()) writeJSONError(w, http.StatusBadGateway, "parse error: "+err.Error())