func userSetPassword(w http.ResponseWriter, r *http.Request) *handler.Error { db := datastore.New() defer db.Close() c := context.New(r) u := user.Current(c, db) if !u.Validate(r.FormValue("oldpassword")) { return handler.NewError(nil, 400, "Old password incorrect!") } newPass := r.FormValue("password") if newPass != r.FormValue("repeatpassword") { return handler.NewError(nil, 400, "New password doesn't match!") } if len(newPass) > 100 { return handler.NewError(nil, 400, "Password length over 100. Seriously?!") } u.SetPassword(newPass) if err := db.C("users").UpdateId(u.Id, u); err != nil { return handler.NewError(err, 500, "Error updating user password!") } return nil }
func userCurrent(w http.ResponseWriter, r *http.Request) *handler.Error { db := datastore.New() defer db.Close() c := context.New(r) u := user.Current(c, db) m := bson.M{"Name": u.Name, "Email": u.Email} render.Json(w, m) return nil }
func projectsByUser(w http.ResponseWriter, r *http.Request) *handler.Error { db := datastore.New() defer db.Close() c := context.New(r) u := user.Current(c, db) projects := ProjectsByUser(u, db) render.Json(w, projects) return nil }
func projectHistory(w http.ResponseWriter, r *http.Request) *handler.Error { db := datastore.New() defer db.Close() c := context.New(r) u := user.Current(c, db) id := bson.ObjectIdHex(mux.Vars(r)["projectId"]) project := ProjectById(u, id) render.Json(w, project.History(db)) return nil }
func userSetProfile(w http.ResponseWriter, r *http.Request) *handler.Error { db := datastore.New() defer db.Close() c := context.New(r) u := user.Current(c, db) u.Name = r.FormValue("name")[:100] u.Email = r.FormValue("email")[:100] if err := db.C("users").UpdateId(u.Id, u); err != nil { return handler.NewError(err, 500, "Error updating user profile") } return nil }
// upload is a web handler for receiving an apk. func upload(w http.ResponseWriter, r *http.Request) *handler.Error { // dont use memory for holding apk if err := r.ParseMultipartForm(0); err != nil { return handler.NewError(err, 500, "Unable to parse multipart form.") } f, _, err := r.FormFile("apk") if err != nil { return handler.NewError(err, 500, "Form file \"apk\" does not exist") } // dump badging and locate appropriate icon name within apk m := dumpBadging(f.(*os.File).Name()) k := fmt.Sprintf("application-icon-%s", m["densities"].([]interface{})[0]) res := m[k].(string) // locate tmp file and extract icon fi, err := f.(*os.File).Stat() if err != nil { return handler.NewError(err, 500, "Can't stat file.") } zr, err := zip.NewReader(f, fi.Size()) if err != nil { return handler.NewError(err, 500, "Not a valid zip archive") } icon := zipReadBytes(zr, res) // Link current user to package name, save badging, apk file, and icon file. db := datastore.New() defer db.Close() u := user.Current(context.New(r), db) apkFile, err := db.FS().Create("") if err != nil { return handler.NewError(err, 500, "Can't save apk") } defer apkFile.Close() io.Copy(apkFile, f) iconFile, err := db.FS().Create("") if err != nil { return handler.NewError(err, 500, "Can't save icon") } defer iconFile.Close() iconFile.Write(icon) // using bson.M to store all badging values, including those not specified in struct apkId := bson.NewObjectId() apkName := m["package"].(map[string]interface{})["name"].(string) apkM := bson.M{ "_id": apkId, "fileid": apkFile.Id(), "iconid": iconFile.Id(), "time": time.Now(), "badging": m, } if err = db.C("apks").Insert(apkM); err != nil { return handler.NewError(err, 500, "Error inserting apk info.") } project := ProjectByName(u, apkName) project.ApkIds = append([]bson.ObjectId{apkId}, project.ApkIds...) if _, err = db.C("projects").UpsertId(project.Id, project); err != nil { return handler.NewError(err, 500, "Error upserting project.") } http.Redirect(w, r, "/console/index", 302) return nil }