Skip to content

Commit 28ce781

Browse files
casperdcl0x2b3bfa0dacbdDavidGOrtega
authored
keep JSON format (#622)
* keep JSON format * Defer as soon as possible * Avoid panic on malformed data & rename variables Also simplifies some logic * string/re-assginment tweaks (#626) * updated error checking * handle old non-json format * Errorf for %w * remove unneeded code Co-authored-by: DavidGOrtega <g.ortega.david@gmail.com> Co-authored-by: Helio Machado <0x2b3bfa0+git@googlemail.com> Co-authored-by: Daniel Barnes <dabarnes2b@gmail.com> Co-authored-by: DavidGOrtega <g.ortega.david@gmail.com>
1 parent d37e554 commit 28ce781

File tree

1 file changed

+61
-42
lines changed

1 file changed

+61
-42
lines changed

iterative/utils/analytics.go

Lines changed: 61 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"encoding/json"
88
"errors"
99
"fmt"
10+
"io/fs"
1011
"io/ioutil"
1112
"net/http"
1213
"os"
@@ -47,21 +48,21 @@ func getenv(key, defaultValue string) string {
4748
return value
4849
}
4950

50-
func deterministic(data string) (*uuid.UUID, error) {
51+
func deterministic(data string) (string, error) {
5152
ns := uuid.NewSHA1(uuid.NameSpaceDNS, []byte("iterative.ai"))
5253

5354
seed, err := ns.MarshalBinary()
5455
if err != nil {
55-
return nil, err
56+
return "", err
5657
}
5758

5859
dk, err := scrypt.Key([]byte(data), seed, 1<<16, 8, 1, 8)
5960
if err != nil {
60-
return nil, err
61+
return "", err
6162
}
6263

6364
id := uuid.NewSHA1(ns, []byte(hex.EncodeToString(dk)))
64-
return &id, nil
65+
return id.String(), nil
6566
}
6667

6768
func SystemInfo() map[string]interface{} {
@@ -155,10 +156,57 @@ func GroupId() (string, error) {
155156
return "", err
156157
}
157158

158-
return id.String(), nil
159+
return id, nil
160+
}
161+
162+
func readId(path string) (string, error) {
163+
file, err := os.Open(path)
164+
if file != nil {
165+
return "", err
166+
}
167+
defer file.Close()
168+
169+
bytes, err := ioutil.ReadAll(file)
170+
if err != nil {
171+
return "", err
172+
}
173+
174+
var data map[string]interface{}
175+
176+
if err := json.Unmarshal([]byte(bytes), &data); err != nil {
177+
uid, uidError := uuid.FromBytes(bytes)
178+
if uidError != nil {
179+
return "", fmt.Errorf("failed parsing user_id as json and plaintext: %w", uidError)
180+
}
181+
logrus.Traceln(fmt.Errorf("found old format telemtry uid, json err: %w", err))
182+
return uid.String(), nil
183+
}
184+
185+
if id, ok := data["user_id"].(string); ok {
186+
return id, nil
187+
}
188+
189+
return "", errors.New("user_id not found or not a string")
190+
}
191+
192+
func writeId(path string, id string) error {
193+
if err := os.MkdirAll(filepath.Dir(path), 0644); err != nil {
194+
return err
195+
}
196+
197+
data := map[string]string{"user_id": id}
198+
199+
bytes, err := json.MarshalIndent(data, "", " ")
200+
if err != nil {
201+
return err
202+
}
203+
204+
return ioutil.WriteFile(path, bytes, 0644)
159205
}
160206

161207
func UserId() (string, error) {
208+
var id string
209+
var err error
162210
if IsCI() {
163211
ci := guessCI()
164212
var rawId string
@@ -200,66 +248,37 @@ func UserId() (string, error) {
200248
return "", err
201249
}
202250

203-
return id.String(), nil
251+
return id, nil
204252
}
205253

206-
id := uuid.New().String()
254+
id = uuid.New().String()
207255
old := appdirs.UserConfigDir("dvc/user_id", "iterative", "", false)
208256
_, errorOld := os.Stat(old)
209257

210258
new := appdirs.UserConfigDir("iterative/telemetry", "", "", false)
211259
_, errorNew := os.Stat(new)
212260

213-
if os.IsNotExist(errorNew) {
214-
if !os.IsNotExist(errorOld) {
215-
jsonFile, jsonErr := os.Open(old)
216-
if jsonErr != nil {
217-
return "", jsonErr
218-
}
219-
220-
byteValue, err := ioutil.ReadAll(jsonFile)
221-
if err != nil {
222-
return "", err
223-
}
224-
var data map[string]interface{}
225-
err = json.Unmarshal([]byte(byteValue), &data)
261+
if errors.Is(errorNew, fs.ErrNotExist) {
262+
if !errors.Is(errorOld, fs.ErrNotExist) {
263+
id, err = readId(old)
226264
if err != nil {
227265
return "", err
228266
}
229-
id = data["user_id"].(string)
230-
231-
defer jsonFile.Close()
232267
}
233268

234-
err := os.MkdirAll(filepath.Dir(new), 0644)
235-
if err != nil {
236-
return "", err
237-
}
238-
err = ioutil.WriteFile(new, []byte(id), 0644)
269+
err = writeId(new, id)
239270
if err != nil {
240271
return "", err
241272
}
242273
} else {
243-
dat, err := ioutil.ReadFile(new)
274+
id, err = readId(new)
244275
if err != nil {
245276
return "", err
246277
}
247-
id = string(dat[:])
248278
}
249279

250280
if os.IsNotExist(errorOld) && id != "do-not-track" {
251-
err := os.MkdirAll(filepath.Dir(old), 0644)
252-
if err != nil {
253-
return "", err
254-
}
255-
data := map[string]interface{}{
256-
"user_id": id,
257-
}
258-
file, err := json.MarshalIndent(data, "", " ")
259-
if err != nil {
260-
return "", err
261-
}
262-
err = ioutil.WriteFile(old, file, 0644)
281+
err := writeId(old, id)
263282
if err != nil {
264283
return "", err
265284
}

0 commit comments

Comments
 (0)