дȫÏîĿÉó²éÎÊÌⲢ·¢²¼ v1.1.9
¸ÄÓñ¾»ú¶ÀÁ¢ CA£¬»ָ´ CLI TLS УÑ飬±£»¤ƾ¾ÝÓëÅäÖò¢·¢±£´档 д Cursor Êý¾ݡ¢»Ự·¾¶¡¢´úÀíÉúÃüÖÜÆڡ¢ģÐÍÇëÇóÓë Skills Îļþ²Ù×÷¡£ Ϊ¶ÀÁ¢ Tab ·þÎñÔö¼ӿͻ§¶˼øȨ£¬Éý¼¶ÒÀÀµÓ빤¾ßÁ´£¬ÍêÉƷ¢²¼ԪÐÅϢͬ²½¡£ Ñé֤£ºÁ½¸ö Go ģ¿éµIJâÊÔ/vet¡¢¹ؼüģ¿é race¡¢ǰ¶˲âÊÔ/Éú²ú¹¹½¨/Éó¼ơ¢ Go ¿ɴï©¶´ɨÃèÓë macOS/Linux ¿ÉÐÐģ¿齻²æ±àÒë¾ùͨ¹ý¡£ Windows ¸ôÀëÆô¶¯ͨ¹ý£»δÍê³ɵĵã»÷ðÑ̺ÍԭÉúƽ̨Ñé֤¼ûÉó²鱨¸档
This commit is contained in:
@@ -30,12 +30,6 @@ var injectedCursorSettingsKeys = []string{
|
||||
// EnsureCACertFile 用于处理与 EnsureCACertFile 相关的逻辑。
|
||||
func EnsureCACertFile(certPEM []byte, currentPath string) (string, error) {
|
||||
certPath := appdata.CACertFilePath()
|
||||
if samePath(strings.TrimSpace(currentPath), certPath) {
|
||||
if _, err := os.Stat(certPath); err == nil {
|
||||
logger.Infof("ensureCACertFile: reusing path=%s", certPath)
|
||||
return certPath, nil
|
||||
}
|
||||
}
|
||||
|
||||
if err := os.MkdirAll(filepath.Dir(certPath), 0o755); err != nil {
|
||||
return "", fmt.Errorf("创建证书配置目录失败: %w", err)
|
||||
@@ -65,6 +59,9 @@ func samePath(left string, right string) bool {
|
||||
if strings.TrimSpace(left) == "" || strings.TrimSpace(right) == "" {
|
||||
return false
|
||||
}
|
||||
if runtime.GOOS == "windows" {
|
||||
return strings.EqualFold(filepath.Clean(left), filepath.Clean(right))
|
||||
}
|
||||
return filepath.Clean(left) == filepath.Clean(right)
|
||||
}
|
||||
|
||||
@@ -117,125 +114,6 @@ func ClearSystemNodeExtraCACerts() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// WriteUserProxySettings 用于处理与 WriteUserProxySettings 相关的逻辑。
|
||||
func WriteUserProxySettings(proxyURL string) error {
|
||||
proxyURL = strings.TrimSpace(proxyURL)
|
||||
if proxyURL == "" {
|
||||
return errors.New("代理地址为空")
|
||||
}
|
||||
|
||||
settingsPath, err := resolveCursorSettingsPath()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := os.MkdirAll(filepath.Dir(settingsPath), 0o755); err != nil {
|
||||
return fmt.Errorf("创建 Cursor 配置目录失败: %w", err)
|
||||
}
|
||||
|
||||
settings := make(map[string]any)
|
||||
data, err := os.ReadFile(settingsPath)
|
||||
if err != nil {
|
||||
if !errors.Is(err, os.ErrNotExist) {
|
||||
return fmt.Errorf("读取 Cursor 配置失败: %w", err)
|
||||
}
|
||||
} else if len(bytes.TrimSpace(data)) > 0 {
|
||||
parsed, err := decodeCursorSettingsJSONC(data)
|
||||
if err != nil {
|
||||
if removeErr := os.Remove(settingsPath); removeErr != nil && !errors.Is(removeErr, os.ErrNotExist) {
|
||||
return fmt.Errorf("解析 Cursor 配置失败,且删除损坏配置失败: %w", removeErr)
|
||||
}
|
||||
logger.Infof("writeCursorUserProxySettings: removed invalid settings path=%s err=%v", settingsPath, err)
|
||||
data = nil
|
||||
} else {
|
||||
settings = parsed
|
||||
}
|
||||
}
|
||||
|
||||
settings["http.proxy"] = proxyURL
|
||||
settings["http.proxyKerberosServicePrincipal"] = proxyURL
|
||||
settings["http.proxySupport"] = "on"
|
||||
settings["cursor.general.disableHttp2"] = true
|
||||
settings["http.experimental.systemCertificatesV2"] = true
|
||||
// update.mode 写入后永久保留,不随 ClearUserProxySettings 清除,避免恢复自动更新。
|
||||
settings["update.mode"] = "none"
|
||||
|
||||
encoded, err := json.MarshalIndent(settings, "", " ")
|
||||
if err != nil {
|
||||
return fmt.Errorf("序列化 Cursor 配置失败: %w", err)
|
||||
}
|
||||
encoded = append(encoded, '\n')
|
||||
|
||||
if len(bytes.TrimSpace(data)) > 0 && bytes.Equal(data, encoded) {
|
||||
logger.Infof("writeCursorUserProxySettings: unchanged path=%s proxy=%s", settingsPath, proxyURL)
|
||||
return nil
|
||||
}
|
||||
|
||||
tempPath := settingsPath + ".tmp"
|
||||
if err := os.WriteFile(tempPath, encoded, 0o644); err != nil {
|
||||
return fmt.Errorf("写入 Cursor 配置临时文件失败: %w", err)
|
||||
}
|
||||
if err := os.Rename(tempPath, settingsPath); err != nil {
|
||||
return fmt.Errorf("保存 Cursor 配置失败: %w", err)
|
||||
}
|
||||
|
||||
logger.Infof("writeCursorUserProxySettings: path=%s proxy=%s", settingsPath, proxyURL)
|
||||
return nil
|
||||
}
|
||||
|
||||
// ClearUserProxySettings 用于处理与 ClearUserProxySettings 相关的逻辑。
|
||||
func ClearUserProxySettings() error {
|
||||
settingsPath, err := resolveCursorSettingsPath()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
data, err := os.ReadFile(settingsPath)
|
||||
if err != nil {
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("读取 Cursor 配置失败: %w", err)
|
||||
}
|
||||
if len(bytes.TrimSpace(data)) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
settings := make(map[string]any)
|
||||
parsed, err := decodeCursorSettingsJSONC(data)
|
||||
if err != nil {
|
||||
return fmt.Errorf("解析 Cursor 配置失败: %w", err)
|
||||
}
|
||||
settings = parsed
|
||||
|
||||
changed := false
|
||||
for _, key := range injectedCursorSettingsKeys {
|
||||
if _, exists := settings[key]; exists {
|
||||
delete(settings, key)
|
||||
changed = true
|
||||
}
|
||||
}
|
||||
if !changed {
|
||||
return nil
|
||||
}
|
||||
|
||||
encoded, err := json.MarshalIndent(settings, "", " ")
|
||||
if err != nil {
|
||||
return fmt.Errorf("序列化 Cursor 配置失败: %w", err)
|
||||
}
|
||||
encoded = append(encoded, '\n')
|
||||
|
||||
tempPath := settingsPath + ".tmp"
|
||||
if err := os.WriteFile(tempPath, encoded, 0o644); err != nil {
|
||||
return fmt.Errorf("写入 Cursor 配置临时文件失败: %w", err)
|
||||
}
|
||||
if err := os.Rename(tempPath, settingsPath); err != nil {
|
||||
return fmt.Errorf("保存 Cursor 配置失败: %w", err)
|
||||
}
|
||||
|
||||
logger.Infof("clearCursorUserProxySettings: path=%s", settingsPath)
|
||||
return nil
|
||||
}
|
||||
|
||||
// resolveCursorSettingsPath 用于处理与 resolveCursorSettingsPath 相关的逻辑。
|
||||
func resolveCursorSettingsPath() (string, error) {
|
||||
homeDir, err := os.UserHomeDir()
|
||||
|
||||
Reference in New Issue
Block a user