func createGroup(uuid uint64, conn net.Conn, r *bufio.Reader, w *bufio.Writer, md *MDService) (err error) { // get lenArgs lenArgs, _ := r.ReadByte() for i := 1; i < int(lenArgs); i++ { var newGroup utils.Group groupName, _ := r.ReadString('\n') groupName = strings.TrimSpace(groupName) // create the group in the database err = md.userDB.Update(func(tx *bolt.Tx) (err error) { // get group bucket b := tx.Bucket([]byte("groups")) id, _ := b.NextSequence() idStr := strconv.FormatUint(id, 10) newGroup.Gid = uint64(id) newGroup.Gname = groupName newGroup.Members = append(newGroup.Members, uuid) newGroup.Owner = uuid fmt.Println("\tNew group \"" + newGroup.Gname + "\" with owner id: " + strconv.FormatUint(uuid, 10)) buf, err := json.Marshal(newGroup) if err != nil { return err } w.WriteString(idStr + "\n") w.Flush() return b.Put(itob(newGroup.Gid), buf) }) if err != nil { return err } } return err }
func groupAdd(uuid uint64, conn net.Conn, r *bufio.Reader, w *bufio.Writer, md *MDService) (err error) { // get lenArgs lenArgs, _ := r.ReadByte() // get details for group to add to gid, _ := r.ReadString('\n') gid = strings.TrimSpace(gid) uintGid, err := strconv.ParseUint(strings.TrimSpace(gid), 10, 64) if err != nil { fmt.Println("\t\tNot a uint or gid") w.WriteByte(2) w.Flush() return nil } err = md.userDB.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte("groups")) v := b.Get(itob(uintGid)) if v == nil { w.WriteByte(2) w.Flush() return fmt.Errorf("\t\tBad access") } var tmpGroup utils.Group json.Unmarshal(v, &tmpGroup) if tmpGroup.Owner != uuid { w.WriteByte(2) w.Flush() return fmt.Errorf("\t\tBad access") } // authorised and group exists w.WriteByte(1) w.Flush() return nil }) if err != nil { fmt.Println("\tInvalid access to group: " + strings.TrimSpace(gid)) return nil } var users []uint64 // read in all users for i := 2; i < int(lenArgs); i++ { user, _ := r.ReadString('\n') user = strings.TrimSpace(user) exists, _ := userExists(user, md.userDB) if exists { uintUuid, _ := strconv.ParseUint(strings.TrimSpace(user), 10, 64) users = append(users, uintUuid) } } // add users to the group in the database err = md.userDB.Update(func(tx *bolt.Tx) (err error) { // get group bucket b := tx.Bucket([]byte("groups")) // we already know it exists from above v := b.Get(itob(uintGid)) var tmpGroup utils.Group json.Unmarshal(v, &tmpGroup) newUsers := "" for _, u := range users { if !utils.Contains(u, tmpGroup.Members) { tmpGroup.Members = append(tmpGroup.Members, u) fmt.Printf("\tAdding user: %d to group %d\n", u, tmpGroup.Gid) newUsers = newUsers + strconv.FormatUint(u, 10) + ", " } } buf, err := json.Marshal(tmpGroup) if err != nil { return err } var anGroup utils.Group json.Unmarshal(buf, &anGroup) w.WriteString(newUsers + "\n") w.Flush() return b.Put(itob(tmpGroup.Gid), buf) }) if err != nil { return err } return err }