You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

172 lines
4.2 KiB

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以使更改生效。")
}