func deleteName(c *gin.Context) { group := strings.ToLower(c.DefaultQuery("group", "noneasdf")) location := strings.ToLower(c.DefaultQuery("location", "none")) if group != "noneasdf" { numChanges := 0 db, err := bolt.Open(path.Join(RuntimeArgs.SourcePath, group+".db"), 0600, nil) if err != nil { log.Fatal(err) } db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("fingerprints")) if b != nil { c := b.Cursor() for k, v := c.Last(); k != nil; k, v = c.Prev() { v2 := loadFingerprint(v) if v2.Location == location { b.Delete(k) numChanges++ } } } return nil }) db.Close() optimizePriorsThreaded(strings.ToLower(group)) c.JSON(http.StatusOK, gin.H{"message": "Changed name of " + strconv.Itoa(numChanges) + " things", "success": true}) } else { c.JSON(http.StatusOK, gin.H{"success": false, "message": "Error parsing request"}) } }
func whereAmI(c *gin.Context) { var jsonData whereAmIJson if c.BindJSON(&jsonData) == nil { defer timeTrack(time.Now(), "getUniqueMacs") db, err := bolt.Open(path.Join(RuntimeArgs.SourcePath, jsonData.Group+".db"), 0600, nil) if err != nil { log.Fatal(err) } defer db.Close() locations := []string{} db.View(func(tx *bolt.Tx) error { // Assume bucket exists and has keys b := tx.Bucket([]byte("fingerprints-track")) c := b.Cursor() for k, v := c.Last(); k != nil; k, v = c.Prev() { v2 := loadFingerprint(v) if v2.Username == jsonData.User { locations = append(locations, v2.Location) } if len(locations) > 2 { break } } return nil }) // jsonLocations, _ := json.Marshal(locations) message := "Found user" if len(locations) == 0 { message = "No locations found." } c.JSON(http.StatusOK, gin.H{"success": true, "message": message, "group": jsonData.Group, "user": jsonData.User, "locations": locations}) } else { c.JSON(http.StatusOK, gin.H{"message": "Could not bind JSON - did you not send it as a JSON?", "success": false}) } }
func deleteLocations(c *gin.Context) { group := strings.ToLower(c.DefaultQuery("group", "noneasdf")) locationsQuery := strings.ToLower(c.DefaultQuery("names", "none")) if group != "noneasdf" && locationsQuery != "none" { locations := strings.Split(strings.ToLower(locationsQuery), ",") db, err := bolt.Open(path.Join(RuntimeArgs.SourcePath, group+".db"), 0600, nil) if err != nil { log.Fatal(err) } numChanges := 0 db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("fingerprints")) if b != nil { c := b.Cursor() for k, v := c.Last(); k != nil; k, v = c.Prev() { v2 := loadFingerprint(v) for _, location := range locations { if v2.Location == location { b.Delete(k) numChanges++ break } } } } return nil }) db.Close() optimizePriorsThreaded(strings.ToLower(group)) c.JSON(http.StatusOK, gin.H{"message": "Deleted " + strconv.Itoa(numChanges) + " locations", "success": true}) } else { c.JSON(http.StatusOK, gin.H{"success": false, "message": "Need to provide group and location list. DELETE /locations?group=X&names=Y,Z,W"}) } }
func deleteUser(c *gin.Context) { group := strings.ToLower(c.DefaultQuery("group", "noneasdf")) user := strings.ToLower(c.DefaultQuery("user", "noneasdf")) if group != "noneasdf" && user != "noneasdf" { numChanges := 0 db, err := bolt.Open(path.Join(RuntimeArgs.SourcePath, group+".db"), 0600, nil) if err != nil { log.Fatal(err) } db.Update(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("fingerprints-track")) if b != nil { c := b.Cursor() for k, v := c.Last(); k != nil; k, v = c.Prev() { v2 := loadFingerprint(v) if v2.Username == user { b.Delete(k) numChanges++ } } } return nil }) db.Close() // reset the cache (cache.go) usersCache = make(map[string][]string) userPositionCache = make(map[string]UserPositionJSON) c.JSON(http.StatusOK, gin.H{"message": "Changed name of " + strconv.Itoa(numChanges) + " things", "success": true}) } else { c.JSON(http.StatusOK, gin.H{"success": false, "message": "Error parsing request"}) } }
func editUserName(c *gin.Context) { group := strings.ToLower(c.DefaultQuery("group", "noneasdf")) user := strings.ToLower(c.DefaultQuery("user", "none")) newname := strings.ToLower(c.DefaultQuery("newname", "none")) if group != "noneasdf" { toUpdate := make(map[string]string) numChanges := 0 db, err := bolt.Open(path.Join(RuntimeArgs.SourcePath, group+".db"), 0600, nil) if err != nil { log.Fatal(err) } db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("fingerprints")) if b != nil { c := b.Cursor() for k, v := c.Last(); k != nil; k, v = c.Prev() { v2 := loadFingerprint(v) if v2.Username == user { v2.Username = newname toUpdate[string(k)] = string(dumpFingerprint(v2)) } } } return nil }) db.Update(func(tx *bolt.Tx) error { bucket, err := tx.CreateBucketIfNotExists([]byte("fingerprints")) if err != nil { return fmt.Errorf("create bucket: %s", err) } for k, v := range toUpdate { bucket.Put([]byte(k), []byte(v)) } return nil }) numChanges += len(toUpdate) toUpdate = make(map[string]string) db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("fingerprints-track")) if b != nil { c := b.Cursor() for k, v := c.Last(); k != nil; k, v = c.Prev() { v2 := loadFingerprint(v) if v2.Username == user { v2.Username = newname toUpdate[string(k)] = string(dumpFingerprint(v2)) } } } return nil }) db.Update(func(tx *bolt.Tx) error { bucket, err := tx.CreateBucketIfNotExists([]byte("fingerprints-track")) if err != nil { return fmt.Errorf("create bucket: %s", err) } for k, v := range toUpdate { bucket.Put([]byte(k), []byte(v)) } return nil }) db.Close() numChanges += len(toUpdate) // reset the cache (cache.go) usersCache = make(map[string][]string) userPositionCache = make(map[string]UserPositionJSON) c.JSON(http.StatusOK, gin.H{"message": "Changed name of " + strconv.Itoa(numChanges) + " things", "success": true}) } else { c.JSON(http.StatusOK, gin.H{"success": false, "message": "Error parsing request"}) } }