|
7 | 7 | "encoding/json" |
8 | 8 | "errors" |
9 | 9 | "fmt" |
| 10 | + "io/fs" |
10 | 11 | "io/ioutil" |
11 | 12 | "net/http" |
12 | 13 | "os" |
@@ -47,21 +48,21 @@ func getenv(key, defaultValue string) string { |
47 | 48 | return value |
48 | 49 | } |
49 | 50 |
|
50 | | -func deterministic(data string) (*uuid.UUID, error) { |
| 51 | +func deterministic(data string) (string, error) { |
51 | 52 | ns := uuid.NewSHA1(uuid.NameSpaceDNS, []byte("iterative.ai")) |
52 | 53 |
|
53 | 54 | seed, err := ns.MarshalBinary() |
54 | 55 | if err != nil { |
55 | | - return nil, err |
| 56 | + return "", err |
56 | 57 | } |
57 | 58 |
|
58 | 59 | dk, err := scrypt.Key([]byte(data), seed, 1<<16, 8, 1, 8) |
59 | 60 | if err != nil { |
60 | | - return nil, err |
| 61 | + return "", err |
61 | 62 | } |
62 | 63 |
|
63 | 64 | id := uuid.NewSHA1(ns, []byte(hex.EncodeToString(dk))) |
64 | | - return &id, nil |
| 65 | + return id.String(), nil |
65 | 66 | } |
66 | 67 |
|
67 | 68 | func SystemInfo() map[string]interface{} { |
@@ -155,10 +156,57 @@ func GroupId() (string, error) { |
155 | 156 | return "", err |
156 | 157 | } |
157 | 158 |
|
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) |
159 | 205 | } |
160 | 206 |
|
161 | 207 | func UserId() (string, error) { |
| 208 | + var id string |
| 209 | + var err error |
162 | 210 | if IsCI() { |
163 | 211 | ci := guessCI() |
164 | 212 | var rawId string |
@@ -200,66 +248,37 @@ func UserId() (string, error) { |
200 | 248 | return "", err |
201 | 249 | } |
202 | 250 |
|
203 | | - return id.String(), nil |
| 251 | + return id, nil |
204 | 252 | } |
205 | 253 |
|
206 | | - id := uuid.New().String() |
| 254 | + id = uuid.New().String() |
207 | 255 | old := appdirs.UserConfigDir("dvc/user_id", "iterative", "", false) |
208 | 256 | _, errorOld := os.Stat(old) |
209 | 257 |
|
210 | 258 | new := appdirs.UserConfigDir("iterative/telemetry", "", "", false) |
211 | 259 | _, errorNew := os.Stat(new) |
212 | 260 |
|
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) |
226 | 264 | if err != nil { |
227 | 265 | return "", err |
228 | 266 | } |
229 | | - id = data["user_id"].(string) |
230 | | - |
231 | | - defer jsonFile.Close() |
232 | 267 | } |
233 | 268 |
|
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) |
239 | 270 | if err != nil { |
240 | 271 | return "", err |
241 | 272 | } |
242 | 273 | } else { |
243 | | - dat, err := ioutil.ReadFile(new) |
| 274 | + id, err = readId(new) |
244 | 275 | if err != nil { |
245 | 276 | return "", err |
246 | 277 | } |
247 | | - id = string(dat[:]) |
248 | 278 | } |
249 | 279 |
|
250 | 280 | 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) |
263 | 282 | if err != nil { |
264 | 283 | return "", err |
265 | 284 | } |
|
0 commit comments