@ -168,21 +168,27 @@ func (e *AppError) Error() string {
}
}
// Configuration Functions / 配置函数
// Configuration Functions / 配置函数
func NewStorageConfig ( oldConfig * StorageConfig ) * StorageConfig { // Modified to take old config
func NewStorageConfig ( oldConfig * StorageConfig ) * StorageConfig {
// Use different ID generation functions for different fields
// 为不同字段使用不同的ID生成函数
// Reason: machineId needs new format while others keep old format
// 原因:machineId需要使用新格式,而其他ID保持旧格式
newConfig := & StorageConfig {
newConfig := & StorageConfig {
TelemetryMacMachineId : generateMachineId ( ) ,
TelemetryMachineId : generateMachineId ( ) ,
TelemetryMacMachineId : generateMacMac hineId ( ) , // Use old format / 使用旧格式
TelemetryMachineId : generateMachineId ( ) , // Use new format / 使用新格式
TelemetryDevDeviceId : generateDevDeviceId ( ) ,
TelemetryDevDeviceId : generateDevDeviceId ( ) ,
}
}
// Keep sqmId from old config or generate new one using old format
// 保留旧配置的sqmId或使用旧格式生成新的
if oldConfig != nil {
if oldConfig != nil {
newConfig . TelemetrySqmId = oldConfig . TelemetrySqmId
newConfig . TelemetrySqmId = oldConfig . TelemetrySqmId
} else {
} else {
newConfig . TelemetrySqmId = generateMachineId ( )
newConfig . TelemetrySqmId = generateMacMac hineId ( )
}
}
if newConfig . TelemetrySqmId == "" {
if newConfig . TelemetrySqmId == "" {
newConfig . TelemetrySqmId = generateMachineId ( )
newConfig . TelemetrySqmId = generateMacMac hineId ( )
}
}
return newConfig
return newConfig
@ -190,6 +196,16 @@ func NewStorageConfig(oldConfig *StorageConfig) *StorageConfig { // Modified to
// ID Generation Functions / ID生成函数
// ID Generation Functions / ID生成函数
func generateMachineId ( ) string {
func generateMachineId ( ) string {
prefix := "auth0|user_"
remainingLength := 74 - len ( prefix )
bytes := make ( [ ] byte , remainingLength / 2 )
if _ , err := rand . Read ( bytes ) ; err != nil {
panic ( fmt . Errorf ( "failed to generate random data: %v" , err ) )
}
return prefix + hex . EncodeToString ( bytes )
}
func generateMacMachineId ( ) string {
data := make ( [ ] byte , 32 )
data := make ( [ ] byte , 32 )
if _ , err := rand . Read ( data ) ; err != nil {
if _ , err := rand . Read ( data ) ; err != nil {
panic ( fmt . Errorf ( "failed to generate random data: %v" , err ) )
panic ( fmt . Errorf ( "failed to generate random data: %v" , err ) )
@ -225,7 +241,7 @@ func getConfigPath(username string) (string, error) {
return filepath . Join ( configDir , "storage.json" ) , nil
return filepath . Join ( configDir , "storage.json" ) , nil
}
}
func saveConfig ( config * StorageConfig , username string ) error { // Modified to take username
func saveConfig ( config * StorageConfig , username string ) error {
configPath , err := getConfigPath ( username )
configPath , err := getConfigPath ( username )
if err != nil {
if err != nil {
return err
return err
@ -252,19 +268,11 @@ func saveConfig(config *StorageConfig, username string) error { // Modified to t
}
}
}
}
originalFileStat , err := os . Stat ( configPath )
if err != nil {
return & AppError {
Type : ErrSystem ,
Op : "get file mode" ,
Path : configPath ,
Err : err ,
}
}
originalFileMode := originalFileStat . Mode ( )
// Read the original file to preserve all fields
var originalFile map [ string ] interface { }
originalFileContent , err := os . ReadFile ( configPath )
originalFileContent , err := os . ReadFile ( configPath )
if err != nil {
if err != nil {
if ! os . IsNotExist ( err ) {
return & AppError {
return & AppError {
Type : ErrSystem ,
Type : ErrSystem ,
Op : "read original file" ,
Op : "read original file" ,
@ -272,8 +280,9 @@ func saveConfig(config *StorageConfig, username string) error { // Modified to t
Err : err ,
Err : err ,
}
}
}
}
var originalFile map [ string ] any
// If file doesn't exist, create a new map
originalFile = make ( map [ string ] interface { } )
} else {
if err := json . Unmarshal ( originalFileContent , & originalFile ) ; err != nil {
if err := json . Unmarshal ( originalFileContent , & originalFile ) ; err != nil {
return & AppError {
return & AppError {
Type : ErrSystem ,
Type : ErrSystem ,
@ -282,10 +291,29 @@ func saveConfig(config *StorageConfig, username string) error { // Modified to t
Err : err ,
Err : err ,
}
}
}
}
}
// Get original file mode
var originalFileMode os . FileMode = 0666
if stat , err := os . Stat ( configPath ) ; err == nil {
originalFileMode = stat . Mode ( )
}
// Update only the telemetry fields while preserving all other fields
originalFile [ "telemetry.sqmId" ] = config . TelemetrySqmId
originalFile [ "telemetry.sqmId" ] = config . TelemetrySqmId
originalFile [ "telemetry.macMachineId" ] = config . TelemetryMacMachineId
originalFile [ "telemetry.macMachineId" ] = config . TelemetryMacMachineId
originalFile [ "telemetry.machineId" ] = config . TelemetryMachineId
originalFile [ "telemetry.machineId" ] = config . TelemetryMachineId
originalFile [ "telemetry.devDeviceId" ] = config . TelemetryDevDeviceId
originalFile [ "telemetry.devDeviceId" ] = config . TelemetryDevDeviceId
// Add lastModified and version fields if they don't exist
if _ , exists := originalFile [ "lastModified" ] ; ! exists {
originalFile [ "lastModified" ] = time . Now ( ) . UTC ( ) . Format ( time . RFC3339 )
}
if _ , exists := originalFile [ "version" ] ; ! exists {
originalFile [ "version" ] = "1.0.1"
}
// Marshal with indentation
newFileContent , err := json . MarshalIndent ( originalFile , "" , " " )
newFileContent , err := json . MarshalIndent ( originalFile , "" , " " )
if err != nil {
if err != nil {
return & AppError {
return & AppError {
@ -513,7 +541,7 @@ func showSuccess() {
successColor . Printf ( "%s\n" , text . SuccessMessage )
successColor . Printf ( "%s\n" , text . SuccessMessage )
fmt . Println ( )
fmt . Println ( )
warningColor . Printf ( "%s\n" , text . RestartMessage )
warningColor . Printf ( "%s\n" , text . RestartMessage )
successColor . Println ( "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━" )
successColor . Println ( "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━�� ━━" )
} else {
} else {
// Chinese messages with extra spacing
// Chinese messages with extra spacing
successColor . Println ( "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" )
successColor . Println ( "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" )