From 31f3003ff5dfc192a0ba1abb8ac9df6204294950 Mon Sep 17 00:00:00 2001 From: Xiangzhe Date: Mon, 14 Sep 2026 03:37:20 +0000 Subject: [PATCH] fix(openai): preserve manifest key validation --- .../internal/service/openai_codex_models_service.go | 11 +++++++---- .../service/openai_codex_models_service_test.go | 5 +++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/backend/internal/service/openai_codex_models_service.go b/backend/internal/service/openai_codex_models_service.go index 4e4cef8560..e2658581e7 100644 --- a/backend/internal/service/openai_codex_models_service.go +++ b/backend/internal/service/openai_codex_models_service.go @@ -2461,18 +2461,21 @@ func mergeMissingCodexModelFields(current, defaults map[string]json.RawMessage) } func validateCodexModelsManifestEnvelope(body []byte) error { - var envelope *struct { - Models []json.RawMessage `json:"models"` - } + var envelope map[string]json.RawMessage if err := json.Unmarshal(body, &envelope); err != nil { return fmt.Errorf("decode JSON object: %w", err) } if envelope == nil { return errors.New("expected a JSON object") } - if envelope.Models == nil { + models, ok := envelope["models"] + if !ok { return errors.New("missing top-level models array") } + models = bytes.TrimSpace(models) + if len(models) == 0 || models[0] != '[' { + return errors.New("top-level models field is not an array") + } return nil } diff --git a/backend/internal/service/openai_codex_models_service_test.go b/backend/internal/service/openai_codex_models_service_test.go index 087b3b8dac..888a32f55c 100644 --- a/backend/internal/service/openai_codex_models_service_test.go +++ b/backend/internal/service/openai_codex_models_service_test.go @@ -2562,6 +2562,11 @@ func TestFetchCodexModelsManifestRejectsInvalidEnvelope(t *testing.T) { } } +func TestValidateCodexModelsManifestEnvelopeRequiresExactModelsKey(t *testing.T) { + require.NoError(t, validateCodexModelsManifestEnvelope([]byte(`{"models":[]}`))) + require.Error(t, validateCodexModelsManifestEnvelope([]byte(`{"Models":[]}`))) +} + func TestFetchCodexModelsManifestAPIKeyDoesNotCacheInvalidEnvelope(t *testing.T) { var calls atomic.Int32 upstream := &codexModelsHTTPUpstreamStub{do: func(_ *http.Request, _ string, _ int64, _ int) (*http.Response, error) {