func newUser(conn net.Conn, r *bufio.Reader, w *bufio.Writer, md *MDService) (err error) { // get the uuid for the new user var newUser utils.User err = md.userDB.Update(func(tx *bolt.Tx) (err error) { // Retrieve the users bucket. // This should be created when the DB is first opened. b := tx.Bucket([]byte("users")) // Generate ID for the user. // This returns an error only if the Tx is closed or not writeable. // That can't happen in an Update() call so I ignore the error check. id, _ := b.NextSequence() newUser.Uuid = uint64(id) idStr := strconv.FormatUint(id, 10) // receive the username and public key for the new user uname, _ := r.ReadString('\n') pubKN, _ := r.ReadString('\n') pubKE, _ := r.ReadString('\n') newUser.Uname = strings.TrimSpace(uname) newUser.Pubkey = &rsa.PublicKey{N: big.NewInt(0)} newUser.Pubkey.N.SetString(strings.TrimSpace(pubKN), 10) newUser.Pubkey.E, err = strconv.Atoi(strings.TrimSpace(pubKE)) fmt.Println("\tNew user: "******"\tRecieved " + newUser.Uname + "'s public key") // Marshal user data into bytes. buf, err := json.Marshal(newUser) if err != nil { return err } fmt.Println("\tSending UUID " + idStr + " to " + newUser.Uname) w.WriteString(idStr + "\n") w.Flush() // Persist bytes to users bucket. return b.Put(itob(newUser.Uuid), buf) }) return err }
func setup(r *bufio.Reader, w *bufio.Writer, thisUser *utils.User) (err error) { fmt.Println("Please enter your username:\n") fmt.Print("Username: "******"/.mdfs/client/" + uname + "/.user_data") if exists != nil { // not exist // Make sure the local user dir exists err := os.MkdirAll(utils.GetUserHome()+"/.mdfs/client/"+uname+"/files", 0777) if err != nil { return err } // notify mdservice that this is a new user (SENDCODE 10) err = w.WriteByte(10) // if err != nil { return err } w.Flush() // local user setup utils.GenUserKeys(utils.GetUserHome() + "/.mdfs/client/" + uname + "/.private_key") err = utils.FileToStruct(utils.GetUserHome()+"/.mdfs/client/"+uname+"/.private_key", &thisUser.Privkey) if err != nil { return err } thisUser.Pubkey = &thisUser.Privkey.PublicKey // send username and keys w.WriteString(uname + "\n") w.Write([]byte(thisUser.Pubkey.N.String() + "\n")) w.Write([]byte(strconv.Itoa(thisUser.Pubkey.E) + "\n")) w.Flush() uuid, _ := r.ReadString('\n') thisUser.Uuid, err = strconv.ParseUint(strings.TrimSpace(uuid), 10, 64) if err != nil { return err } err = utils.StructToFile(*thisUser, utils.GetUserHome()+"/.mdfs/client/"+uname+"/.user_data") if err != nil { return err } //NOTE: NOT COMPLETE } else { err = utils.FileToStruct(utils.GetUserHome()+"/.mdfs/client/"+uname+"/.user_data", &thisUser) w.WriteByte(9) w.Flush() } return err // if none exist, will send a code to mdserv to notify as new user, // and get a uuid, create userkeys, send pubkey to mdserv }