|
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