// Handles PUT and POST for a user or a role. func (h *handler) updatePrincipal(name string, isUser bool) error { h.assertAdminOnly() // Unmarshal the request body into a PrincipalConfig struct: body, _ := h.readBody() var newInfo db.PrincipalConfig var err error if err = json.Unmarshal(body, &newInfo); err != nil { return err } if h.rq.Method == "POST" { // On POST, take the name from the "name" property in the request body: if newInfo.Name == nil { return base.HTTPErrorf(http.StatusBadRequest, "Missing name property") } } else { // ON PUT, verify the name matches, if given: if newInfo.Name == nil { newInfo.Name = &name } else if *newInfo.Name != name { return base.HTTPErrorf(http.StatusBadRequest, "Name mismatch (can't change name)") } } internalName := internalUserName(*newInfo.Name) newInfo.Name = &internalName replaced, err := h.db.UpdatePrincipal(newInfo, isUser, h.rq.Method != "POST") if err != nil { return err } else if replaced { h.writeStatus(http.StatusOK, "OK") } else { h.writeStatus(http.StatusCreated, "Created") } return nil }