From adb580b3442fa2ac5ffbf120173189b541cabdb9 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Fri, 3 Apr 2026 21:46:49 +0800 Subject: [PATCH] feat(security): add configuration to toggle Gemini CLI endpoint access Closes: #2445 --- config.example.yaml | 4 ++++ internal/config/sdk_config.go | 4 ++++ sdk/api/handlers/gemini/gemini-cli_handlers.go | 10 ++++++++++ 3 files changed, 18 insertions(+) diff --git a/config.example.yaml b/config.example.yaml index 9bc71e058..5dd872eae 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -100,6 +100,10 @@ routing: # When true, enable authentication for the WebSocket API (/v1/ws). ws-auth: false +# When true, enable Gemini CLI internal endpoints (/v1internal:*). +# Default is false for safety. +enable-gemini-cli-endpoint: false + # When > 0, emit blank lines every N seconds for non-streaming responses to prevent idle timeouts. nonstream-keepalive-interval: 0 diff --git a/internal/config/sdk_config.go b/internal/config/sdk_config.go index 9d99c9242..aa27526d1 100644 --- a/internal/config/sdk_config.go +++ b/internal/config/sdk_config.go @@ -9,6 +9,10 @@ type SDKConfig struct { // ProxyURL is the URL of an optional proxy server to use for outbound requests. ProxyURL string `yaml:"proxy-url" json:"proxy-url"` + // EnableGeminiCLIEndpoint controls whether Gemini CLI internal endpoints (/v1internal:*) are enabled. + // Default is false for safety; when false, /v1internal:* requests are rejected. + EnableGeminiCLIEndpoint bool `yaml:"enable-gemini-cli-endpoint" json:"enable-gemini-cli-endpoint"` + // ForceModelPrefix requires explicit model prefixes (e.g., "teamA/gemini-3-pro-preview") // to target prefixed credentials. When false, unprefixed model requests may use prefixed // credentials as well. diff --git a/sdk/api/handlers/gemini/gemini-cli_handlers.go b/sdk/api/handlers/gemini/gemini-cli_handlers.go index df5efc423..4c5ddf80f 100644 --- a/sdk/api/handlers/gemini/gemini-cli_handlers.go +++ b/sdk/api/handlers/gemini/gemini-cli_handlers.go @@ -50,6 +50,16 @@ func (h *GeminiCLIAPIHandler) Models() []map[string]any { // CLIHandler handles CLI-specific requests for Gemini API operations. // It restricts access to localhost only and routes requests to appropriate internal handlers. func (h *GeminiCLIAPIHandler) CLIHandler(c *gin.Context) { + if h.Cfg == nil || !h.Cfg.EnableGeminiCLIEndpoint { + c.JSON(http.StatusForbidden, handlers.ErrorResponse{ + Error: handlers.ErrorDetail{ + Message: "Gemini CLI endpoint is disabled", + Type: "forbidden", + }, + }) + return + } + requestHost := c.Request.Host requestHostname := requestHost if hostname, _, errSplitHostPort := net.SplitHostPort(requestHost); errSplitHostPort == nil {