Welcome: Create new users via Memberships API

Change-Id: Iaa12b3438340a5ca4c4fdb2157d1e8f064d56139
diff --git a/core/auth/memberships/main.go b/core/auth/memberships/main.go
index 8ef0848..0e3f2da 100644
--- a/core/auth/memberships/main.go
+++ b/core/auth/memberships/main.go
@@ -33,7 +33,7 @@
 
 type Store interface {
 	// Initializes store with admin user and their groups.
-	Init(owner string, groups []string) error
+	Init(user, email string, groups []string) error
 	CreateGroup(owner string, group Group) error
 	AddChildGroup(parent, child string) error
 	AddOwnerGroup(owned_group, owner_group string) error
@@ -137,7 +137,7 @@
 	return &SQLiteStore{db: db}, nil
 }
 
-func (s *SQLiteStore) Init(owner string, groups []string) error {
+func (s *SQLiteStore) Init(user, email string, groups []string) error {
 	tx, err := s.db.Begin()
 	if err != nil {
 		return err
@@ -151,17 +151,21 @@
 	if count != 0 {
 		return fmt.Errorf("Store already initialised")
 	}
+	query := `INSERT INTO users (username, email) VALUES (?, ?)`
+	if _, err := tx.Exec(query, user, email); err != nil {
+		return err
+	}
 	for _, g := range groups {
-		query := `INSERT INTO groups (name, description) VALUES (?, '')`
+		query = `INSERT INTO groups (name, description) VALUES (?, '')`
 		if _, err := tx.Exec(query, g); err != nil {
 			return err
 		}
 		query = `INSERT INTO owners (username, group_name) VALUES (?, ?)`
-		if _, err := tx.Exec(query, owner, g); err != nil {
+		if _, err := tx.Exec(query, user, g); err != nil {
 			return err
 		}
 		query = `INSERT INTO user_to_group (username, group_name) VALUES (?, ?)`
-		if _, err := tx.Exec(query, owner, g); err != nil {
+		if _, err := tx.Exec(query, user, g); err != nil {
 			return err
 		}
 	}
@@ -1188,7 +1192,8 @@
 }
 
 type initRequest struct {
-	Owner  string   `json:"owner"`
+	User   string   `json:"user"`
+	Email  string   `json:"email"`
 	Groups []string `json:"groups"`
 }
 
@@ -1198,7 +1203,7 @@
 		http.Error(w, err.Error(), http.StatusBadRequest)
 		return
 	}
-	if err := s.store.Init(req.Owner, req.Groups); err != nil {
+	if err := s.store.Init(req.User, req.Email, req.Groups); err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
@@ -1285,34 +1290,30 @@
 	}
 }
 
+type createUserRequest struct {
+	User  string `json:"user"`
+	Email string `json:"email"`
+}
+
 func (s *Server) apiCreateUser(w http.ResponseWriter, r *http.Request) {
 	defer s.pingAllSyncAddresses()
-	selfAddress := r.FormValue("selfAddress")
-	if selfAddress != "" {
-		s.addSyncAddress(selfAddress)
-	}
-	if err := r.ParseForm(); err != nil {
+	var req createUserRequest
+	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
 		http.Error(w, "Invalid request body", http.StatusBadRequest)
 		return
 	}
-	username := r.FormValue("username")
-	email := r.FormValue("email")
-	if username == "" {
+	if req.User == "" {
 		http.Error(w, "Username cannot be empty", http.StatusBadRequest)
 		return
 	}
-	if email == "" {
+	if req.Email == "" {
 		http.Error(w, "Email cannot be empty", http.StatusBadRequest)
 		return
 	}
-	username = strings.ToLower(username)
-	email = strings.ToLower(email)
-	err := s.store.CreateUser(username, email)
-	if err != nil {
+	if err := s.store.CreateUser(strings.ToLower(req.User), strings.ToLower(req.Email)); err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
-	w.WriteHeader(http.StatusOK)
 }
 
 func (s *Server) pingAllSyncAddresses() {