Example #1
0
File: server.go Project: CPSSD/MDFS
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
}
Example #2
0
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

}