func extractZip(body []byte, location string) (string, error) { path, err := utilities.SaveFileonTempDir("tooldownloaded.zip", bytes.NewReader(body)) r, err := zip.OpenReader(path) if err != nil { return location, err } var dirList []string for _, f := range r.File { dirList = append(dirList, f.Name) } basedir := findBaseDir(dirList) for _, f := range r.File { fullname := filepath.Join(location, strings.Replace(f.Name, basedir, "", -1)) if f.FileInfo().IsDir() { os.MkdirAll(fullname, f.FileInfo().Mode().Perm()) } else { os.MkdirAll(filepath.Dir(fullname), 0755) perms := f.FileInfo().Mode().Perm() out, err := os.OpenFile(fullname, os.O_CREATE|os.O_RDWR, perms) if err != nil { return location, err } rc, err := f.Open() if err != nil { return location, err } _, err = io.CopyN(out, rc, f.FileInfo().Size()) if err != nil { return location, err } rc.Close() out.Close() mtime := f.FileInfo().ModTime() err = os.Chtimes(fullname, mtime, mtime) if err != nil { return location, err } } } return location, nil }
func uploadHandler(c *gin.Context) { data := new(Upload) c.BindJSON(data) log.Printf("%+v", data) if data.Port == "" { c.String(http.StatusBadRequest, "port is required") return } if data.Board == "" { c.String(http.StatusBadRequest, "board is required") log.Error("board is required") return } if data.Extra.Network == false { if data.Signature == "" { c.String(http.StatusBadRequest, "signature is required") return } if data.Commandline == "" { c.String(http.StatusBadRequest, "commandline is required for local board") return } err := verifyCommandLine(data.Commandline, data.Signature) if err != nil { c.String(http.StatusBadRequest, "signature is invalid") return } } buffer := bytes.NewBuffer(data.Hex) filePath, err := utilities.SaveFileonTempDir(data.Filename, buffer) if err != nil { c.String(http.StatusBadRequest, err.Error()) return } for _, extraFile := range data.ExtraFiles { path := filepath.Join(filepath.Dir(filePath), extraFile.Filename) log.Printf("Saving %s on %s", extraFile.Filename, path) err := ioutil.WriteFile(path, extraFile.Hex, 0644) if err != nil { log.Printf(err.Error()) } } if data.Rewrite != "" { data.Board = data.Rewrite } go spProgramRW(data.Port, data.Board, filePath, data.Commandline, data.Extra) c.String(http.StatusAccepted, "") }