go-cursor-help/main.go
2024-12-09 15:00:45 +08:00

173 lines
4.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 main
import (
"crypto/rand"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"fmt"
"os"
"path/filepath"
"runtime"
)
// StorageConfig 存储配置结构体
type StorageConfig struct {
TelemetryMacMachineId string `json:"telemetry.macMachineId"`
TelemetryMachineId string `json:"telemetry.machineId"`
TelemetryDevDeviceId string `json:"telemetry.devDeviceId"`
}
// 生成类似原始machineId的字符串 (64位小写hex)
func generateMachineId() string {
// 生成一些随机数据
data := make([]byte, 32)
rand.Read(data)
// 使用SHA256生成hash
hash := sha256.New()
hash.Write(data)
// 转换为小写的hex字符串
return hex.EncodeToString(hash.Sum(nil))
}
// 生成类似原始macMachineId的字符串 (64位小写hex)
func generateMacMachineId() string {
return generateMachineId() // 使用相同的格式
}
// 生成类似原始devDeviceId的字符串 (标准UUID格式)
func generateDevDeviceId() string {
// 生成 UUID v4
uuid := make([]byte, 16)
rand.Read(uuid)
// 设置版本 (4) 和变体位
uuid[6] = (uuid[6] & 0x0f) | 0x40 // 版本 4
uuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 变体
// 格式化为标准 UUID 字符串
return fmt.Sprintf("%x-%x-%x-%x-%x",
uuid[0:4],
uuid[4:6],
uuid[6:8],
uuid[8:10],
uuid[10:16])
}
// 获取配置文件路径
func getConfigPath() (string, error) {
var configDir string
switch runtime.GOOS {
case "darwin":
homeDir, err := os.UserHomeDir()
if err != nil {
return "", err
}
configDir = filepath.Join(homeDir, "Library", "Application Support", "Cursor", "User", "globalStorage")
case "windows":
appData := os.Getenv("APPDATA")
configDir = filepath.Join(appData, "Cursor", "User", "globalStorage")
case "linux":
homeDir, err := os.UserHomeDir()
if err != nil {
return "", err
}
configDir = filepath.Join(homeDir, ".config", "Cursor", "User", "globalStorage")
default:
return "", fmt.Errorf("不支持的操作系统: %s", runtime.GOOS)
}
return filepath.Join(configDir, "storage.json"), nil
}
// 修改文件权限
func setFilePermissions(filePath string) error {
if runtime.GOOS == "windows" {
// Windows 使用 ACL 权限系统,这里仅设置为只读
return os.Chmod(filePath, 0444)
} else {
// Linux 和 macOS
return os.Chmod(filePath, 0444)
}
}
// 获取Cursor可执行文件路径
func getCursorExePath() (string, error) {
switch runtime.GOOS {
case "windows":
// Windows下通常在LocalAppData目录
localAppData := os.Getenv("LOCALAPPDATA")
return filepath.Join(localAppData, "Programs", "Cursor", "Cursor.exe"), nil
case "darwin":
// macOS下通常在Applications目录
return "/Applications/Cursor.app/Contents/MacOS/Cursor", nil
case "linux":
// Linux下可能在usr/bin目录
return "/usr/bin/cursor", nil
default:
return "", fmt.Errorf("不支持的操作系统: %s", runtime.GOOS)
}
}
func main() {
// 获取配置文件路径
configPath, err := getConfigPath()
if err != nil {
fmt.Printf("获取配置文件路径失败: %v\n", err)
return
}
// 读取原始文件内容
content, err := os.ReadFile(configPath)
if err != nil {
fmt.Printf("读取配置文件失败: %v\n", err)
return
}
// 解析 JSON
var config map[string]interface{}
if err := json.Unmarshal(content, &config); err != nil {
fmt.Printf("解析 JSON 失败: %v\n", err)
return
}
// 修改指定字段,使用更准确的生成方法
config["telemetry.macMachineId"] = generateMacMachineId()
config["telemetry.machineId"] = generateMachineId()
config["telemetry.devDeviceId"] = generateDevDeviceId()
// 转换回 JSON保持原有的格式
newContent, err := json.MarshalIndent(config, "", " ")
if err != nil {
fmt.Printf("生成 JSON 失败: %v\n", err)
return
}
// 先确保文件可写
err = os.Chmod(configPath, 0666)
if err != nil {
fmt.Printf("修改文件权限失败: %v\n", err)
return
}
// 写入文件
err = os.WriteFile(configPath, newContent, 0666)
if err != nil {
fmt.Printf("写入文件失败: %v\n", err)
return
}
// 设置文件为只读
err = setFilePermissions(configPath)
if err != nil {
fmt.Printf("设置文件只读权限失败: %v\n", err)
return
}
fmt.Println("配置文件已成功更新请手动重启Cursor以使更改生效。")
}