func newDevice(w http.ResponseWriter, r *twocloud.RequestBundle) { username := r.Request.URL.Query().Get(":username") user := r.AuthUser if strings.ToLower(username) != strings.ToLower(r.AuthUser.Username) { if !r.AuthUser.IsAdmin { Respond(w, r, http.StatusUnauthorized, "You don't have access to that user's devices.", []interface{}{}) return } id, err := r.GetUserID(username) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } user, err = r.GetUser(id) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } } var req twocloud.Device body, err := ioutil.ReadAll(r.Request.Body) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error.", []interface{}{}) return } err = json.Unmarshal(body, &req) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusBadRequest, "Error decoding request.", []interface{}{}) return } if req.Name == "" { Respond(w, r, http.StatusBadRequest, "Name must be specified.", []interface{}{}) return } req.ClientType = strings.ToLower(req.ClientType) if !req.ValidClientType() { Respond(w, r, http.StatusBadRequest, "Invalid client type.", []interface{}{}) return } gcm_key := "" if req.Pushers != nil && req.Pushers.GCM != nil { gcm_key = req.Pushers.GCM.Key } device, err := r.AddDevice(req.Name, req.ClientType, r.Request.RemoteAddr, gcm_key, user) if err != nil { Respond(w, r, http.StatusInternalServerError, "Internal server error.", []interface{}{}) return } Respond(w, r, http.StatusCreated, "Successfully created a device", []interface{}{device}) return }
func updateDevice(w http.ResponseWriter, r *twocloud.RequestBundle) { username := r.Request.URL.Query().Get(":username") deviceId := r.Request.URL.Query().Get(":device") user := r.AuthUser if strings.ToLower(username) != strings.ToLower(r.AuthUser.Username) { if !r.AuthUser.IsAdmin { Respond(w, r, http.StatusUnauthorized, "You don't have access to that user's devices.", []interface{}{}) return } id, err := r.GetUserID(username) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } user, err = r.GetUser(id) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } } devID, err := strconv.ParseUint(deviceId, 10, 64) if err != nil { Respond(w, r, http.StatusBadRequest, "Invalid device ID", []interface{}{}) return } device := r.Device if device.ID != devID { device, err = r.GetDevice(devID) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } } if device.UserID != user.ID { Respond(w, r, http.StatusBadRequest, "The specified device does not belong to the specified user", []interface{}{}) return } var req twocloud.Device body, err := ioutil.ReadAll(r.Request.Body) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error.", []interface{}{}) return } err = json.Unmarshal(body, &req) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusBadRequest, "Error decoding request.", []interface{}{}) return } req.ClientType = strings.ToLower(req.ClientType) gcm_key := "" if req.Pushers != nil && req.Pushers.GCM != nil { gcm_key = req.Pushers.GCM.Key } device, err = r.UpdateDevice(device, req.Name, req.ClientType, gcm_key) if err != nil { Respond(w, r, http.StatusInternalServerError, "Internal server error.", []interface{}{}) return } Respond(w, r, http.StatusCreated, "Successfully updated the device", []interface{}{device}) return }