diff --git a/internal/api/handlers/management/auth_files.go b/internal/api/handlers/management/auth_files.go index 4318b972..a0bff059 100644 --- a/internal/api/handlers/management/auth_files.go +++ b/internal/api/handlers/management/auth_files.go @@ -508,6 +508,10 @@ func (h *Handler) DeleteAuthFile(c *gin.Context) { } } if err = os.Remove(full); err == nil { + if errDel := h.deleteTokenRecord(ctx, full); errDel != nil { + c.JSON(500, gin.H{"error": errDel.Error()}) + return + } deleted++ h.disableAuth(ctx, full) } @@ -534,6 +538,10 @@ func (h *Handler) DeleteAuthFile(c *gin.Context) { } return } + if err := h.deleteTokenRecord(ctx, full); err != nil { + c.JSON(500, gin.H{"error": err.Error()}) + return + } h.disableAuth(ctx, full) c.JSON(200, gin.H{"status": "ok"}) } @@ -640,9 +648,20 @@ func (h *Handler) disableAuth(ctx context.Context, id string) { } } -func (h *Handler) saveTokenRecord(ctx context.Context, record *coreauth.Auth) (string, error) { - if record == nil { - return "", fmt.Errorf("token record is nil") +func (h *Handler) deleteTokenRecord(ctx context.Context, path string) error { + if strings.TrimSpace(path) == "" { + return fmt.Errorf("auth path is empty") + } + store := h.tokenStoreWithBaseDir() + if store == nil { + return fmt.Errorf("token store unavailable") + } + return store.Delete(ctx, path) +} + +func (h *Handler) tokenStoreWithBaseDir() coreauth.Store { + if h == nil { + return nil } store := h.tokenStore if store == nil { @@ -654,6 +673,17 @@ func (h *Handler) saveTokenRecord(ctx context.Context, record *coreauth.Auth) (s dirSetter.SetBaseDir(h.cfg.AuthDir) } } + return store +} + +func (h *Handler) saveTokenRecord(ctx context.Context, record *coreauth.Auth) (string, error) { + if record == nil { + return "", fmt.Errorf("token record is nil") + } + store := h.tokenStoreWithBaseDir() + if store == nil { + return "", fmt.Errorf("token store unavailable") + } return store.Save(ctx, record) } diff --git a/internal/runtime/executor/gemini_vertex_executor.go b/internal/runtime/executor/gemini_vertex_executor.go index 4e606390..94be62cb 100644 --- a/internal/runtime/executor/gemini_vertex_executor.go +++ b/internal/runtime/executor/gemini_vertex_executor.go @@ -22,6 +22,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/tidwall/gjson" "github.com/tidwall/sjson" + "golang.org/x/oauth2" "golang.org/x/oauth2/google" ) @@ -89,7 +90,7 @@ func (e *GeminiVertexExecutor) Execute(ctx context.Context, auth *cliproxyauth.A return resp, errNewReq } httpReq.Header.Set("Content-Type", "application/json") - if token, errTok := vertexAccessToken(ctx, saJSON); errTok == nil && token != "" { + if token, errTok := vertexAccessToken(ctx, e.cfg, auth, saJSON); errTok == nil && token != "" { httpReq.Header.Set("Authorization", "Bearer "+token) } else if errTok != nil { log.Errorf("vertex executor: access token error: %v", errTok) @@ -184,7 +185,7 @@ func (e *GeminiVertexExecutor) ExecuteStream(ctx context.Context, auth *cliproxy return nil, errNewReq } httpReq.Header.Set("Content-Type", "application/json") - if token, errTok := vertexAccessToken(ctx, saJSON); errTok == nil && token != "" { + if token, errTok := vertexAccessToken(ctx, e.cfg, auth, saJSON); errTok == nil && token != "" { httpReq.Header.Set("Authorization", "Bearer "+token) } else if errTok != nil { log.Errorf("vertex executor: access token error: %v", errTok) @@ -295,7 +296,7 @@ func (e *GeminiVertexExecutor) CountTokens(ctx context.Context, auth *cliproxyau return cliproxyexecutor.Response{}, errNewReq } httpReq.Header.Set("Content-Type", "application/json") - if token, errTok := vertexAccessToken(ctx, saJSON); errTok == nil && token != "" { + if token, errTok := vertexAccessToken(ctx, e.cfg, auth, saJSON); errTok == nil && token != "" { httpReq.Header.Set("Authorization", "Bearer "+token) } else if errTok != nil { log.Errorf("vertex executor: access token error: %v", errTok) @@ -407,7 +408,10 @@ func vertexBaseURL(location string) string { return fmt.Sprintf("https://%s-aiplatform.googleapis.com", loc) } -func vertexAccessToken(ctx context.Context, saJSON []byte) (string, error) { +func vertexAccessToken(ctx context.Context, cfg *config.Config, auth *cliproxyauth.Auth, saJSON []byte) (string, error) { + if httpClient := newProxyAwareHTTPClient(ctx, cfg, auth, 0); httpClient != nil { + ctx = context.WithValue(ctx, oauth2.HTTPClient, httpClient) + } // Use cloud-platform scope for Vertex AI. creds, errCreds := google.CredentialsFromJSON(ctx, saJSON, "https://www.googleapis.com/auth/cloud-platform") if errCreds != nil {