Files
Local-Cursor/internal/client/cursor.go
FuDie0915 188225fae6 Ð޸´ȫÏîĿÉó²éÎÊÌⲢ·¢²¼ v1.1.9
¸ÄÓñ¾»ú¶ÀÁ¢ CA£¬»ָ´ CLI TLS УÑ飬±£»¤ƾ¾ÝÓëÅäÖò¢·¢±£´档
Ð޸´ Cursor Êý¾ݡ¢»Ự·¾¶¡¢´úÀíÉúÃüÖÜÆڡ¢ģÐÍÇëÇóÓë Skills Îļþ²Ù×÷¡£
Ϊ¶ÀÁ¢ Tab ·þÎñÔö¼ӿͻ§¶˼øȨ£¬Éý¼¶ÒÀÀµÓ빤¾ßÁ´£¬ÍêÉƷ¢²¼ԪÐÅϢͬ²½¡£

Ñé֤£ºÁ½¸ö Go ģ¿éµIJâÊÔ/vet¡¢¹ؼüģ¿é race¡¢ǰ¶˲âÊÔ/Éú²ú¹¹½¨/Éó¼ơ¢
Go ¿ɴï©¶´ɨÃèÓë macOS/Linux ¿ÉÐÐģ¿齻²æ±àÒë¾ùͨ¹ý¡£
Windows ¸ôÀëÆô¶¯ͨ¹ý£»δÍê³ɵĵã»÷ðÑ̺ÍԭÉúƽ̨Ñé֤¼ûÉó²鱨¸档
2026-11-10 09:59:34 +08:00

112 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package client
import (
"errors"
"fmt"
goruntime "runtime"
"cursor/internal/cursor"
"cursor/internal/logger"
)
// ApplyCursorSettings 用于处理与 ApplyCursorSettings 相关的逻辑。
func (s *ProxyService) ApplyCursorSettings() error {
if s == nil || s.proxyServer() == nil {
return fmt.Errorf("proxy is not initialized")
}
s.caFileMu.Lock()
caCertPath, err := cursor.EnsureCACertFile(s.caCertPEM, s.caFilePath)
if err == nil {
s.caFilePath = caCertPath
}
s.caFileMu.Unlock()
if err != nil {
return fmt.Errorf("ensure ca cert file: %w", err)
}
switch goruntime.GOOS {
case "windows":
if err := cursor.EnsureCACertInstalled(s.caCertPEM, caCertPath); err != nil {
return fmt.Errorf("install ca cert: %w", err)
}
case "darwin":
if err := cursor.EnsureCACertInstalled(s.caCertPEM, caCertPath); err != nil {
return fmt.Errorf("install ca cert: %w", err)
}
if err := cursor.SetSystemNodeExtraCACerts(caCertPath); err != nil {
return fmt.Errorf("set node extra ca certs: %w", err)
}
}
proxyURL := cursor.ProxyURLFromListenAddr(s.proxyServer().Snapshot().ListenAddr)
if err := cursor.WriteUserProxySettings(proxyURL); err != nil {
return err
}
// CLI 版 wrapper: 不再需要 HTTP_PROXY,由 preload 脚本直接重定向 tls.connect 到后端 HTTPS 端口
// 注入 NODE_EXTRA_CA_CERTS + CURSOR_AUTH_TOKEN
// 如果未检测到 CLI 安装,跳过但不报错
if cliPath := cursor.DetectCLIInstallPath(); cliPath != "" {
cliHTTPSAddr := ""
if s.backend() != nil {
cliHTTPSAddr = s.backend().CLIHTTPSListenAddr()
}
if err := cursor.WriteCLIProxyWrapper(cliHTTPSAddr, caCertPath); err != nil {
logger.Errorf("write cli proxy wrapper failed: %v", err)
}
// 写入 mock auth.json,使 CLI 跳过交互式登录
if err := cursor.WriteCLIAuthFile(); err != nil {
logger.Errorf("write cli auth.json failed: %v", err)
}
} else {
logger.Infof("applyCursorSettings: cli not detected, skipping wrapper")
}
s.setCursorSettingsApplied(true)
return nil
}
// ClearCursorSettings 用于处理与 ClearCursorSettings 相关的逻辑。
func (s *ProxyService) ClearCursorSettings() error {
var errs []error
if goruntime.GOOS == "darwin" {
if err := cursor.ClearSystemNodeExtraCACerts(); err != nil {
errs = append(errs, err)
}
}
for _, clear := range []func() error{cursor.ClearUserProxySettings, cursor.ClearCLIProxyWrapper, cursor.ClearCLIAuthFile} {
if err := clear(); err != nil {
errs = append(errs, err)
}
}
if len(errs) == 0 {
s.setCursorSettingsApplied(false)
}
return errors.Join(errs...)
}
// GetDeviceID 用于处理与 GetDeviceID 相关的逻辑。
func (s *ProxyService) GetDeviceID() (string, error) {
return cursor.GetDeviceID()
}
// CLIStatus 返回 CLI 版 cursor-agent 的代理状态。
type CLIStatus struct {
Installed bool `json:"installed"`
InstallPath string `json:"installPath"`
WrapperActive bool `json:"wrapperActive"`
WrapperPath string `json:"wrapperPath"`
}
// GetCLIStatus 用于处理与 GetCLIStatus 相关的逻辑。
func (s *ProxyService) GetCLIStatus() CLIStatus {
path := cursor.DetectCLIInstallPath()
return CLIStatus{
Installed: path != "",
InstallPath: path,
WrapperActive: cursor.CLIWrapperExists(),
WrapperPath: cursor.CLIWrapperPath(),
}
}