@ -1,5 +1,7 @@
// 主程序包 / Main package
package main
package main
// 导入所需的包 / Import required packages
import (
import (
"bufio"
"bufio"
"crypto/rand"
"crypto/rand"
@ -13,12 +15,39 @@ import (
"path/filepath"
"path/filepath"
"runtime"
"runtime"
"strings"
"strings"
"syscall"
"time"
"time"
"github.com/fatih/color"
"github.com/fatih/color"
"golang.org/x/sys/windows"
)
)
// StorageConfig 存储配置结构体优化
// 语言类型和常量 / Language type and constants
type Language string
const (
CN Language = "cn"
EN Language = "en"
// Version constant
Version = "1.0.1"
)
// TextResource 存储多语言文本 / TextResource stores multilingual text
type TextResource struct {
SuccessMessage string
RestartMessage string
ReadingConfig string
GeneratingIds string
PressEnterToExit string
ErrorPrefix string
PrivilegeError string
RunAsAdmin string
RunWithSudo string
SudoExample string
}
// StorageConfig 优化的存储配置结构 / StorageConfig optimized storage configuration struct
type StorageConfig struct {
type StorageConfig struct {
TelemetryMacMachineId string ` json:"telemetry.macMachineId" `
TelemetryMacMachineId string ` json:"telemetry.macMachineId" `
TelemetryMachineId string ` json:"telemetry.machineId" `
TelemetryMachineId string ` json:"telemetry.machineId" `
@ -27,47 +56,91 @@ type StorageConfig struct {
Version string ` json:"version" `
Version string ` json:"version" `
}
}
// NewStorageConfig 创建新的配置实例
// AppError 定义错误类型 / AppError defines error types
type AppError struct {
Op string
Path string
Err error
}
// ProgressSpinner 用于显示进度动画 / ProgressSpinner for showing progress animation
type ProgressSpinner struct {
frames [ ] string
current int
message string
}
// 全局变量 / Global variables
var (
currentLanguage = CN // 默认为中文 / Default to Chinese
texts = map [ Language ] TextResource {
CN : {
SuccessMessage : "[√] 配置文件已成功更新!" ,
RestartMessage : "[!] 请手动重启 Cursor 以使更新生效" ,
ReadingConfig : "正在读取配置文件..." ,
GeneratingIds : "正在生成新的标识符..." ,
PressEnterToExit : "按回车键退出程序..." ,
ErrorPrefix : "程序发生严重错误: %v" ,
PrivilegeError : "\n[!] 错误:需要管理员权限" ,
RunAsAdmin : "请右键点击程序,选择「以管理员身份运行」" ,
RunWithSudo : "请使用 sudo 命令运行此程序" ,
SudoExample : "示例: sudo %s" ,
} ,
EN : {
SuccessMessage : "[√] Configuration file updated successfully!" ,
RestartMessage : "[!] Please restart Cursor manually for changes to take effect" ,
ReadingConfig : "Reading configuration file..." ,
GeneratingIds : "Generating new identifiers..." ,
PressEnterToExit : "Press Enter to exit..." ,
ErrorPrefix : "Program encountered a serious error: %v" ,
PrivilegeError : "\n[!] Error: Administrator privileges required" ,
RunAsAdmin : "Please right-click and select 'Run as Administrator'" ,
RunWithSudo : "Please run this program with sudo" ,
SudoExample : "Example: sudo %s" ,
} ,
}
)
// Error implementation for AppError
func ( e * AppError ) Error ( ) string {
if e . Path != "" {
return fmt . Sprintf ( "%s: %v [Path: %s]" , e . Op , e . Err , e . Path )
}
return fmt . Sprintf ( "%s: %v" , e . Op , e . Err )
}
// NewStorageConfig 创建新的配置实例 / Creates a new configuration instance
func NewStorageConfig ( ) * StorageConfig {
func NewStorageConfig ( ) * StorageConfig {
return & StorageConfig {
return & StorageConfig {
TelemetryMacMachineId : generateMacMachineId ( ) ,
TelemetryMacMachineId : generateMachineId ( ) ,
TelemetryMachineId : generateMachineId ( ) ,
TelemetryMachineId : generateMachineId ( ) ,
TelemetryDevDeviceId : generateDevDeviceId ( ) ,
TelemetryDevDeviceId : generateDevDeviceId ( ) ,
LastModified : time . Now ( ) ,
LastModified : time . Now ( ) ,
Version : "1.0.1" ,
Version : Version ,
}
}
}
}
// 生成类似原始machineId的字符串 (64位小写hex)
// 生成类似原始machineId的字符串(64位小写十六进制) / Generate a string similar to the original machineId (64-bit lowercase hex)
func generateMachineId ( ) string {
func generateMachineId ( ) string {
// 生成一些随机数据
data := make ( [ ] byte , 32 )
data := make ( [ ] byte , 32 )
rand . Read ( data )
// 使用SHA256生成hash
hash := sha256 . New ( )
hash . Write ( data )
// 转换为小写的hex字符串
return hex . EncodeToString ( hash . Sum ( nil ) )
if _ , err := rand . Read ( data ) ; err != nil {
panic ( fmt . Errorf ( "failed to generate random data: %v" , err ) )
}
}
// 生成类似原始macMachineId的字符串 (64位小写hex)
func generateMacMachineId ( ) string {
return generateMachineId ( ) // 使用相同的格式
hash := sha256 . Sum256 ( data )
return hex . EncodeToString ( hash [ : ] )
}
}
// 生成类似原始devDeviceId的字符 (标准UUID格式)
// 生成类似原始devDeviceId的字符串(标准UUID格式) / Generate a string similar to the original devDeviceId (standard UUID format)
func generateDevDeviceId ( ) string {
func generateDevDeviceId ( ) string {
// 生成 UUID v4
uuid := make ( [ ] byte , 16 )
uuid := make ( [ ] byte , 16 )
rand . Read ( uuid )
if _ , err := rand . Read ( uuid ) ; err != nil {
panic ( fmt . Errorf ( "failed to generate UUID: %v" , err ) )
}
// 设置版本 (4) 和变体位
uuid [ 6 ] = ( uuid [ 6 ] & 0x0f ) | 0x40 // 版本 4
uuid [ 8 ] = ( uuid [ 8 ] & 0x3f ) | 0x80 // RFC 4122 变体
uuid [ 6 ] = ( uuid [ 6 ] & 0x0f ) | 0x40 // Version 4
uuid [ 8 ] = ( uuid [ 8 ] & 0x3f ) | 0x80 // RFC 4122 variant
// 格式化为标准 UUID 字符串
return fmt . Sprintf ( "%x-%x-%x-%x-%x" ,
return fmt . Sprintf ( "%x-%x-%x-%x-%x" ,
uuid [ 0 : 4 ] ,
uuid [ 0 : 4 ] ,
uuid [ 4 : 6 ] ,
uuid [ 4 : 6 ] ,
@ -76,19 +149,39 @@ func generateDevDeviceId() string {
uuid [ 10 : 16 ] )
uuid [ 10 : 16 ] )
}
}
// 获取配置文件路径
// NewProgressSpinner creates a new progress spinner
func NewProgressSpinner ( message string ) * ProgressSpinner {
return & ProgressSpinner {
frames : [ ] string { "⠋" , "⠙" , "⠹" , "⠸" , "⠼" , "⠴" , "⠦" , "⠧" , "⠇" , "⠏" } ,
message : message ,
}
}
// Spin advances the spinner animation
func ( s * ProgressSpinner ) Spin ( ) {
frame := s . frames [ s . current % len ( s . frames ) ]
s . current ++
fmt . Printf ( "\r%s %s" , color . CyanString ( frame ) , s . message )
}
// Stop ends the spinner animation
func ( s * ProgressSpinner ) Stop ( ) {
fmt . Println ( )
}
// File and system operations
func getConfigPath ( ) ( string , error ) {
func getConfigPath ( ) ( string , error ) {
var configDir string
var configDir string
switch runtime . GOOS {
switch runtime . GOOS {
case "windows" :
configDir = filepath . Join ( os . Getenv ( "APPDATA" ) , "Cursor" , "User" , "globalStorage" )
case "darwin" :
case "darwin" :
homeDir , err := os . UserHomeDir ( )
homeDir , err := os . UserHomeDir ( )
if err != nil {
if err != nil {
return "" , err
return "" , err
}
}
configDir = filepath . Join ( homeDir , "Library" , "Application Support" , "Cursor" , "User" , "globalStorage" )
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" :
case "linux" :
homeDir , err := os . UserHomeDir ( )
homeDir , err := os . UserHomeDir ( )
if err != nil {
if err != nil {
@ -96,22 +189,87 @@ func getConfigPath() (string, error) {
}
}
configDir = filepath . Join ( homeDir , ".config" , "Cursor" , "User" , "globalStorage" )
configDir = filepath . Join ( homeDir , ".config" , "Cursor" , "User" , "globalStorage" )
default :
default :
return "" , fmt . Errorf ( "不支持的操作系统 : %s" , runtime . GOOS )
return "" , fmt . Errorf ( "unsupported operating system : %s" , runtime . GOOS )
}
}
return filepath . Join ( configDir , "storage.json" ) , nil
return filepath . Join ( configDir , "storage.json" ) , nil
}
}
// 修改件权限
func safeWriteFile ( path string , data [ ] byte , perm os . FileMode ) error {
dir := filepath . Dir ( path )
if err := os . MkdirAll ( dir , 0755 ) ; err != nil {
return & AppError { "create directory" , dir , err }
}
tmpPath := path + ".tmp"
if err := os . WriteFile ( tmpPath , data , perm ) ; err != nil {
return & AppError { "write temporary file" , tmpPath , err }
}
if err := os . Rename ( tmpPath , path ) ; err != nil {
os . Remove ( tmpPath )
return & AppError { "rename file" , path , err }
}
return nil
}
func setFilePermissions ( filePath string ) error {
func setFilePermissions ( filePath string ) error {
if runtime . GOOS == "windows" {
// Windows 使用 ACL 权限系统,这里仅设置为只读
return os . Chmod ( filePath , 0444 )
return os . Chmod ( filePath , 0444 )
}
// Process management functions
func killCursorProcesses ( ) error {
if runtime . GOOS == "windows" {
// First try graceful shutdown
exec . Command ( "taskkill" , "/IM" , "Cursor.exe" ) . Run ( )
exec . Command ( "taskkill" , "/IM" , "cursor.exe" ) . Run ( )
time . Sleep ( time . Second )
// Force kill any remaining instances
exec . Command ( "taskkill" , "/F" , "/IM" , "Cursor.exe" ) . Run ( )
exec . Command ( "taskkill" , "/F" , "/IM" , "cursor.exe" ) . Run ( )
} else {
} else {
// Linux 和 macOS
return os . Chmod ( filePath , 0444 )
exec . Command ( "pkill" , "-f" , "Cursor" ) . Run ( )
exec . Command ( "pkill" , "-f" , "cursor" ) . Run ( )
}
return nil
}
}
func checkCursorRunning ( ) bool {
var cmd * exec . Cmd
if runtime . GOOS == "windows" {
cmd = exec . Command ( "tasklist" , "/FI" , "IMAGENAME eq Cursor.exe" , "/NH" )
} else {
cmd = exec . Command ( "pgrep" , "-f" , "Cursor" )
}
}
output , _ := cmd . Output ( )
return strings . Contains ( string ( output ) , "Cursor" ) || strings . Contains ( string ( output ) , "cursor" )
}
// UI and display functions
func clearScreen ( ) {
var cmd * exec . Cmd
if runtime . GOOS == "windows" {
cmd = exec . Command ( "cmd" , "/c" , "cls" )
} else {
cmd = exec . Command ( "clear" )
}
cmd . Stdout = os . Stdout
cmd . Run ( )
}
func showProgress ( message string ) {
spinner := NewProgressSpinner ( message )
for i := 0 ; i < 15 ; i ++ {
spinner . Spin ( )
time . Sleep ( 100 * time . Millisecond )
}
spinner . Stop ( )
}
func printCyberpunkBanner ( ) {
func printCyberpunkBanner ( ) {
cyan := color . New ( color . FgCyan , color . Bold )
cyan := color . New ( color . FgCyan , color . Bold )
@ -123,7 +281,7 @@ func printCyberpunkBanner() {
█ █ █ █ █ █ ╗ █ █ ╗ █ █ ╗ █ █ █ █ █ █ ╗ █ █ █ █ █ █ █ ╗ █ █ █ █ █ █ ╗ █ █ █ █ █ █ ╗
█ █ █ █ █ █ ╗ █ █ ╗ █ █ ╗ █ █ █ █ █ █ ╗ █ █ █ █ █ █ █ ╗ █ █ █ █ █ █ ╗ █ █ █ █ █ █ ╗
█ █ ╔ ═ ═ ═ ═ ╝ █ █ ║ █ █ ║ █ █ ╔ ═ ═ █ █ ╗ █ █ ╔ ═ ═ ═ ═ ╝ █ █ ╔ ═ ═ ═ █ █ ╗ █ █ ╔ ═ ═ █ █ ╗
█ █ ╔ ═ ═ ═ ═ ╝ █ █ ║ █ █ ║ █ █ ╔ ═ ═ █ █ ╗ █ █ ╔ ═ ═ ═ ═ ╝ █ █ ╔ ═ ═ ═ █ █ ╗ █ █ ╔ ═ ═ █ █ ╗
█ █ ║ █ █ ║ █ █ ║ █ █ █ █ █ █ ╔ ╝ █ █ █ █ █ █ █ ╗ █ █ ║ █ █ ║ █ █ █ █ █ █ ╔ ╝
█ █ ║ █ █ ║ █ █ ║ █ █ █ █ █ █ ╔ ╝ █ █ █ █ █ █ █ ╗ █ █ ║ █ █ ║ █ █ █ █ █ █ ╔ ╝
█ █ ║ █ █ ║ █ █ ║ █ ╔ ═ ═ █ █ ╗ ╚ ═ ═ ═ ═ █ █ ║ █ █ ║ █ █ ║ █ █ ╔ ═ ═ █ █ ╗
█ █ ║ █ █ ║ █ █ ║ █ █ ╔ ═ ═ █ █ ╗ ╚ ═ ═ ═ ═ █ █ ║ █ █ ║ █ █ ║ █ █ ╔ ═ ═ █ █ ╗
╚ █ █ █ █ █ █ ╗ ╚ █ █ █ █ █ █ ╔ ╝ █ █ ║ █ █ ║ █ █ █ █ █ █ █ ║ ╚ █ █ █ █ █ █ ╔ ╝ █ █ ║ █ █ ║
╚ █ █ █ █ █ █ ╗ ╚ █ █ █ █ █ █ ╔ ╝ █ █ ║ █ █ ║ █ █ █ █ █ █ █ ║ ╚ █ █ █ █ █ █ ╔ ╝ █ █ ║ █ █ ║
╚ ═ ═ ═ ═ ╝ ╚ ═ ═ ═ ═ ═ ╝ ╚ ═ ╝ ╚ ═ ╝ ╚ ═ ═ ═ ═ ═ ═ ╝ ╚ ═ ═ ═ ═ ═ ╝ ╚ ═ ╝ ╚ ═ ╝
╚ ═ ═ ═ ═ ╝ ╚ ═ ═ ═ ═ ═ ╝ ╚ ═ ╝ ╚ ═ ╝ ╚ ═ ═ ═ ═ ═ ═ ╝ ╚ ═ ═ ═ ═ ═ ╝ ╚ ═ ╝ ╚ ═ ╝
`
`
@ -131,7 +289,6 @@ func printCyberpunkBanner() {
yellow . Println ( "\t\t>> Cursor ID Modifier v1.0 <<" )
yellow . Println ( "\t\t>> Cursor ID Modifier v1.0 <<" )
magenta . Println ( "\t\t [ By Pancake Fruit Rolled Shark Chili ]" )
magenta . Println ( "\t\t [ By Pancake Fruit Rolled Shark Chili ]" )
// 添加语言标识
langText := "当前语言/Language: "
langText := "当前语言/Language: "
if currentLanguage == CN {
if currentLanguage == CN {
langText += "简体中文"
langText += "简体中文"
@ -141,352 +298,265 @@ func printCyberpunkBanner() {
green . Printf ( "\n\t\t %s\n\n" , langText )
green . Printf ( "\n\t\t %s\n\n" , langText )
}
}
type ProgressSpinner struct {
frames [ ] string
current int
message string
}
func showSuccess ( ) {
text := texts [ currentLanguage ]
successColor := color . New ( color . FgGreen , color . Bold )
warningColor := color . New ( color . FgYellow , color . Bold )
func NewProgressSpinner ( message string ) * ProgressSpinner {
return & ProgressSpinner {
frames : [ ] string { "⠋" , "⠙" , "⠹" , "⠸" , "⠼" , "⠴" , "⠦" , "⠧" , "⠇" , "⠏" } ,
message : message ,
}
successColor . Printf ( "\n%s\n" , text . SuccessMessage )
warningColor . Printf ( "%s\n" , text . RestartMessage )
}
}
func ( s * ProgressSpinner ) Spin ( ) {
frame := s . frames [ s . current % len ( s . frames ) ]
s . current ++
fmt . Printf ( "\r%s %s" , color . CyanString ( frame ) , s . message )
}
func showPrivilegeError ( ) {
text := texts [ currentLanguage ]
red := color . New ( color . FgRed , color . Bold )
yellow := color . New ( color . FgYellow )
func ( s * ProgressSpinner ) Stop ( ) {
fmt . Println ( )
red . Println ( text . PrivilegeError )
if runtime . GOOS == "windows" {
yellow . Println ( text . RunAsAdmin )
} else {
yellow . Println ( text . RunWithSudo )
yellow . Printf ( text . SudoExample , os . Args [ 0 ] )
}
}
// 定义错误类型
type AppError struct {
Op string
Path string
Err error
}
}
func ( e * AppError ) Error ( ) string {
if e . Path != "" {
return fmt . Sprintf ( "%s: %v [路径: %s]" , e . Op , e . Err , e . Path )
}
return fmt . Sprintf ( "%s: %v" , e . Op , e . Err )
}
func showIdComparison ( oldConfig * StorageConfig , newConfig * StorageConfig ) {
cyan := color . New ( color . FgCyan )
yellow := color . New ( color . FgYellow )
// 文件操作包装函数
func safeWriteFile ( path string , data [ ] byte , perm os . FileMode ) error {
// 创建临时文件
tmpPath := path + ".tmp"
if err := os . WriteFile ( tmpPath , data , perm ) ; err != nil {
return & AppError { "写入临时文件" , tmpPath , err }
}
fmt . Println ( "\n=== ID Modification Comparison / ID 修改对比 ===" )
// 重命名临时文件
if err := os . Rename ( tmpPath , path ) ; err != nil {
os . Remove ( tmpPath ) // 清理临时文件
return & AppError { "重命名文件" , path , err }
if oldConfig != nil {
cyan . Println ( "\n[Original IDs / 原始 ID]" )
yellow . Printf ( "Machine ID: %s\n" , oldConfig . TelemetryMachineId )
yellow . Printf ( "Mac Machine ID: %s\n" , oldConfig . TelemetryMacMachineId )
yellow . Printf ( "Dev Device ID: %s\n" , oldConfig . TelemetryDevDeviceId )
}
}
return nil
cyan . Println ( "\n[Newly Generated IDs / 新生成 ID]" )
yellow . Printf ( "Machine ID: %s\n" , newConfig . TelemetryMachineId )
yellow . Printf ( "Mac Machine ID: %s\n" , newConfig . TelemetryMacMachineId )
yellow . Printf ( "Dev Device ID: %s\n" , newConfig . TelemetryDevDeviceId )
fmt . Println ( )
}
}
// Configuration operations
// clearScreen 清除终端屏幕
func clearScreen ( ) {
if runtime . GOOS == "windows" {
cmd := exec . Command ( "cmd" , "/c" , "cls" )
cmd . Stdout = os . Stdout
cmd . Run ( )
} else {
cmd := exec . Command ( "clear" )
cmd . Stdout = os . Stdout
cmd . Run ( )
}
}
// showProgress 显示进度
func showProgress ( message string ) {
spinner := NewProgressSpinner ( message )
for i := 0 ; i < 15 ; i ++ {
spinner . Spin ( )
time . Sleep ( 100 * time . Millisecond )
}
spinner . Stop ( )
}
// saveConfig 保存配置到文件
func saveConfig ( config * StorageConfig ) error {
func saveConfig ( config * StorageConfig ) error {
configPath , err := getConfigPath ( )
configPath , err := getConfigPath ( )
if err != nil {
if err != nil {
return err
return err
}
}
// 转换为JSON
content , err := json . MarshalIndent ( config , "" , " " )
content , err := json . MarshalIndent ( config , "" , " " )
if err != nil {
if err != nil {
return & AppError { "生成 JSON" , "" , err }
return & AppError { "generate JSON" , "" , err }
}
}
// 确保文件可写
err = os . Chmod ( configPath , 0666 )
if err != nil {
return & AppError { "修改文件权限" , configPath , err }
if err := os . Chmod ( configPath , 0666 ) ; err != nil && ! os . IsNotExist ( err ) {
return & AppError { "modify file permissions" , configPath , err }
}
}
// 安全写入文件
if err := safeWriteFile ( configPath , content , 0666 ) ; err != nil {
if err := safeWriteFile ( configPath , content , 0666 ) ; err != nil {
return err
return err
}
}
// 设置为只读
return setFilePermissions ( configPath )
return setFilePermissions ( configPath )
}
}
// showSuccess 显示成功信息
func showSuccess ( ) {
text := texts [ currentLanguage ]
successColor := color . New ( color . FgGreen , color . Bold )
warningColor := color . New ( color . FgYellow , color . Bold )
successColor . Printf ( "\n%s\n" , text . SuccessMessage )
warningColor . Printf ( "%s\n" , text . RestartMessage )
}
// 修改 loadAndUpdateConfig 函数使用 configPath
func loadAndUpdateConfig ( ) ( * StorageConfig , error ) {
func readExistingConfig ( ) ( * StorageConfig , error ) {
configPath , err := getConfigPath ( )
configPath , err := getConfigPath ( )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
text := texts [ currentLanguage ]
showProgress ( text . ReadingConfig )
// 读取原始文件内容
_ , err = os . ReadFile ( configPath )
if err != nil && ! os . IsNotExist ( err ) {
return nil , & AppError { "读取配置文件" , configPath , err }
}
showProgress ( text . GeneratingIds )
config := NewStorageConfig ( )
return config , nil
}
// 修改 waitExit 函数,正确初始化 reader
func waitExit ( ) {
reader := bufio . NewReader ( os . Stdin )
color . Cyan ( "\n" + texts [ currentLanguage ] . PressEnterToExit )
reader . ReadString ( '\n' )
}
func main ( ) {
currentLanguage = detectLanguage ( )
defer func ( ) {
if err := recover ( ) ; err != nil {
color . Red ( texts [ currentLanguage ] . ErrorPrefix , err )
waitExit ( )
}
} ( )
// 添加权限检查
isAdmin , err := checkAdminPrivileges ( )
data , err := os . ReadFile ( configPath )
if err != nil {
if err != nil {
handleError ( "权限检查失败" , err )
waitExit ( )
return
if os . IsNotExist ( err ) {
return nil , nil
}
}
if ! isAdmin {
showPrivilegeError ( )
waitExit ( )
return
return nil , err
}
}
setupProgram ( )
var config StorageConfig
if err := json . Unmarshal ( data , & config ) ; err != nil {
return nil , err
}
oldConfig , err := readExistingConfig ( )
if err != nil {
oldConfig = nil
return & config , nil
}
}
config , err := loadAndUpdateConfig ( )
func loadAndUpdateConfig ( ) ( * StorageConfig , error ) {
configPath , err := getConfigPath ( )
if err != nil {
if err != nil {
handleError ( "配置更新失败" , err )
return
return nil , err
}
}
showIdComparison ( oldConfig , config )
if err := saveConfig ( config ) ; err != nil {
handleError ( "保存配置失败" , err )
return
}
text := texts [ currentLanguage ]
showProgress ( text . ReadingConfig )
showSuccess ( )
waitExit ( )
_ , err = os . ReadFile ( configPath )
if err != nil && ! os . IsNotExist ( err ) {
return nil , & AppError { "read config file" , configPath , err }
}
}
func setupProgram ( ) {
clearScreen ( )
printCyberpunkBanner ( )
showProgress ( text . GeneratingIds )
return NewStorageConfig ( ) , nil
}
}
func handleError ( msg string , err error ) {
if appErr , ok := err . ( * AppError ) ; ok {
color . Red ( "%s: %v" , msg , appErr )
} else {
color . Red ( "%s: %v" , msg , err )
}
}
// System privilege functions
func checkAdminPrivileges ( ) ( bool , error ) {
func checkAdminPrivileges ( ) ( bool , error ) {
switch runtime . GOOS {
switch runtime . GOOS {
case "windows" :
case "windows" :
// Windows 管理员权限检查
cmd := exec . Command ( "net" , "session" )
cmd := exec . Command ( "net" , "session" )
err := cmd . Run ( )
err := cmd . Run ( )
return err == nil , nil
return err == nil , nil
case "darwin" , "linux" :
case "darwin" , "linux" :
// Unix 系统检查 root 权限
currentUser , err := user . Current ( )
currentUser , err := user . Current ( )
if err != nil {
if err != nil {
return false , fmt . Errorf ( "获取当前用户失败 : %v" , err )
return false , fmt . Errorf ( "failed to get current user : %v" , err )
}
}
return currentUser . Uid == "0" , nil
return currentUser . Uid == "0" , nil
default :
default :
return false , fmt . Errorf ( "不支持的操作系统 : %s" , runtime . GOOS )
return false , fmt . Errorf ( "unsupported operating system : %s" , runtime . GOOS )
}
}
}
}
func showPrivilegeError ( ) {
text := texts [ currentLanguage ]
red := color . New ( color . FgRed , color . Bold )
yellow := color . New ( color . FgYellow )
red . Println ( text . PrivilegeError )
if runtime . GOOS == "windows" {
yellow . Println ( text . RunAsAdmin )
} else {
yellow . Println ( text . RunWithSudo )
yellow . Printf ( text . SudoExample , os . Args [ 0 ] )
func selfElevate ( ) error {
verb := "runas"
exe , err := os . Executable ( )
if err != nil {
return err
}
}
cwd , err := os . Getwd ( )
if err != nil {
return err
}
}
// 在文件开头添加新的类型和变量定义
type Language string
verbPtr , _ := syscall . UTF16PtrFromString ( verb )
exePtr , _ := syscall . UTF16PtrFromString ( exe )
cwdPtr , _ := syscall . UTF16PtrFromString ( cwd )
argPtr , _ := syscall . UTF16PtrFromString ( "" )
const (
CN Language = "cn"
EN Language = "en"
)
var showCmd int32 = 1 //SW_NORMAL
// TextResource 存储多语言文本
type TextResource struct {
SuccessMessage string
RestartMessage string
ReadingConfig string
GeneratingIds string
PressEnterToExit string
ErrorPrefix string
PrivilegeError string
RunAsAdmin string
RunWithSudo string
SudoExample string
err = windows . ShellExecute ( 0 , verbPtr , exePtr , argPtr , cwdPtr , showCmd )
if err != nil {
return err
}
}
var (
currentLanguage = CN // 默认使用中文
texts = map [ Language ] TextResource {
CN : {
SuccessMessage : "[√] 配置文件已成功更新!" ,
RestartMessage : "[!] 请手动重启 Cursor 以使更改生效" ,
ReadingConfig : "正在读取配置文件..." ,
GeneratingIds : "正在生成新的标识符..." ,
PressEnterToExit : "按回车键退出程序..." ,
ErrorPrefix : "程序发生严重错误: %v" ,
PrivilegeError : "\n[!] 错误:需要管理员权限" ,
RunAsAdmin : "请右键点击程序,选择「以管理员身份运行」" ,
RunWithSudo : "请使用 sudo 命令运行此程序" ,
SudoExample : "示例: sudo %s" ,
} ,
EN : {
SuccessMessage : "[√] Configuration file updated successfully!" ,
RestartMessage : "[!] Please restart Cursor manually for changes to take effect" ,
ReadingConfig : "Reading configuration file..." ,
GeneratingIds : "Generating new identifiers..." ,
PressEnterToExit : "Press Enter to exit..." ,
ErrorPrefix : "Program encountered a serious error: %v" ,
PrivilegeError : "\n[!] Error: Administrator privileges required" ,
RunAsAdmin : "Please right-click and select 'Run as Administrator'" ,
RunWithSudo : "Please run this program with sudo" ,
SudoExample : "Example: sudo %s" ,
} ,
os . Exit ( 0 )
return nil
}
}
)
// 添加语言检测函数
// Utility functions
func detectLanguage ( ) Language {
func detectLanguage ( ) Language {
// 获取系统语言环境
lang := os . Getenv ( "LANG" )
lang := os . Getenv ( "LANG" )
if lang == "" {
if lang == "" {
lang = os . Getenv ( "LANGUAGE" )
lang = os . Getenv ( "LANGUAGE" )
}
}
// 如果包含 zh 则使用中文,否则使用英文
if strings . Contains ( strings . ToLower ( lang ) , "zh" ) {
if strings . Contains ( strings . ToLower ( lang ) , "zh" ) {
return CN
return CN
}
}
return EN
return EN
}
}
// 添加新函数用于显示ID对比
func showIdComparison ( oldConfig * StorageConfig , newConfig * StorageConfig ) {
cyan := color . New ( color . FgCyan )
yellow := color . New ( color . FgYellow )
func waitExit ( ) {
fmt . Println ( "\nPress Enter to exit... / 按回车键退出程序..." )
os . Stdout . Sync ( )
bufio . NewReader ( os . Stdin ) . ReadString ( '\n' )
}
fmt . Println ( "\n=== ID 修改对比 ===" )
func handleError ( msg string , err error ) {
if appErr , ok := err . ( * AppError ) ; ok {
color . Red ( "%s: %v" , msg , appErr )
} else {
color . Red ( "%s: %v" , msg , err )
}
}
if oldConfig != nil {
cyan . Println ( "\n[原始 ID]" )
yellow . Printf ( "Machine ID: %s\n" , oldConfig . TelemetryMachineId )
yellow . Printf ( "Mac Machine ID: %s\n" , oldConfig . TelemetryMacMachineId )
yellow . Printf ( "Dev Device ID: %s\n" , oldConfig . TelemetryDevDeviceId )
// Main program entry
func main ( ) {
defer func ( ) {
if r := recover ( ) ; r != nil {
color . Red ( texts [ currentLanguage ] . ErrorPrefix , r )
fmt . Println ( "\nAn error occurred! / 发生错误!" )
waitExit ( )
}
}
} ( )
cyan . Println ( "\n[新生成 ID]" )
yellow . Printf ( "Machine ID: %s\n" , newConfig . TelemetryMachineId )
yellow . Printf ( "Mac Machine ID: %s\n" , newConfig . TelemetryMacMachineId )
yellow . Printf ( "Dev Device ID: %s\n" , newConfig . TelemetryDevDeviceId )
fmt . Println ( )
os . Stdout . Sync ( )
currentLanguage = detectLanguage ( )
isAdmin , err := checkAdminPrivileges ( )
if err != nil {
handleError ( "permission check failed" , err )
waitExit ( )
return
}
}
// 新增函数用于读取现有配置
func readExistingConfig ( ) ( * StorageConfig , error ) {
configPath , err := getConfigPath ( )
if ! isAdmin && runtime . GOOS == "windows" {
fmt . Println ( "Requesting administrator privileges... / 请求管理员权限..." )
if err := selfElevate ( ) ; err != nil {
handleError ( "failed to elevate privileges" , err )
showPrivilegeError ( )
waitExit ( )
return
}
return
} else if ! isAdmin {
showPrivilegeError ( )
waitExit ( )
return
}
if checkCursorRunning ( ) {
fmt . Println ( "\nDetected running Cursor instance(s). Closing... / 检测到正在运行的 Cursor 实例,正在关闭..." )
if err := killCursorProcesses ( ) ; err != nil {
fmt . Println ( "Warning: Could not close all Cursor instances. Please close them manually. / 警告:无法关闭所有 Cursor 实例,请手动关闭。" )
waitExit ( )
return
}
time . Sleep ( 2 * time . Second )
if checkCursorRunning ( ) {
fmt . Println ( "\nWarning: Cursor is still running. Please close it manually. / 警告:Cursor 仍在运行,请手动关闭。" )
waitExit ( )
return
}
}
clearScreen ( )
printCyberpunkBanner ( )
oldConfig , err := readExistingConfig ( )
if err != nil {
if err != nil {
return nil , err
oldConfig = nil
}
}
data , err := os . ReadFile ( configPath )
config , err := loadAndUpdateConfig ( )
if err != nil {
if err != nil {
return nil , err
handleError ( "configuration update failed" , err )
waitExit ( )
return
}
}
var config StorageConfig
if err := json . Unmarshal ( data , & config ) ; err != nil {
return nil , err
showIdComparison ( oldConfig , config )
if err := saveConfig ( config ) ; err != nil {
handleError ( "failed to save configuration" , err )
waitExit ( )
return
}
}
return & config , nil
showSuccess ( )
fmt . Println ( "\nOperation completed! / 操作完成!" )
waitExit ( )
}
}